]> git.saurik.com Git - wxWidgets.git/blob - src/stc/scintilla/src/KeyWords.cxx
0728580fdfeb69c50b434c377f58726b7ed659ca
[wxWidgets.git] / src / stc / scintilla / src / KeyWords.cxx
1 // Scintilla source code edit control
2 /** @file KeyWords.cxx
3 ** Colourise for particular languages.
4 **/
5 // Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
6 // The License.txt file describes the conditions under which this software may be distributed.
7
8 #include <stdlib.h>
9 #include <string.h>
10 #include <ctype.h>
11 #include <stdio.h>
12 #include <stdarg.h>
13
14 #include "Platform.h"
15
16 #include "PropSet.h"
17 #include "Accessor.h"
18 #include "KeyWords.h"
19 #include "Scintilla.h"
20 #include "SciLexer.h"
21
22 LexerModule *LexerModule::base = 0;
23 int LexerModule::nextLanguage = SCLEX_AUTOMATIC+1;
24
25 LexerModule::LexerModule(int language_, LexerFunction fnLexer_,
26 const char *languageName_, LexerFunction fnFolder_) :
27 language(language_),
28 languageName(languageName_),
29 fnLexer(fnLexer_),
30 fnFolder(fnFolder_) {
31 next = base;
32 base = this;
33 if (language == SCLEX_AUTOMATIC) {
34 language = nextLanguage;
35 nextLanguage++;
36 }
37 }
38
39 LexerModule *LexerModule::Find(int language) {
40 LexerModule *lm = base;
41 while (lm) {
42 if (lm->language == language) {
43 return lm;
44 }
45 lm = lm->next;
46 }
47 return 0;
48 }
49
50 LexerModule *LexerModule::Find(const char *languageName) {
51 if (languageName) {
52 LexerModule *lm = base;
53 while (lm) {
54 if (lm->languageName && 0 == strcmp(lm->languageName, languageName)) {
55 return lm;
56 }
57 lm = lm->next;
58 }
59 }
60 return 0;
61 }
62
63 void LexerModule::Lex(unsigned int startPos, int lengthDoc, int initStyle,
64 WordList *keywordlists[], Accessor &styler) {
65 if (fnLexer)
66 fnLexer(startPos, lengthDoc, initStyle, keywordlists, styler);
67 }
68
69 void LexerModule::Fold(unsigned int startPos, int lengthDoc, int initStyle,
70 WordList *keywordlists[], Accessor &styler) {
71 if (fnFolder) {
72 int lineCurrent = styler.GetLine(startPos);
73 // Move back one line in case deletion wrecked current line fold state
74 if (lineCurrent > 0) {
75 lineCurrent--;
76 int newStartPos = styler.LineStart(lineCurrent);
77 lengthDoc += startPos - newStartPos;
78 startPos = newStartPos;
79 initStyle = 0;
80 if (startPos > 0) {
81 initStyle = styler.StyleAt(startPos - 1);
82 }
83 }
84 fnFolder(startPos, lengthDoc, initStyle, keywordlists, styler);
85 }
86 }
87
88 static void ColouriseNullDoc(unsigned int startPos, int length, int, WordList *[],
89 Accessor &styler) {
90 // Null language means all style bytes are 0 so just mark the end - no need to fill in.
91 if (length > 0) {
92 styler.StartAt(startPos + length - 1);
93 styler.StartSegment(startPos + length - 1);
94 styler.ColourTo(startPos + length - 1, 0);
95 }
96 }
97
98 LexerModule lmNull(SCLEX_NULL, ColouriseNullDoc, "null");
99
100 #ifdef __vms
101
102 // The following code forces a reference to all of the Scintilla lexers.
103 // If we don't do something like this, then the linker tends to "optimize"
104 // them away. (eric@sourcegear.com)
105
106 // Taken from wxWindow's stc.cpp. Walter.
107
108 int wxForceScintillaLexers(void) {
109 extern LexerModule lmAda;
110 extern LexerModule lmAVE;
111 extern LexerModule lmConf;
112 extern LexerModule lmDiff;
113 extern LexerModule lmLatex;
114 extern LexerModule lmPascal;
115 extern LexerModule lmCPP;
116 extern LexerModule lmHTML;
117 extern LexerModule lmXML;
118 extern LexerModule lmProps;
119 extern LexerModule lmErrorList;
120 extern LexerModule lmMake;
121 extern LexerModule lmBatch;
122 extern LexerModule lmPerl;
123 extern LexerModule lmPython;
124 extern LexerModule lmSQL;
125 extern LexerModule lmVB;
126 extern LexerModule lmRuby;
127
128 if (
129 &lmAda
130 && &lmAVE
131 && &lmConf
132 && &lmDiff
133 && &lmLatex
134 && &lmPascal
135 && &lmCPP
136 && &lmHTML
137 && &lmXML
138 && &lmProps
139 && &lmErrorList
140 && &lmMake
141 && &lmBatch
142 && &lmPerl
143 && &lmPython
144 && &lmSQL
145 && &lmVB
146 && &lmRuby
147 )
148 {
149 return 1;
150 }
151 else
152 {
153 return 0;
154 }
155 }
156 #endif