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