#ifndef TOKENIZER_H
#define TOKENIZER_H

#include <wx/string.h>

struct TokenizerOptions
{
	bool wantPreprocessor;
};

class Tokenizer
{
	public:
		Tokenizer(const wxString& filename = wxEmptyString);
		~Tokenizer();

		bool Init(const wxString& filename = wxEmptyString);
		bool InitFromBuffer(const wxString& buffer);
		wxString GetToken();
		wxString PeekToken();
		void UngetToken();
		const wxString& GetFilename(){ return m_Filename; }
		unsigned int GetLineNumber(){ return m_LineNumber; }
		unsigned int GetNestingLevel(){ return m_NestLevel; }
		bool IsOK(){ return m_IsOK; }
		TokenizerOptions m_Options;
	protected:
		void BaseInit();
		wxString DoGetToken();
		bool ReadFile();
		bool SkipWhiteSpace();
		bool SkipToChar(const wxChar& ch);
		bool SkipToOneOfChars(const char* chars, bool supportNesting = false);
		bool SkipToEOL();
		bool SkipBlock(const wxChar& ch);
		bool SkipUnwanted(); // skips comments, assignments, preprocessor etc.
		bool IsEOF(){ return m_TokenIndex >= m_BufferLen; }
		bool MoveToNextChar();
		void AdjustLineNumber();
		wxChar CurrentChar();
		wxChar NextChar();
		wxChar PreviousChar();
	private:
		bool CharInString(const char ch, const char* chars);
		wxString m_Filename;
		wxString m_Buffer;
		unsigned int m_BufferLen;
		unsigned int m_NestLevel; // keep track of block nesting { }
		unsigned int m_UndoNestLevel;
		unsigned int m_TokenIndex;
		unsigned int m_UndoTokenIndex;
		unsigned int m_LineNumber;
		unsigned int m_UndoLineNumber;
		bool m_IsOK;
		bool m_IsOperator;
		bool m_LastWasPreprocessor;
		wxString m_LastPreprocessor;
};

#endif // TOKENIZER_H



syntax highlighted by Code2HTML, v. 0.9.1