diff options
Diffstat (limited to 'win32/ExternalLexer.h')
-rw-r--r-- | win32/ExternalLexer.h | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/win32/ExternalLexer.h b/win32/ExternalLexer.h new file mode 100644 index 000000000..bbc2cf4f6 --- /dev/null +++ b/win32/ExternalLexer.h @@ -0,0 +1,74 @@ +// Scintilla source code edit control +/** @file ExternalLexer.h + ** Support external lexers in DLLs. + **/ +// Copyright 2001 Simon Steele <ss@pnotepad.org>, portions copyright Neil Hodgson. +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef EXTERNALLEXER_H +#define EXTERNALLEXER_H + +// External Lexer function definitions... +typedef void (__stdcall *ExtLexerFunction)(unsigned int lexer, unsigned int startPos, int length, int initStyle, + char *words[], WindowID window, char *props); +typedef void (__stdcall *ExtFoldFunction)(unsigned int lexer, unsigned int startPos, int length, int initStyle, + char *words[], WindowID window, char *props); +typedef void* (__stdcall *GetLexerFunction)(unsigned int Index); +typedef int (__stdcall *GetLexerCountFn)(); +typedef void (__stdcall *GetLexerNameFn)(unsigned int Index, char *name, int buflength); + +// Sub-class of LexerModule to use an external lexer. +class ExternalLexerModule : protected LexerModule { +protected: + ExtLexerFunction fneLexer; + ExtFoldFunction fneFolder; + int externalLanguage; + char name[100]; +public: + ExternalLexerModule(int language_, LexerFunction fnLexer_, + const char *languageName_=0, LexerFunction fnFolder_=0) : LexerModule(language_, fnLexer_, 0, fnFolder_){ + strncpy(name, languageName_, sizeof(name)); + languageName = name; + }; + virtual void Lex(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler); + virtual void Fold(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler); + virtual void SetExternal(ExtLexerFunction fLexer, ExtFoldFunction fFolder, int index); +}; + +// LexerMinder points to an ExternalLexerModule - so we don't leak them. +class LexerMinder { +public: + ExternalLexerModule *self; + LexerMinder *next; +}; + +// LexerLibrary exists for every External Lexer DLL, contains LexerMinders. +class LexerLibrary { +public: + LexerLibrary(LPCTSTR ModuleName); + ~LexerLibrary(); + void Release(); + // Variables + LexerLibrary *next; + SString m_sModuleName; +private: + HMODULE m_hModule; + LexerMinder *first; + LexerMinder *last; +}; + +// LexerManager manages external lexers, contains LexerLibrarys. +class LexerManager { +public: + LexerManager(); + ~LexerManager(); +private: + void EnumerateLexers(); + static int UseCount; + static LexerLibrary *first; + static LexerLibrary *last; +}; + +#endif |