diff options
Diffstat (limited to 'src/ExternalLexer.cxx')
| -rw-r--r-- | src/ExternalLexer.cxx | 70 | 
1 files changed, 70 insertions, 0 deletions
| diff --git a/src/ExternalLexer.cxx b/src/ExternalLexer.cxx index 4f2ab987b..b35e8962a 100644 --- a/src/ExternalLexer.cxx +++ b/src/ExternalLexer.cxx @@ -26,6 +26,66 @@  using namespace Scintilla; +#if PLAT_WIN +#define EXT_LEXER_DECL __stdcall +#else +#define EXT_LEXER_DECL +#endif + +namespace { + +typedef int (EXT_LEXER_DECL *GetLexerCountFn)(); +typedef void (EXT_LEXER_DECL *GetLexerNameFn)(unsigned int Index, char *name, int buflength); +typedef LexerFactoryFunction(EXT_LEXER_DECL *GetLexerFactoryFunction)(unsigned int Index); + +/// Sub-class of LexerModule to use an external lexer. +class ExternalLexerModule : public LexerModule { +protected: +	GetLexerFactoryFunction fneFactory; +	std::string name; +public: +	ExternalLexerModule(int language_, LexerFunction fnLexer_, +		const char *languageName_=nullptr, LexerFunction fnFolder_=nullptr) : +		LexerModule(language_, fnLexer_, nullptr, fnFolder_), +		fneFactory(nullptr), name(languageName_){ +		languageName = name.c_str(); +	} +	virtual void SetExternal(GetLexerFactoryFunction fFactory, int index); +}; + +/// LexerLibrary exists for every External Lexer DLL, contains ExternalLexerModules. +class LexerLibrary { +	std::unique_ptr<DynamicLibrary> lib; +	std::vector<std::unique_ptr<ExternalLexerModule>> modules; +public: +	explicit LexerLibrary(const char *moduleName_); +	~LexerLibrary(); + +	std::string moduleName; +}; + +/// LexerManager manages external lexers, contains LexerLibrarys. +class LexerManager { +public: +	~LexerManager(); + +	static LexerManager *GetInstance(); +	static void DeleteInstance(); + +	void Load(const char *path); +	void Clear(); + +private: +	LexerManager(); +	static std::unique_ptr<LexerManager> theInstance; +	std::vector<std::unique_ptr<LexerLibrary>> libraries; +}; + +class LMMinder { +public: +	~LMMinder(); +}; +  std::unique_ptr<LexerManager> LexerManager::theInstance;  //------------------------------------------ @@ -133,3 +193,13 @@ LMMinder::~LMMinder() {  }  LMMinder minder; + +} + +namespace Scintilla { + +void ExternalLexerLoad(const char *path) { +	LexerManager::GetInstance()->Load(path); +} + +} | 
