diff options
author | nyamatongwe <unknown> | 2010-07-13 21:24:26 +1000 |
---|---|---|
committer | nyamatongwe <unknown> | 2010-07-13 21:24:26 +1000 |
commit | c0247be1cde4c927b987edff2243524cea28d547 (patch) | |
tree | 482fac70e504ac105d36898d359c5992cea8e4c8 /lexlib/LexerModule.cxx | |
parent | 27a22f2c85e3aa0f540c61a0a245a0d759e706a9 (diff) | |
download | scintilla-mirror-c0247be1cde4c927b987edff2243524cea28d547.tar.gz |
New files for new lexer implementation.
Diffstat (limited to 'lexlib/LexerModule.cxx')
-rw-r--r-- | lexlib/LexerModule.cxx | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/lexlib/LexerModule.cxx b/lexlib/LexerModule.cxx new file mode 100644 index 000000000..defc86356 --- /dev/null +++ b/lexlib/LexerModule.cxx @@ -0,0 +1,121 @@ +// Scintilla source code edit control +/** @file LexerModule.cxx + ** Colourise for particular languages. + **/ +// Copyright 1998-2010 by Neil Hodgson <neilh@scintilla.org> +// The License.txt file describes the conditions under which this software may be distributed. + +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include <stdarg.h> +#include <assert.h> +#include <ctype.h> + +#include <string> + +#include "ILexer.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#include "PropSetSimple.h" +#include "WordList.h" +#include "LexAccessor.h" +#include "Accessor.h" +#include "LexerModule.h" +#include "LexerBase.h" +#include "LexerSimple.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +LexerModule::LexerModule(int language_, + LexerFunction fnLexer_, + const char *languageName_, + LexerFunction fnFolder_, + const char *const wordListDescriptions_[], + int styleBits_) : + language(language_), + fnLexer(fnLexer_), + fnFolder(fnFolder_), + fnFactory(0), + wordListDescriptions(wordListDescriptions_), + styleBits(styleBits_), + languageName(languageName_) { +} + +LexerModule::LexerModule(int language_, + LexerFactoryFunction fnFactory_, + const char *languageName_, + const char * const wordListDescriptions_[], + int styleBits_) : + language(language_), + fnLexer(0), + fnFolder(0), + fnFactory(fnFactory_), + wordListDescriptions(wordListDescriptions_), + styleBits(styleBits_), + languageName(languageName_) { +} + +int LexerModule::GetNumWordLists() const { + if (wordListDescriptions == NULL) { + return -1; + } else { + int numWordLists = 0; + + while (wordListDescriptions[numWordLists]) { + ++numWordLists; + } + + return numWordLists; + } +} + +const char *LexerModule::GetWordListDescription(int index) const { + static const char *emptyStr = ""; + + assert(index < GetNumWordLists()); + if (index >= GetNumWordLists()) { + return emptyStr; + } else { + return wordListDescriptions[index]; + } +} + +int LexerModule::GetStyleBitsNeeded() const { + return styleBits; +} + +ILexer *LexerModule::Create() const { + if (fnFactory) + return fnFactory(); + else + return new LexerSimple(this); +} + +void LexerModule::Lex(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler) const { + if (fnLexer) + fnLexer(startPos, lengthDoc, initStyle, keywordlists, styler); +} + +void LexerModule::Fold(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler) const { + if (fnFolder) { + int lineCurrent = styler.GetLine(startPos); + // Move back one line in case deletion wrecked current line fold state + if (lineCurrent > 0) { + lineCurrent--; + int newStartPos = styler.LineStart(lineCurrent); + lengthDoc += startPos - newStartPos; + startPos = newStartPos; + initStyle = 0; + if (startPos > 0) { + initStyle = styler.StyleAt(startPos - 1); + } + } + fnFolder(startPos, lengthDoc, initStyle, keywordlists, styler); + } +} |