a163a443cc
git-svn-id: https://geany.svn.sourceforge.net/svnroot/geany/trunk@3203 ea778897-0a13-0410-b9d1-a72fbfd435f5
178 lines
4.1 KiB
C++
178 lines
4.1 KiB
C++
// Scintilla source code edit control
|
|
/** @file KeyWords.cxx
|
|
** Colourise for particular languages.
|
|
**/
|
|
// Copyright 1998-2002 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 <ctype.h>
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
|
|
#include "Platform.h"
|
|
|
|
#include "PropSet.h"
|
|
#include "Accessor.h"
|
|
#include "KeyWords.h"
|
|
#include "Scintilla.h"
|
|
#include "SciLexer.h"
|
|
|
|
#ifdef SCI_NAMESPACE
|
|
using namespace Scintilla;
|
|
#endif
|
|
|
|
const LexerModule *LexerModule::base = 0;
|
|
int LexerModule::nextLanguage = SCLEX_AUTOMATIC+1;
|
|
|
|
LexerModule::LexerModule(int language_,
|
|
LexerFunction fnLexer_,
|
|
const char *languageName_,
|
|
LexerFunction fnFolder_,
|
|
const char * const wordListDescriptions_[],
|
|
int styleBits_) :
|
|
language(language_),
|
|
fnLexer(fnLexer_),
|
|
fnFolder(fnFolder_),
|
|
wordListDescriptions(wordListDescriptions_),
|
|
styleBits(styleBits_),
|
|
languageName(languageName_) {
|
|
next = base;
|
|
base = this;
|
|
if (language == SCLEX_AUTOMATIC) {
|
|
language = nextLanguage;
|
|
nextLanguage++;
|
|
}
|
|
}
|
|
|
|
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 = "";
|
|
|
|
PLATFORM_ASSERT(index < GetNumWordLists());
|
|
if (index >= GetNumWordLists()) {
|
|
return emptyStr;
|
|
} else {
|
|
return wordListDescriptions[index];
|
|
}
|
|
}
|
|
|
|
int LexerModule::GetStyleBitsNeeded() const {
|
|
return styleBits;
|
|
}
|
|
|
|
const LexerModule *LexerModule::Find(int language) {
|
|
const LexerModule *lm = base;
|
|
while (lm) {
|
|
if (lm->language == language) {
|
|
return lm;
|
|
}
|
|
lm = lm->next;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
const LexerModule *LexerModule::Find(const char *languageName) {
|
|
if (languageName) {
|
|
const LexerModule *lm = base;
|
|
while (lm) {
|
|
if (lm->languageName && 0 == strcmp(lm->languageName, languageName)) {
|
|
return lm;
|
|
}
|
|
lm = lm->next;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
// Alternative historical name for Scintilla_LinkLexers
|
|
int wxForceScintillaLexers(void) {
|
|
return Scintilla_LinkLexers();
|
|
}
|
|
|
|
// To add or remove a lexer, add or remove its file and run LexGen.py.
|
|
|
|
// Force a reference to all of the Scintilla lexers so that the linker will
|
|
// not remove the code of the lexers.
|
|
int Scintilla_LinkLexers() {
|
|
static int forcer = 0;
|
|
|
|
// Shorten the code that declares a lexer and ensures it is linked in by calling a method.
|
|
#define LINK_LEXER(lexer) extern LexerModule lexer; forcer += lexer.GetLanguage();
|
|
|
|
//++Autogenerated -- run src/LexGen.py to regenerate
|
|
//**\(\tLINK_LEXER(\*);\n\)
|
|
LINK_LEXER(lmAsm);
|
|
LINK_LEXER(lmBash);
|
|
LINK_LEXER(lmFreeBasic);
|
|
LINK_LEXER(lmCaml);
|
|
LINK_LEXER(lmCPP);
|
|
LINK_LEXER(lmCss);
|
|
LINK_LEXER(lmD);
|
|
LINK_LEXER(lmDiff);
|
|
LINK_LEXER(lmF77);
|
|
LINK_LEXER(lmFortran);
|
|
LINK_LEXER(lmHaskell);
|
|
LINK_LEXER(lmHTML);
|
|
LINK_LEXER(lmLatex);
|
|
LINK_LEXER(lmLua);
|
|
LINK_LEXER(lmMake);
|
|
LINK_LEXER(lmMatlab);
|
|
LINK_LEXER(lmNull);
|
|
LINK_LEXER(lmOMS);
|
|
LINK_LEXER(lmPascal);
|
|
LINK_LEXER(lmPerl);
|
|
LINK_LEXER(lmPo);
|
|
LINK_LEXER(lmProps);
|
|
LINK_LEXER(lmPython);
|
|
LINK_LEXER(lmR);
|
|
LINK_LEXER(lmRuby);
|
|
LINK_LEXER(lmSQL);
|
|
LINK_LEXER(lmTCL);
|
|
LINK_LEXER(lmVHDL);
|
|
LINK_LEXER(lmXML);
|
|
|
|
//--Autogenerated -- end of automatically generated section
|
|
|
|
return 1;
|
|
}
|