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
));
43 name
[sizeof(name
)-1] = '\0';
46 virtual void Lex(unsigned int startPos
, int lengthDoc
, int initStyle
,
47 WordList
*keywordlists
[], Accessor
&styler
) const;
48 virtual void Fold(unsigned int startPos
, int lengthDoc
, int initStyle
,
49 WordList
*keywordlists
[], Accessor
&styler
) const;
50 virtual void SetExternal(ExtLexerFunction fLexer
, ExtFoldFunction fFolder
, int index
);
53 /// LexerMinder points to an ExternalLexerModule - so we don't leak them.
56 ExternalLexerModule
*self
;
60 /// LexerLibrary exists for every External Lexer DLL, contains LexerMinders.
67 LexerLibrary(const char* ModuleName
);
72 std::string m_sModuleName
;
75 /// LexerManager manages external lexers, contains LexerLibrarys.
80 static LexerManager
*GetInstance();
81 static void DeleteInstance();
83 void Load(const char* path
);
88 static LexerManager
*theInstance
;
90 void LoadLexerLibrary(const char* module);