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
21 // External Lexer function definitions...
22 typedef void (EXT_LEXER_DECL
*ExtLexerFunction
)(unsigned int lexer
, unsigned int startPos
, int length
, int initStyle
,
23 char *words
[], WindowID window
, char *props
);
24 typedef void (EXT_LEXER_DECL
*ExtFoldFunction
)(unsigned int lexer
, unsigned int startPos
, int length
, int initStyle
,
25 char *words
[], WindowID window
, char *props
);
26 typedef void* (EXT_LEXER_DECL
*GetLexerFunction
)(unsigned int Index
);
27 typedef int (EXT_LEXER_DECL
*GetLexerCountFn
)();
28 typedef void (EXT_LEXER_DECL
*GetLexerNameFn
)(unsigned int Index
, char *name
, int buflength
);
30 //class DynamicLibrary;
32 /// Sub-class of LexerModule to use an external lexer.
33 class ExternalLexerModule
: protected LexerModule
{
35 ExtLexerFunction fneLexer
;
36 ExtFoldFunction fneFolder
;
40 ExternalLexerModule(int language_
, LexerFunction fnLexer_
,
41 const char *languageName_
=0, LexerFunction fnFolder_
=0) : LexerModule(language_
, fnLexer_
, 0, fnFolder_
){
42 strncpy(name
, languageName_
, sizeof(name
));
45 virtual void Lex(unsigned int startPos
, int lengthDoc
, int initStyle
,
46 WordList
*keywordlists
[], Accessor
&styler
) const;
47 virtual void Fold(unsigned int startPos
, int lengthDoc
, int initStyle
,
48 WordList
*keywordlists
[], Accessor
&styler
) const;
49 virtual void SetExternal(ExtLexerFunction fLexer
, ExtFoldFunction fFolder
, int index
);
52 /// LexerMinder points to an ExternalLexerModule - so we don't leak them.
55 ExternalLexerModule
*self
;
59 /// LexerLibrary exists for every External Lexer DLL, contains LexerMinders.
66 LexerLibrary(const char* ModuleName
);
71 SString m_sModuleName
;
74 /// LexerManager manages external lexers, contains LexerLibrarys.
79 static LexerManager
*GetInstance();
80 static void DeleteInstance();
82 void Load(const char* path
);
87 static LexerManager
*theInstance
;
89 void LoadLexerLibrary(const char* module
);