224 lines
5.4 KiB
C++
224 lines
5.4 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"
|
||
|
|
||
|
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(lmAda);
|
||
|
LINK_LEXER(lmAns1);
|
||
|
LINK_LEXER(lmAPDL);
|
||
|
LINK_LEXER(lmAsm);
|
||
|
LINK_LEXER(lmASP);
|
||
|
LINK_LEXER(lmAU3);
|
||
|
LINK_LEXER(lmAVE);
|
||
|
LINK_LEXER(lmBaan);
|
||
|
LINK_LEXER(lmBash);
|
||
|
LINK_LEXER(lmBatch);
|
||
|
LINK_LEXER(lmBlitzBasic);
|
||
|
LINK_LEXER(lmBullant);
|
||
|
LINK_LEXER(lmCaml);
|
||
|
LINK_LEXER(lmClw);
|
||
|
LINK_LEXER(lmClwNoCase);
|
||
|
LINK_LEXER(lmCmake);
|
||
|
LINK_LEXER(lmConf);
|
||
|
LINK_LEXER(lmCPP);
|
||
|
LINK_LEXER(lmCPPNoCase);
|
||
|
LINK_LEXER(lmCsound);
|
||
|
LINK_LEXER(lmCss);
|
||
|
LINK_LEXER(lmD);
|
||
|
LINK_LEXER(lmDiff);
|
||
|
LINK_LEXER(lmEiffel);
|
||
|
LINK_LEXER(lmEiffelkw);
|
||
|
LINK_LEXER(lmErlang);
|
||
|
LINK_LEXER(lmErrorList);
|
||
|
LINK_LEXER(lmESCRIPT);
|
||
|
LINK_LEXER(lmF77);
|
||
|
LINK_LEXER(lmFlagShip);
|
||
|
LINK_LEXER(lmForth);
|
||
|
LINK_LEXER(lmFortran);
|
||
|
LINK_LEXER(lmFreeBasic);
|
||
|
LINK_LEXER(lmGui4Cli);
|
||
|
LINK_LEXER(lmHaskell);
|
||
|
LINK_LEXER(lmHTML);
|
||
|
LINK_LEXER(lmInno);
|
||
|
LINK_LEXER(lmKix);
|
||
|
LINK_LEXER(lmLatex);
|
||
|
LINK_LEXER(lmLISP);
|
||
|
LINK_LEXER(lmLot);
|
||
|
LINK_LEXER(lmLout);
|
||
|
LINK_LEXER(lmLua);
|
||
|
LINK_LEXER(lmMake);
|
||
|
LINK_LEXER(lmMatlab);
|
||
|
LINK_LEXER(lmMETAPOST);
|
||
|
LINK_LEXER(lmMMIXAL);
|
||
|
LINK_LEXER(lmMSSQL);
|
||
|
LINK_LEXER(lmNncrontab);
|
||
|
LINK_LEXER(lmNsis);
|
||
|
LINK_LEXER(lmNull);
|
||
|
LINK_LEXER(lmOctave);
|
||
|
LINK_LEXER(lmOpal);
|
||
|
LINK_LEXER(lmPascal);
|
||
|
LINK_LEXER(lmPB);
|
||
|
LINK_LEXER(lmPerl);
|
||
|
LINK_LEXER(lmPHP);
|
||
|
LINK_LEXER(lmPHPSCRIPT);
|
||
|
LINK_LEXER(lmPOV);
|
||
|
LINK_LEXER(lmProps);
|
||
|
LINK_LEXER(lmPS);
|
||
|
LINK_LEXER(lmPureBasic);
|
||
|
LINK_LEXER(lmPython);
|
||
|
LINK_LEXER(lmREBOL);
|
||
|
LINK_LEXER(lmRuby);
|
||
|
LINK_LEXER(lmScriptol);
|
||
|
LINK_LEXER(lmSmalltalk);
|
||
|
LINK_LEXER(lmSpecman);
|
||
|
LINK_LEXER(lmSpice);
|
||
|
LINK_LEXER(lmSQL);
|
||
|
LINK_LEXER(lmTADS3);
|
||
|
LINK_LEXER(lmTCL);
|
||
|
LINK_LEXER(lmTeX);
|
||
|
LINK_LEXER(lmVB);
|
||
|
LINK_LEXER(lmVBScript);
|
||
|
LINK_LEXER(lmVerilog);
|
||
|
LINK_LEXER(lmVHDL);
|
||
|
LINK_LEXER(lmXML);
|
||
|
LINK_LEXER(lmYAML);
|
||
|
|
||
|
//--Autogenerated -- end of automatically generated section
|
||
|
|
||
|
return 1;
|
||
|
}
|