aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/ExternalLexer.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/ExternalLexer.cxx')
-rw-r--r--src/ExternalLexer.cxx222
1 files changed, 0 insertions, 222 deletions
diff --git a/src/ExternalLexer.cxx b/src/ExternalLexer.cxx
deleted file mode 100644
index 1609b676e..000000000
--- a/src/ExternalLexer.cxx
+++ /dev/null
@@ -1,222 +0,0 @@
-// Scintilla source code edit control
-/** @file ExternalLexer.cxx
- ** Support external lexers in DLLs or shared libraries.
- **/
-// Copyright 2001 Simon Steele <ss@pnotepad.org>, portions copyright Neil Hodgson.
-// The License.txt file describes the conditions under which this software may be distributed.
-
-#include <cstdlib>
-#include <cassert>
-#include <cstring>
-
-#include <stdexcept>
-#include <string>
-#include <string_view>
-#include <vector>
-#include <memory>
-
-#include "Platform.h"
-
-#include "ILexer.h"
-#include "Scintilla.h"
-#include "SciLexer.h"
-
-#include "LexerModule.h"
-#include "Catalogue.h"
-#include "ExternalLexer.h"
-
-using namespace Scintilla;
-
-#if PLAT_WIN
-#define EXT_LEXER_DECL __stdcall
-#else
-#define EXT_LEXER_DECL
-#endif
-
-namespace {
-
-int nextLanguage = SCLEX_AUTOMATIC + 1;
-
-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);
-
-/// Generic function to convert from a void* to a function pointer.
-/// This avoids undefined and conditionally defined behaviour.
-template<typename T>
-T FunctionPointer(void *function) noexcept {
- static_assert(sizeof(T) == sizeof(function));
- T fp;
- memcpy(&fp, &function, sizeof(T));
- return fp;
-}
-
-/// 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();
- }
- void SetExternal(GetLexerFactoryFunction fFactory, int index) noexcept;
-};
-
-/// 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() noexcept;
-
- void Load(const char *path);
- void Clear() noexcept;
-
-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;
-
-//------------------------------------------
-//
-// ExternalLexerModule
-//
-//------------------------------------------
-
-void ExternalLexerModule::SetExternal(GetLexerFactoryFunction fFactory, int index) noexcept {
- fneFactory = fFactory;
- fnFactory = fFactory(index);
-}
-
-//------------------------------------------
-//
-// LexerLibrary
-//
-//------------------------------------------
-
-LexerLibrary::LexerLibrary(const char *moduleName_) {
- // Load the DLL
- lib.reset(DynamicLibrary::Load(moduleName_));
- if (lib->IsValid()) {
- moduleName = moduleName_;
- GetLexerCountFn GetLexerCount = FunctionPointer<GetLexerCountFn>(lib->FindFunction("GetLexerCount"));
-
- if (GetLexerCount) {
- // Find functions in the DLL
- GetLexerNameFn GetLexerName = FunctionPointer<GetLexerNameFn>(lib->FindFunction("GetLexerName"));
- GetLexerFactoryFunction fnFactory = FunctionPointer<GetLexerFactoryFunction>(lib->FindFunction("GetLexerFactory"));
-
- if (!GetLexerName || !fnFactory) {
- return;
- }
-
- const int nl = GetLexerCount();
-
- for (int i = 0; i < nl; i++) {
- // Assign a buffer for the lexer name.
- char lexname[100] = "";
- GetLexerName(i, lexname, sizeof(lexname));
- ExternalLexerModule *lex = new ExternalLexerModule(nextLanguage, nullptr, lexname, nullptr);
- nextLanguage++;
-
- // This is storing a second reference to lex in the Catalogue as well as in modules.
- // TODO: Should use std::shared_ptr or similar to ensure allocation safety.
- Catalogue::AddLexerModule(lex);
-
- // Remember ExternalLexerModule so we don't leak it
- modules.push_back(std::unique_ptr<ExternalLexerModule>(lex));
-
- // The external lexer needs to know how to call into its DLL to
- // do its lexing and folding, we tell it here.
- lex->SetExternal(fnFactory, i);
- }
- }
- }
-}
-
-LexerLibrary::~LexerLibrary() {
-}
-
-//------------------------------------------
-//
-// LexerManager
-//
-//------------------------------------------
-
-/// Return the single LexerManager instance...
-LexerManager *LexerManager::GetInstance() {
- if (!theInstance)
- theInstance.reset(new LexerManager);
- return theInstance.get();
-}
-
-/// Delete any LexerManager instance...
-void LexerManager::DeleteInstance() noexcept {
- theInstance.reset();
-}
-
-/// protected constructor - this is a singleton...
-LexerManager::LexerManager() {
-}
-
-LexerManager::~LexerManager() {
- Clear();
-}
-
-void LexerManager::Load(const char *path) {
- for (const std::unique_ptr<LexerLibrary> &ll : libraries) {
- if (ll->moduleName == path)
- return;
- }
- libraries.push_back(std::make_unique<LexerLibrary>(path));
-}
-
-void LexerManager::Clear() noexcept {
- libraries.clear();
-}
-
-//------------------------------------------
-//
-// LMMinder -- trigger to clean up at exit.
-//
-//------------------------------------------
-
-LMMinder::~LMMinder() {
- LexerManager::DeleteInstance();
-}
-
-LMMinder minder;
-
-}
-
-namespace Scintilla {
-
-void ExternalLexerLoad(const char *path) {
- LexerManager::GetInstance()->Load(path);
-}
-
-}