diff options
| -rw-r--r-- | src/ExternalLexer.cxx | 70 | ||||
| -rw-r--r-- | src/ExternalLexer.h | 58 | ||||
| -rw-r--r-- | src/ScintillaBase.cxx | 2 | 
3 files changed, 72 insertions, 58 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); +} + +} diff --git a/src/ExternalLexer.h b/src/ExternalLexer.h index f0af9834a..d0a615e31 100644 --- a/src/ExternalLexer.h +++ b/src/ExternalLexer.h @@ -8,65 +8,9 @@  #ifndef EXTERNALLEXER_H  #define EXTERNALLEXER_H -#if PLAT_WIN -#define EXT_LEXER_DECL __stdcall -#else -#define EXT_LEXER_DECL -#endif -  namespace Scintilla { -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(); -}; +void ExternalLexerLoad(const char *path);  } diff --git a/src/ScintillaBase.cxx b/src/ScintillaBase.cxx index 9757b8400..76308ce2a 100644 --- a/src/ScintillaBase.cxx +++ b/src/ScintillaBase.cxx @@ -1092,7 +1092,7 @@ sptr_t ScintillaBase::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lPara  		return StringResult(lParam, DocumentLexState()->GetName());  	case SCI_LOADLEXERLIBRARY: -		LexerManager::GetInstance()->Load(ConstCharPtrFromSPtr(lParam)); +		ExternalLexerLoad(ConstCharPtrFromSPtr(lParam));  		break;  	case SCI_PRIVATELEXERCALL: | 
