diff options
Diffstat (limited to 'win32/ExternalLexer.cxx')
| -rw-r--r-- | win32/ExternalLexer.cxx | 312 |
1 files changed, 0 insertions, 312 deletions
diff --git a/win32/ExternalLexer.cxx b/win32/ExternalLexer.cxx deleted file mode 100644 index 41cc812bc..000000000 --- a/win32/ExternalLexer.cxx +++ /dev/null @@ -1,312 +0,0 @@ -// Scintilla source code edit control -/** @file ExternalLexer.cxx - ** Support external lexers in DLLs. - **/ -// 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 <stdlib.h> -#include <stdio.h> -#include <ctype.h> - -#define _WIN32_WINNT 0x0400 -#include <windows.h> - -#include "Platform.h" -#include "SciLexer.h" -#include "PropSet.h" -#include "Accessor.h" -#include "DocumentAccessor.h" -#include "KeyWords.h" -#include "ExternalLexer.h" - -// Initialise the static vars... -int LexerManager::UseCount = 0; -LexerLibrary *LexerManager::first = NULL; -LexerLibrary *LexerManager::last = NULL; -LexerManager *LexerManager::firstlm = NULL; - -//------------------------------------------ -// -// ExternalLexerModule -// -//------------------------------------------ - -char **WordListsToStrings(WordList *val[]) { - int dim = 0; - while (val[dim]) - dim++; - char **wls = new char * [dim + 1]; - for (int i = 0;i < dim;i++) { - SString words; - words = ""; - for (int n = 0; n < val[i]->len; n++) { - words += val[i]->words[n]; - if (n != val[i]->len - 1) - words += " "; - } - wls[i] = new char[words.length() + 1]; - strcpy(wls[i], words.c_str()); - } - wls[dim] = 0; - return wls; -} - -void DeleteWLStrings(char *strs[]) { - int dim = 0; - while (strs[dim]) { - delete strs[dim]; - dim++; - } - delete [] strs; -} - -void ExternalLexerModule::Lex(unsigned int startPos, int lengthDoc, int initStyle, - WordList *keywordlists[], Accessor &styler) const { - if (!fneLexer) - return ; - - char **kwds = WordListsToStrings(keywordlists); - char *ps = styler.GetProperties(); - - // The accessor passed in is always a DocumentAccessor so this cast and the subsequent - // access will work. Can not use the stricter dynamic_cast as that requires RTTI. - DocumentAccessor &da = static_cast<DocumentAccessor &>(styler); - WindowID wID = da.GetWindow(); - - fneLexer(externalLanguage, startPos, lengthDoc, initStyle, kwds, wID, ps); - - delete ps; - DeleteWLStrings(kwds); -} - -void ExternalLexerModule::Fold(unsigned int startPos, int lengthDoc, int initStyle, - WordList *keywordlists[], Accessor &styler) const { - if (!fneFolder) - return ; - - char **kwds = WordListsToStrings(keywordlists); - char *ps = styler.GetProperties(); - - // The accessor passed in is always a DocumentAccessor so this cast and the subsequent - // access will work. Can not use the stricter dynamic_cast as that requires RTTI. - DocumentAccessor &da = static_cast<DocumentAccessor &>(styler); - WindowID wID = da.GetWindow(); - - fneFolder(externalLanguage, startPos, lengthDoc, initStyle, kwds, wID, ps); - - delete ps; - DeleteWLStrings(kwds); -} - -void ExternalLexerModule::SetExternal(ExtLexerFunction fLexer, ExtFoldFunction fFolder, int index) { - fneLexer = fLexer; - fneFolder = fFolder; - externalLanguage = index; -} - -//------------------------------------------ -// -// LexerLibrary -// -//------------------------------------------ - -LexerLibrary::LexerLibrary(LPCTSTR ModuleName) { - // Initialise some members... - first = NULL; - last = NULL; - - // Load the DLL - m_hModule = LoadLibrary(ModuleName); - if (m_hModule) { - m_sModuleName = ModuleName; - GetLexerCountFn GetLexerCount = (GetLexerCountFn)GetProcAddress(m_hModule, "GetLexerCount"); - - if (GetLexerCount) { - ExternalLexerModule *lex; - LexerMinder *lm; - - // Find functions in the DLL - GetLexerNameFn GetLexerName = (GetLexerNameFn)GetProcAddress(m_hModule, "GetLexerName"); - ExtLexerFunction Lexer = (ExtLexerFunction)GetProcAddress(m_hModule, "Lex"); - ExtFoldFunction Folder = (ExtFoldFunction)GetProcAddress(m_hModule, "Fold"); - - // Assign a buffer for the lexer name. - char lexname[100]; - strcpy(lexname, ""); - - int nl = GetLexerCount(); - - for (int i = 0; i < nl; i++) { - GetLexerName(i, lexname, 100); - lex = new ExternalLexerModule(SCLEX_AUTOMATIC, NULL, lexname, NULL); - - // Create a LexerMinder so we don't leak the ExternalLexerModule... - lm = new LexerMinder; - lm->self = lex; - lm->next = NULL; - if (first != NULL) { - last->next = lm; - last = lm; - } else { - first = lm; - last = lm; - } - - // The external lexer needs to know how to call into its DLL to - // do its lexing and folding, we tell it here. Folder may be null. - lex->SetExternal(Lexer, Folder, i); - - } - } - } - next = NULL; -} - -LexerLibrary::~LexerLibrary() { - Release(); -} - -void LexerLibrary::Release() { - //TODO maintain a list of lexers created, and delete them! - LexerMinder *lm; - LexerMinder *next; - lm = first; - while (NULL != lm) { - next = lm->next; - delete lm->self; - delete lm; - lm = next; - } - - first = NULL; - last = NULL; - - // Release the DLL - if (NULL != m_hModule) { - FreeLibrary(m_hModule); - } -} - -//------------------------------------------ -// -// LexerManager -// -//------------------------------------------ - -int FindLastSlash(char *inp) { - int ret = -1; - for (int i = static_cast<int>(strlen(inp)) - 1; i >= 0; i--) { - if (inp[i] == '\\' || inp[i] == '/') { - // if you don't like break: - /* - if (ret == -1) - */ - ret = i; - break; - } - } - return ret; -} - -LexerManager::LexerManager() { - - UseCount++; - if (1 == UseCount) { - firstlm = this; - m_bLoaded = false; - } -} - -void LexerManager::EnumerateLexers() { - HANDLE hFind; - WIN32_FIND_DATA FindFileData; - - char path[MAX_PATH + 1]; - - GetModuleFileName(GetModuleHandle(NULL), path, MAX_PATH); - - int i = FindLastSlash(path); - - if (i == -1) - i = static_cast<int>(strlen(path)); - - SString sPath(path, 0, i); - - // Ensure a trailing slash... - if ( sPath[sPath.size() - 1] != '/' && sPath[sPath.size() - 1] != '\\' ) { - sPath += '\\'; - } - - SString sPattern(sPath); - sPattern += "*.lexer"; - - hFind = FindFirstFile(sPattern.c_str(), &FindFileData); - if (hFind != INVALID_HANDLE_VALUE) { - //Found the first file... - BOOL found = TRUE; - SString to_open; - - while (found) { - to_open = sPath; - to_open += FindFileData.cFileName; - LexerLibrary *lib = new LexerLibrary(to_open.c_str()); - if (NULL != first) { - last->next = lib; - last = lib; - } else { - first = lib; - last = lib; - } - found = FindNextFile(hFind, &FindFileData); - } - - FindClose(hFind); - - } -} - -LexerManager::~LexerManager() { - // If this is the last LexerManager to be freed then - // we delete all of our LexerLibrarys. - UseCount--; - if (0 == UseCount) { - if (NULL != first) { - LexerLibrary *cur = first; - LexerLibrary *next = first->next; - while (cur) { - delete cur; - cur = next; - } - first = NULL; - last = NULL; - } - } - if (this == firstlm) - firstlm = NULL; -} - -void LexerManager::Load() -{ - if(!m_bLoaded) - { - m_bLoaded = true; - EnumerateLexers(); - } -} - -// Return a LexerManager, or create one and then return it. -LexerManager *LexerManager::GetInstance() { - if(!firstlm) - firstlm = new LexerManager; - return firstlm; -} - -LMMinder::~LMMinder() -{ - LexerManager *rem = LexerManager::firstlm; - if(rem) - delete rem; -} - -LMMinder minder; |
