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_i18npool.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <cclass_unicode.hxx>
28*b1cdbd2cSJim Jagielski #include <unicode/uchar.h>
29*b1cdbd2cSJim Jagielski #include <rtl/math.hxx>
30*b1cdbd2cSJim Jagielski #include <rtl/ustring.hxx>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/KParseTokens.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/KParseType.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/UnicodeType.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/XLocaleData.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/NativeNumberMode.hpp>
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski #include <string.h>		// memcpy()
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
40*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang;
41*b1cdbd2cSJim Jagielski using namespace ::rtl;
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski namespace com { namespace sun { namespace star { namespace i18n {
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski const UPT_FLAG_TYPE cclass_Unicode::TOKEN_ILLEGAL		= 0x00000000;
46*b1cdbd2cSJim Jagielski const UPT_FLAG_TYPE cclass_Unicode::TOKEN_CHAR			= 0x00000001;
47*b1cdbd2cSJim Jagielski const UPT_FLAG_TYPE cclass_Unicode::TOKEN_CHAR_BOOL	= 0x00000002;
48*b1cdbd2cSJim Jagielski const UPT_FLAG_TYPE cclass_Unicode::TOKEN_CHAR_WORD	= 0x00000004;
49*b1cdbd2cSJim Jagielski const UPT_FLAG_TYPE cclass_Unicode::TOKEN_CHAR_VALUE	= 0x00000008;
50*b1cdbd2cSJim Jagielski const UPT_FLAG_TYPE cclass_Unicode::TOKEN_CHAR_STRING	= 0x00000010;
51*b1cdbd2cSJim Jagielski const UPT_FLAG_TYPE cclass_Unicode::TOKEN_CHAR_DONTCARE= 0x00000020;
52*b1cdbd2cSJim Jagielski const UPT_FLAG_TYPE cclass_Unicode::TOKEN_BOOL			= 0x00000040;
53*b1cdbd2cSJim Jagielski const UPT_FLAG_TYPE cclass_Unicode::TOKEN_WORD			= 0x00000080;
54*b1cdbd2cSJim Jagielski const UPT_FLAG_TYPE cclass_Unicode::TOKEN_WORD_SEP		= 0x00000100;
55*b1cdbd2cSJim Jagielski const UPT_FLAG_TYPE cclass_Unicode::TOKEN_VALUE		= 0x00000200;
56*b1cdbd2cSJim Jagielski const UPT_FLAG_TYPE cclass_Unicode::TOKEN_VALUE_SEP	= 0x00000400;
57*b1cdbd2cSJim Jagielski const UPT_FLAG_TYPE cclass_Unicode::TOKEN_VALUE_EXP	= 0x00000800;
58*b1cdbd2cSJim Jagielski const UPT_FLAG_TYPE cclass_Unicode::TOKEN_VALUE_SIGN	= 0x00001000;
59*b1cdbd2cSJim Jagielski const UPT_FLAG_TYPE cclass_Unicode::TOKEN_VALUE_EXP_VALUE	= 0x00002000;
60*b1cdbd2cSJim Jagielski const UPT_FLAG_TYPE cclass_Unicode::TOKEN_VALUE_DIGIT	= 0x00004000;
61*b1cdbd2cSJim Jagielski const UPT_FLAG_TYPE cclass_Unicode::TOKEN_NAME_SEP		= 0x20000000;
62*b1cdbd2cSJim Jagielski const UPT_FLAG_TYPE cclass_Unicode::TOKEN_STRING_SEP	= 0x40000000;
63*b1cdbd2cSJim Jagielski const UPT_FLAG_TYPE cclass_Unicode::TOKEN_EXCLUDED		= 0x80000000;
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski #define TOKEN_DIGIT_FLAGS (TOKEN_CHAR_VALUE | TOKEN_VALUE | TOKEN_VALUE_EXP | TOKEN_VALUE_EXP_VALUE | TOKEN_VALUE_DIGIT)
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski // Default identifier/name specification is [A-Za-z_][A-Za-z0-9_]*
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski const sal_uInt8 cclass_Unicode::nDefCnt = 128;
70*b1cdbd2cSJim Jagielski const UPT_FLAG_TYPE cclass_Unicode::pDefaultParserTable[ nDefCnt ] =
71*b1cdbd2cSJim Jagielski {
72*b1cdbd2cSJim Jagielski // (...) == Calc formula compiler specific, commented out and modified
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski 	/* \0 */	TOKEN_EXCLUDED,
75*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
76*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
77*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
78*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
79*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
80*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
81*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
82*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
83*b1cdbd2cSJim Jagielski 	/*  9 \t */	TOKEN_CHAR_DONTCARE | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,		// (TOKEN_ILLEGAL)
84*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
85*b1cdbd2cSJim Jagielski 	/* 11 \v */	TOKEN_CHAR_DONTCARE | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,		// (TOKEN_ILLEGAL)
86*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
87*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
88*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
89*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
90*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
91*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
92*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
93*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
94*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
95*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
96*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
97*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
98*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
99*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
100*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
101*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
102*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
103*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
104*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
105*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL,
106*b1cdbd2cSJim Jagielski 	/*  32   */	TOKEN_CHAR_DONTCARE | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,
107*b1cdbd2cSJim Jagielski 	/*  33 ! */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,
108*b1cdbd2cSJim Jagielski 	/*  34 " */	TOKEN_CHAR_STRING | TOKEN_STRING_SEP,
109*b1cdbd2cSJim Jagielski 	/*  35 # */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,	// (TOKEN_WORD_SEP)
110*b1cdbd2cSJim Jagielski 	/*  36 $ */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,	// (TOKEN_CHAR_WORD | TOKEN_WORD)
111*b1cdbd2cSJim Jagielski 	/*  37 % */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,	// (TOKEN_VALUE)
112*b1cdbd2cSJim Jagielski 	/*  38 & */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,
113*b1cdbd2cSJim Jagielski 	/*  39 ' */	TOKEN_NAME_SEP,
114*b1cdbd2cSJim Jagielski 	/*  40 ( */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,
115*b1cdbd2cSJim Jagielski 	/*  41 ) */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,
116*b1cdbd2cSJim Jagielski 	/*  42 * */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,
117*b1cdbd2cSJim Jagielski 	/*  43 + */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP | TOKEN_VALUE_EXP | TOKEN_VALUE_SIGN,
118*b1cdbd2cSJim Jagielski 	/*  44 , */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,	// (TOKEN_CHAR_VALUE | TOKEN_VALUE)
119*b1cdbd2cSJim Jagielski 	/*  45 - */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP | TOKEN_VALUE_EXP | TOKEN_VALUE_SIGN,
120*b1cdbd2cSJim Jagielski 	/*  46 . */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,	// (TOKEN_WORD | TOKEN_CHAR_VALUE | TOKEN_VALUE)
121*b1cdbd2cSJim Jagielski 	/*  47 / */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,
122*b1cdbd2cSJim Jagielski 	//for ( i = 48; i < 58; i++ )
123*b1cdbd2cSJim Jagielski 	/*  48 0 */	TOKEN_DIGIT_FLAGS | TOKEN_WORD,
124*b1cdbd2cSJim Jagielski 	/*  49 1 */	TOKEN_DIGIT_FLAGS | TOKEN_WORD,
125*b1cdbd2cSJim Jagielski 	/*  50 2 */	TOKEN_DIGIT_FLAGS | TOKEN_WORD,
126*b1cdbd2cSJim Jagielski 	/*  51 3 */	TOKEN_DIGIT_FLAGS | TOKEN_WORD,
127*b1cdbd2cSJim Jagielski 	/*  52 4 */	TOKEN_DIGIT_FLAGS | TOKEN_WORD,
128*b1cdbd2cSJim Jagielski 	/*  53 5 */	TOKEN_DIGIT_FLAGS | TOKEN_WORD,
129*b1cdbd2cSJim Jagielski 	/*  54 6 */	TOKEN_DIGIT_FLAGS | TOKEN_WORD,
130*b1cdbd2cSJim Jagielski 	/*  55 7 */	TOKEN_DIGIT_FLAGS | TOKEN_WORD,
131*b1cdbd2cSJim Jagielski 	/*  56 8 */	TOKEN_DIGIT_FLAGS | TOKEN_WORD,
132*b1cdbd2cSJim Jagielski 	/*  57 9 */	TOKEN_DIGIT_FLAGS | TOKEN_WORD,
133*b1cdbd2cSJim Jagielski 	/*  58 : */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,	// (TOKEN_WORD)
134*b1cdbd2cSJim Jagielski 	/*  59 ; */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,
135*b1cdbd2cSJim Jagielski 	/*  60 < */	TOKEN_CHAR_BOOL | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,
136*b1cdbd2cSJim Jagielski 	/*  61 = */	TOKEN_CHAR | TOKEN_BOOL | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,
137*b1cdbd2cSJim Jagielski 	/*  62 > */	TOKEN_CHAR_BOOL | TOKEN_BOOL | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,
138*b1cdbd2cSJim Jagielski 	/*  63 ? */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,	// (TOKEN_CHAR_WORD | TOKEN_WORD)
139*b1cdbd2cSJim Jagielski 	/*  64 @ */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,	// (TOKEN_ILLEGAL // UNUSED)
140*b1cdbd2cSJim Jagielski 	//for ( i = 65; i < 91; i++ )
141*b1cdbd2cSJim Jagielski 	/*  65 A */	TOKEN_CHAR_WORD | TOKEN_WORD,
142*b1cdbd2cSJim Jagielski 	/*  66 B */	TOKEN_CHAR_WORD | TOKEN_WORD,
143*b1cdbd2cSJim Jagielski 	/*  67 C */	TOKEN_CHAR_WORD | TOKEN_WORD,
144*b1cdbd2cSJim Jagielski 	/*  68 D */	TOKEN_CHAR_WORD | TOKEN_WORD,
145*b1cdbd2cSJim Jagielski 	/*  69 E */	TOKEN_CHAR_WORD | TOKEN_WORD,
146*b1cdbd2cSJim Jagielski 	/*  70 F */	TOKEN_CHAR_WORD | TOKEN_WORD,
147*b1cdbd2cSJim Jagielski 	/*  71 G */	TOKEN_CHAR_WORD | TOKEN_WORD,
148*b1cdbd2cSJim Jagielski 	/*  72 H */	TOKEN_CHAR_WORD | TOKEN_WORD,
149*b1cdbd2cSJim Jagielski 	/*  73 I */	TOKEN_CHAR_WORD | TOKEN_WORD,
150*b1cdbd2cSJim Jagielski 	/*  74 J */	TOKEN_CHAR_WORD | TOKEN_WORD,
151*b1cdbd2cSJim Jagielski 	/*  75 K */	TOKEN_CHAR_WORD | TOKEN_WORD,
152*b1cdbd2cSJim Jagielski 	/*  76 L */	TOKEN_CHAR_WORD | TOKEN_WORD,
153*b1cdbd2cSJim Jagielski 	/*  77 M */	TOKEN_CHAR_WORD | TOKEN_WORD,
154*b1cdbd2cSJim Jagielski 	/*  78 N */	TOKEN_CHAR_WORD | TOKEN_WORD,
155*b1cdbd2cSJim Jagielski 	/*  79 O */	TOKEN_CHAR_WORD | TOKEN_WORD,
156*b1cdbd2cSJim Jagielski 	/*  80 P */	TOKEN_CHAR_WORD | TOKEN_WORD,
157*b1cdbd2cSJim Jagielski 	/*  81 Q */	TOKEN_CHAR_WORD | TOKEN_WORD,
158*b1cdbd2cSJim Jagielski 	/*  82 R */	TOKEN_CHAR_WORD | TOKEN_WORD,
159*b1cdbd2cSJim Jagielski 	/*  83 S */	TOKEN_CHAR_WORD | TOKEN_WORD,
160*b1cdbd2cSJim Jagielski 	/*  84 T */	TOKEN_CHAR_WORD | TOKEN_WORD,
161*b1cdbd2cSJim Jagielski 	/*  85 U */	TOKEN_CHAR_WORD | TOKEN_WORD,
162*b1cdbd2cSJim Jagielski 	/*  86 V */	TOKEN_CHAR_WORD | TOKEN_WORD,
163*b1cdbd2cSJim Jagielski 	/*  87 W */	TOKEN_CHAR_WORD | TOKEN_WORD,
164*b1cdbd2cSJim Jagielski 	/*  88 X */	TOKEN_CHAR_WORD | TOKEN_WORD,
165*b1cdbd2cSJim Jagielski 	/*  89 Y */	TOKEN_CHAR_WORD | TOKEN_WORD,
166*b1cdbd2cSJim Jagielski 	/*  90 Z */	TOKEN_CHAR_WORD | TOKEN_WORD,
167*b1cdbd2cSJim Jagielski 	/*  91 [ */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,	// (TOKEN_ILLEGAL // UNUSED)
168*b1cdbd2cSJim Jagielski 	/*  92 \ */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,	// (TOKEN_ILLEGAL // UNUSED)
169*b1cdbd2cSJim Jagielski 	/*  93 ] */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,	// (TOKEN_ILLEGAL // UNUSED)
170*b1cdbd2cSJim Jagielski 	/*  94 ^ */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,
171*b1cdbd2cSJim Jagielski 	/*  95 _ */	TOKEN_CHAR_WORD | TOKEN_WORD,
172*b1cdbd2cSJim Jagielski 	/*  96 ` */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,	// (TOKEN_ILLEGAL // UNUSED)
173*b1cdbd2cSJim Jagielski 	//for ( i = 97; i < 123; i++ )
174*b1cdbd2cSJim Jagielski 	/*  97 a */	TOKEN_CHAR_WORD | TOKEN_WORD,
175*b1cdbd2cSJim Jagielski 	/*  98 b */	TOKEN_CHAR_WORD | TOKEN_WORD,
176*b1cdbd2cSJim Jagielski 	/*  99 c */	TOKEN_CHAR_WORD | TOKEN_WORD,
177*b1cdbd2cSJim Jagielski 	/* 100 d */	TOKEN_CHAR_WORD | TOKEN_WORD,
178*b1cdbd2cSJim Jagielski 	/* 101 e */	TOKEN_CHAR_WORD | TOKEN_WORD,
179*b1cdbd2cSJim Jagielski 	/* 102 f */	TOKEN_CHAR_WORD | TOKEN_WORD,
180*b1cdbd2cSJim Jagielski 	/* 103 g */	TOKEN_CHAR_WORD | TOKEN_WORD,
181*b1cdbd2cSJim Jagielski 	/* 104 h */	TOKEN_CHAR_WORD | TOKEN_WORD,
182*b1cdbd2cSJim Jagielski 	/* 105 i */	TOKEN_CHAR_WORD | TOKEN_WORD,
183*b1cdbd2cSJim Jagielski 	/* 106 j */	TOKEN_CHAR_WORD | TOKEN_WORD,
184*b1cdbd2cSJim Jagielski 	/* 107 k */	TOKEN_CHAR_WORD | TOKEN_WORD,
185*b1cdbd2cSJim Jagielski 	/* 108 l */	TOKEN_CHAR_WORD | TOKEN_WORD,
186*b1cdbd2cSJim Jagielski 	/* 109 m */	TOKEN_CHAR_WORD | TOKEN_WORD,
187*b1cdbd2cSJim Jagielski 	/* 110 n */	TOKEN_CHAR_WORD | TOKEN_WORD,
188*b1cdbd2cSJim Jagielski 	/* 111 o */	TOKEN_CHAR_WORD | TOKEN_WORD,
189*b1cdbd2cSJim Jagielski 	/* 112 p */	TOKEN_CHAR_WORD | TOKEN_WORD,
190*b1cdbd2cSJim Jagielski 	/* 113 q */	TOKEN_CHAR_WORD | TOKEN_WORD,
191*b1cdbd2cSJim Jagielski 	/* 114 r */	TOKEN_CHAR_WORD | TOKEN_WORD,
192*b1cdbd2cSJim Jagielski 	/* 115 s */	TOKEN_CHAR_WORD | TOKEN_WORD,
193*b1cdbd2cSJim Jagielski 	/* 116 t */	TOKEN_CHAR_WORD | TOKEN_WORD,
194*b1cdbd2cSJim Jagielski 	/* 117 u */	TOKEN_CHAR_WORD | TOKEN_WORD,
195*b1cdbd2cSJim Jagielski 	/* 118 v */	TOKEN_CHAR_WORD | TOKEN_WORD,
196*b1cdbd2cSJim Jagielski 	/* 119 w */	TOKEN_CHAR_WORD | TOKEN_WORD,
197*b1cdbd2cSJim Jagielski 	/* 120 x */	TOKEN_CHAR_WORD | TOKEN_WORD,
198*b1cdbd2cSJim Jagielski 	/* 121 y */	TOKEN_CHAR_WORD | TOKEN_WORD,
199*b1cdbd2cSJim Jagielski 	/* 122 z */	TOKEN_CHAR_WORD | TOKEN_WORD,
200*b1cdbd2cSJim Jagielski 	/* 123 { */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,	// (TOKEN_ILLEGAL // UNUSED)
201*b1cdbd2cSJim Jagielski 	/* 124 | */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,	// (TOKEN_ILLEGAL // UNUSED)
202*b1cdbd2cSJim Jagielski 	/* 125 } */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,	// (TOKEN_ILLEGAL // UNUSED)
203*b1cdbd2cSJim Jagielski 	/* 126 ~ */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,	// (TOKEN_ILLEGAL // UNUSED)
204*b1cdbd2cSJim Jagielski 	/* 127   */	TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP	// (TOKEN_ILLEGAL // UNUSED)
205*b1cdbd2cSJim Jagielski };
206*b1cdbd2cSJim Jagielski 
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski const sal_Int32 cclass_Unicode::pParseTokensType[ nDefCnt ] =
209*b1cdbd2cSJim Jagielski {
210*b1cdbd2cSJim Jagielski 	/* \0 */	KParseTokens::ASC_OTHER,
211*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
212*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
213*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
214*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
215*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
216*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
217*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
218*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
219*b1cdbd2cSJim Jagielski 	/*  9 \t */	KParseTokens::ASC_CONTROL,
220*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
221*b1cdbd2cSJim Jagielski 	/* 11 \v */	KParseTokens::ASC_CONTROL,
222*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
223*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
224*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
225*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
226*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
227*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
228*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
229*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
230*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
231*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
232*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
233*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
234*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
235*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
236*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
237*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
238*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
239*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
240*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
241*b1cdbd2cSJim Jagielski 				KParseTokens::ASC_CONTROL,
242*b1cdbd2cSJim Jagielski 	/*  32   */	KParseTokens::ASC_OTHER,
243*b1cdbd2cSJim Jagielski 	/*  33 ! */	KParseTokens::ASC_OTHER,
244*b1cdbd2cSJim Jagielski 	/*  34 " */	KParseTokens::ASC_OTHER,
245*b1cdbd2cSJim Jagielski 	/*  35 # */	KParseTokens::ASC_OTHER,
246*b1cdbd2cSJim Jagielski 	/*  36 $ */	KParseTokens::ASC_DOLLAR,
247*b1cdbd2cSJim Jagielski 	/*  37 % */	KParseTokens::ASC_OTHER,
248*b1cdbd2cSJim Jagielski 	/*  38 & */	KParseTokens::ASC_OTHER,
249*b1cdbd2cSJim Jagielski 	/*  39 ' */	KParseTokens::ASC_OTHER,
250*b1cdbd2cSJim Jagielski 	/*  40 ( */	KParseTokens::ASC_OTHER,
251*b1cdbd2cSJim Jagielski 	/*  41 ) */	KParseTokens::ASC_OTHER,
252*b1cdbd2cSJim Jagielski 	/*  42 * */	KParseTokens::ASC_OTHER,
253*b1cdbd2cSJim Jagielski 	/*  43 + */	KParseTokens::ASC_OTHER,
254*b1cdbd2cSJim Jagielski 	/*  44 , */	KParseTokens::ASC_OTHER,
255*b1cdbd2cSJim Jagielski 	/*  45 - */	KParseTokens::ASC_OTHER,
256*b1cdbd2cSJim Jagielski 	/*  46 . */	KParseTokens::ASC_DOT,
257*b1cdbd2cSJim Jagielski 	/*  47 / */	KParseTokens::ASC_OTHER,
258*b1cdbd2cSJim Jagielski 	//for ( i = 48; i < 58; i++ )
259*b1cdbd2cSJim Jagielski 	/*  48 0 */	KParseTokens::ASC_DIGIT,
260*b1cdbd2cSJim Jagielski 	/*  49 1 */	KParseTokens::ASC_DIGIT,
261*b1cdbd2cSJim Jagielski 	/*  50 2 */	KParseTokens::ASC_DIGIT,
262*b1cdbd2cSJim Jagielski 	/*  51 3 */	KParseTokens::ASC_DIGIT,
263*b1cdbd2cSJim Jagielski 	/*  52 4 */	KParseTokens::ASC_DIGIT,
264*b1cdbd2cSJim Jagielski 	/*  53 5 */	KParseTokens::ASC_DIGIT,
265*b1cdbd2cSJim Jagielski 	/*  54 6 */	KParseTokens::ASC_DIGIT,
266*b1cdbd2cSJim Jagielski 	/*  55 7 */	KParseTokens::ASC_DIGIT,
267*b1cdbd2cSJim Jagielski 	/*  56 8 */	KParseTokens::ASC_DIGIT,
268*b1cdbd2cSJim Jagielski 	/*  57 9 */	KParseTokens::ASC_DIGIT,
269*b1cdbd2cSJim Jagielski 	/*  58 : */	KParseTokens::ASC_COLON,
270*b1cdbd2cSJim Jagielski 	/*  59 ; */	KParseTokens::ASC_OTHER,
271*b1cdbd2cSJim Jagielski 	/*  60 < */	KParseTokens::ASC_OTHER,
272*b1cdbd2cSJim Jagielski 	/*  61 = */	KParseTokens::ASC_OTHER,
273*b1cdbd2cSJim Jagielski 	/*  62 > */	KParseTokens::ASC_OTHER,
274*b1cdbd2cSJim Jagielski 	/*  63 ? */	KParseTokens::ASC_OTHER,
275*b1cdbd2cSJim Jagielski 	/*  64 @ */	KParseTokens::ASC_OTHER,
276*b1cdbd2cSJim Jagielski 	//for ( i = 65; i < 91; i++ )
277*b1cdbd2cSJim Jagielski 	/*  65 A */	KParseTokens::ASC_UPALPHA,
278*b1cdbd2cSJim Jagielski 	/*  66 B */	KParseTokens::ASC_UPALPHA,
279*b1cdbd2cSJim Jagielski 	/*  67 C */	KParseTokens::ASC_UPALPHA,
280*b1cdbd2cSJim Jagielski 	/*  68 D */	KParseTokens::ASC_UPALPHA,
281*b1cdbd2cSJim Jagielski 	/*  69 E */	KParseTokens::ASC_UPALPHA,
282*b1cdbd2cSJim Jagielski 	/*  70 F */	KParseTokens::ASC_UPALPHA,
283*b1cdbd2cSJim Jagielski 	/*  71 G */	KParseTokens::ASC_UPALPHA,
284*b1cdbd2cSJim Jagielski 	/*  72 H */	KParseTokens::ASC_UPALPHA,
285*b1cdbd2cSJim Jagielski 	/*  73 I */	KParseTokens::ASC_UPALPHA,
286*b1cdbd2cSJim Jagielski 	/*  74 J */	KParseTokens::ASC_UPALPHA,
287*b1cdbd2cSJim Jagielski 	/*  75 K */	KParseTokens::ASC_UPALPHA,
288*b1cdbd2cSJim Jagielski 	/*  76 L */	KParseTokens::ASC_UPALPHA,
289*b1cdbd2cSJim Jagielski 	/*  77 M */	KParseTokens::ASC_UPALPHA,
290*b1cdbd2cSJim Jagielski 	/*  78 N */	KParseTokens::ASC_UPALPHA,
291*b1cdbd2cSJim Jagielski 	/*  79 O */	KParseTokens::ASC_UPALPHA,
292*b1cdbd2cSJim Jagielski 	/*  80 P */	KParseTokens::ASC_UPALPHA,
293*b1cdbd2cSJim Jagielski 	/*  81 Q */	KParseTokens::ASC_UPALPHA,
294*b1cdbd2cSJim Jagielski 	/*  82 R */	KParseTokens::ASC_UPALPHA,
295*b1cdbd2cSJim Jagielski 	/*  83 S */	KParseTokens::ASC_UPALPHA,
296*b1cdbd2cSJim Jagielski 	/*  84 T */	KParseTokens::ASC_UPALPHA,
297*b1cdbd2cSJim Jagielski 	/*  85 U */	KParseTokens::ASC_UPALPHA,
298*b1cdbd2cSJim Jagielski 	/*  86 V */	KParseTokens::ASC_UPALPHA,
299*b1cdbd2cSJim Jagielski 	/*  87 W */	KParseTokens::ASC_UPALPHA,
300*b1cdbd2cSJim Jagielski 	/*  88 X */	KParseTokens::ASC_UPALPHA,
301*b1cdbd2cSJim Jagielski 	/*  89 Y */	KParseTokens::ASC_UPALPHA,
302*b1cdbd2cSJim Jagielski 	/*  90 Z */	KParseTokens::ASC_UPALPHA,
303*b1cdbd2cSJim Jagielski 	/*  91 [ */	KParseTokens::ASC_OTHER,
304*b1cdbd2cSJim Jagielski 	/*  92 \ */	KParseTokens::ASC_OTHER,
305*b1cdbd2cSJim Jagielski 	/*  93 ] */	KParseTokens::ASC_OTHER,
306*b1cdbd2cSJim Jagielski 	/*  94 ^ */	KParseTokens::ASC_OTHER,
307*b1cdbd2cSJim Jagielski 	/*  95 _ */	KParseTokens::ASC_UNDERSCORE,
308*b1cdbd2cSJim Jagielski 	/*  96 ` */	KParseTokens::ASC_OTHER,
309*b1cdbd2cSJim Jagielski 	//for ( i = 97; i < 123; i++ )
310*b1cdbd2cSJim Jagielski 	/*  97 a */	KParseTokens::ASC_LOALPHA,
311*b1cdbd2cSJim Jagielski 	/*  98 b */	KParseTokens::ASC_LOALPHA,
312*b1cdbd2cSJim Jagielski 	/*  99 c */	KParseTokens::ASC_LOALPHA,
313*b1cdbd2cSJim Jagielski 	/* 100 d */	KParseTokens::ASC_LOALPHA,
314*b1cdbd2cSJim Jagielski 	/* 101 e */	KParseTokens::ASC_LOALPHA,
315*b1cdbd2cSJim Jagielski 	/* 102 f */	KParseTokens::ASC_LOALPHA,
316*b1cdbd2cSJim Jagielski 	/* 103 g */	KParseTokens::ASC_LOALPHA,
317*b1cdbd2cSJim Jagielski 	/* 104 h */	KParseTokens::ASC_LOALPHA,
318*b1cdbd2cSJim Jagielski 	/* 105 i */	KParseTokens::ASC_LOALPHA,
319*b1cdbd2cSJim Jagielski 	/* 106 j */	KParseTokens::ASC_LOALPHA,
320*b1cdbd2cSJim Jagielski 	/* 107 k */	KParseTokens::ASC_LOALPHA,
321*b1cdbd2cSJim Jagielski 	/* 108 l */	KParseTokens::ASC_LOALPHA,
322*b1cdbd2cSJim Jagielski 	/* 109 m */	KParseTokens::ASC_LOALPHA,
323*b1cdbd2cSJim Jagielski 	/* 110 n */	KParseTokens::ASC_LOALPHA,
324*b1cdbd2cSJim Jagielski 	/* 111 o */	KParseTokens::ASC_LOALPHA,
325*b1cdbd2cSJim Jagielski 	/* 112 p */	KParseTokens::ASC_LOALPHA,
326*b1cdbd2cSJim Jagielski 	/* 113 q */	KParseTokens::ASC_LOALPHA,
327*b1cdbd2cSJim Jagielski 	/* 114 r */	KParseTokens::ASC_LOALPHA,
328*b1cdbd2cSJim Jagielski 	/* 115 s */	KParseTokens::ASC_LOALPHA,
329*b1cdbd2cSJim Jagielski 	/* 116 t */	KParseTokens::ASC_LOALPHA,
330*b1cdbd2cSJim Jagielski 	/* 117 u */	KParseTokens::ASC_LOALPHA,
331*b1cdbd2cSJim Jagielski 	/* 118 v */	KParseTokens::ASC_LOALPHA,
332*b1cdbd2cSJim Jagielski 	/* 119 w */	KParseTokens::ASC_LOALPHA,
333*b1cdbd2cSJim Jagielski 	/* 120 x */	KParseTokens::ASC_LOALPHA,
334*b1cdbd2cSJim Jagielski 	/* 121 y */	KParseTokens::ASC_LOALPHA,
335*b1cdbd2cSJim Jagielski 	/* 122 z */	KParseTokens::ASC_LOALPHA,
336*b1cdbd2cSJim Jagielski 	/* 123 { */	KParseTokens::ASC_OTHER,
337*b1cdbd2cSJim Jagielski 	/* 124 | */	KParseTokens::ASC_OTHER,
338*b1cdbd2cSJim Jagielski 	/* 125 } */	KParseTokens::ASC_OTHER,
339*b1cdbd2cSJim Jagielski 	/* 126 ~ */	KParseTokens::ASC_OTHER,
340*b1cdbd2cSJim Jagielski 	/* 127   */	KParseTokens::ASC_OTHER
341*b1cdbd2cSJim Jagielski };
342*b1cdbd2cSJim Jagielski 
343*b1cdbd2cSJim Jagielski 
344*b1cdbd2cSJim Jagielski // static
StrChr(const sal_Unicode * pStr,sal_Unicode c)345*b1cdbd2cSJim Jagielski const sal_Unicode* cclass_Unicode::StrChr( const sal_Unicode* pStr, sal_Unicode c )
346*b1cdbd2cSJim Jagielski {
347*b1cdbd2cSJim Jagielski 	if ( !pStr )
348*b1cdbd2cSJim Jagielski 		return NULL;
349*b1cdbd2cSJim Jagielski 	while ( *pStr )
350*b1cdbd2cSJim Jagielski 	{
351*b1cdbd2cSJim Jagielski 		if ( *pStr == c )
352*b1cdbd2cSJim Jagielski 			return pStr;
353*b1cdbd2cSJim Jagielski 		pStr++;
354*b1cdbd2cSJim Jagielski 	}
355*b1cdbd2cSJim Jagielski 	return NULL;
356*b1cdbd2cSJim Jagielski }
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski 
getParseTokensType(const sal_Unicode * aStr,sal_Int32 nPos)359*b1cdbd2cSJim Jagielski sal_Int32 cclass_Unicode::getParseTokensType( const sal_Unicode* aStr, sal_Int32 nPos )
360*b1cdbd2cSJim Jagielski {
361*b1cdbd2cSJim Jagielski 	sal_Unicode c = aStr[nPos];
362*b1cdbd2cSJim Jagielski 	if ( c < nDefCnt )
363*b1cdbd2cSJim Jagielski 		return pParseTokensType[ sal_uInt8(c) ];
364*b1cdbd2cSJim Jagielski 	else
365*b1cdbd2cSJim Jagielski 	{
366*b1cdbd2cSJim Jagielski 
367*b1cdbd2cSJim Jagielski 		//! all KParseTokens::UNI_... must be matched
368*b1cdbd2cSJim Jagielski         switch ( u_charType( (sal_uInt32) c ) )
369*b1cdbd2cSJim Jagielski 		{
370*b1cdbd2cSJim Jagielski 			case U_UPPERCASE_LETTER :
371*b1cdbd2cSJim Jagielski 				return KParseTokens::UNI_UPALPHA;
372*b1cdbd2cSJim Jagielski 			case U_LOWERCASE_LETTER :
373*b1cdbd2cSJim Jagielski 				return KParseTokens::UNI_LOALPHA;
374*b1cdbd2cSJim Jagielski 			case U_TITLECASE_LETTER :
375*b1cdbd2cSJim Jagielski 				return KParseTokens::UNI_TITLE_ALPHA;
376*b1cdbd2cSJim Jagielski 			case U_MODIFIER_LETTER :
377*b1cdbd2cSJim Jagielski 				return KParseTokens::UNI_MODIFIER_LETTER;
378*b1cdbd2cSJim Jagielski 			case U_OTHER_LETTER :
379*b1cdbd2cSJim Jagielski 				// Non_Spacing_Mark could not be as leading character
380*b1cdbd2cSJim Jagielski 				if (nPos == 0) break;
381*b1cdbd2cSJim Jagielski 				// fall through, treat it as Other_Letter.
382*b1cdbd2cSJim Jagielski 			case U_NON_SPACING_MARK :
383*b1cdbd2cSJim Jagielski 				return KParseTokens::UNI_OTHER_LETTER;
384*b1cdbd2cSJim Jagielski 			case U_DECIMAL_DIGIT_NUMBER :
385*b1cdbd2cSJim Jagielski 				return KParseTokens::UNI_DIGIT;
386*b1cdbd2cSJim Jagielski 			case U_LETTER_NUMBER :
387*b1cdbd2cSJim Jagielski 				return KParseTokens::UNI_LETTER_NUMBER;
388*b1cdbd2cSJim Jagielski 			case U_OTHER_NUMBER :
389*b1cdbd2cSJim Jagielski 				return KParseTokens::UNI_OTHER_NUMBER;
390*b1cdbd2cSJim Jagielski 		}
391*b1cdbd2cSJim Jagielski 
392*b1cdbd2cSJim Jagielski 		return KParseTokens::UNI_OTHER;
393*b1cdbd2cSJim Jagielski 	}
394*b1cdbd2cSJim Jagielski }
395*b1cdbd2cSJim Jagielski 
setupInternational(const Locale & rLocale)396*b1cdbd2cSJim Jagielski sal_Bool cclass_Unicode::setupInternational( const Locale& rLocale )
397*b1cdbd2cSJim Jagielski {
398*b1cdbd2cSJim Jagielski 	sal_Bool bChanged = (aParserLocale.Language != rLocale.Language
399*b1cdbd2cSJim Jagielski 		|| aParserLocale.Country != rLocale.Country
400*b1cdbd2cSJim Jagielski 		|| aParserLocale.Variant != rLocale.Variant);
401*b1cdbd2cSJim Jagielski 	if ( bChanged )
402*b1cdbd2cSJim Jagielski 	{
403*b1cdbd2cSJim Jagielski 		aParserLocale.Language = rLocale.Language;
404*b1cdbd2cSJim Jagielski 		aParserLocale.Country = rLocale.Country;
405*b1cdbd2cSJim Jagielski 		aParserLocale.Variant = rLocale.Variant;
406*b1cdbd2cSJim Jagielski 	}
407*b1cdbd2cSJim Jagielski 	if ( !xLocaleData.is() && xMSF.is() )
408*b1cdbd2cSJim Jagielski 	{
409*b1cdbd2cSJim Jagielski 		Reference <
410*b1cdbd2cSJim Jagielski 			XInterface > xI =
411*b1cdbd2cSJim Jagielski 			xMSF->createInstance( OUString(
412*b1cdbd2cSJim Jagielski 			RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.i18n.LocaleData" ) ) );
413*b1cdbd2cSJim Jagielski 		if ( xI.is() )
414*b1cdbd2cSJim Jagielski 		{
415*b1cdbd2cSJim Jagielski 			Any x = xI->queryInterface( getCppuType((const Reference< XLocaleData>*)0) );
416*b1cdbd2cSJim Jagielski 			x >>= xLocaleData;
417*b1cdbd2cSJim Jagielski 		}
418*b1cdbd2cSJim Jagielski 	}
419*b1cdbd2cSJim Jagielski 	return bChanged;
420*b1cdbd2cSJim Jagielski }
421*b1cdbd2cSJim Jagielski 
422*b1cdbd2cSJim Jagielski 
setupParserTable(const Locale & rLocale,sal_Int32 startCharTokenType,const OUString & userDefinedCharactersStart,sal_Int32 contCharTokenType,const OUString & userDefinedCharactersCont)423*b1cdbd2cSJim Jagielski void cclass_Unicode::setupParserTable( const Locale& rLocale, sal_Int32 startCharTokenType,
424*b1cdbd2cSJim Jagielski             const OUString& userDefinedCharactersStart, sal_Int32 contCharTokenType,
425*b1cdbd2cSJim Jagielski             const OUString& userDefinedCharactersCont )
426*b1cdbd2cSJim Jagielski {
427*b1cdbd2cSJim Jagielski 	bool bIntlEqual = (rLocale.Language == aParserLocale.Language &&
428*b1cdbd2cSJim Jagielski 		rLocale.Country == aParserLocale.Country &&
429*b1cdbd2cSJim Jagielski 		rLocale.Variant == aParserLocale.Variant);
430*b1cdbd2cSJim Jagielski 	if ( !pTable || !bIntlEqual ||
431*b1cdbd2cSJim Jagielski 			startCharTokenType != nStartTypes ||
432*b1cdbd2cSJim Jagielski 			contCharTokenType != nContTypes ||
433*b1cdbd2cSJim Jagielski 			userDefinedCharactersStart != aStartChars ||
434*b1cdbd2cSJim Jagielski 			userDefinedCharactersCont != aContChars )
435*b1cdbd2cSJim Jagielski 		initParserTable( rLocale, startCharTokenType, userDefinedCharactersStart,
436*b1cdbd2cSJim Jagielski 			contCharTokenType, userDefinedCharactersCont );
437*b1cdbd2cSJim Jagielski }
438*b1cdbd2cSJim Jagielski 
439*b1cdbd2cSJim Jagielski 
initParserTable(const Locale & rLocale,sal_Int32 startCharTokenType,const OUString & userDefinedCharactersStart,sal_Int32 contCharTokenType,const OUString & userDefinedCharactersCont)440*b1cdbd2cSJim Jagielski void cclass_Unicode::initParserTable( const Locale& rLocale, sal_Int32 startCharTokenType,
441*b1cdbd2cSJim Jagielski             const OUString& userDefinedCharactersStart, sal_Int32 contCharTokenType,
442*b1cdbd2cSJim Jagielski             const OUString& userDefinedCharactersCont )
443*b1cdbd2cSJim Jagielski {
444*b1cdbd2cSJim Jagielski 	// (Re)Init
445*b1cdbd2cSJim Jagielski 	setupInternational( rLocale );
446*b1cdbd2cSJim Jagielski 	// Memory of pTable is reused.
447*b1cdbd2cSJim Jagielski 	if ( !pTable )
448*b1cdbd2cSJim Jagielski 		pTable = new UPT_FLAG_TYPE[nDefCnt];
449*b1cdbd2cSJim Jagielski 	memcpy( pTable, pDefaultParserTable, sizeof(UPT_FLAG_TYPE) * nDefCnt );
450*b1cdbd2cSJim Jagielski 	// Start and cont tables only need reallocation if different length.
451*b1cdbd2cSJim Jagielski     if ( pStart && userDefinedCharactersStart.getLength() != aStartChars.getLength() )
452*b1cdbd2cSJim Jagielski 	{
453*b1cdbd2cSJim Jagielski 		delete [] pStart;
454*b1cdbd2cSJim Jagielski 		pStart = NULL;
455*b1cdbd2cSJim Jagielski 	}
456*b1cdbd2cSJim Jagielski     if ( pCont && userDefinedCharactersCont.getLength() != aContChars.getLength() )
457*b1cdbd2cSJim Jagielski 	{
458*b1cdbd2cSJim Jagielski 		delete [] pCont;
459*b1cdbd2cSJim Jagielski 		pCont = NULL;
460*b1cdbd2cSJim Jagielski 	}
461*b1cdbd2cSJim Jagielski 	nStartTypes = startCharTokenType;
462*b1cdbd2cSJim Jagielski 	nContTypes = contCharTokenType;
463*b1cdbd2cSJim Jagielski 	aStartChars = userDefinedCharactersStart;
464*b1cdbd2cSJim Jagielski 	aContChars = userDefinedCharactersCont;
465*b1cdbd2cSJim Jagielski 
466*b1cdbd2cSJim Jagielski 	// specials
467*b1cdbd2cSJim Jagielski 	if( xLocaleData.is() )
468*b1cdbd2cSJim Jagielski 	{
469*b1cdbd2cSJim Jagielski 		LocaleDataItem aItem =
470*b1cdbd2cSJim Jagielski 			xLocaleData->getLocaleItem( aParserLocale );
471*b1cdbd2cSJim Jagielski //!TODO: theoretically separators may be a string, adjustment would have to be
472*b1cdbd2cSJim Jagielski //! done here and in parsing and in ::rtl::math::stringToDouble()
473*b1cdbd2cSJim Jagielski 		cGroupSep = aItem.thousandSeparator.getStr()[0];
474*b1cdbd2cSJim Jagielski         cDecimalSep = aItem.decimalSeparator.getStr()[0];
475*b1cdbd2cSJim Jagielski 	}
476*b1cdbd2cSJim Jagielski 
477*b1cdbd2cSJim Jagielski 	if ( cGroupSep < nDefCnt )
478*b1cdbd2cSJim Jagielski 		pTable[cGroupSep] |= TOKEN_VALUE;
479*b1cdbd2cSJim Jagielski 	if ( cDecimalSep < nDefCnt )
480*b1cdbd2cSJim Jagielski 		pTable[cDecimalSep] |= TOKEN_CHAR_VALUE | TOKEN_VALUE;
481*b1cdbd2cSJim Jagielski 
482*b1cdbd2cSJim Jagielski 	// Modify characters according to KParseTokens definitions.
483*b1cdbd2cSJim Jagielski 	{
484*b1cdbd2cSJim Jagielski 		using namespace KParseTokens;
485*b1cdbd2cSJim Jagielski 		sal_uInt8 i;
486*b1cdbd2cSJim Jagielski 
487*b1cdbd2cSJim Jagielski 		if ( !(nStartTypes & ASC_UPALPHA) )
488*b1cdbd2cSJim Jagielski 			for ( i = 65; i < 91; i++ )
489*b1cdbd2cSJim Jagielski 				pTable[i] &= ~TOKEN_CHAR_WORD;	// not allowed as start character
490*b1cdbd2cSJim Jagielski 		if ( !(nContTypes & ASC_UPALPHA) )
491*b1cdbd2cSJim Jagielski 			for ( i = 65; i < 91; i++ )
492*b1cdbd2cSJim Jagielski 				pTable[i] &= ~TOKEN_WORD;		// not allowed as cont character
493*b1cdbd2cSJim Jagielski 
494*b1cdbd2cSJim Jagielski 		if ( !(nStartTypes & ASC_LOALPHA) )
495*b1cdbd2cSJim Jagielski 			for ( i = 97; i < 123; i++ )
496*b1cdbd2cSJim Jagielski 				pTable[i] &= ~TOKEN_CHAR_WORD;	// not allowed as start character
497*b1cdbd2cSJim Jagielski 		if ( !(nContTypes & ASC_LOALPHA) )
498*b1cdbd2cSJim Jagielski 			for ( i = 97; i < 123; i++ )
499*b1cdbd2cSJim Jagielski 				pTable[i] &= ~TOKEN_WORD;		// not allowed as cont character
500*b1cdbd2cSJim Jagielski 
501*b1cdbd2cSJim Jagielski 		if ( nStartTypes & ASC_DIGIT )
502*b1cdbd2cSJim Jagielski 			for ( i = 48; i < 58; i++ )
503*b1cdbd2cSJim Jagielski 				pTable[i] |= TOKEN_CHAR_WORD;	// allowed as start character
504*b1cdbd2cSJim Jagielski 		if ( !(nContTypes & ASC_DIGIT) )
505*b1cdbd2cSJim Jagielski 			for ( i = 48; i < 58; i++ )
506*b1cdbd2cSJim Jagielski 				pTable[i] &= ~TOKEN_WORD;		// not allowed as cont character
507*b1cdbd2cSJim Jagielski 
508*b1cdbd2cSJim Jagielski 		if ( !(nStartTypes & ASC_UNDERSCORE) )
509*b1cdbd2cSJim Jagielski 			pTable[95] &= ~TOKEN_CHAR_WORD;		// not allowed as start character
510*b1cdbd2cSJim Jagielski 		if ( !(nContTypes & ASC_UNDERSCORE) )
511*b1cdbd2cSJim Jagielski 			pTable[95] &= ~TOKEN_WORD;			// not allowed as cont character
512*b1cdbd2cSJim Jagielski 
513*b1cdbd2cSJim Jagielski 		if ( nStartTypes & ASC_DOLLAR )
514*b1cdbd2cSJim Jagielski 			pTable[36] |= TOKEN_CHAR_WORD;		// allowed as start character
515*b1cdbd2cSJim Jagielski 		if ( nContTypes & ASC_DOLLAR )
516*b1cdbd2cSJim Jagielski 			pTable[36] |= TOKEN_WORD;			// allowed as cont character
517*b1cdbd2cSJim Jagielski 
518*b1cdbd2cSJim Jagielski 		if ( nStartTypes & ASC_DOT )
519*b1cdbd2cSJim Jagielski 			pTable[46] |= TOKEN_CHAR_WORD;		// allowed as start character
520*b1cdbd2cSJim Jagielski 		if ( nContTypes & ASC_DOT )
521*b1cdbd2cSJim Jagielski 			pTable[46] |= TOKEN_WORD;			// allowed as cont character
522*b1cdbd2cSJim Jagielski 
523*b1cdbd2cSJim Jagielski 		if ( nStartTypes & ASC_COLON )
524*b1cdbd2cSJim Jagielski 			pTable[58] |= TOKEN_CHAR_WORD;		// allowed as start character
525*b1cdbd2cSJim Jagielski 		if ( nContTypes & ASC_COLON )
526*b1cdbd2cSJim Jagielski 			pTable[58] |= TOKEN_WORD;			// allowed as cont character
527*b1cdbd2cSJim Jagielski 
528*b1cdbd2cSJim Jagielski 		if ( nStartTypes & ASC_CONTROL )
529*b1cdbd2cSJim Jagielski 			for ( i = 1; i < 32; i++ )
530*b1cdbd2cSJim Jagielski 				pTable[i] |= TOKEN_CHAR_WORD;	// allowed as start character
531*b1cdbd2cSJim Jagielski 		if ( nContTypes & ASC_CONTROL )
532*b1cdbd2cSJim Jagielski 			for ( i = 1; i < 32; i++ )
533*b1cdbd2cSJim Jagielski 				pTable[i] |= TOKEN_WORD;		// allowed as cont character
534*b1cdbd2cSJim Jagielski 
535*b1cdbd2cSJim Jagielski 		if ( nStartTypes & ASC_ANY_BUT_CONTROL )
536*b1cdbd2cSJim Jagielski 			for ( i = 32; i < nDefCnt; i++ )
537*b1cdbd2cSJim Jagielski 				pTable[i] |= TOKEN_CHAR_WORD;	// allowed as start character
538*b1cdbd2cSJim Jagielski 		if ( nContTypes & ASC_ANY_BUT_CONTROL )
539*b1cdbd2cSJim Jagielski 			for ( i = 32; i < nDefCnt; i++ )
540*b1cdbd2cSJim Jagielski 				pTable[i] |= TOKEN_WORD;		// allowed as cont character
541*b1cdbd2cSJim Jagielski 
542*b1cdbd2cSJim Jagielski 	}
543*b1cdbd2cSJim Jagielski 
544*b1cdbd2cSJim Jagielski 	// Merge in (positively override with) user defined characters.
545*b1cdbd2cSJim Jagielski 	// StartChars
546*b1cdbd2cSJim Jagielski     sal_Int32 nLen = aStartChars.getLength();
547*b1cdbd2cSJim Jagielski 	if ( nLen )
548*b1cdbd2cSJim Jagielski 	{
549*b1cdbd2cSJim Jagielski 		if ( !pStart )
550*b1cdbd2cSJim Jagielski 			pStart = new UPT_FLAG_TYPE[ nLen ];
551*b1cdbd2cSJim Jagielski         const sal_Unicode* p = aStartChars.getStr();
552*b1cdbd2cSJim Jagielski         for ( sal_Int32 j=0; j<nLen; j++, p++ )
553*b1cdbd2cSJim Jagielski 		{
554*b1cdbd2cSJim Jagielski 			pStart[j] = TOKEN_CHAR_WORD;
555*b1cdbd2cSJim Jagielski             if ( *p < nDefCnt )
556*b1cdbd2cSJim Jagielski                 pTable[*p] |= TOKEN_CHAR_WORD;
557*b1cdbd2cSJim Jagielski 		}
558*b1cdbd2cSJim Jagielski 	}
559*b1cdbd2cSJim Jagielski 	// ContChars
560*b1cdbd2cSJim Jagielski     nLen = aContChars.getLength();
561*b1cdbd2cSJim Jagielski 	if ( nLen )
562*b1cdbd2cSJim Jagielski 	{
563*b1cdbd2cSJim Jagielski 		if ( !pCont )
564*b1cdbd2cSJim Jagielski 			pCont = new UPT_FLAG_TYPE[ nLen ];
565*b1cdbd2cSJim Jagielski         const sal_Unicode* p = aContChars.getStr();
566*b1cdbd2cSJim Jagielski         for ( sal_Int32 j=0; j<nLen; j++ )
567*b1cdbd2cSJim Jagielski 		{
568*b1cdbd2cSJim Jagielski 			pCont[j] = TOKEN_WORD;
569*b1cdbd2cSJim Jagielski             if ( *p < nDefCnt )
570*b1cdbd2cSJim Jagielski                 pTable[*p] |= TOKEN_WORD;
571*b1cdbd2cSJim Jagielski 		}
572*b1cdbd2cSJim Jagielski 	}
573*b1cdbd2cSJim Jagielski }
574*b1cdbd2cSJim Jagielski 
575*b1cdbd2cSJim Jagielski 
destroyParserTable()576*b1cdbd2cSJim Jagielski void cclass_Unicode::destroyParserTable()
577*b1cdbd2cSJim Jagielski {
578*b1cdbd2cSJim Jagielski 	if ( pCont )
579*b1cdbd2cSJim Jagielski 		delete [] pCont;
580*b1cdbd2cSJim Jagielski 	if ( pStart )
581*b1cdbd2cSJim Jagielski 		delete [] pStart;
582*b1cdbd2cSJim Jagielski 	if ( pTable )
583*b1cdbd2cSJim Jagielski 		delete [] pTable;
584*b1cdbd2cSJim Jagielski }
585*b1cdbd2cSJim Jagielski 
586*b1cdbd2cSJim Jagielski 
getFlags(const sal_Unicode * aStr,sal_Int32 nPos)587*b1cdbd2cSJim Jagielski UPT_FLAG_TYPE cclass_Unicode::getFlags( const sal_Unicode* aStr, sal_Int32 nPos )
588*b1cdbd2cSJim Jagielski {
589*b1cdbd2cSJim Jagielski 	UPT_FLAG_TYPE nMask;
590*b1cdbd2cSJim Jagielski 	sal_Unicode c = aStr[nPos];
591*b1cdbd2cSJim Jagielski 	if ( c < nDefCnt )
592*b1cdbd2cSJim Jagielski 		nMask = pTable[ sal_uInt8(c) ];
593*b1cdbd2cSJim Jagielski 	else
594*b1cdbd2cSJim Jagielski 		nMask = getFlagsExtended( aStr, nPos );
595*b1cdbd2cSJim Jagielski 	switch ( eState )
596*b1cdbd2cSJim Jagielski 	{
597*b1cdbd2cSJim Jagielski 		case ssGetChar :
598*b1cdbd2cSJim Jagielski         case ssRewindFromValue :
599*b1cdbd2cSJim Jagielski         case ssIgnoreLeadingInRewind :
600*b1cdbd2cSJim Jagielski 		case ssGetWordFirstChar :
601*b1cdbd2cSJim Jagielski 			if ( !(nMask & TOKEN_CHAR_WORD) )
602*b1cdbd2cSJim Jagielski 			{
603*b1cdbd2cSJim Jagielski 				nMask |= getStartCharsFlags( c );
604*b1cdbd2cSJim Jagielski 				if ( nMask & TOKEN_CHAR_WORD )
605*b1cdbd2cSJim Jagielski 					nMask &= ~TOKEN_EXCLUDED;
606*b1cdbd2cSJim Jagielski 			}
607*b1cdbd2cSJim Jagielski 		break;
608*b1cdbd2cSJim Jagielski 		case ssGetValue :
609*b1cdbd2cSJim Jagielski 		case ssGetWord :
610*b1cdbd2cSJim Jagielski 			if ( !(nMask & TOKEN_WORD) )
611*b1cdbd2cSJim Jagielski 			{
612*b1cdbd2cSJim Jagielski 				nMask |= getContCharsFlags( c );
613*b1cdbd2cSJim Jagielski 				if ( nMask & TOKEN_WORD )
614*b1cdbd2cSJim Jagielski 					nMask &= ~TOKEN_EXCLUDED;
615*b1cdbd2cSJim Jagielski 			}
616*b1cdbd2cSJim Jagielski 		break;
617*b1cdbd2cSJim Jagielski         default:
618*b1cdbd2cSJim Jagielski             ;   // other cases aren't needed, no compiler warning
619*b1cdbd2cSJim Jagielski 	}
620*b1cdbd2cSJim Jagielski 	return nMask;
621*b1cdbd2cSJim Jagielski }
622*b1cdbd2cSJim Jagielski 
623*b1cdbd2cSJim Jagielski 
getFlagsExtended(const sal_Unicode * aStr,sal_Int32 nPos)624*b1cdbd2cSJim Jagielski UPT_FLAG_TYPE cclass_Unicode::getFlagsExtended( const sal_Unicode* aStr, sal_Int32 nPos )
625*b1cdbd2cSJim Jagielski {
626*b1cdbd2cSJim Jagielski 	sal_Unicode c = aStr[nPos];
627*b1cdbd2cSJim Jagielski 	if ( c == cGroupSep )
628*b1cdbd2cSJim Jagielski 		return TOKEN_VALUE;
629*b1cdbd2cSJim Jagielski 	else if ( c == cDecimalSep )
630*b1cdbd2cSJim Jagielski 		return TOKEN_CHAR_VALUE | TOKEN_VALUE;
631*b1cdbd2cSJim Jagielski 	using namespace i18n;
632*b1cdbd2cSJim Jagielski     bool bStart = (eState == ssGetChar || eState == ssGetWordFirstChar ||
633*b1cdbd2cSJim Jagielski             eState == ssRewindFromValue || eState == ssIgnoreLeadingInRewind);
634*b1cdbd2cSJim Jagielski 	sal_Int32 nTypes = (bStart ? nStartTypes : nContTypes);
635*b1cdbd2cSJim Jagielski 
636*b1cdbd2cSJim Jagielski 	//! all KParseTokens::UNI_... must be matched
637*b1cdbd2cSJim Jagielski     switch ( u_charType( (sal_uInt32) c ) )
638*b1cdbd2cSJim Jagielski 	{
639*b1cdbd2cSJim Jagielski 		case U_UPPERCASE_LETTER :
640*b1cdbd2cSJim Jagielski 			return (nTypes & KParseTokens::UNI_UPALPHA) ?
641*b1cdbd2cSJim Jagielski 				(bStart ? TOKEN_CHAR_WORD : TOKEN_WORD) :
642*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL;
643*b1cdbd2cSJim Jagielski 		case U_LOWERCASE_LETTER :
644*b1cdbd2cSJim Jagielski 			return (nTypes & KParseTokens::UNI_LOALPHA) ?
645*b1cdbd2cSJim Jagielski 				(bStart ? TOKEN_CHAR_WORD : TOKEN_WORD) :
646*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL;
647*b1cdbd2cSJim Jagielski 		case U_TITLECASE_LETTER :
648*b1cdbd2cSJim Jagielski 			return (nTypes & KParseTokens::UNI_TITLE_ALPHA) ?
649*b1cdbd2cSJim Jagielski 				(bStart ? TOKEN_CHAR_WORD : TOKEN_WORD) :
650*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL;
651*b1cdbd2cSJim Jagielski 		case U_MODIFIER_LETTER :
652*b1cdbd2cSJim Jagielski 			return (nTypes & KParseTokens::UNI_MODIFIER_LETTER) ?
653*b1cdbd2cSJim Jagielski 				(bStart ? TOKEN_CHAR_WORD : TOKEN_WORD) :
654*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL;
655*b1cdbd2cSJim Jagielski 		case U_NON_SPACING_MARK :
656*b1cdbd2cSJim Jagielski         case U_COMBINING_SPACING_MARK :
657*b1cdbd2cSJim Jagielski             // Non_Spacing_Mark can't be a leading character,
658*b1cdbd2cSJim Jagielski             // nor can a spacing combining mark.
659*b1cdbd2cSJim Jagielski             if (bStart)
660*b1cdbd2cSJim Jagielski                 return TOKEN_ILLEGAL;
661*b1cdbd2cSJim Jagielski 			// fall through, treat it as Other_Letter.
662*b1cdbd2cSJim Jagielski 		case U_OTHER_LETTER :
663*b1cdbd2cSJim Jagielski 			return (nTypes & KParseTokens::UNI_OTHER_LETTER) ?
664*b1cdbd2cSJim Jagielski 				(bStart ? TOKEN_CHAR_WORD : TOKEN_WORD) :
665*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL;
666*b1cdbd2cSJim Jagielski 		case U_DECIMAL_DIGIT_NUMBER :
667*b1cdbd2cSJim Jagielski 			return ((nTypes & KParseTokens::UNI_DIGIT) ?
668*b1cdbd2cSJim Jagielski 				(bStart ? TOKEN_CHAR_WORD : TOKEN_WORD) :
669*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL) | TOKEN_DIGIT_FLAGS;
670*b1cdbd2cSJim Jagielski 		case U_LETTER_NUMBER :
671*b1cdbd2cSJim Jagielski 			return ((nTypes & KParseTokens::UNI_LETTER_NUMBER) ?
672*b1cdbd2cSJim Jagielski 				(bStart ? TOKEN_CHAR_WORD : TOKEN_WORD) :
673*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL) | TOKEN_DIGIT_FLAGS;
674*b1cdbd2cSJim Jagielski 		case U_OTHER_NUMBER :
675*b1cdbd2cSJim Jagielski 			return ((nTypes & KParseTokens::UNI_OTHER_NUMBER) ?
676*b1cdbd2cSJim Jagielski 				(bStart ? TOKEN_CHAR_WORD : TOKEN_WORD) :
677*b1cdbd2cSJim Jagielski 				TOKEN_ILLEGAL) | TOKEN_DIGIT_FLAGS;
678*b1cdbd2cSJim Jagielski 		case U_SPACE_SEPARATOR :
679*b1cdbd2cSJim Jagielski 			return ((nTypes & KParseTokens::IGNORE_LEADING_WS) ?
680*b1cdbd2cSJim Jagielski 				TOKEN_CHAR_DONTCARE : (bStart ? TOKEN_CHAR_WORD : (TOKEN_CHAR_DONTCARE | TOKEN_WORD_SEP | TOKEN_VALUE_SEP) ));
681*b1cdbd2cSJim Jagielski 	}
682*b1cdbd2cSJim Jagielski 
683*b1cdbd2cSJim Jagielski 	return TOKEN_ILLEGAL;
684*b1cdbd2cSJim Jagielski }
685*b1cdbd2cSJim Jagielski 
686*b1cdbd2cSJim Jagielski 
getStartCharsFlags(sal_Unicode c)687*b1cdbd2cSJim Jagielski UPT_FLAG_TYPE cclass_Unicode::getStartCharsFlags( sal_Unicode c )
688*b1cdbd2cSJim Jagielski {
689*b1cdbd2cSJim Jagielski 	if ( pStart )
690*b1cdbd2cSJim Jagielski 	{
691*b1cdbd2cSJim Jagielski         const sal_Unicode* pStr = aStartChars.getStr();
692*b1cdbd2cSJim Jagielski 		const sal_Unicode* p = StrChr( pStr, c );
693*b1cdbd2cSJim Jagielski 		if ( p )
694*b1cdbd2cSJim Jagielski 			return pStart[ p - pStr ];
695*b1cdbd2cSJim Jagielski 	}
696*b1cdbd2cSJim Jagielski 	return TOKEN_ILLEGAL;
697*b1cdbd2cSJim Jagielski }
698*b1cdbd2cSJim Jagielski 
699*b1cdbd2cSJim Jagielski 
getContCharsFlags(sal_Unicode c)700*b1cdbd2cSJim Jagielski UPT_FLAG_TYPE cclass_Unicode::getContCharsFlags( sal_Unicode c )
701*b1cdbd2cSJim Jagielski {
702*b1cdbd2cSJim Jagielski 	if ( pCont )
703*b1cdbd2cSJim Jagielski 	{
704*b1cdbd2cSJim Jagielski         const sal_Unicode* pStr = aContChars.getStr();
705*b1cdbd2cSJim Jagielski 		const sal_Unicode* p = StrChr( pStr, c );
706*b1cdbd2cSJim Jagielski 		if ( p )
707*b1cdbd2cSJim Jagielski 			return pCont[ p - pStr ];
708*b1cdbd2cSJim Jagielski 	}
709*b1cdbd2cSJim Jagielski 	return TOKEN_ILLEGAL;
710*b1cdbd2cSJim Jagielski }
711*b1cdbd2cSJim Jagielski 
712*b1cdbd2cSJim Jagielski 
parseText(ParseResult & r,const OUString & rText,sal_Int32 nPos,sal_Int32 nTokenType)713*b1cdbd2cSJim Jagielski void cclass_Unicode::parseText( ParseResult& r, const OUString& rText, sal_Int32 nPos, sal_Int32 nTokenType )
714*b1cdbd2cSJim Jagielski {
715*b1cdbd2cSJim Jagielski 	using namespace i18n;
716*b1cdbd2cSJim Jagielski 	const sal_Unicode* const pTextStart = rText.getStr() + nPos;
717*b1cdbd2cSJim Jagielski 	eState = ssGetChar;
718*b1cdbd2cSJim Jagielski 
719*b1cdbd2cSJim Jagielski     //! All the variables below (plus ParseResult) have to be resetted on ssRewindFromValue!
720*b1cdbd2cSJim Jagielski 	const sal_Unicode* pSym = pTextStart;
721*b1cdbd2cSJim Jagielski 	const sal_Unicode* pSrc = pSym;
722*b1cdbd2cSJim Jagielski 	OUString aSymbol;
723*b1cdbd2cSJim Jagielski 	sal_Unicode c = *pSrc;
724*b1cdbd2cSJim Jagielski 	sal_Unicode cLast = 0;
725*b1cdbd2cSJim Jagielski     int nDecSeps = 0;
726*b1cdbd2cSJim Jagielski 	bool bQuote = false;
727*b1cdbd2cSJim Jagielski 	bool bMightBeWord = true;
728*b1cdbd2cSJim Jagielski 	bool bMightBeWordLast = true;
729*b1cdbd2cSJim Jagielski     //! All the variables above (plus ParseResult) have to be resetted on ssRewindFromValue!
730*b1cdbd2cSJim Jagielski 
731*b1cdbd2cSJim Jagielski 	while ( (c != 0) && (eState != ssStop) )
732*b1cdbd2cSJim Jagielski 	{
733*b1cdbd2cSJim Jagielski 		UPT_FLAG_TYPE nMask = getFlags( pTextStart, pSrc - pTextStart );
734*b1cdbd2cSJim Jagielski 		if ( nMask & TOKEN_EXCLUDED )
735*b1cdbd2cSJim Jagielski 			eState = ssBounce;
736*b1cdbd2cSJim Jagielski 		if ( bMightBeWord )
737*b1cdbd2cSJim Jagielski 		{	// only relevant for ssGetValue fall back
738*b1cdbd2cSJim Jagielski 			if ( eState == ssGetChar || eState == ssRewindFromValue ||
739*b1cdbd2cSJim Jagielski                     eState == ssIgnoreLeadingInRewind )
740*b1cdbd2cSJim Jagielski 				bMightBeWord = ((nMask & TOKEN_CHAR_WORD) != 0);
741*b1cdbd2cSJim Jagielski 			else
742*b1cdbd2cSJim Jagielski 				bMightBeWord = ((nMask & TOKEN_WORD) != 0);
743*b1cdbd2cSJim Jagielski 		}
744*b1cdbd2cSJim Jagielski 		sal_Int32 nParseTokensType = getParseTokensType( pTextStart, pSrc - pTextStart );
745*b1cdbd2cSJim Jagielski 		pSrc++;
746*b1cdbd2cSJim Jagielski 		switch (eState)
747*b1cdbd2cSJim Jagielski 		{
748*b1cdbd2cSJim Jagielski 			case ssGetChar :
749*b1cdbd2cSJim Jagielski             case ssRewindFromValue :
750*b1cdbd2cSJim Jagielski             case ssIgnoreLeadingInRewind :
751*b1cdbd2cSJim Jagielski 			{
752*b1cdbd2cSJim Jagielski                 if ( (nMask & TOKEN_CHAR_VALUE) && eState != ssRewindFromValue
753*b1cdbd2cSJim Jagielski                         && eState != ssIgnoreLeadingInRewind )
754*b1cdbd2cSJim Jagielski 				{	//! must be first, may fall back to ssGetWord via bMightBeWord
755*b1cdbd2cSJim Jagielski 					eState = ssGetValue;
756*b1cdbd2cSJim Jagielski 					if ( nMask & TOKEN_VALUE_DIGIT )
757*b1cdbd2cSJim Jagielski                     {
758*b1cdbd2cSJim Jagielski                         if ( 128 <= c )
759*b1cdbd2cSJim Jagielski                             r.TokenType = KParseType::UNI_NUMBER;
760*b1cdbd2cSJim Jagielski                         else
761*b1cdbd2cSJim Jagielski                             r.TokenType = KParseType::ASC_NUMBER;
762*b1cdbd2cSJim Jagielski                     }
763*b1cdbd2cSJim Jagielski                     else if ( c == cDecimalSep )
764*b1cdbd2cSJim Jagielski                     {
765*b1cdbd2cSJim Jagielski                         if ( *pSrc )
766*b1cdbd2cSJim Jagielski                             ++nDecSeps;
767*b1cdbd2cSJim Jagielski                         else
768*b1cdbd2cSJim Jagielski                             eState = ssRewindFromValue;
769*b1cdbd2cSJim Jagielski                             // retry for ONE_SINGLE_CHAR or others
770*b1cdbd2cSJim Jagielski                     }
771*b1cdbd2cSJim Jagielski 				}
772*b1cdbd2cSJim Jagielski 				else if ( nMask & TOKEN_CHAR_WORD )
773*b1cdbd2cSJim Jagielski 				{
774*b1cdbd2cSJim Jagielski 					eState = ssGetWord;
775*b1cdbd2cSJim Jagielski 					r.TokenType = KParseType::IDENTNAME;
776*b1cdbd2cSJim Jagielski 				}
777*b1cdbd2cSJim Jagielski 				else if ( nMask & TOKEN_NAME_SEP )
778*b1cdbd2cSJim Jagielski 				{
779*b1cdbd2cSJim Jagielski 					eState = ssGetWordFirstChar;
780*b1cdbd2cSJim Jagielski 					bQuote = true;
781*b1cdbd2cSJim Jagielski 					pSym++;
782*b1cdbd2cSJim Jagielski 					nParseTokensType = 0;	// will be taken of first real character
783*b1cdbd2cSJim Jagielski 					r.TokenType = KParseType::SINGLE_QUOTE_NAME;
784*b1cdbd2cSJim Jagielski 				}
785*b1cdbd2cSJim Jagielski 				else if ( nMask & TOKEN_CHAR_STRING )
786*b1cdbd2cSJim Jagielski 				{
787*b1cdbd2cSJim Jagielski 					eState = ssGetString;
788*b1cdbd2cSJim Jagielski 					pSym++;
789*b1cdbd2cSJim Jagielski 					nParseTokensType = 0;	// will be taken of first real character
790*b1cdbd2cSJim Jagielski 					r.TokenType = KParseType::DOUBLE_QUOTE_STRING;
791*b1cdbd2cSJim Jagielski 				}
792*b1cdbd2cSJim Jagielski 				else if ( nMask & TOKEN_CHAR_DONTCARE )
793*b1cdbd2cSJim Jagielski 				{
794*b1cdbd2cSJim Jagielski 					if ( nStartTypes & KParseTokens::IGNORE_LEADING_WS )
795*b1cdbd2cSJim Jagielski 					{
796*b1cdbd2cSJim Jagielski                         if (eState == ssRewindFromValue)
797*b1cdbd2cSJim Jagielski                             eState = ssIgnoreLeadingInRewind;
798*b1cdbd2cSJim Jagielski 						r.LeadingWhiteSpace++;
799*b1cdbd2cSJim Jagielski 						pSym++;
800*b1cdbd2cSJim Jagielski 						nParseTokensType = 0;	// wait until real character
801*b1cdbd2cSJim Jagielski 						bMightBeWord = true;
802*b1cdbd2cSJim Jagielski 					}
803*b1cdbd2cSJim Jagielski 					else
804*b1cdbd2cSJim Jagielski 						eState = ssBounce;
805*b1cdbd2cSJim Jagielski 				}
806*b1cdbd2cSJim Jagielski 				else if ( nMask & TOKEN_CHAR_BOOL )
807*b1cdbd2cSJim Jagielski 				{
808*b1cdbd2cSJim Jagielski 					eState = ssGetBool;
809*b1cdbd2cSJim Jagielski 					r.TokenType = KParseType::BOOLEAN;
810*b1cdbd2cSJim Jagielski 				}
811*b1cdbd2cSJim Jagielski 				else if ( nMask & TOKEN_CHAR )
812*b1cdbd2cSJim Jagielski 				{	//! must be last
813*b1cdbd2cSJim Jagielski 					eState = ssStop;
814*b1cdbd2cSJim Jagielski 					r.TokenType = KParseType::ONE_SINGLE_CHAR;
815*b1cdbd2cSJim Jagielski 				}
816*b1cdbd2cSJim Jagielski 				else
817*b1cdbd2cSJim Jagielski 					eState = ssBounce;		// not known
818*b1cdbd2cSJim Jagielski 			}
819*b1cdbd2cSJim Jagielski 			break;
820*b1cdbd2cSJim Jagielski 			case ssGetValue :
821*b1cdbd2cSJim Jagielski 			{
822*b1cdbd2cSJim Jagielski                 if ( nMask & TOKEN_VALUE_DIGIT )
823*b1cdbd2cSJim Jagielski                 {
824*b1cdbd2cSJim Jagielski                     if ( 128 <= c )
825*b1cdbd2cSJim Jagielski                         r.TokenType = KParseType::UNI_NUMBER;
826*b1cdbd2cSJim Jagielski                     else if ( r.TokenType != KParseType::UNI_NUMBER )
827*b1cdbd2cSJim Jagielski                         r.TokenType = KParseType::ASC_NUMBER;
828*b1cdbd2cSJim Jagielski                 }
829*b1cdbd2cSJim Jagielski                 if ( nMask & TOKEN_VALUE )
830*b1cdbd2cSJim Jagielski                 {
831*b1cdbd2cSJim Jagielski                     if ( c == cDecimalSep && ++nDecSeps > 1 )
832*b1cdbd2cSJim Jagielski                     {
833*b1cdbd2cSJim Jagielski                         if ( pSrc - pTextStart == 2 )
834*b1cdbd2cSJim Jagielski                             eState = ssRewindFromValue;
835*b1cdbd2cSJim Jagielski                             // consecutive separators
836*b1cdbd2cSJim Jagielski                         else
837*b1cdbd2cSJim Jagielski                             eState = ssStopBack;
838*b1cdbd2cSJim Jagielski                     }
839*b1cdbd2cSJim Jagielski                     // else keep it going
840*b1cdbd2cSJim Jagielski                 }
841*b1cdbd2cSJim Jagielski 				else if ( c == 'E' || c == 'e' )
842*b1cdbd2cSJim Jagielski 				{
843*b1cdbd2cSJim Jagielski 					UPT_FLAG_TYPE nNext = getFlags( pTextStart, pSrc - pTextStart );
844*b1cdbd2cSJim Jagielski 					if ( nNext & TOKEN_VALUE_EXP )
845*b1cdbd2cSJim Jagielski 						;	// keep it going
846*b1cdbd2cSJim Jagielski 					else if ( bMightBeWord && ((nNext & TOKEN_WORD) || !*pSrc) )
847*b1cdbd2cSJim Jagielski 					{	// might be a numerical name (1.2efg)
848*b1cdbd2cSJim Jagielski 						eState = ssGetWord;
849*b1cdbd2cSJim Jagielski 						r.TokenType = KParseType::IDENTNAME;
850*b1cdbd2cSJim Jagielski 					}
851*b1cdbd2cSJim Jagielski 					else
852*b1cdbd2cSJim Jagielski 						eState = ssStopBack;
853*b1cdbd2cSJim Jagielski 				}
854*b1cdbd2cSJim Jagielski 				else if ( nMask & TOKEN_VALUE_SIGN )
855*b1cdbd2cSJim Jagielski 				{
856*b1cdbd2cSJim Jagielski 					if ( (cLast == 'E') || (cLast == 'e') )
857*b1cdbd2cSJim Jagielski 					{
858*b1cdbd2cSJim Jagielski 						UPT_FLAG_TYPE nNext = getFlags( pTextStart, pSrc - pTextStart );
859*b1cdbd2cSJim Jagielski 						if ( nNext & TOKEN_VALUE_EXP_VALUE )
860*b1cdbd2cSJim Jagielski 							;	// keep it going
861*b1cdbd2cSJim Jagielski 						else if ( bMightBeWord && ((nNext & TOKEN_WORD) || !*pSrc) )
862*b1cdbd2cSJim Jagielski 						{	// might be a numerical name (1.2e+fg)
863*b1cdbd2cSJim Jagielski 							eState = ssGetWord;
864*b1cdbd2cSJim Jagielski 							r.TokenType = KParseType::IDENTNAME;
865*b1cdbd2cSJim Jagielski 						}
866*b1cdbd2cSJim Jagielski 						else
867*b1cdbd2cSJim Jagielski 							eState = ssStopBack;
868*b1cdbd2cSJim Jagielski 					}
869*b1cdbd2cSJim Jagielski 					else if ( bMightBeWord )
870*b1cdbd2cSJim Jagielski 					{	// might be a numerical name (1.2+fg)
871*b1cdbd2cSJim Jagielski 						eState = ssGetWord;
872*b1cdbd2cSJim Jagielski 						r.TokenType = KParseType::IDENTNAME;
873*b1cdbd2cSJim Jagielski 					}
874*b1cdbd2cSJim Jagielski 					else
875*b1cdbd2cSJim Jagielski 						eState = ssStopBack;
876*b1cdbd2cSJim Jagielski 				}
877*b1cdbd2cSJim Jagielski 				else if ( bMightBeWord && (nMask & TOKEN_WORD) )
878*b1cdbd2cSJim Jagielski 				{	// might be a numerical name (1995.A1)
879*b1cdbd2cSJim Jagielski 					eState = ssGetWord;
880*b1cdbd2cSJim Jagielski 					r.TokenType = KParseType::IDENTNAME;
881*b1cdbd2cSJim Jagielski 				}
882*b1cdbd2cSJim Jagielski 				else
883*b1cdbd2cSJim Jagielski 					eState = ssStopBack;
884*b1cdbd2cSJim Jagielski 			}
885*b1cdbd2cSJim Jagielski 			break;
886*b1cdbd2cSJim Jagielski 			case ssGetWordFirstChar :
887*b1cdbd2cSJim Jagielski 				eState = ssGetWord;
888*b1cdbd2cSJim Jagielski 				// fall thru
889*b1cdbd2cSJim Jagielski 			case ssGetWord :
890*b1cdbd2cSJim Jagielski 			{
891*b1cdbd2cSJim Jagielski 				if ( nMask & TOKEN_WORD )
892*b1cdbd2cSJim Jagielski 					;	// keep it going
893*b1cdbd2cSJim Jagielski 				else if ( nMask & TOKEN_NAME_SEP )
894*b1cdbd2cSJim Jagielski 				{
895*b1cdbd2cSJim Jagielski 					if ( bQuote )
896*b1cdbd2cSJim Jagielski 					{
897*b1cdbd2cSJim Jagielski 						if ( cLast == '\\' )
898*b1cdbd2cSJim Jagielski 						{	// escaped
899*b1cdbd2cSJim Jagielski 							aSymbol += OUString( pSym, pSrc - pSym - 2 );
900*b1cdbd2cSJim Jagielski 							aSymbol += OUString( &c, 1);
901*b1cdbd2cSJim Jagielski 						}
902*b1cdbd2cSJim Jagielski 						else
903*b1cdbd2cSJim Jagielski 						{
904*b1cdbd2cSJim Jagielski 							eState = ssStop;
905*b1cdbd2cSJim Jagielski 							aSymbol += OUString( pSym, pSrc - pSym - 1 );
906*b1cdbd2cSJim Jagielski 						}
907*b1cdbd2cSJim Jagielski 						pSym = pSrc;
908*b1cdbd2cSJim Jagielski 					}
909*b1cdbd2cSJim Jagielski 					else
910*b1cdbd2cSJim Jagielski 						eState = ssStopBack;
911*b1cdbd2cSJim Jagielski 				}
912*b1cdbd2cSJim Jagielski 				else if ( bQuote )
913*b1cdbd2cSJim Jagielski 					;	// keep it going
914*b1cdbd2cSJim Jagielski 				else
915*b1cdbd2cSJim Jagielski 					eState = ssStopBack;
916*b1cdbd2cSJim Jagielski 			}
917*b1cdbd2cSJim Jagielski 			break;
918*b1cdbd2cSJim Jagielski 			case ssGetString :
919*b1cdbd2cSJim Jagielski 			{
920*b1cdbd2cSJim Jagielski 				if ( nMask & TOKEN_STRING_SEP )
921*b1cdbd2cSJim Jagielski 				{
922*b1cdbd2cSJim Jagielski 					if ( cLast == '\\' )
923*b1cdbd2cSJim Jagielski 					{	// escaped
924*b1cdbd2cSJim Jagielski 						aSymbol += OUString( pSym, pSrc - pSym - 2 );
925*b1cdbd2cSJim Jagielski 						aSymbol += OUString( &c, 1);
926*b1cdbd2cSJim Jagielski 					}
927*b1cdbd2cSJim Jagielski                     else if ( c == *pSrc &&
928*b1cdbd2cSJim Jagielski                             !(nContTypes & KParseTokens::TWO_DOUBLE_QUOTES_BREAK_STRING) )
929*b1cdbd2cSJim Jagielski 					{	// "" => literal " escaped
930*b1cdbd2cSJim Jagielski 						aSymbol += OUString( pSym, pSrc - pSym );
931*b1cdbd2cSJim Jagielski 						pSrc++;
932*b1cdbd2cSJim Jagielski 					}
933*b1cdbd2cSJim Jagielski 					else
934*b1cdbd2cSJim Jagielski 					{
935*b1cdbd2cSJim Jagielski 						eState = ssStop;
936*b1cdbd2cSJim Jagielski 						aSymbol += OUString( pSym, pSrc - pSym - 1 );
937*b1cdbd2cSJim Jagielski 					}
938*b1cdbd2cSJim Jagielski 					pSym = pSrc;
939*b1cdbd2cSJim Jagielski 				}
940*b1cdbd2cSJim Jagielski 			}
941*b1cdbd2cSJim Jagielski 			break;
942*b1cdbd2cSJim Jagielski 			case ssGetBool :
943*b1cdbd2cSJim Jagielski 			{
944*b1cdbd2cSJim Jagielski 				if ( (nMask & TOKEN_BOOL) )
945*b1cdbd2cSJim Jagielski 					eState = ssStop;	// maximum 2: <, >, <>, <=, >=
946*b1cdbd2cSJim Jagielski 				else
947*b1cdbd2cSJim Jagielski 					eState = ssStopBack;
948*b1cdbd2cSJim Jagielski 			}
949*b1cdbd2cSJim Jagielski 			break;
950*b1cdbd2cSJim Jagielski             case ssStopBack :
951*b1cdbd2cSJim Jagielski             case ssBounce :
952*b1cdbd2cSJim Jagielski             case ssStop :
953*b1cdbd2cSJim Jagielski                 ;   // nothing, no compiler warning
954*b1cdbd2cSJim Jagielski             break;
955*b1cdbd2cSJim Jagielski 		}
956*b1cdbd2cSJim Jagielski         if ( eState == ssRewindFromValue )
957*b1cdbd2cSJim Jagielski         {
958*b1cdbd2cSJim Jagielski             r = ParseResult();
959*b1cdbd2cSJim Jagielski             pSym = pTextStart;
960*b1cdbd2cSJim Jagielski             pSrc = pSym;
961*b1cdbd2cSJim Jagielski             aSymbol = OUString();
962*b1cdbd2cSJim Jagielski             c = *pSrc;
963*b1cdbd2cSJim Jagielski             cLast = 0;
964*b1cdbd2cSJim Jagielski             nDecSeps = 0;
965*b1cdbd2cSJim Jagielski             bQuote = false;
966*b1cdbd2cSJim Jagielski             bMightBeWord = true;
967*b1cdbd2cSJim Jagielski             bMightBeWordLast = true;
968*b1cdbd2cSJim Jagielski         }
969*b1cdbd2cSJim Jagielski         else
970*b1cdbd2cSJim Jagielski         {
971*b1cdbd2cSJim Jagielski             if ( !(r.TokenType & nTokenType) )
972*b1cdbd2cSJim Jagielski             {
973*b1cdbd2cSJim Jagielski                 if ( (r.TokenType & (KParseType::ASC_NUMBER | KParseType::UNI_NUMBER))
974*b1cdbd2cSJim Jagielski                         && (nTokenType & KParseType::IDENTNAME) && bMightBeWord )
975*b1cdbd2cSJim Jagielski                     ;	// keep a number that might be a word
976*b1cdbd2cSJim Jagielski                 else if ( r.LeadingWhiteSpace == (pSrc - pTextStart) )
977*b1cdbd2cSJim Jagielski                     ;	// keep ignored white space
978*b1cdbd2cSJim Jagielski                 else if ( !r.TokenType && eState == ssGetValue && (nMask & TOKEN_VALUE_SEP) )
979*b1cdbd2cSJim Jagielski                     ;   // keep uncertain value
980*b1cdbd2cSJim Jagielski                 else
981*b1cdbd2cSJim Jagielski                     eState = ssBounce;
982*b1cdbd2cSJim Jagielski             }
983*b1cdbd2cSJim Jagielski             if ( eState == ssBounce )
984*b1cdbd2cSJim Jagielski             {
985*b1cdbd2cSJim Jagielski                 r.TokenType = 0;
986*b1cdbd2cSJim Jagielski                 eState = ssStopBack;
987*b1cdbd2cSJim Jagielski             }
988*b1cdbd2cSJim Jagielski             if ( eState == ssStopBack )
989*b1cdbd2cSJim Jagielski             {	// put back
990*b1cdbd2cSJim Jagielski                 pSrc--;
991*b1cdbd2cSJim Jagielski                 bMightBeWord = bMightBeWordLast;
992*b1cdbd2cSJim Jagielski                 eState = ssStop;
993*b1cdbd2cSJim Jagielski             }
994*b1cdbd2cSJim Jagielski             if ( eState != ssStop )
995*b1cdbd2cSJim Jagielski             {
996*b1cdbd2cSJim Jagielski                 if ( !r.StartFlags )
997*b1cdbd2cSJim Jagielski                     r.StartFlags |= nParseTokensType;
998*b1cdbd2cSJim Jagielski                 else
999*b1cdbd2cSJim Jagielski                     r.ContFlags |= nParseTokensType;
1000*b1cdbd2cSJim Jagielski             }
1001*b1cdbd2cSJim Jagielski             bMightBeWordLast = bMightBeWord;
1002*b1cdbd2cSJim Jagielski             cLast = c;
1003*b1cdbd2cSJim Jagielski             c = *pSrc;
1004*b1cdbd2cSJim Jagielski         }
1005*b1cdbd2cSJim Jagielski 	}
1006*b1cdbd2cSJim Jagielski 	// r.CharLen is the length in characters (not code points) of the parsed
1007*b1cdbd2cSJim Jagielski 	// token not including any leading white space, change this calculation if
1008*b1cdbd2cSJim Jagielski 	// multi-code-point Unicode characters are to be supported.
1009*b1cdbd2cSJim Jagielski 	r.CharLen = pSrc - pTextStart - r.LeadingWhiteSpace;
1010*b1cdbd2cSJim Jagielski 	r.EndPos = nPos + (pSrc - pTextStart);
1011*b1cdbd2cSJim Jagielski 	if ( r.TokenType & KParseType::ASC_NUMBER )
1012*b1cdbd2cSJim Jagielski 	{
1013*b1cdbd2cSJim Jagielski         r.Value = rtl_math_uStringToDouble( pTextStart + r.LeadingWhiteSpace,
1014*b1cdbd2cSJim Jagielski                 pTextStart + r.EndPos, cDecimalSep, cGroupSep, NULL, NULL );
1015*b1cdbd2cSJim Jagielski 		if ( bMightBeWord )
1016*b1cdbd2cSJim Jagielski 			r.TokenType |= KParseType::IDENTNAME;
1017*b1cdbd2cSJim Jagielski 	}
1018*b1cdbd2cSJim Jagielski 	else if ( r.TokenType & KParseType::UNI_NUMBER )
1019*b1cdbd2cSJim Jagielski 	{
1020*b1cdbd2cSJim Jagielski         if ( !xNatNumSup.is() )
1021*b1cdbd2cSJim Jagielski         {
1022*b1cdbd2cSJim Jagielski #define NATIVENUMBERSUPPLIER_SERVICENAME "com.sun.star.i18n.NativeNumberSupplier"
1023*b1cdbd2cSJim Jagielski             if ( xMSF.is() )
1024*b1cdbd2cSJim Jagielski             {
1025*b1cdbd2cSJim Jagielski                 xNatNumSup = Reference< XNativeNumberSupplier > (
1026*b1cdbd2cSJim Jagielski                         xMSF->createInstance( OUString(
1027*b1cdbd2cSJim Jagielski                                 RTL_CONSTASCII_USTRINGPARAM(
1028*b1cdbd2cSJim Jagielski                                     NATIVENUMBERSUPPLIER_SERVICENAME ) ) ),
1029*b1cdbd2cSJim Jagielski                         UNO_QUERY );
1030*b1cdbd2cSJim Jagielski             }
1031*b1cdbd2cSJim Jagielski             if ( !xNatNumSup.is() )
1032*b1cdbd2cSJim Jagielski             {
1033*b1cdbd2cSJim Jagielski                 throw RuntimeException( OUString(
1034*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
1035*b1cdbd2cSJim Jagielski                     RTL_CONSTASCII_USTRINGPARAM(
1036*b1cdbd2cSJim Jagielski                         "cclass_Unicode::parseText: can't instanciate "
1037*b1cdbd2cSJim Jagielski                         NATIVENUMBERSUPPLIER_SERVICENAME )
1038*b1cdbd2cSJim Jagielski #endif
1039*b1cdbd2cSJim Jagielski                     ), *this );
1040*b1cdbd2cSJim Jagielski             }
1041*b1cdbd2cSJim Jagielski #undef NATIVENUMBERSUPPLIER_SERVICENAME
1042*b1cdbd2cSJim Jagielski         }
1043*b1cdbd2cSJim Jagielski         OUString aTmp( pTextStart + r.LeadingWhiteSpace, r.EndPos - nPos +
1044*b1cdbd2cSJim Jagielski                 r.LeadingWhiteSpace );
1045*b1cdbd2cSJim Jagielski         // transliterate to ASCII
1046*b1cdbd2cSJim Jagielski         aTmp = xNatNumSup->getNativeNumberString( aTmp, aParserLocale,
1047*b1cdbd2cSJim Jagielski                 NativeNumberMode::NATNUM0 );
1048*b1cdbd2cSJim Jagielski         r.Value = ::rtl::math::stringToDouble( aTmp, cDecimalSep, cGroupSep, NULL, NULL );
1049*b1cdbd2cSJim Jagielski 		if ( bMightBeWord )
1050*b1cdbd2cSJim Jagielski 			r.TokenType |= KParseType::IDENTNAME;
1051*b1cdbd2cSJim Jagielski 	}
1052*b1cdbd2cSJim Jagielski 	else if ( r.TokenType & (KParseType::SINGLE_QUOTE_NAME | KParseType::DOUBLE_QUOTE_STRING) )
1053*b1cdbd2cSJim Jagielski 	{
1054*b1cdbd2cSJim Jagielski 		if ( pSym < pSrc )
1055*b1cdbd2cSJim Jagielski 		{	//! open quote
1056*b1cdbd2cSJim Jagielski 			aSymbol += OUString( pSym, pSrc - pSym );
1057*b1cdbd2cSJim Jagielski 			r.TokenType |= KParseType::MISSING_QUOTE;
1058*b1cdbd2cSJim Jagielski 		}
1059*b1cdbd2cSJim Jagielski 		r.DequotedNameOrString = aSymbol;
1060*b1cdbd2cSJim Jagielski 	}
1061*b1cdbd2cSJim Jagielski }
1062*b1cdbd2cSJim Jagielski 
1063*b1cdbd2cSJim Jagielski } } } }
1064