Tokenizerつくった。

よく知らんけど、文字列から単語を拾い上げるみたいな部品。コンフィグファイルからラベルとスイッチを拾ってくる処理を書いてて欲しくなったので作った。JAVAかなんかのライブラリにはあった気がするし、C++でもどっかのライブラリにはあるっぽい(標準には無い?)。素晴らしき再発明。ちょちょいのちょいで作るつもりが、なんか半日ぐらい費やしてしまった。。。

いちおう紹介。

class CToken
{
	friend class CTokenizer;
public:
	CToken();
	CToken(char const* pStr);
	CToken(char const* pStr, int Size);
	~CToken();

	void			SetString(char const* pStr, int Size);
	inline char*	GetString(){return m_pString;};

private:
	char*			m_pString;
	CToken*			m_pNext;
};


class CTokenizer
{
public:
	CTokenizer();
	CTokenizer(char const* pStr, char const* pDel = NULL);
	~CTokenizer();

	void			SetString(char const* pStr, char const* pDel);
	char*			GetNext();
	
private:
	void			DeleteToken();
	inline int		IsKugiri(char Target, char const* pDel);

	int				mSize;

	CToken*			m_pMyToken;
	CToken			mHead;

	static CToken*	pTail;
	static char const*	DefaultSpacer;
};

こんな感じのTokenクラス(文字列+リンクリスト)に

void CTokenizer::SetString(char const* pStr, char const* pDel)
{
	int cursor;
	CToken* LatestToken = &mHead;

	DeleteToken();

	if( !pDel )
	{
		pDel = DefaultSpacer;
	}

	for(cursor=0; pStr[cursor]; cursor++)
	{
		int TokenHead = cursor;

		for( ;pStr[cursor] && !IsKugiri(pStr[cursor], pDel); cursor++);

		int tmpTokenLength = cursor - TokenHead;
		if( tmpTokenLength > 0 )
		{
			CToken* tmpToken = new CToken( &(pStr[TokenHead]), tmpTokenLength);
			
			LatestToken->m_pNext = tmpToken;
			LatestToken = tmpToken;

			mSize++;
		}
	}

	LatestToken->m_pNext = pTail;
	m_pMyToken = mHead.m_pNext;
}

char* CTokenizer::GetNext()
{
	char* pRet;

	if( m_pMyToken != pTail )
	{
		pRet = m_pMyToken->GetString();
		m_pMyToken = m_pMyToken->m_pNext;
	}
	else
	{
		pRet = NULL;
	}
	return pRet;
}

int CTokenizer::IsKugiri(char Target, const char* pDel)
{
	for( int cnt=0; pDel[cnt]; cnt++ )
	{
		if( Target == pDel[cnt] )
			return 1;
	}

	return 0;
}

こんな感じで突っ込む。