aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/ExternalLexer.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/ExternalLexer.cxx')
-rw-r--r--src/ExternalLexer.cxx70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/ExternalLexer.cxx b/src/ExternalLexer.cxx
index 0326f19de..308846628 100644
--- a/src/ExternalLexer.cxx
+++ b/src/ExternalLexer.cxx
@@ -27,6 +27,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);
+}
+
+}