1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski *
3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file
5*b1cdbd2cSJim Jagielski * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file
7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski *
11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the
17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski * under the License.
19*b1cdbd2cSJim Jagielski *
20*b1cdbd2cSJim Jagielski *************************************************************/
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_svtools.hxx"
26*b1cdbd2cSJim Jagielski
27*b1cdbd2cSJim Jagielski #include <svtools/syntaxhighlight.hxx>
28*b1cdbd2cSJim Jagielski
29*b1cdbd2cSJim Jagielski #include <unotools/charclass.hxx>
30*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
31*b1cdbd2cSJim Jagielski
32*b1cdbd2cSJim Jagielski
33*b1cdbd2cSJim Jagielski // ##########################################################################
34*b1cdbd2cSJim Jagielski // ATTENTION: all these words needs to be in small caps
35*b1cdbd2cSJim Jagielski // ##########################################################################
36*b1cdbd2cSJim Jagielski static const char* strListBasicKeyWords[] = {
37*b1cdbd2cSJim Jagielski "access",
38*b1cdbd2cSJim Jagielski "alias",
39*b1cdbd2cSJim Jagielski "and",
40*b1cdbd2cSJim Jagielski "any",
41*b1cdbd2cSJim Jagielski "append",
42*b1cdbd2cSJim Jagielski "as",
43*b1cdbd2cSJim Jagielski "base",
44*b1cdbd2cSJim Jagielski "binary",
45*b1cdbd2cSJim Jagielski "boolean",
46*b1cdbd2cSJim Jagielski "byref",
47*b1cdbd2cSJim Jagielski "byte",
48*b1cdbd2cSJim Jagielski "byval",
49*b1cdbd2cSJim Jagielski "call",
50*b1cdbd2cSJim Jagielski "case",
51*b1cdbd2cSJim Jagielski "cdecl",
52*b1cdbd2cSJim Jagielski "classmodule",
53*b1cdbd2cSJim Jagielski "close",
54*b1cdbd2cSJim Jagielski "compare",
55*b1cdbd2cSJim Jagielski "compatible",
56*b1cdbd2cSJim Jagielski "const",
57*b1cdbd2cSJim Jagielski "currency",
58*b1cdbd2cSJim Jagielski "date",
59*b1cdbd2cSJim Jagielski "declare",
60*b1cdbd2cSJim Jagielski "defbool",
61*b1cdbd2cSJim Jagielski "defcur",
62*b1cdbd2cSJim Jagielski "defdate",
63*b1cdbd2cSJim Jagielski "defdbl",
64*b1cdbd2cSJim Jagielski "deferr",
65*b1cdbd2cSJim Jagielski "defint",
66*b1cdbd2cSJim Jagielski "deflng",
67*b1cdbd2cSJim Jagielski "defobj",
68*b1cdbd2cSJim Jagielski "defsng",
69*b1cdbd2cSJim Jagielski "defstr",
70*b1cdbd2cSJim Jagielski "defvar",
71*b1cdbd2cSJim Jagielski "dim",
72*b1cdbd2cSJim Jagielski "do",
73*b1cdbd2cSJim Jagielski "double",
74*b1cdbd2cSJim Jagielski "each",
75*b1cdbd2cSJim Jagielski "else",
76*b1cdbd2cSJim Jagielski "elseif",
77*b1cdbd2cSJim Jagielski "end",
78*b1cdbd2cSJim Jagielski "end enum",
79*b1cdbd2cSJim Jagielski "end function",
80*b1cdbd2cSJim Jagielski "end if",
81*b1cdbd2cSJim Jagielski "end select",
82*b1cdbd2cSJim Jagielski "end sub",
83*b1cdbd2cSJim Jagielski "end type",
84*b1cdbd2cSJim Jagielski "endif",
85*b1cdbd2cSJim Jagielski "enum",
86*b1cdbd2cSJim Jagielski "eqv",
87*b1cdbd2cSJim Jagielski "erase",
88*b1cdbd2cSJim Jagielski "error",
89*b1cdbd2cSJim Jagielski "exit",
90*b1cdbd2cSJim Jagielski "explicit",
91*b1cdbd2cSJim Jagielski "for",
92*b1cdbd2cSJim Jagielski "function",
93*b1cdbd2cSJim Jagielski "get",
94*b1cdbd2cSJim Jagielski "global",
95*b1cdbd2cSJim Jagielski "gosub",
96*b1cdbd2cSJim Jagielski "goto",
97*b1cdbd2cSJim Jagielski "if",
98*b1cdbd2cSJim Jagielski "imp",
99*b1cdbd2cSJim Jagielski "implements",
100*b1cdbd2cSJim Jagielski "in",
101*b1cdbd2cSJim Jagielski "input",
102*b1cdbd2cSJim Jagielski "integer",
103*b1cdbd2cSJim Jagielski "is",
104*b1cdbd2cSJim Jagielski "let",
105*b1cdbd2cSJim Jagielski "lib",
106*b1cdbd2cSJim Jagielski "like",
107*b1cdbd2cSJim Jagielski "line",
108*b1cdbd2cSJim Jagielski "line input",
109*b1cdbd2cSJim Jagielski "local",
110*b1cdbd2cSJim Jagielski "lock",
111*b1cdbd2cSJim Jagielski "long",
112*b1cdbd2cSJim Jagielski "loop",
113*b1cdbd2cSJim Jagielski "lprint",
114*b1cdbd2cSJim Jagielski "lset",
115*b1cdbd2cSJim Jagielski "mod",
116*b1cdbd2cSJim Jagielski "name",
117*b1cdbd2cSJim Jagielski "new",
118*b1cdbd2cSJim Jagielski "next",
119*b1cdbd2cSJim Jagielski "not",
120*b1cdbd2cSJim Jagielski "object",
121*b1cdbd2cSJim Jagielski "on",
122*b1cdbd2cSJim Jagielski "open",
123*b1cdbd2cSJim Jagielski "option",
124*b1cdbd2cSJim Jagielski "optional",
125*b1cdbd2cSJim Jagielski "or",
126*b1cdbd2cSJim Jagielski "output",
127*b1cdbd2cSJim Jagielski "preserve",
128*b1cdbd2cSJim Jagielski "print",
129*b1cdbd2cSJim Jagielski "private",
130*b1cdbd2cSJim Jagielski "property",
131*b1cdbd2cSJim Jagielski "public",
132*b1cdbd2cSJim Jagielski "random",
133*b1cdbd2cSJim Jagielski "read",
134*b1cdbd2cSJim Jagielski "redim",
135*b1cdbd2cSJim Jagielski "rem",
136*b1cdbd2cSJim Jagielski "resume",
137*b1cdbd2cSJim Jagielski "return",
138*b1cdbd2cSJim Jagielski "rset",
139*b1cdbd2cSJim Jagielski "select",
140*b1cdbd2cSJim Jagielski "set",
141*b1cdbd2cSJim Jagielski "shared",
142*b1cdbd2cSJim Jagielski "single",
143*b1cdbd2cSJim Jagielski "static",
144*b1cdbd2cSJim Jagielski "step",
145*b1cdbd2cSJim Jagielski "stop",
146*b1cdbd2cSJim Jagielski "string",
147*b1cdbd2cSJim Jagielski "sub",
148*b1cdbd2cSJim Jagielski "system",
149*b1cdbd2cSJim Jagielski "text",
150*b1cdbd2cSJim Jagielski "then",
151*b1cdbd2cSJim Jagielski "to",
152*b1cdbd2cSJim Jagielski "type",
153*b1cdbd2cSJim Jagielski "typeof",
154*b1cdbd2cSJim Jagielski "until",
155*b1cdbd2cSJim Jagielski "variant",
156*b1cdbd2cSJim Jagielski "wend",
157*b1cdbd2cSJim Jagielski "while",
158*b1cdbd2cSJim Jagielski "with",
159*b1cdbd2cSJim Jagielski "write",
160*b1cdbd2cSJim Jagielski "xor"
161*b1cdbd2cSJim Jagielski };
162*b1cdbd2cSJim Jagielski
163*b1cdbd2cSJim Jagielski
164*b1cdbd2cSJim Jagielski static const char* strListSqlKeyWords[] = {
165*b1cdbd2cSJim Jagielski "all",
166*b1cdbd2cSJim Jagielski "and",
167*b1cdbd2cSJim Jagielski "any",
168*b1cdbd2cSJim Jagielski "as",
169*b1cdbd2cSJim Jagielski "asc",
170*b1cdbd2cSJim Jagielski "avg",
171*b1cdbd2cSJim Jagielski "between",
172*b1cdbd2cSJim Jagielski "by",
173*b1cdbd2cSJim Jagielski "cast",
174*b1cdbd2cSJim Jagielski "corresponding",
175*b1cdbd2cSJim Jagielski "count",
176*b1cdbd2cSJim Jagielski "create",
177*b1cdbd2cSJim Jagielski "cross",
178*b1cdbd2cSJim Jagielski "delete",
179*b1cdbd2cSJim Jagielski "desc",
180*b1cdbd2cSJim Jagielski "distinct",
181*b1cdbd2cSJim Jagielski "drop",
182*b1cdbd2cSJim Jagielski "escape",
183*b1cdbd2cSJim Jagielski "except",
184*b1cdbd2cSJim Jagielski "exists",
185*b1cdbd2cSJim Jagielski "false",
186*b1cdbd2cSJim Jagielski "from",
187*b1cdbd2cSJim Jagielski "full",
188*b1cdbd2cSJim Jagielski "global",
189*b1cdbd2cSJim Jagielski "group",
190*b1cdbd2cSJim Jagielski "having",
191*b1cdbd2cSJim Jagielski "in",
192*b1cdbd2cSJim Jagielski "inner",
193*b1cdbd2cSJim Jagielski "insert",
194*b1cdbd2cSJim Jagielski "intersect",
195*b1cdbd2cSJim Jagielski "into",
196*b1cdbd2cSJim Jagielski "is",
197*b1cdbd2cSJim Jagielski "join",
198*b1cdbd2cSJim Jagielski "left",
199*b1cdbd2cSJim Jagielski "like",
200*b1cdbd2cSJim Jagielski "local",
201*b1cdbd2cSJim Jagielski "match",
202*b1cdbd2cSJim Jagielski "max",
203*b1cdbd2cSJim Jagielski "min",
204*b1cdbd2cSJim Jagielski "natural",
205*b1cdbd2cSJim Jagielski "not",
206*b1cdbd2cSJim Jagielski "null",
207*b1cdbd2cSJim Jagielski "on",
208*b1cdbd2cSJim Jagielski "or",
209*b1cdbd2cSJim Jagielski "order",
210*b1cdbd2cSJim Jagielski "outer",
211*b1cdbd2cSJim Jagielski "right",
212*b1cdbd2cSJim Jagielski "select",
213*b1cdbd2cSJim Jagielski "set",
214*b1cdbd2cSJim Jagielski "some",
215*b1cdbd2cSJim Jagielski "sum",
216*b1cdbd2cSJim Jagielski "table",
217*b1cdbd2cSJim Jagielski "temporary",
218*b1cdbd2cSJim Jagielski "true",
219*b1cdbd2cSJim Jagielski "union",
220*b1cdbd2cSJim Jagielski "unique",
221*b1cdbd2cSJim Jagielski "unknown",
222*b1cdbd2cSJim Jagielski "update",
223*b1cdbd2cSJim Jagielski "using",
224*b1cdbd2cSJim Jagielski "values",
225*b1cdbd2cSJim Jagielski "where"
226*b1cdbd2cSJim Jagielski };
227*b1cdbd2cSJim Jagielski
228*b1cdbd2cSJim Jagielski
compare_strings(const void * arg1,const void * arg2)229*b1cdbd2cSJim Jagielski extern "C" int CDECL compare_strings( const void *arg1, const void *arg2 )
230*b1cdbd2cSJim Jagielski {
231*b1cdbd2cSJim Jagielski return strcmp( (char *)arg1, *(char **)arg2 );
232*b1cdbd2cSJim Jagielski }
233*b1cdbd2cSJim Jagielski
234*b1cdbd2cSJim Jagielski
235*b1cdbd2cSJim Jagielski class LetterTable
236*b1cdbd2cSJim Jagielski {
237*b1cdbd2cSJim Jagielski bool IsLetterTab[256];
238*b1cdbd2cSJim Jagielski
239*b1cdbd2cSJim Jagielski public:
240*b1cdbd2cSJim Jagielski LetterTable( void );
241*b1cdbd2cSJim Jagielski
isLetter(sal_Unicode c)242*b1cdbd2cSJim Jagielski inline bool isLetter( sal_Unicode c )
243*b1cdbd2cSJim Jagielski {
244*b1cdbd2cSJim Jagielski bool bRet = (c < 256) ? IsLetterTab[c] : isLetterUnicode( c );
245*b1cdbd2cSJim Jagielski return bRet;
246*b1cdbd2cSJim Jagielski }
247*b1cdbd2cSJim Jagielski bool isLetterUnicode( sal_Unicode c );
248*b1cdbd2cSJim Jagielski };
249*b1cdbd2cSJim Jagielski
250*b1cdbd2cSJim Jagielski class BasicSimpleCharClass
251*b1cdbd2cSJim Jagielski {
252*b1cdbd2cSJim Jagielski static LetterTable aLetterTable;
253*b1cdbd2cSJim Jagielski
254*b1cdbd2cSJim Jagielski public:
isAlpha(sal_Unicode c,bool bCompatible)255*b1cdbd2cSJim Jagielski static sal_Bool isAlpha( sal_Unicode c, bool bCompatible )
256*b1cdbd2cSJim Jagielski {
257*b1cdbd2cSJim Jagielski sal_Bool bRet = (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
258*b1cdbd2cSJim Jagielski || (bCompatible && aLetterTable.isLetter( c ));
259*b1cdbd2cSJim Jagielski return bRet;
260*b1cdbd2cSJim Jagielski }
261*b1cdbd2cSJim Jagielski
isDigit(sal_Unicode c)262*b1cdbd2cSJim Jagielski static sal_Bool isDigit( sal_Unicode c )
263*b1cdbd2cSJim Jagielski {
264*b1cdbd2cSJim Jagielski sal_Bool bRet = (c >= '0' && c <= '9');
265*b1cdbd2cSJim Jagielski return bRet;
266*b1cdbd2cSJim Jagielski }
267*b1cdbd2cSJim Jagielski
isAlphaNumeric(sal_Unicode c,bool bCompatible)268*b1cdbd2cSJim Jagielski static sal_Bool isAlphaNumeric( sal_Unicode c, bool bCompatible )
269*b1cdbd2cSJim Jagielski {
270*b1cdbd2cSJim Jagielski sal_Bool bRet = isDigit( c ) || isAlpha( c, bCompatible );
271*b1cdbd2cSJim Jagielski return bRet;
272*b1cdbd2cSJim Jagielski }
273*b1cdbd2cSJim Jagielski };
274*b1cdbd2cSJim Jagielski
275*b1cdbd2cSJim Jagielski LetterTable BasicSimpleCharClass::aLetterTable;
276*b1cdbd2cSJim Jagielski
LetterTable(void)277*b1cdbd2cSJim Jagielski LetterTable::LetterTable( void )
278*b1cdbd2cSJim Jagielski {
279*b1cdbd2cSJim Jagielski for( int i = 0 ; i < 256 ; ++i )
280*b1cdbd2cSJim Jagielski IsLetterTab[i] = false;
281*b1cdbd2cSJim Jagielski
282*b1cdbd2cSJim Jagielski IsLetterTab[0xC0] = true; // ?, CAPITAL LETTER A WITH GRAVE ACCENT
283*b1cdbd2cSJim Jagielski IsLetterTab[0xC1] = true; // ?, CAPITAL LETTER A WITH ACUTE ACCENT
284*b1cdbd2cSJim Jagielski IsLetterTab[0xC2] = true; // ?, CAPITAL LETTER A WITH CIRCUMFLEX ACCENT
285*b1cdbd2cSJim Jagielski IsLetterTab[0xC3] = true; // ?, CAPITAL LETTER A WITH TILDE
286*b1cdbd2cSJim Jagielski IsLetterTab[0xC4] = true; // ?, CAPITAL LETTER A WITH DIAERESIS
287*b1cdbd2cSJim Jagielski IsLetterTab[0xC5] = true; // ?, CAPITAL LETTER A WITH RING ABOVE
288*b1cdbd2cSJim Jagielski IsLetterTab[0xC6] = true; // ?, CAPITAL LIGATURE AE
289*b1cdbd2cSJim Jagielski IsLetterTab[0xC7] = true; // ?, CAPITAL LETTER C WITH CEDILLA
290*b1cdbd2cSJim Jagielski IsLetterTab[0xC8] = true; // ?, CAPITAL LETTER E WITH GRAVE ACCENT
291*b1cdbd2cSJim Jagielski IsLetterTab[0xC9] = true; // ?, CAPITAL LETTER E WITH ACUTE ACCENT
292*b1cdbd2cSJim Jagielski IsLetterTab[0xCA] = true; // ?, CAPITAL LETTER E WITH CIRCUMFLEX ACCENT
293*b1cdbd2cSJim Jagielski IsLetterTab[0xCB] = true; // ?, CAPITAL LETTER E WITH DIAERESIS
294*b1cdbd2cSJim Jagielski IsLetterTab[0xCC] = true; // ?, CAPITAL LETTER I WITH GRAVE ACCENT
295*b1cdbd2cSJim Jagielski IsLetterTab[0xCD] = true; // ?, CAPITAL LETTER I WITH ACUTE ACCENT
296*b1cdbd2cSJim Jagielski IsLetterTab[0xCE] = true; // ?, CAPITAL LETTER I WITH CIRCUMFLEX ACCENT
297*b1cdbd2cSJim Jagielski IsLetterTab[0xCF] = true; // ?, CAPITAL LETTER I WITH DIAERESIS
298*b1cdbd2cSJim Jagielski IsLetterTab[0xD0] = true; // ?, CAPITAL LETTER ETH
299*b1cdbd2cSJim Jagielski IsLetterTab[0xD1] = true; // ?, CAPITAL LETTER N WITH TILDE
300*b1cdbd2cSJim Jagielski IsLetterTab[0xD2] = true; // ?, CAPITAL LETTER O WITH GRAVE ACCENT
301*b1cdbd2cSJim Jagielski IsLetterTab[0xD3] = true; // ?, CAPITAL LETTER O WITH ACUTE ACCENT
302*b1cdbd2cSJim Jagielski IsLetterTab[0xD4] = true; // ?, CAPITAL LETTER O WITH CIRCUMFLEX ACCENT
303*b1cdbd2cSJim Jagielski IsLetterTab[0xD5] = true; // ?, CAPITAL LETTER O WITH TILDE
304*b1cdbd2cSJim Jagielski IsLetterTab[0xD6] = true; // ?, CAPITAL LETTER O WITH DIAERESIS
305*b1cdbd2cSJim Jagielski IsLetterTab[0xD8] = true; // ?, CAPITAL LETTER O WITH STROKE
306*b1cdbd2cSJim Jagielski IsLetterTab[0xD9] = true; // ?, CAPITAL LETTER U WITH GRAVE ACCENT
307*b1cdbd2cSJim Jagielski IsLetterTab[0xDA] = true; // ?, CAPITAL LETTER U WITH ACUTE ACCENT
308*b1cdbd2cSJim Jagielski IsLetterTab[0xDB] = true; // ?, CAPITAL LETTER U WITH CIRCUMFLEX ACCENT
309*b1cdbd2cSJim Jagielski IsLetterTab[0xDC] = true; // ?, CAPITAL LETTER U WITH DIAERESIS
310*b1cdbd2cSJim Jagielski IsLetterTab[0xDD] = true; // ?, CAPITAL LETTER Y WITH ACUTE ACCENT
311*b1cdbd2cSJim Jagielski IsLetterTab[0xDE] = true; // ?, CAPITAL LETTER THORN
312*b1cdbd2cSJim Jagielski IsLetterTab[0xDF] = true; // ?, SMALL LETTER SHARP S
313*b1cdbd2cSJim Jagielski IsLetterTab[0xE0] = true; // ?, SMALL LETTER A WITH GRAVE ACCENT
314*b1cdbd2cSJim Jagielski IsLetterTab[0xE1] = true; // ?, SMALL LETTER A WITH ACUTE ACCENT
315*b1cdbd2cSJim Jagielski IsLetterTab[0xE2] = true; // ?, SMALL LETTER A WITH CIRCUMFLEX ACCENT
316*b1cdbd2cSJim Jagielski IsLetterTab[0xE3] = true; // ?, SMALL LETTER A WITH TILDE
317*b1cdbd2cSJim Jagielski IsLetterTab[0xE4] = true; // ?, SMALL LETTER A WITH DIAERESIS
318*b1cdbd2cSJim Jagielski IsLetterTab[0xE5] = true; // ?, SMALL LETTER A WITH RING ABOVE
319*b1cdbd2cSJim Jagielski IsLetterTab[0xE6] = true; // ?, SMALL LIGATURE AE
320*b1cdbd2cSJim Jagielski IsLetterTab[0xE7] = true; // ?, SMALL LETTER C WITH CEDILLA
321*b1cdbd2cSJim Jagielski IsLetterTab[0xE8] = true; // ?, SMALL LETTER E WITH GRAVE ACCENT
322*b1cdbd2cSJim Jagielski IsLetterTab[0xE9] = true; // ?, SMALL LETTER E WITH ACUTE ACCENT
323*b1cdbd2cSJim Jagielski IsLetterTab[0xEA] = true; // ?, SMALL LETTER E WITH CIRCUMFLEX ACCENT
324*b1cdbd2cSJim Jagielski IsLetterTab[0xEB] = true; // ?, SMALL LETTER E WITH DIAERESIS
325*b1cdbd2cSJim Jagielski IsLetterTab[0xEC] = true; // ?, SMALL LETTER I WITH GRAVE ACCENT
326*b1cdbd2cSJim Jagielski IsLetterTab[0xED] = true; // ?, SMALL LETTER I WITH ACUTE ACCENT
327*b1cdbd2cSJim Jagielski IsLetterTab[0xEE] = true; // ?, SMALL LETTER I WITH CIRCUMFLEX ACCENT
328*b1cdbd2cSJim Jagielski IsLetterTab[0xEF] = true; // ?, SMALL LETTER I WITH DIAERESIS
329*b1cdbd2cSJim Jagielski IsLetterTab[0xF0] = true; // ?, SMALL LETTER ETH
330*b1cdbd2cSJim Jagielski IsLetterTab[0xF1] = true; // ?, SMALL LETTER N WITH TILDE
331*b1cdbd2cSJim Jagielski IsLetterTab[0xF2] = true; // ?, SMALL LETTER O WITH GRAVE ACCENT
332*b1cdbd2cSJim Jagielski IsLetterTab[0xF3] = true; // ?, SMALL LETTER O WITH ACUTE ACCENT
333*b1cdbd2cSJim Jagielski IsLetterTab[0xF4] = true; // ?, SMALL LETTER O WITH CIRCUMFLEX ACCENT
334*b1cdbd2cSJim Jagielski IsLetterTab[0xF5] = true; // ?, SMALL LETTER O WITH TILDE
335*b1cdbd2cSJim Jagielski IsLetterTab[0xF6] = true; // ?, SMALL LETTER O WITH DIAERESIS
336*b1cdbd2cSJim Jagielski IsLetterTab[0xF8] = true; // ?, SMALL LETTER O WITH OBLIQUE BAR
337*b1cdbd2cSJim Jagielski IsLetterTab[0xF9] = true; // ?, SMALL LETTER U WITH GRAVE ACCENT
338*b1cdbd2cSJim Jagielski IsLetterTab[0xFA] = true; // ?, SMALL LETTER U WITH ACUTE ACCENT
339*b1cdbd2cSJim Jagielski IsLetterTab[0xFB] = true; // ?, SMALL LETTER U WITH CIRCUMFLEX ACCENT
340*b1cdbd2cSJim Jagielski IsLetterTab[0xFC] = true; // ?, SMALL LETTER U WITH DIAERESIS
341*b1cdbd2cSJim Jagielski IsLetterTab[0xFD] = true; // ?, SMALL LETTER Y WITH ACUTE ACCENT
342*b1cdbd2cSJim Jagielski IsLetterTab[0xFE] = true; // ?, SMALL LETTER THORN
343*b1cdbd2cSJim Jagielski IsLetterTab[0xFF] = true; // � , SMALL LETTER Y WITH DIAERESIS
344*b1cdbd2cSJim Jagielski }
345*b1cdbd2cSJim Jagielski
isLetterUnicode(sal_Unicode c)346*b1cdbd2cSJim Jagielski bool LetterTable::isLetterUnicode( sal_Unicode c )
347*b1cdbd2cSJim Jagielski {
348*b1cdbd2cSJim Jagielski static CharClass* pCharClass = NULL;
349*b1cdbd2cSJim Jagielski if( pCharClass == NULL )
350*b1cdbd2cSJim Jagielski pCharClass = new CharClass( Application::GetSettings().GetLocale() );
351*b1cdbd2cSJim Jagielski String aStr( c );
352*b1cdbd2cSJim Jagielski bool bRet = pCharClass->isLetter( aStr, 0 );
353*b1cdbd2cSJim Jagielski return bRet;
354*b1cdbd2cSJim Jagielski }
355*b1cdbd2cSJim Jagielski
356*b1cdbd2cSJim Jagielski // Hilfsfunktion: Zeichen-Flag Testen
testCharFlags(sal_Unicode c,sal_uInt16 nTestFlags)357*b1cdbd2cSJim Jagielski sal_Bool SimpleTokenizer_Impl::testCharFlags( sal_Unicode c, sal_uInt16 nTestFlags )
358*b1cdbd2cSJim Jagielski {
359*b1cdbd2cSJim Jagielski bool bRet = false;
360*b1cdbd2cSJim Jagielski if( c != 0 && c <= 255 )
361*b1cdbd2cSJim Jagielski {
362*b1cdbd2cSJim Jagielski bRet = ( (aCharTypeTab[c] & nTestFlags) != 0 );
363*b1cdbd2cSJim Jagielski }
364*b1cdbd2cSJim Jagielski else if( c > 255 )
365*b1cdbd2cSJim Jagielski {
366*b1cdbd2cSJim Jagielski bRet = (( CHAR_START_IDENTIFIER | CHAR_IN_IDENTIFIER ) & nTestFlags) != 0
367*b1cdbd2cSJim Jagielski ? BasicSimpleCharClass::isAlpha( c, true ) : false;
368*b1cdbd2cSJim Jagielski }
369*b1cdbd2cSJim Jagielski return bRet;
370*b1cdbd2cSJim Jagielski }
371*b1cdbd2cSJim Jagielski
setKeyWords(const char ** ppKeyWords,sal_uInt16 nCount)372*b1cdbd2cSJim Jagielski void SimpleTokenizer_Impl::setKeyWords( const char** ppKeyWords, sal_uInt16 nCount )
373*b1cdbd2cSJim Jagielski {
374*b1cdbd2cSJim Jagielski ppListKeyWords = ppKeyWords;
375*b1cdbd2cSJim Jagielski nKeyWordCount = nCount;
376*b1cdbd2cSJim Jagielski }
377*b1cdbd2cSJim Jagielski
378*b1cdbd2cSJim Jagielski // Neues Token holen
getNextToken(TokenTypes & reType,const sal_Unicode * & rpStartPos,const sal_Unicode * & rpEndPos)379*b1cdbd2cSJim Jagielski sal_Bool SimpleTokenizer_Impl::getNextToken( /*out*/TokenTypes& reType,
380*b1cdbd2cSJim Jagielski /*out*/const sal_Unicode*& rpStartPos, /*out*/const sal_Unicode*& rpEndPos )
381*b1cdbd2cSJim Jagielski {
382*b1cdbd2cSJim Jagielski reType = TT_UNKNOWN;
383*b1cdbd2cSJim Jagielski
384*b1cdbd2cSJim Jagielski // Position merken
385*b1cdbd2cSJim Jagielski rpStartPos = mpActualPos;
386*b1cdbd2cSJim Jagielski
387*b1cdbd2cSJim Jagielski // Zeichen untersuchen
388*b1cdbd2cSJim Jagielski sal_Unicode c = peekChar();
389*b1cdbd2cSJim Jagielski if( c == CHAR_EOF )
390*b1cdbd2cSJim Jagielski return sal_False;
391*b1cdbd2cSJim Jagielski
392*b1cdbd2cSJim Jagielski // Zeichen lesen
393*b1cdbd2cSJim Jagielski getChar();
394*b1cdbd2cSJim Jagielski
395*b1cdbd2cSJim Jagielski //*** Alle Moeglichkeiten durchgehen ***
396*b1cdbd2cSJim Jagielski // Space?
397*b1cdbd2cSJim Jagielski if ( (testCharFlags( c, CHAR_SPACE ) == sal_True) )
398*b1cdbd2cSJim Jagielski {
399*b1cdbd2cSJim Jagielski while( testCharFlags( peekChar(), CHAR_SPACE ) == sal_True )
400*b1cdbd2cSJim Jagielski getChar();
401*b1cdbd2cSJim Jagielski
402*b1cdbd2cSJim Jagielski reType = TT_WHITESPACE;
403*b1cdbd2cSJim Jagielski }
404*b1cdbd2cSJim Jagielski
405*b1cdbd2cSJim Jagielski // Identifier?
406*b1cdbd2cSJim Jagielski else if ( (testCharFlags( c, CHAR_START_IDENTIFIER ) == sal_True) )
407*b1cdbd2cSJim Jagielski {
408*b1cdbd2cSJim Jagielski sal_Bool bIdentifierChar;
409*b1cdbd2cSJim Jagielski do
410*b1cdbd2cSJim Jagielski {
411*b1cdbd2cSJim Jagielski // Naechstes Zeichen holen
412*b1cdbd2cSJim Jagielski c = peekChar();
413*b1cdbd2cSJim Jagielski bIdentifierChar = testCharFlags( c, CHAR_IN_IDENTIFIER );
414*b1cdbd2cSJim Jagielski if( bIdentifierChar )
415*b1cdbd2cSJim Jagielski getChar();
416*b1cdbd2cSJim Jagielski }
417*b1cdbd2cSJim Jagielski while( bIdentifierChar );
418*b1cdbd2cSJim Jagielski
419*b1cdbd2cSJim Jagielski reType = TT_IDENTIFIER;
420*b1cdbd2cSJim Jagielski
421*b1cdbd2cSJim Jagielski // Schluesselwort-Tabelle
422*b1cdbd2cSJim Jagielski if (ppListKeyWords != NULL)
423*b1cdbd2cSJim Jagielski {
424*b1cdbd2cSJim Jagielski int nCount = mpActualPos - rpStartPos;
425*b1cdbd2cSJim Jagielski
426*b1cdbd2cSJim Jagielski // No keyword if string contains char > 255
427*b1cdbd2cSJim Jagielski bool bCanBeKeyword = true;
428*b1cdbd2cSJim Jagielski for( int i = 0 ; i < nCount ; i++ )
429*b1cdbd2cSJim Jagielski {
430*b1cdbd2cSJim Jagielski if( rpStartPos[i] > 255 )
431*b1cdbd2cSJim Jagielski {
432*b1cdbd2cSJim Jagielski bCanBeKeyword = false;
433*b1cdbd2cSJim Jagielski break;
434*b1cdbd2cSJim Jagielski }
435*b1cdbd2cSJim Jagielski }
436*b1cdbd2cSJim Jagielski
437*b1cdbd2cSJim Jagielski if( bCanBeKeyword )
438*b1cdbd2cSJim Jagielski {
439*b1cdbd2cSJim Jagielski String aKWString(rpStartPos, sal::static_int_cast< xub_StrLen >(nCount) );
440*b1cdbd2cSJim Jagielski ByteString aByteStr( aKWString, RTL_TEXTENCODING_ASCII_US );
441*b1cdbd2cSJim Jagielski aByteStr.ToLowerAscii();
442*b1cdbd2cSJim Jagielski if ( bsearch( aByteStr.GetBuffer(), ppListKeyWords, nKeyWordCount, sizeof( char* ),
443*b1cdbd2cSJim Jagielski compare_strings ) )
444*b1cdbd2cSJim Jagielski {
445*b1cdbd2cSJim Jagielski reType = TT_KEYWORDS;
446*b1cdbd2cSJim Jagielski
447*b1cdbd2cSJim Jagielski if ( aByteStr.Equals( "rem" ) )
448*b1cdbd2cSJim Jagielski {
449*b1cdbd2cSJim Jagielski // Alle Zeichen bis Zeilen-Ende oder EOF entfernen
450*b1cdbd2cSJim Jagielski sal_Unicode cPeek = peekChar();
451*b1cdbd2cSJim Jagielski while( cPeek != CHAR_EOF && testCharFlags( cPeek, CHAR_EOL ) == sal_False )
452*b1cdbd2cSJim Jagielski {
453*b1cdbd2cSJim Jagielski c = getChar();
454*b1cdbd2cSJim Jagielski cPeek = peekChar();
455*b1cdbd2cSJim Jagielski }
456*b1cdbd2cSJim Jagielski
457*b1cdbd2cSJim Jagielski reType = TT_COMMENT;
458*b1cdbd2cSJim Jagielski }
459*b1cdbd2cSJim Jagielski }
460*b1cdbd2cSJim Jagielski }
461*b1cdbd2cSJim Jagielski }
462*b1cdbd2cSJim Jagielski }
463*b1cdbd2cSJim Jagielski
464*b1cdbd2cSJim Jagielski // Operator?
465*b1cdbd2cSJim Jagielski // only for BASIC '\'' should be a comment, otherwise it is a normal string and handled there
466*b1cdbd2cSJim Jagielski else if ( ( testCharFlags( c, CHAR_OPERATOR ) == sal_True ) || ( (c == '\'') && (aLanguage==HIGHLIGHT_BASIC)) )
467*b1cdbd2cSJim Jagielski {
468*b1cdbd2cSJim Jagielski // paramters for SQL view
469*b1cdbd2cSJim Jagielski if ( (c==':') || (c=='?'))
470*b1cdbd2cSJim Jagielski {
471*b1cdbd2cSJim Jagielski if (c!='?')
472*b1cdbd2cSJim Jagielski {
473*b1cdbd2cSJim Jagielski sal_Bool bIdentifierChar;
474*b1cdbd2cSJim Jagielski do
475*b1cdbd2cSJim Jagielski {
476*b1cdbd2cSJim Jagielski // Naechstes Zeichen holen
477*b1cdbd2cSJim Jagielski c = peekChar();
478*b1cdbd2cSJim Jagielski bIdentifierChar = BasicSimpleCharClass::isAlpha( c, true );
479*b1cdbd2cSJim Jagielski if( bIdentifierChar )
480*b1cdbd2cSJim Jagielski getChar();
481*b1cdbd2cSJim Jagielski }
482*b1cdbd2cSJim Jagielski while( bIdentifierChar );
483*b1cdbd2cSJim Jagielski }
484*b1cdbd2cSJim Jagielski reType = TT_PARAMETER;
485*b1cdbd2cSJim Jagielski }
486*b1cdbd2cSJim Jagielski else if( c=='-' )
487*b1cdbd2cSJim Jagielski {
488*b1cdbd2cSJim Jagielski sal_Unicode cPeekNext = peekChar();
489*b1cdbd2cSJim Jagielski if (cPeekNext=='-')
490*b1cdbd2cSJim Jagielski {
491*b1cdbd2cSJim Jagielski // Alle Zeichen bis Zeilen-Ende oder EOF entfernen
492*b1cdbd2cSJim Jagielski while( cPeekNext != CHAR_EOF && testCharFlags( cPeekNext, CHAR_EOL ) == sal_False )
493*b1cdbd2cSJim Jagielski {
494*b1cdbd2cSJim Jagielski getChar();
495*b1cdbd2cSJim Jagielski cPeekNext = peekChar();
496*b1cdbd2cSJim Jagielski }
497*b1cdbd2cSJim Jagielski reType = TT_COMMENT;
498*b1cdbd2cSJim Jagielski }
499*b1cdbd2cSJim Jagielski }
500*b1cdbd2cSJim Jagielski else if (c=='/')
501*b1cdbd2cSJim Jagielski {
502*b1cdbd2cSJim Jagielski sal_Unicode cPeekNext = peekChar();
503*b1cdbd2cSJim Jagielski if (cPeekNext=='/')
504*b1cdbd2cSJim Jagielski {
505*b1cdbd2cSJim Jagielski // Alle Zeichen bis Zeilen-Ende oder EOF entfernen
506*b1cdbd2cSJim Jagielski while( cPeekNext != CHAR_EOF && testCharFlags( cPeekNext, CHAR_EOL ) == sal_False )
507*b1cdbd2cSJim Jagielski {
508*b1cdbd2cSJim Jagielski getChar();
509*b1cdbd2cSJim Jagielski cPeekNext = peekChar();
510*b1cdbd2cSJim Jagielski }
511*b1cdbd2cSJim Jagielski reType = TT_COMMENT;
512*b1cdbd2cSJim Jagielski }
513*b1cdbd2cSJim Jagielski }
514*b1cdbd2cSJim Jagielski else
515*b1cdbd2cSJim Jagielski {
516*b1cdbd2cSJim Jagielski // Kommentar ?
517*b1cdbd2cSJim Jagielski if ( c == '\'' )
518*b1cdbd2cSJim Jagielski {
519*b1cdbd2cSJim Jagielski c = getChar(); // '/' entfernen
520*b1cdbd2cSJim Jagielski
521*b1cdbd2cSJim Jagielski // Alle Zeichen bis Zeilen-Ende oder EOF entfernen
522*b1cdbd2cSJim Jagielski sal_Unicode cPeek = c;
523*b1cdbd2cSJim Jagielski while( cPeek != CHAR_EOF && testCharFlags( cPeek, CHAR_EOL ) == sal_False )
524*b1cdbd2cSJim Jagielski {
525*b1cdbd2cSJim Jagielski getChar();
526*b1cdbd2cSJim Jagielski cPeek = peekChar();
527*b1cdbd2cSJim Jagielski }
528*b1cdbd2cSJim Jagielski
529*b1cdbd2cSJim Jagielski reType = TT_COMMENT;
530*b1cdbd2cSJim Jagielski }
531*b1cdbd2cSJim Jagielski
532*b1cdbd2cSJim Jagielski // Echter Operator, kann hier einfach behandelt werden,
533*b1cdbd2cSJim Jagielski // da nicht der wirkliche Operator, wie z.B. += interessiert,
534*b1cdbd2cSJim Jagielski // sondern nur die Tatsache, dass es sich um einen handelt.
535*b1cdbd2cSJim Jagielski if( reType != TT_COMMENT )
536*b1cdbd2cSJim Jagielski {
537*b1cdbd2cSJim Jagielski reType = TT_OPERATOR;
538*b1cdbd2cSJim Jagielski }
539*b1cdbd2cSJim Jagielski
540*b1cdbd2cSJim Jagielski }
541*b1cdbd2cSJim Jagielski }
542*b1cdbd2cSJim Jagielski
543*b1cdbd2cSJim Jagielski // Objekt-Trenner? Muss vor Number abgehandelt werden
544*b1cdbd2cSJim Jagielski else if( c == '.' && ( peekChar() < '0' || peekChar() > '9' ) )
545*b1cdbd2cSJim Jagielski {
546*b1cdbd2cSJim Jagielski reType = TT_OPERATOR;
547*b1cdbd2cSJim Jagielski }
548*b1cdbd2cSJim Jagielski
549*b1cdbd2cSJim Jagielski // Zahl?
550*b1cdbd2cSJim Jagielski else if( testCharFlags( c, CHAR_START_NUMBER ) == sal_True )
551*b1cdbd2cSJim Jagielski {
552*b1cdbd2cSJim Jagielski reType = TT_NUMBER;
553*b1cdbd2cSJim Jagielski
554*b1cdbd2cSJim Jagielski // Zahlensystem, 10 = normal, wird bei Oct/Hex geaendert
555*b1cdbd2cSJim Jagielski int nRadix = 10;
556*b1cdbd2cSJim Jagielski
557*b1cdbd2cSJim Jagielski // Ist es eine Hex- oder Oct-Zahl?
558*b1cdbd2cSJim Jagielski if( c == '&' )
559*b1cdbd2cSJim Jagielski {
560*b1cdbd2cSJim Jagielski // Octal?
561*b1cdbd2cSJim Jagielski if( peekChar() == 'o' || peekChar() == 'O' )
562*b1cdbd2cSJim Jagielski {
563*b1cdbd2cSJim Jagielski // o entfernen
564*b1cdbd2cSJim Jagielski getChar();
565*b1cdbd2cSJim Jagielski nRadix = 8; // Octal-Basis
566*b1cdbd2cSJim Jagielski
567*b1cdbd2cSJim Jagielski // Alle Ziffern einlesen
568*b1cdbd2cSJim Jagielski while( testCharFlags( peekChar(), CHAR_IN_OCT_NUMBER ) )
569*b1cdbd2cSJim Jagielski c = getChar();
570*b1cdbd2cSJim Jagielski }
571*b1cdbd2cSJim Jagielski // Hex?
572*b1cdbd2cSJim Jagielski else if( peekChar() == 'h' || peekChar() == 'H' )
573*b1cdbd2cSJim Jagielski {
574*b1cdbd2cSJim Jagielski // x entfernen
575*b1cdbd2cSJim Jagielski getChar();
576*b1cdbd2cSJim Jagielski nRadix = 16; // Hex-Basis
577*b1cdbd2cSJim Jagielski
578*b1cdbd2cSJim Jagielski // Alle Ziffern einlesen und puffern
579*b1cdbd2cSJim Jagielski while( testCharFlags( peekChar(), CHAR_IN_HEX_NUMBER ) )
580*b1cdbd2cSJim Jagielski c = getChar();
581*b1cdbd2cSJim Jagielski }
582*b1cdbd2cSJim Jagielski else
583*b1cdbd2cSJim Jagielski {
584*b1cdbd2cSJim Jagielski reType = TT_OPERATOR;
585*b1cdbd2cSJim Jagielski }
586*b1cdbd2cSJim Jagielski }
587*b1cdbd2cSJim Jagielski
588*b1cdbd2cSJim Jagielski // Wenn nicht Oct oder Hex als double ansehen
589*b1cdbd2cSJim Jagielski if( reType == TT_NUMBER && nRadix == 10 )
590*b1cdbd2cSJim Jagielski {
591*b1cdbd2cSJim Jagielski // Flag, ob das letzte Zeichen ein Exponent war
592*b1cdbd2cSJim Jagielski sal_Bool bAfterExpChar = sal_False;
593*b1cdbd2cSJim Jagielski
594*b1cdbd2cSJim Jagielski // Alle Ziffern einlesen
595*b1cdbd2cSJim Jagielski while( testCharFlags( peekChar(), CHAR_IN_NUMBER ) ||
596*b1cdbd2cSJim Jagielski (bAfterExpChar && peekChar() == '+' ) ||
597*b1cdbd2cSJim Jagielski (bAfterExpChar && peekChar() == '-' ) )
598*b1cdbd2cSJim Jagielski // Nach Exponent auch +/- OK
599*b1cdbd2cSJim Jagielski {
600*b1cdbd2cSJim Jagielski c = getChar(); // Zeichen lesen
601*b1cdbd2cSJim Jagielski bAfterExpChar = ( c == 'e' || c == 'E' );
602*b1cdbd2cSJim Jagielski }
603*b1cdbd2cSJim Jagielski }
604*b1cdbd2cSJim Jagielski
605*b1cdbd2cSJim Jagielski // reType = TT_NUMBER;
606*b1cdbd2cSJim Jagielski }
607*b1cdbd2cSJim Jagielski
608*b1cdbd2cSJim Jagielski // String?
609*b1cdbd2cSJim Jagielski else if( testCharFlags( c, CHAR_START_STRING ) == sal_True )
610*b1cdbd2cSJim Jagielski {
611*b1cdbd2cSJim Jagielski // Merken, welches Zeichen den String eroeffnet hat
612*b1cdbd2cSJim Jagielski sal_Unicode cEndString = c;
613*b1cdbd2cSJim Jagielski if( c == '[' )
614*b1cdbd2cSJim Jagielski cEndString = ']';
615*b1cdbd2cSJim Jagielski
616*b1cdbd2cSJim Jagielski // Alle Ziffern einlesen und puffern
617*b1cdbd2cSJim Jagielski while( peekChar() != cEndString )
618*b1cdbd2cSJim Jagielski {
619*b1cdbd2cSJim Jagielski // #58846 EOF vor getChar() abfangen, damit EOF micht verloren geht
620*b1cdbd2cSJim Jagielski if( peekChar() == CHAR_EOF )
621*b1cdbd2cSJim Jagielski {
622*b1cdbd2cSJim Jagielski // ERROR: unterminated string literal
623*b1cdbd2cSJim Jagielski reType = TT_ERROR;
624*b1cdbd2cSJim Jagielski break;
625*b1cdbd2cSJim Jagielski }
626*b1cdbd2cSJim Jagielski c = getChar();
627*b1cdbd2cSJim Jagielski if( testCharFlags( c, CHAR_EOL ) == sal_True )
628*b1cdbd2cSJim Jagielski {
629*b1cdbd2cSJim Jagielski // ERROR: unterminated string literal
630*b1cdbd2cSJim Jagielski reType = TT_ERROR;
631*b1cdbd2cSJim Jagielski break;
632*b1cdbd2cSJim Jagielski }
633*b1cdbd2cSJim Jagielski }
634*b1cdbd2cSJim Jagielski
635*b1cdbd2cSJim Jagielski // Zeichen lesen
636*b1cdbd2cSJim Jagielski if( reType != TT_ERROR )
637*b1cdbd2cSJim Jagielski {
638*b1cdbd2cSJim Jagielski getChar();
639*b1cdbd2cSJim Jagielski if( cEndString == ']' )
640*b1cdbd2cSJim Jagielski reType = TT_IDENTIFIER;
641*b1cdbd2cSJim Jagielski else
642*b1cdbd2cSJim Jagielski reType = TT_STRING;
643*b1cdbd2cSJim Jagielski }
644*b1cdbd2cSJim Jagielski }
645*b1cdbd2cSJim Jagielski
646*b1cdbd2cSJim Jagielski // Zeilenende?
647*b1cdbd2cSJim Jagielski else if( testCharFlags( c, CHAR_EOL ) == sal_True )
648*b1cdbd2cSJim Jagielski {
649*b1cdbd2cSJim Jagielski // Falls ein weiteres anderes EOL-Char folgt, weg damit
650*b1cdbd2cSJim Jagielski sal_Unicode cNext = peekChar();
651*b1cdbd2cSJim Jagielski if( cNext != c && testCharFlags( cNext, CHAR_EOL ) == sal_True )
652*b1cdbd2cSJim Jagielski getChar();
653*b1cdbd2cSJim Jagielski
654*b1cdbd2cSJim Jagielski // Positions-Daten auf Zeilen-Beginn setzen
655*b1cdbd2cSJim Jagielski nCol = 0;
656*b1cdbd2cSJim Jagielski nLine++;
657*b1cdbd2cSJim Jagielski
658*b1cdbd2cSJim Jagielski reType = TT_EOL;
659*b1cdbd2cSJim Jagielski }
660*b1cdbd2cSJim Jagielski
661*b1cdbd2cSJim Jagielski // Alles andere bleibt TT_UNKNOWN
662*b1cdbd2cSJim Jagielski
663*b1cdbd2cSJim Jagielski
664*b1cdbd2cSJim Jagielski // End-Position eintragen
665*b1cdbd2cSJim Jagielski rpEndPos = mpActualPos;
666*b1cdbd2cSJim Jagielski return sal_True;
667*b1cdbd2cSJim Jagielski }
668*b1cdbd2cSJim Jagielski
getTokStr(const sal_Unicode * pStartPos,const sal_Unicode * pEndPos)669*b1cdbd2cSJim Jagielski String SimpleTokenizer_Impl::getTokStr
670*b1cdbd2cSJim Jagielski ( /*out*/const sal_Unicode* pStartPos, /*out*/const sal_Unicode* pEndPos )
671*b1cdbd2cSJim Jagielski {
672*b1cdbd2cSJim Jagielski return String( pStartPos, (sal_uInt16)( pEndPos - pStartPos ) );
673*b1cdbd2cSJim Jagielski }
674*b1cdbd2cSJim Jagielski
675*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
676*b1cdbd2cSJim Jagielski // TEST: Token ausgeben
getFullTokenStr(TokenTypes eType,const sal_Unicode * pStartPos,const sal_Unicode * pEndPos)677*b1cdbd2cSJim Jagielski String SimpleTokenizer_Impl::getFullTokenStr( /*out*/TokenTypes eType,
678*b1cdbd2cSJim Jagielski /*out*/const sal_Unicode* pStartPos, /*out*/const sal_Unicode* pEndPos )
679*b1cdbd2cSJim Jagielski {
680*b1cdbd2cSJim Jagielski String aOut;
681*b1cdbd2cSJim Jagielski switch( eType )
682*b1cdbd2cSJim Jagielski {
683*b1cdbd2cSJim Jagielski case TT_UNKNOWN: aOut = String( RTL_CONSTASCII_USTRINGPARAM("TT_UNKNOWN:") ); break;
684*b1cdbd2cSJim Jagielski case TT_IDENTIFIER: aOut = String( RTL_CONSTASCII_USTRINGPARAM("TT_IDENTIFIER:") ); break;
685*b1cdbd2cSJim Jagielski case TT_WHITESPACE: aOut = String( RTL_CONSTASCII_USTRINGPARAM("TT_WHITESPACE:") ); break;
686*b1cdbd2cSJim Jagielski case TT_NUMBER: aOut = String( RTL_CONSTASCII_USTRINGPARAM("TT_NUMBER:") ); break;
687*b1cdbd2cSJim Jagielski case TT_STRING: aOut = String( RTL_CONSTASCII_USTRINGPARAM("TT_STRING:") ); break;
688*b1cdbd2cSJim Jagielski case TT_EOL: aOut = String( RTL_CONSTASCII_USTRINGPARAM("TT_EOL:") ); break;
689*b1cdbd2cSJim Jagielski case TT_COMMENT: aOut = String( RTL_CONSTASCII_USTRINGPARAM("TT_COMMENT:") ); break;
690*b1cdbd2cSJim Jagielski case TT_ERROR: aOut = String( RTL_CONSTASCII_USTRINGPARAM("TT_ERROR:") ); break;
691*b1cdbd2cSJim Jagielski case TT_OPERATOR: aOut = String( RTL_CONSTASCII_USTRINGPARAM("TT_OPERATOR:") ); break;
692*b1cdbd2cSJim Jagielski case TT_KEYWORDS: aOut = String( RTL_CONSTASCII_USTRINGPARAM("TT_KEYWORD:") ); break;
693*b1cdbd2cSJim Jagielski case TT_PARAMETER: aOut = String( RTL_CONSTASCII_USTRINGPARAM("TT_PARAMETER:") ); break;
694*b1cdbd2cSJim Jagielski }
695*b1cdbd2cSJim Jagielski if( eType != TT_EOL )
696*b1cdbd2cSJim Jagielski {
697*b1cdbd2cSJim Jagielski aOut += String( pStartPos, (sal_uInt16)( pEndPos - pStartPos ) );
698*b1cdbd2cSJim Jagielski }
699*b1cdbd2cSJim Jagielski aOut += String( RTL_CONSTASCII_USTRINGPARAM("\n") );
700*b1cdbd2cSJim Jagielski return aOut;
701*b1cdbd2cSJim Jagielski }
702*b1cdbd2cSJim Jagielski #endif
703*b1cdbd2cSJim Jagielski
SimpleTokenizer_Impl(HighlighterLanguage aLang)704*b1cdbd2cSJim Jagielski SimpleTokenizer_Impl::SimpleTokenizer_Impl( HighlighterLanguage aLang ): aLanguage(aLang)
705*b1cdbd2cSJim Jagielski {
706*b1cdbd2cSJim Jagielski memset( aCharTypeTab, 0, sizeof( aCharTypeTab ) );
707*b1cdbd2cSJim Jagielski
708*b1cdbd2cSJim Jagielski // Zeichen-Tabelle fuellen
709*b1cdbd2cSJim Jagielski sal_uInt16 i;
710*b1cdbd2cSJim Jagielski
711*b1cdbd2cSJim Jagielski // Zulaessige Zeichen fuer Identifier
712*b1cdbd2cSJim Jagielski sal_uInt16 nHelpMask = (sal_uInt16)( CHAR_START_IDENTIFIER | CHAR_IN_IDENTIFIER );
713*b1cdbd2cSJim Jagielski for( i = 'a' ; i <= 'z' ; i++ )
714*b1cdbd2cSJim Jagielski aCharTypeTab[i] |= nHelpMask;
715*b1cdbd2cSJim Jagielski for( i = 'A' ; i <= 'Z' ; i++ )
716*b1cdbd2cSJim Jagielski aCharTypeTab[i] |= nHelpMask;
717*b1cdbd2cSJim Jagielski // '_' extra eintragen
718*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'_'] |= nHelpMask;
719*b1cdbd2cSJim Jagielski // AB 23.6.97: '$' ist auch erlaubt
720*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'$'] |= nHelpMask;
721*b1cdbd2cSJim Jagielski
722*b1cdbd2cSJim Jagielski // Ziffern (Identifier und Number ist moeglich)
723*b1cdbd2cSJim Jagielski nHelpMask = (sal_uInt16)( CHAR_IN_IDENTIFIER | CHAR_START_NUMBER |
724*b1cdbd2cSJim Jagielski CHAR_IN_NUMBER | CHAR_IN_HEX_NUMBER );
725*b1cdbd2cSJim Jagielski for( i = '0' ; i <= '9' ; i++ )
726*b1cdbd2cSJim Jagielski aCharTypeTab[i] |= nHelpMask;
727*b1cdbd2cSJim Jagielski
728*b1cdbd2cSJim Jagielski // e und E sowie . von Hand ergaenzen
729*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'e'] |= CHAR_IN_NUMBER;
730*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'E'] |= CHAR_IN_NUMBER;
731*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'.'] |= (sal_uInt16)( CHAR_IN_NUMBER | CHAR_START_NUMBER );
732*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'&'] |= CHAR_START_NUMBER;
733*b1cdbd2cSJim Jagielski
734*b1cdbd2cSJim Jagielski // Hex-Ziffern
735*b1cdbd2cSJim Jagielski for( i = 'a' ; i <= 'f' ; i++ )
736*b1cdbd2cSJim Jagielski aCharTypeTab[i] |= CHAR_IN_HEX_NUMBER;
737*b1cdbd2cSJim Jagielski for( i = 'A' ; i <= 'F' ; i++ )
738*b1cdbd2cSJim Jagielski aCharTypeTab[i] |= CHAR_IN_HEX_NUMBER;
739*b1cdbd2cSJim Jagielski
740*b1cdbd2cSJim Jagielski // Oct-Ziffern
741*b1cdbd2cSJim Jagielski for( i = '0' ; i <= '7' ; i++ )
742*b1cdbd2cSJim Jagielski aCharTypeTab[i] |= CHAR_IN_OCT_NUMBER;
743*b1cdbd2cSJim Jagielski
744*b1cdbd2cSJim Jagielski // String-Beginn/End-Zeichen
745*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'\''] |= CHAR_START_STRING;
746*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'\"'] |= CHAR_START_STRING;
747*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'['] |= CHAR_START_STRING;
748*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'`'] |= CHAR_START_STRING;
749*b1cdbd2cSJim Jagielski
750*b1cdbd2cSJim Jagielski // Operator-Zeichen
751*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'!'] |= CHAR_OPERATOR;
752*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'%'] |= CHAR_OPERATOR;
753*b1cdbd2cSJim Jagielski // aCharTypeTab[(int)'&'] |= CHAR_OPERATOR; Removed because of #i14140
754*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'('] |= CHAR_OPERATOR;
755*b1cdbd2cSJim Jagielski aCharTypeTab[(int)')'] |= CHAR_OPERATOR;
756*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'*'] |= CHAR_OPERATOR;
757*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'+'] |= CHAR_OPERATOR;
758*b1cdbd2cSJim Jagielski aCharTypeTab[(int)','] |= CHAR_OPERATOR;
759*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'-'] |= CHAR_OPERATOR;
760*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'/'] |= CHAR_OPERATOR;
761*b1cdbd2cSJim Jagielski aCharTypeTab[(int)':'] |= CHAR_OPERATOR;
762*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'<'] |= CHAR_OPERATOR;
763*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'='] |= CHAR_OPERATOR;
764*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'>'] |= CHAR_OPERATOR;
765*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'?'] |= CHAR_OPERATOR;
766*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'^'] |= CHAR_OPERATOR;
767*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'|'] |= CHAR_OPERATOR;
768*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'~'] |= CHAR_OPERATOR;
769*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'{'] |= CHAR_OPERATOR;
770*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'}'] |= CHAR_OPERATOR;
771*b1cdbd2cSJim Jagielski // aCharTypeTab[(int)'['] |= CHAR_OPERATOR; Removed because of #i17826
772*b1cdbd2cSJim Jagielski aCharTypeTab[(int)']'] |= CHAR_OPERATOR;
773*b1cdbd2cSJim Jagielski aCharTypeTab[(int)';'] |= CHAR_OPERATOR;
774*b1cdbd2cSJim Jagielski
775*b1cdbd2cSJim Jagielski // Space
776*b1cdbd2cSJim Jagielski aCharTypeTab[(int)' ' ] |= CHAR_SPACE;
777*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'\t'] |= CHAR_SPACE;
778*b1cdbd2cSJim Jagielski
779*b1cdbd2cSJim Jagielski // Zeilen-Ende-Zeichen
780*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'\r'] |= CHAR_EOL;
781*b1cdbd2cSJim Jagielski aCharTypeTab[(int)'\n'] |= CHAR_EOL;
782*b1cdbd2cSJim Jagielski
783*b1cdbd2cSJim Jagielski ppListKeyWords = NULL;
784*b1cdbd2cSJim Jagielski }
785*b1cdbd2cSJim Jagielski
~SimpleTokenizer_Impl(void)786*b1cdbd2cSJim Jagielski SimpleTokenizer_Impl::~SimpleTokenizer_Impl( void )
787*b1cdbd2cSJim Jagielski {
788*b1cdbd2cSJim Jagielski }
789*b1cdbd2cSJim Jagielski
getSimpleTokenizer(void)790*b1cdbd2cSJim Jagielski SimpleTokenizer_Impl* getSimpleTokenizer( void )
791*b1cdbd2cSJim Jagielski {
792*b1cdbd2cSJim Jagielski static SimpleTokenizer_Impl* pSimpleTokenizer = NULL;
793*b1cdbd2cSJim Jagielski if( !pSimpleTokenizer )
794*b1cdbd2cSJim Jagielski pSimpleTokenizer = new SimpleTokenizer_Impl();
795*b1cdbd2cSJim Jagielski return pSimpleTokenizer;
796*b1cdbd2cSJim Jagielski }
797*b1cdbd2cSJim Jagielski
798*b1cdbd2cSJim Jagielski // Heraussuchen der jeweils naechsten Funktion aus einem JavaScript-Modul
parseLine(sal_uInt32 nParseLine,const String * aSource)799*b1cdbd2cSJim Jagielski sal_uInt16 SimpleTokenizer_Impl::parseLine( sal_uInt32 nParseLine, const String* aSource )
800*b1cdbd2cSJim Jagielski {
801*b1cdbd2cSJim Jagielski // Position auf den Anfang des Source-Strings setzen
802*b1cdbd2cSJim Jagielski mpStringBegin = mpActualPos = aSource->GetBuffer();
803*b1cdbd2cSJim Jagielski
804*b1cdbd2cSJim Jagielski // Zeile und Spalte initialisieren
805*b1cdbd2cSJim Jagielski nLine = nParseLine;
806*b1cdbd2cSJim Jagielski nCol = 0L;
807*b1cdbd2cSJim Jagielski
808*b1cdbd2cSJim Jagielski // Variablen fuer die Out-Parameter
809*b1cdbd2cSJim Jagielski TokenTypes eType;
810*b1cdbd2cSJim Jagielski const sal_Unicode* pStartPos;
811*b1cdbd2cSJim Jagielski const sal_Unicode* pEndPos;
812*b1cdbd2cSJim Jagielski
813*b1cdbd2cSJim Jagielski // Schleife ueber alle Tokens
814*b1cdbd2cSJim Jagielski sal_uInt16 nTokenCount = 0;
815*b1cdbd2cSJim Jagielski while( getNextToken( eType, pStartPos, pEndPos ) )
816*b1cdbd2cSJim Jagielski nTokenCount++;
817*b1cdbd2cSJim Jagielski
818*b1cdbd2cSJim Jagielski return nTokenCount;
819*b1cdbd2cSJim Jagielski }
820*b1cdbd2cSJim Jagielski
getHighlightPortions(sal_uInt32 nParseLine,const String & rLine,HighlightPortions & portions)821*b1cdbd2cSJim Jagielski void SimpleTokenizer_Impl::getHighlightPortions( sal_uInt32 nParseLine, const String& rLine,
822*b1cdbd2cSJim Jagielski /*out*/HighlightPortions& portions )
823*b1cdbd2cSJim Jagielski {
824*b1cdbd2cSJim Jagielski // Position auf den Anfang des Source-Strings setzen
825*b1cdbd2cSJim Jagielski mpStringBegin = mpActualPos = rLine.GetBuffer();
826*b1cdbd2cSJim Jagielski
827*b1cdbd2cSJim Jagielski // Zeile und Spalte initialisieren
828*b1cdbd2cSJim Jagielski nLine = nParseLine;
829*b1cdbd2cSJim Jagielski nCol = 0L;
830*b1cdbd2cSJim Jagielski
831*b1cdbd2cSJim Jagielski // Variablen fuer die Out-Parameter
832*b1cdbd2cSJim Jagielski TokenTypes eType;
833*b1cdbd2cSJim Jagielski const sal_Unicode* pStartPos;
834*b1cdbd2cSJim Jagielski const sal_Unicode* pEndPos;
835*b1cdbd2cSJim Jagielski
836*b1cdbd2cSJim Jagielski // Schleife ueber alle Tokens
837*b1cdbd2cSJim Jagielski while( getNextToken( eType, pStartPos, pEndPos ) )
838*b1cdbd2cSJim Jagielski {
839*b1cdbd2cSJim Jagielski HighlightPortion portion;
840*b1cdbd2cSJim Jagielski
841*b1cdbd2cSJim Jagielski portion.nBegin = (sal_uInt16)(pStartPos - mpStringBegin);
842*b1cdbd2cSJim Jagielski portion.nEnd = (sal_uInt16)(pEndPos - mpStringBegin);
843*b1cdbd2cSJim Jagielski portion.tokenType = eType;
844*b1cdbd2cSJim Jagielski
845*b1cdbd2cSJim Jagielski portions.push_back(portion);
846*b1cdbd2cSJim Jagielski }
847*b1cdbd2cSJim Jagielski }
848*b1cdbd2cSJim Jagielski
849*b1cdbd2cSJim Jagielski
850*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////
851*b1cdbd2cSJim Jagielski // Implementierung des SyntaxHighlighter
852*b1cdbd2cSJim Jagielski
SyntaxHighlighter()853*b1cdbd2cSJim Jagielski SyntaxHighlighter::SyntaxHighlighter()
854*b1cdbd2cSJim Jagielski {
855*b1cdbd2cSJim Jagielski m_pSimpleTokenizer = 0;
856*b1cdbd2cSJim Jagielski m_pKeyWords = NULL;
857*b1cdbd2cSJim Jagielski m_nKeyWordCount = 0;
858*b1cdbd2cSJim Jagielski }
859*b1cdbd2cSJim Jagielski
~SyntaxHighlighter()860*b1cdbd2cSJim Jagielski SyntaxHighlighter::~SyntaxHighlighter()
861*b1cdbd2cSJim Jagielski {
862*b1cdbd2cSJim Jagielski delete m_pSimpleTokenizer;
863*b1cdbd2cSJim Jagielski delete m_pKeyWords;
864*b1cdbd2cSJim Jagielski }
865*b1cdbd2cSJim Jagielski
initialize(HighlighterLanguage eLanguage_)866*b1cdbd2cSJim Jagielski void SyntaxHighlighter::initialize( HighlighterLanguage eLanguage_ )
867*b1cdbd2cSJim Jagielski {
868*b1cdbd2cSJim Jagielski eLanguage = eLanguage_;
869*b1cdbd2cSJim Jagielski delete m_pSimpleTokenizer;
870*b1cdbd2cSJim Jagielski m_pSimpleTokenizer = new SimpleTokenizer_Impl(eLanguage);
871*b1cdbd2cSJim Jagielski
872*b1cdbd2cSJim Jagielski switch (eLanguage)
873*b1cdbd2cSJim Jagielski {
874*b1cdbd2cSJim Jagielski case HIGHLIGHT_BASIC:
875*b1cdbd2cSJim Jagielski m_pSimpleTokenizer->setKeyWords( strListBasicKeyWords,
876*b1cdbd2cSJim Jagielski sizeof( strListBasicKeyWords ) / sizeof( char* ));
877*b1cdbd2cSJim Jagielski break;
878*b1cdbd2cSJim Jagielski case HIGHLIGHT_SQL:
879*b1cdbd2cSJim Jagielski m_pSimpleTokenizer->setKeyWords( strListSqlKeyWords,
880*b1cdbd2cSJim Jagielski sizeof( strListSqlKeyWords ) / sizeof( char* ));
881*b1cdbd2cSJim Jagielski break;
882*b1cdbd2cSJim Jagielski default:
883*b1cdbd2cSJim Jagielski m_pSimpleTokenizer->setKeyWords( NULL, 0 );
884*b1cdbd2cSJim Jagielski }
885*b1cdbd2cSJim Jagielski }
886*b1cdbd2cSJim Jagielski
notifyChange(sal_uInt32 nLine,sal_Int32 nLineCountDifference,const String * pChangedLines,sal_uInt32 nArrayLength)887*b1cdbd2cSJim Jagielski const Range SyntaxHighlighter::notifyChange( sal_uInt32 nLine, sal_Int32 nLineCountDifference,
888*b1cdbd2cSJim Jagielski const String* pChangedLines, sal_uInt32 nArrayLength)
889*b1cdbd2cSJim Jagielski {
890*b1cdbd2cSJim Jagielski (void)nLineCountDifference;
891*b1cdbd2cSJim Jagielski
892*b1cdbd2cSJim Jagielski for( sal_uInt32 i=0 ; i < nArrayLength ; i++ )
893*b1cdbd2cSJim Jagielski m_pSimpleTokenizer->parseLine(nLine+i, &pChangedLines[i]);
894*b1cdbd2cSJim Jagielski
895*b1cdbd2cSJim Jagielski return Range( nLine, nLine + nArrayLength-1 );
896*b1cdbd2cSJim Jagielski }
897*b1cdbd2cSJim Jagielski
getHighlightPortions(sal_uInt32 nLine,const String & rLine,HighlightPortions & portions)898*b1cdbd2cSJim Jagielski void SyntaxHighlighter::getHighlightPortions( sal_uInt32 nLine, const String& rLine,
899*b1cdbd2cSJim Jagielski /*out*/HighlightPortions& portions )
900*b1cdbd2cSJim Jagielski {
901*b1cdbd2cSJim Jagielski m_pSimpleTokenizer->getHighlightPortions( nLine, rLine, portions );
902*b1cdbd2cSJim Jagielski }
903