Показать сообщение отдельно

  #3  
Старый 17.02.2008, 05:23
KEZ
Banned
Регистрация: 18.05.2005
Сообщений: 1,981
Провел на форуме:
1941233

Репутация: 2726


По умолчанию

Код:
// ...

class Tokenize
{

public:

	void Reset()
	{
		m_Pos = m_Source;
	}

	Tokenize(const char * Src,const char * Tokens = "|")
	{
		m_Pos = m_Source = strdup(Src);
		m_End = m_Pos+strlen(m_Pos);
		mg_Ret = 0;
		m_Tokens = strdup(Tokens);
	}

	~Tokenize()
	{
		delete m_Source;
		if (m_Tokens)
			delete m_Tokens;
		if (mg_Ret)
			delete mg_Ret;
	}

	const char * GetNextToken()
	{
		if (mg_Ret)
		{
			delete mg_Ret;
			mg_Ret = 0;
		}

		if (!*m_Pos)
			return 0;

		if (m_Tokens)
		{
			const char * nextpos = token_first();
			unsigned curlen = (unsigned)(nextpos - m_Pos + 1);
			mg_Ret = (char*)malloc(curlen);
			lstrcpyn(mg_Ret,m_Pos,curlen);
			m_Pos = nextpos;
			if (m_Pos[0]) ++m_Pos;
		}

		return mg_Ret;
	}

private:
	const char * m_Pos, * m_Tokens, * m_Source, * m_End;
	char * mg_Ret;

	const char * token_first()
	{
		unsigned i = 0;
		char c;
		const char * m = m_End;
		while (c=m_Tokens[i++])
		{
			char * d = strchr(m_Pos,c);
			if (d && d < m)
				m = d;
		}
		return m;
	}
};

// ...

int main()
{
	Tokenize tok("abc|def|ghi.sex.dax/big/min",".|/");
	const char * part;
	while (part = tok.GetNextToken())
	{
		MessageBox(0, part, "Tokenize 1", MB_ICONEXCLAMATION);
	}
	tok.Reset();
	while (part = tok.GetNextToken())
	{
		MessageBox(0, part, "Tokenize 2", MB_ICONINFORMATION);
	}

	return 0;
}

// ...