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); +	} +} | 
