1 // Scintilla source code edit control
2 /** @file ExternalLexer.h
3 ** Support external lexers in DLLs.
5 // Copyright 2001 Simon Steele <ss@pnotepad.org>, portions copyright Neil Hodgson.
6 // The License.txt file describes the conditions under which this software may be distributed.
8 #ifndef EXTERNALLEXER_H
9 #define EXTERNALLEXER_H
12 #define EXT_LEXER_DECL __stdcall
14 #define EXT_LEXER_DECL
19 #define EXT_LEXER_DECL __stdcall
21 #define EXT_LEXER_DECL
25 // External Lexer function definitions...
26 typedef void (EXT_LEXER_DECL
*ExtLexerFunction
)(unsigned int lexer
, unsigned int startPos
, int length
, int initStyle
,
27 char *words
[], WindowID window
, char *props
);
28 typedef void (EXT_LEXER_DECL
*ExtFoldFunction
)(unsigned int lexer
, unsigned int startPos
, int length
, int initStyle
,
29 char *words
[], WindowID window
, char *props
);
30 typedef void* (EXT_LEXER_DECL
*GetLexerFunction
)(unsigned int Index
);
31 typedef int (EXT_LEXER_DECL
*GetLexerCountFn
)();
32 typedef void (EXT_LEXER_DECL
*GetLexerNameFn
)(unsigned int Index
, char *name
, int buflength
);
34 //class DynamicLibrary;
36 /// Sub-class of LexerModule to use an external lexer.
37 class ExternalLexerModule
: protected LexerModule
{
39 ExtLexerFunction fneLexer
;
40 ExtFoldFunction fneFolder
;
44 ExternalLexerModule(int language_
, LexerFunction fnLexer_
,
45 const char *languageName_
=0, LexerFunction fnFolder_
=0) : LexerModule(language_
, fnLexer_
, 0, fnFolder_
){
46 strncpy(name
, languageName_
, sizeof(name
));
49 virtual void Lex(unsigned int startPos
, int lengthDoc
, int initStyle
,
50 WordList
*keywordlists
[], Accessor
&styler
) const;
51 virtual void Fold(unsigned int startPos
, int lengthDoc
, int initStyle
,
52 WordList
*keywordlists
[], Accessor
&styler
) const;
53 virtual void SetExternal(ExtLexerFunction fLexer
, ExtFoldFunction fFolder
, int index
);
56 /// LexerMinder points to an ExternalLexerModule - so we don't leak them.
59 ExternalLexerModule
*self
;
63 /// LexerLibrary exists for every External Lexer DLL, contains LexerMinders.
70 LexerLibrary(const char* ModuleName
);
75 SString m_sModuleName
;
78 /// LexerManager manages external lexers, contains LexerLibrarys.
83 static LexerManager
*GetInstance();
84 static void DeleteInstance();
86 void Load(const char* path
);
91 static LexerManager
*theInstance
;
93 void LoadLexerLibrary(const char* module);