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