1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 #ifndef _L10N_TRANSLITERATION_NUMTOCHAR_H_
28 #define _L10N_TRANSLITERATION_NUMTOCHAR_H_
29 
30 namespace com { namespace sun { namespace star { namespace i18n {
31 
32 static const sal_Int16 NumberChar_HalfWidth 	= 0;
33 static const sal_Int16 NumberChar_FullWidth 	= 1;
34 static const sal_Int16 NumberChar_Lower_zh 	= 2;
35 static const sal_Int16 NumberChar_Upper_zh 	= 3;
36 static const sal_Int16 NumberChar_Upper_zh_TW 	= 4;
37 static const sal_Int16 NumberChar_Modern_ja 	= 5;
38 static const sal_Int16 NumberChar_Traditional_ja= 6;
39 static const sal_Int16 NumberChar_Lower_ko 	= 7;
40 static const sal_Int16 NumberChar_Upper_ko 	= 8;
41 static const sal_Int16 NumberChar_Hangul_ko 	= 9;
42 static const sal_Int16 NumberChar_Indic_ar 	= 10;
43 static const sal_Int16 NumberChar_EastIndic_ar  = 11;
44 static const sal_Int16 NumberChar_hi 		= 12;
45 static const sal_Int16 NumberChar_th 		= 13;
46 static const sal_Int16 NumberChar_or 		= 14;
47 static const sal_Int16 NumberChar_mr 		= 15;
48 static const sal_Int16 NumberChar_bn 		= 16;
49 static const sal_Int16 NumberChar_pa 		= 17;
50 static const sal_Int16 NumberChar_gu 		= 18;
51 static const sal_Int16 NumberChar_ta 		= 19;
52 static const sal_Int16 NumberChar_te 		= 20;
53 static const sal_Int16 NumberChar_kn 		= 21;
54 static const sal_Int16 NumberChar_ml 		= 22;
55 static const sal_Int16 NumberChar_lo 		= 23;
56 static const sal_Int16 NumberChar_bo 		= 24;
57 static const sal_Int16 NumberChar_my 		= 25;
58 static const sal_Int16 NumberChar_km 		= 26;
59 static const sal_Int16 NumberChar_mn 		= 27;
60 static const sal_Int16 NumberChar_he 		= 28;
61 static const sal_Int16 NumberChar_ne 		= 29;
62 static const sal_Int16 NumberChar_dz 		= 30;
63 static const sal_Int16 NumberChar_Count 	= 31;
64 
65 static sal_Unicode NumberChar[][10] = {
66 //	0	1	2	3	4	5	6	7	8	9
67     { 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039 }, // Half Width (Ascii)
68     { 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19 }, // Full Width
69     { 0x3007, 0x4E00, 0x4E8c, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D }, // Chinese Lower
70     { 0x96F6, 0x58F9, 0x8D30, 0x53C1, 0x8086, 0x4F0D, 0x9646, 0x67D2, 0x634C, 0x7396 }, // S. Chinese Upper
71     { 0x96F6, 0x58F9, 0x8CB3, 0x53C3, 0x8086, 0x4F0D, 0x9678, 0x67D2, 0x634C, 0x7396 }, // T. Chinese Upper
72     { 0x3007, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D }, // Japanese Modern
73     { 0x96F6, 0x58F1, 0x5F10, 0x53C2, 0x56DB, 0x4F0D, 0x516D, 0x4E03, 0x516B, 0x4E5D }, // Japanese Trad.
74     { 0x3007, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D }, // Korean Lower
75     { 0xF9B2, 0x58F9, 0x8CB3, 0x53C3, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D }, // Korean Upper
76     { 0xC601, 0xC77C, 0xC774, 0xC0BC, 0xC0AC, 0xC624, 0xC721, 0xCE60, 0xD314, 0xAD6C }, // Korean Hangul
77     { 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, 0x0668, 0x0669 }, // Arabic Indic
78     { 0x06F0, 0x06F1, 0x06F2, 0x06F3, 0x06F4, 0x06F5, 0x06F6, 0x06F7, 0x06F8, 0x06F9 }, // Est. Arabic Indic
79     { 0x0966, 0x0967, 0x0968, 0x0969, 0x096A, 0x096B, 0x096C, 0x096D, 0x096E, 0x096F }, // Indic (Devanagari)
80     { 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57, 0x0E58, 0x0E59 }, // Thai
81     { 0x0866, 0x0867, 0x0868, 0x0869, 0x086A, 0x086B, 0x086C, 0x086D, 0x086E, 0x086F }, // Oriya
82     { 0x0966, 0x0967, 0x0968, 0x0969, 0x096A, 0x096B, 0x096C, 0x096D, 0x096E, 0x096F }, // Marathi
83     { 0x09E6, 0x09E7, 0x09E8, 0x09E9, 0x09EA, 0x09EB, 0x09EC, 0x09ED, 0x09EE, 0x09EF }, // Bengali
84     { 0x0A66, 0x0A67, 0x0A68, 0x0A69, 0x0A6A, 0x0A6B, 0x0A6C, 0x0A6D, 0x0A6E, 0x0A6F }, // Punjabi (Gurmukhi)
85     { 0x0AE6, 0x0AE7, 0x0AE8, 0x0AE9, 0x0AEA, 0x0AEB, 0x0AEC, 0x0AED, 0x0AEE, 0x0AEF }, // Gujarali
86     { 0x0030, 0x0BE7, 0x0BE8, 0x0BE9, 0x0BEA, 0x0BEB, 0x0BEC, 0x0BED, 0x0BEE, 0x0BEF }, // Tamil
87     { 0x0C66, 0x0C67, 0x0C68, 0x0C69, 0x0C6A, 0x0C6B, 0x0C6C, 0x0C6D, 0x0C6E, 0x0C6F }, // Telugu
88     { 0x0CE6, 0x0CE7, 0x0CE8, 0x0CE9, 0x0CEA, 0x0CEB, 0x0CEC, 0x0CED, 0x0CEE, 0x0CEF }, // Kannada
89     { 0x0DE6, 0x0DE7, 0x0DE8, 0x0DE9, 0x0DEA, 0x0DEB, 0x0DEC, 0x0DED, 0x0DEE, 0x0DEF }, // Malayalam
90     { 0x0ED0, 0x0ED1, 0x0ED2, 0x0ED3, 0x0ED4, 0x0ED5, 0x0ED6, 0x0ED7, 0x0ED8, 0x0ED9 }, // Lao
91     { 0x0F20, 0x0F21, 0x0F22, 0x0F23, 0x0F24, 0x0F25, 0x0F26, 0x0F27, 0x0F28, 0x0F29 }, // Tibetan
92     { 0x1040, 0x1041, 0x1042, 0x1043, 0x1044, 0x1045, 0x1046, 0x1047, 0x1048, 0x1049 }, // Myammar
93     { 0x17E0, 0x17E1, 0x17E2, 0x17E3, 0x17E4, 0x17E5, 0x17E6, 0x17E7, 0x17E8, 0x17E9 }, // Cambodian (Khmer)
94     { 0x1810, 0x1811, 0x1812, 0x1813, 0x1814, 0x1815, 0x1816, 0x1817, 0x1818, 0x1819 }, // Mongolian
95     { 0x0020, 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8 }, // Hebrew
96     { 0x0966, 0x0967, 0x0968, 0x0969, 0x096A, 0x096B, 0x096C, 0x096D, 0x096E, 0x096F }, // Nepali
97     { 0x0F20, 0x0F21, 0x0F22, 0x0F23, 0x0F24, 0x0F25, 0x0F26, 0x0F27, 0x0F28, 0x0F29 }, // Dzongkha
98 };
99 
100 static sal_Unicode DecimalChar[] = {
101     0x002E, // Half Width (Ascii)
102     0xFF0E, // Full Width
103     0xFF0E, // Chinese Lower
104     0x70B9, // S. Chinese Upper
105     0x9EDE, // T. Chinese Upper
106     0x30FB, // Japanese Modern
107     0x30FB, // Japanese Trad.
108     0xFF0E, // Korean Lower
109     0x9EDE, // Korean Upper
110     0xC810, // Korean Hangul
111     0x066B, // Arabic Indic
112     0x066B, // Est. Arabic Indic
113     0x0000, // Indic (Devanagari)
114     0x0000, // Thai
115     0x0000, // Oriya
116     0x0000, // Marathi
117     0x0000, // Bengali
118     0x0000, // Punjabi (Gurmukhi)
119     0x0000, // Gujarali
120     0x0000, // Tamil
121     0x0000, // Telugu
122     0x0000, // Kannada
123     0x0000, // Malayalam
124     0x0000, // Lao
125     0x0000, // Tibetan
126     0x0000, // Myammar
127     0x0000, // Cambodian (Khmer)
128     0x0000, // Mongolian
129     0x0000, // Hebrew
130     0x0000, // Nepali
131     0x0000, // Dzongkha
132 };
133 
134 static sal_Unicode MinusChar[] = {
135     0x002D, // Half Width (Ascii)
136     0xFF0D, // Full Width
137     0xFF0D, // Chinese Lower
138     0x8D1F, // S. Chinese Upper
139     0x5069, // T. Chinese Upper
140     0x2212, // Japanese Modern
141     0x2212, // Japanese Trad.
142     0xFF0D, // Korean Lower
143     0x5069, // Korean Upper
144     0xFF0D, // Korean Hangul ???
145     0x0000, // Arabic Indic
146     0x2212, // Est. Arabic Indic
147     0x0000, // Indic
148     0x0000, // Thai
149     0x0000, // Oriya
150     0x0000, // Marathi
151     0x0000, // Bengali
152     0x0000, // Punjabi
153     0x0000, // Gujarali
154     0x0000, // Tamil
155     0x0000, // Telugu
156     0x0000, // Kannada
157     0x0000, // Malayalam
158     0x0000, // Lao
159     0x0000, // Tibetan
160     0x0000, // Myammar
161     0x0000, // Cambodian (Khmer)
162     0x0000, // Mongolian
163     0x0000, // Hebrew
164     0x0000, // Nepali
165     0x0000, // Dzongkha
166 };
167 
168 static sal_uInt16 SeparatorChar[] = {
169     0x002C, // Half Width (Ascii)
170     0xFF0C, // Full Width
171     0x3001, // Chinese Lower
172     0x3001, // S. Chinese Upper
173     0x3001, // T. Chinese Upper
174     0x3001, // Japanese Modern
175     0x3001, // Japanese Trad.
176     0x3001, // Korean Lower
177     0x3001, // Korean Upper
178     0x3001, // Korean Hangul
179     0x0000, // Arabic Indic
180     0x066C, // Est. Arabic Indic
181     0x0000, // Indic
182     0x0000, // Thai
183     0x0000, // Oriya
184     0x0000, // Marathi
185     0x0000, // Bengali
186     0x0000, // Punjabi
187     0x0000, // Gujarali
188     0x0000, // Tamil
189     0x0000, // Telugu
190     0x0000, // Kannada
191     0x0000, // Malayalam
192     0x0000, // Lao
193     0x0000, // Tibetan
194     0x0000, // Myammar
195     0x0000, // Cambodian (Khmer)
196     0x0000, // Mongolian
197     0x0000, // Hebrew
198     0x0000, // Nepali
199     0x0000, // Dzongkha
200 };
201 
202 #define NUMBER_ZERO     NumberChar[NumberChar_HalfWidth][0]	// 0x0030
203 #define NUMBER_ONE  	NumberChar[NumberChar_HalfWidth][1]     // 0x0031
204 #define NUMBER_NINE  	NumberChar[NumberChar_HalfWidth][9]     // 0x0039
205 #define isNumber(n) 	( NUMBER_ZERO <= n && n <= NUMBER_NINE )
206 #define isDecimal(n) 	( n == DecimalChar[NumberChar_HalfWidth] )
207 #define isMinus(n) 	    ( n == MinusChar[NumberChar_HalfWidth] )
208 #define isSeparator(n)  ( n == SeparatorChar[NumberChar_HalfWidth] )
209 
210 const sal_Int16 Multiplier_Lower_zh 	= 0;
211 const sal_Int16 Multiplier_Upper_zh 	= 1;
212 const sal_Int16 Multiplier_Lower_zh_TW 	= 2;
213 const sal_Int16 Multiplier_Upper_zh_TW 	= 3;
214 const sal_Int16 Multiplier_Lower_ko 	= 4;
215 const sal_Int16 Multiplier_Hangul_ko 	= 5;
216 const sal_Int16 Multiplier_Modern_ja 	= 6;
217 const sal_Int16 Multiplier_Traditional_ja = 7;
218 const sal_Int16 Multiplier_Count	= 8;
219 
220 const sal_Int16 ExponentCount_6_CJK 	= 6;
221 
222 static sal_Int16 MultiplierExponent_6_CJK[ExponentCount_6_CJK] = {
223     	12, 	8, 	4, 	3, 	2, 	1
224 };
225 static sal_Unicode MultiplierChar_6_CJK[][ExponentCount_6_CJK] = {
226     {0x5146, 0x4EBF, 0x4E07, 0x5343, 0x767E, 0x5341},	// S. Chinese Lower
227     {0x5146, 0x4EBF, 0x4E07, 0x4EDF, 0x4F70, 0x62FE},	// S. Chinese Upper
228     {0x5146, 0x5104, 0x842C, 0x5343, 0x767E, 0x5341},	// T. Chinese Lower
229     {0x5146, 0x5104, 0x842C, 0x4EDF, 0x4F70, 0x62FE},	// T. Chinese & Korean Upper
230     {0x5146, 0x5104, 0x4E07, 0x5343, 0x767E, 0x5341},	// Korean Lower
231     {0xC870, 0xC5B5, 0xB9CC, 0xCC9C, 0xBC31, 0xC2ED},	// Korean Hangul
232     {0x5146, 0x5104, 0x4E07, 0x5343, 0x767E, 0x5341},	// Japanese Modern
233     {0x5146, 0x5104, 0x842C, 0x9621, 0x767E, 0x62FE}	// Japanese Traditional
234 };
235 
236 const sal_Int16 ExponentCount_2_CJK 	= 2;
237 
238 static sal_Int16 MultiplierExponent_2_CJK[ExponentCount_2_CJK] = {
239     	8, 	4,
240 };
241 
242 static sal_Unicode MultiplierChar_2_CJK[][ExponentCount_2_CJK] = {
243     {0x4EBF, 0x4E07}, // S. Chinese Lower
244     {0x4EBF, 0x4E07}, // S. Chinese Upper
245     {0x5104, 0x842C}, // T. Chinese Lower
246     {0x5104, 0x842C}, // T. Chinese & Korean Upper
247     {0x5104, 0x4E07}, // Korean Lower
248     {0xC5B5, 0xB9CC}, // Korean Hangul
249     {0x5104, 0x4E07}, // Japanese Modern
250     {0x5104, 0x842C}  // Japanese Traditional
251 };
252 
253 const sal_Int16 ExponentCount_7_CJK 	= 7;
254 
255 static sal_Int16 MultiplierExponent_7_CJK[ExponentCount_7_CJK] = {
256     	16,	12, 	8, 	4, 	3, 	2, 	1
257 };
258 static sal_Unicode MultiplierChar_7_CJK[][ExponentCount_7_CJK] = {
259     {0x4EAC, 0x5146, 0x4EBF, 0x4E07, 0x5343, 0x767E, 0x5341},	// S. Chinese Lower
260     {0x4EAC, 0x5146, 0x4EBF, 0x4E07, 0x4EDF, 0x4F70, 0x62FE},	// S. Chinese Upper
261     {0x4EAC, 0x5146, 0x5104, 0x842C, 0x5343, 0x767E, 0x5341},	// T. Chinese Lower
262     {0x4EAC, 0x5146, 0x5104, 0x842C, 0x4EDF, 0x4F70, 0x62FE},	// T. Chinese & Korean Upper
263     {0x4EAC, 0x5146, 0x5104, 0x4E07, 0x5343, 0x767E, 0x5341},	// Korean Lower
264     {0x4EAC, 0xC870, 0xC5B5, 0xB9CC, 0xCC9C, 0xBC31, 0xC2ED},	// Korean Hangul
265     {0x4EAC, 0x5146, 0x5104, 0x4E07, 0x5343, 0x767E, 0x5341},	// Japanese Modern
266     {0x4EAC, 0x5146, 0x5104, 0x842C, 0x9621, 0x767E, 0x62FE}	// Japanese Traditional
267 };
268 
269 typedef struct {
270     sal_Int16 ExponentCount;
271     sal_Int16* MultiplierExponent;
272     sal_Unicode *MultiplierChar;
273 } Multiplier;
274 
275 } } } }
276 
277 #endif // _L10N_TRANSLITERATION_NUMTOCHAR_H_
278