You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
221 lines
5.4 KiB
221 lines
5.4 KiB
// 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(lmConf); |
|
LINK_LEXER(lmCPP); |
|
LINK_LEXER(lmCPPNoCase); |
|
LINK_LEXER(lmCsound); |
|
LINK_LEXER(lmCss); |
|
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; |
|
}
|
|
|