/src/libreoffice/sal/textenc/convertsimple.cxx
Line | Count | Source |
1 | | /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
2 | | /* |
3 | | * This file is part of the LibreOffice project. |
4 | | * |
5 | | * This Source Code Form is subject to the terms of the Mozilla Public |
6 | | * License, v. 2.0. If a copy of the MPL was not distributed with this |
7 | | * file, You can obtain one at http://mozilla.org/MPL/2.0/. |
8 | | */ |
9 | | |
10 | | #include <sal/config.h> |
11 | | |
12 | | #include <rtl/textcvt.h> |
13 | | #include <sal/types.h> |
14 | | |
15 | | #include "convertsimple.hxx" |
16 | | #include "handleundefinedunicodetotextchar.hxx" |
17 | | #include "tenchelp.hxx" |
18 | | |
19 | | #include <iterator> |
20 | | |
21 | 0 | #define IMPL_MAX_REPLACECHAR 5 |
22 | | |
23 | | namespace { |
24 | | |
25 | | struct ImplReplaceCharData |
26 | | { |
27 | | sal_uInt16 mnUniChar; |
28 | | sal_uInt16 mnReplaceChar; |
29 | | }; |
30 | | |
31 | | ImplReplaceCharData const aImplRepCharTab[] = |
32 | | { |
33 | | { 0x00A0, 0x0020 }, /* NO-BREAK-SPACE */ |
34 | | { 0x00A1, 0x0021 }, /* INVERTED EXCLAMATION MARK */ |
35 | | { 0x00B7, 0x0045 }, /* MIDDLE DOT */ |
36 | | { 0x00BF, 0x003F }, /* INVERTED QUESTION MARK */ |
37 | | { 0x00D7, 0x002A }, /* MULTIPLICATION SIGN */ |
38 | | { 0x00F7, 0x002F }, /* DIVISION SIGN */ |
39 | | { 0x2000, 0x0020 }, /* EN QUAD */ |
40 | | { 0x2001, 0x0020 }, /* EM QUAD */ |
41 | | { 0x2002, 0x0020 }, /* EN SPACE */ |
42 | | { 0x2003, 0x0020 }, /* EM SPACE */ |
43 | | { 0x2004, 0x0020 }, /* THREE-PER-EM SPACE */ |
44 | | { 0x2005, 0x0020 }, /* FOUR-PER-EM SPACE */ |
45 | | { 0x2006, 0x0020 }, /* SIX-PER-EM SPACE */ |
46 | | { 0x2007, 0x0020 }, /* FIGURE SPACE */ |
47 | | { 0x2008, 0x0020 }, /* PUNCTUATION SPACE */ |
48 | | { 0x2009, 0x0020 }, /* THIN SPACE */ |
49 | | { 0x200A, 0x0020 }, /* HAIR SPACE */ |
50 | | { 0x2010, 0x002D }, /* HYPHEN */ |
51 | | { 0x2011, 0x002D }, /* NON-BREAKING HYPHEN */ |
52 | | { 0x2012, 0x002D }, /* FIGURE DASH */ |
53 | | { 0x2013, 0x002D }, /* EN DASH */ |
54 | | { 0x2014, 0x002D }, /* EM DASH */ |
55 | | { 0x2015, 0x002D }, /* HORIZONTAL BAR */ |
56 | | { 0x2018, 0x0027 }, /* LEFT SINGLE QUOTATION MARK */ |
57 | | { 0x2019, 0x0027 }, /* RIGHT SINGLE QUOTATION MARK */ |
58 | | { 0x201A, 0x002C }, /* SINGLE LOW-9 QUOTATION MARK */ |
59 | | { 0x201B, 0x0027 }, /* SINGLE HIGH-RESERVED-9 QUOTATION MARK */ |
60 | | { 0x201C, 0x0022 }, /* LEFT DOUBLE QUOTATION MARK */ |
61 | | { 0x201D, 0x0022 }, /* RIGHT DOUBLE QUOTATION MARK */ |
62 | | { 0x201E, 0x0022 }, /* DOUBLE LOW-9 QUOTATION MARK */ |
63 | | { 0x201F, 0x0022 }, /* DOUBLE HIGH-RESERVED-9 QUOTATION MARK */ |
64 | | { 0x2022, 0x002D }, /* BULLET */ |
65 | | { 0x2023, 0x002D }, /* TRIANGULAR BULLET */ |
66 | | { 0x2024, 0x002D }, /* ONE DOT LEADER */ |
67 | | { 0x2027, 0x002D }, /* HYPHENATION POINT */ |
68 | | { 0x2028, 0x000A }, /* LINE SEPARATOR */ |
69 | | { 0x2029, 0x000D }, /* PARAGRAPH SEPARATOR */ |
70 | | { 0x2032, 0x0027 }, /* PRIME */ |
71 | | { 0x2033, 0x0022 }, /* DOUBLE PRIME */ |
72 | | { 0x2035, 0x0027 }, /* RESERVED PRIME */ |
73 | | { 0x2036, 0x0022 }, /* RESERVED DOUBLE PRIME */ |
74 | | { 0x2039, 0x003C }, /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK */ |
75 | | { 0x203A, 0x003E }, /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK */ |
76 | | { 0x2043, 0x002D }, /* HYPHEN BULLET */ |
77 | | { 0x2044, 0x002F }, /* FRACTION SLASH */ |
78 | | { 0x2160, 0x0049 }, /* ROMAN NUMERAL ONE */ |
79 | | { 0x2164, 0x0056 }, /* ROMAN NUMERAL FIVE */ |
80 | | { 0x2169, 0x0058 }, /* ROMAN NUMERAL TEN */ |
81 | | { 0x216C, 0x004C }, /* ROMAN NUMERAL FIFTY */ |
82 | | { 0x216D, 0x0043 }, /* ROMAN NUMERAL ONE HUNDRED */ |
83 | | { 0x216E, 0x0044 }, /* ROMAN NUMERAL FIVE HUNDRED */ |
84 | | { 0x216F, 0x004D }, /* ROMAN NUMERAL ONE THOUSAND */ |
85 | | { 0x2170, 0x0069 }, /* SMALL ROMAN NUMERAL ONE */ |
86 | | { 0x2174, 0x0076 }, /* SMALL ROMAN NUMERAL FIVE */ |
87 | | { 0x2179, 0x0078 }, /* SMALL ROMAN NUMERAL TEN */ |
88 | | { 0x217C, 0x006C }, /* SMALL ROMAN NUMERAL FIFTY */ |
89 | | { 0x217D, 0x0063 }, /* SMALL ROMAN NUMERAL ONE HUNDRED */ |
90 | | { 0x217E, 0x0064 }, /* SMALL ROMAN NUMERAL FIVE HUNDRED */ |
91 | | { 0x217F, 0x006D }, /* SMALL ROMAN NUMERAL ONE THOUSAND */ |
92 | | { 0x2215, 0x002F }, /* DIVISION SLASH */ |
93 | | { 0x2217, 0x002A }, /* ASTERISK OPERATOR */ |
94 | | { 0xFF00, 0x0020 }, /* FULLWIDTH ASCII FORMS */ |
95 | | { 0xFF01, 0x0021 }, /* FULLWIDTH ASCII FORMS */ |
96 | | { 0xFF02, 0x0022 }, /* FULLWIDTH ASCII FORMS*/ |
97 | | { 0xFF03, 0x0023 }, /* FULLWIDTH ASCII FORMS */ |
98 | | { 0xFF04, 0x0024 }, /* FULLWIDTH ASCII FORMS*/ |
99 | | { 0xFF05, 0x0025 }, /* FULLWIDTH ASCII FORMS */ |
100 | | { 0xFF06, 0x0026 }, /* FULLWIDTH ASCII FORMS*/ |
101 | | { 0xFF07, 0x0027 }, /* FULLWIDTH ASCII FORMS */ |
102 | | { 0xFF08, 0x0028 }, /* FULLWIDTH ASCII FORMS*/ |
103 | | { 0xFF09, 0x0029 }, /* FULLWIDTH ASCII FORMS */ |
104 | | { 0xFF0A, 0x002A }, /* FULLWIDTH ASCII FORMS*/ |
105 | | { 0xFF0B, 0x002B }, /* FULLWIDTH ASCII FORMS */ |
106 | | { 0xFF0C, 0x002C }, /* FULLWIDTH ASCII FORMS*/ |
107 | | { 0xFF0D, 0x002D }, /* FULLWIDTH ASCII FORMS */ |
108 | | { 0xFF0E, 0x002E }, /* FULLWIDTH ASCII FORMS*/ |
109 | | { 0xFF0F, 0x002F }, /* FULLWIDTH ASCII FORMS */ |
110 | | { 0xFF10, 0x0030 }, /* FULLWIDTH ASCII FORMS */ |
111 | | { 0xFF11, 0x0031 }, /* FULLWIDTH ASCII FORMS */ |
112 | | { 0xFF12, 0x0032 }, /* FULLWIDTH ASCII FORMS*/ |
113 | | { 0xFF13, 0x0033 }, /* FULLWIDTH ASCII FORMS */ |
114 | | { 0xFF14, 0x0034 }, /* FULLWIDTH ASCII FORMS*/ |
115 | | { 0xFF15, 0x0035 }, /* FULLWIDTH ASCII FORMS */ |
116 | | { 0xFF16, 0x0036 }, /* FULLWIDTH ASCII FORMS*/ |
117 | | { 0xFF17, 0x0037 }, /* FULLWIDTH ASCII FORMS */ |
118 | | { 0xFF18, 0x0038 }, /* FULLWIDTH ASCII FORMS*/ |
119 | | { 0xFF19, 0x0039 }, /* FULLWIDTH ASCII FORMS */ |
120 | | { 0xFF1A, 0x003A }, /* FULLWIDTH ASCII FORMS*/ |
121 | | { 0xFF1B, 0x003B }, /* FULLWIDTH ASCII FORMS */ |
122 | | { 0xFF1C, 0x003C }, /* FULLWIDTH ASCII FORMS*/ |
123 | | { 0xFF1D, 0x003D }, /* FULLWIDTH ASCII FORMS */ |
124 | | { 0xFF1E, 0x003E }, /* FULLWIDTH ASCII FORMS*/ |
125 | | { 0xFF1F, 0x003F }, /* FULLWIDTH ASCII FORMS */ |
126 | | { 0xFF20, 0x0040 }, /* FULLWIDTH ASCII FORMS */ |
127 | | { 0xFF21, 0x0041 }, /* FULLWIDTH ASCII FORMS */ |
128 | | { 0xFF22, 0x0042 }, /* FULLWIDTH ASCII FORMS*/ |
129 | | { 0xFF23, 0x0043 }, /* FULLWIDTH ASCII FORMS */ |
130 | | { 0xFF24, 0x0044 }, /* FULLWIDTH ASCII FORMS*/ |
131 | | { 0xFF25, 0x0045 }, /* FULLWIDTH ASCII FORMS */ |
132 | | { 0xFF26, 0x0046 }, /* FULLWIDTH ASCII FORMS*/ |
133 | | { 0xFF27, 0x0047 }, /* FULLWIDTH ASCII FORMS */ |
134 | | { 0xFF28, 0x0048 }, /* FULLWIDTH ASCII FORMS*/ |
135 | | { 0xFF29, 0x0049 }, /* FULLWIDTH ASCII FORMS */ |
136 | | { 0xFF2A, 0x004A }, /* FULLWIDTH ASCII FORMS*/ |
137 | | { 0xFF2B, 0x004B }, /* FULLWIDTH ASCII FORMS */ |
138 | | { 0xFF2C, 0x004C }, /* FULLWIDTH ASCII FORMS*/ |
139 | | { 0xFF2D, 0x004D }, /* FULLWIDTH ASCII FORMS */ |
140 | | { 0xFF2E, 0x004E }, /* FULLWIDTH ASCII FORMS*/ |
141 | | { 0xFF2F, 0x004F }, /* FULLWIDTH ASCII FORMS */ |
142 | | { 0xFF30, 0x0050 }, /* FULLWIDTH ASCII FORMS */ |
143 | | { 0xFF31, 0x0051 }, /* FULLWIDTH ASCII FORMS */ |
144 | | { 0xFF32, 0x0052 }, /* FULLWIDTH ASCII FORMS*/ |
145 | | { 0xFF33, 0x0053 }, /* FULLWIDTH ASCII FORMS */ |
146 | | { 0xFF34, 0x0054 }, /* FULLWIDTH ASCII FORMS*/ |
147 | | { 0xFF35, 0x0055 }, /* FULLWIDTH ASCII FORMS */ |
148 | | { 0xFF36, 0x0056 }, /* FULLWIDTH ASCII FORMS*/ |
149 | | { 0xFF37, 0x0057 }, /* FULLWIDTH ASCII FORMS */ |
150 | | { 0xFF38, 0x0058 }, /* FULLWIDTH ASCII FORMS*/ |
151 | | { 0xFF39, 0x0059 }, /* FULLWIDTH ASCII FORMS */ |
152 | | { 0xFF3A, 0x005A }, /* FULLWIDTH ASCII FORMS*/ |
153 | | { 0xFF3B, 0x005B }, /* FULLWIDTH ASCII FORMS */ |
154 | | { 0xFF3C, 0x005C }, /* FULLWIDTH ASCII FORMS*/ |
155 | | { 0xFF3D, 0x005D }, /* FULLWIDTH ASCII FORMS */ |
156 | | { 0xFF3E, 0x005E }, /* FULLWIDTH ASCII FORMS*/ |
157 | | { 0xFF3F, 0x005F }, /* FULLWIDTH ASCII FORMS */ |
158 | | { 0xFF40, 0x0060 }, /* FULLWIDTH ASCII FORMS */ |
159 | | { 0xFF41, 0x0061 }, /* FULLWIDTH ASCII FORMS */ |
160 | | { 0xFF42, 0x0062 }, /* FULLWIDTH ASCII FORMS*/ |
161 | | { 0xFF43, 0x0063 }, /* FULLWIDTH ASCII FORMS */ |
162 | | { 0xFF44, 0x0064 }, /* FULLWIDTH ASCII FORMS*/ |
163 | | { 0xFF45, 0x0065 }, /* FULLWIDTH ASCII FORMS */ |
164 | | { 0xFF46, 0x0066 }, /* FULLWIDTH ASCII FORMS*/ |
165 | | { 0xFF47, 0x0067 }, /* FULLWIDTH ASCII FORMS */ |
166 | | { 0xFF48, 0x0068 }, /* FULLWIDTH ASCII FORMS*/ |
167 | | { 0xFF49, 0x0069 }, /* FULLWIDTH ASCII FORMS */ |
168 | | { 0xFF4A, 0x006A }, /* FULLWIDTH ASCII FORMS*/ |
169 | | { 0xFF4B, 0x006B }, /* FULLWIDTH ASCII FORMS */ |
170 | | { 0xFF4C, 0x006C }, /* FULLWIDTH ASCII FORMS*/ |
171 | | { 0xFF4D, 0x006D }, /* FULLWIDTH ASCII FORMS */ |
172 | | { 0xFF4E, 0x006E }, /* FULLWIDTH ASCII FORMS*/ |
173 | | { 0xFF4F, 0x006F }, /* FULLWIDTH ASCII FORMS */ |
174 | | { 0xFF50, 0x0070 }, /* FULLWIDTH ASCII FORMS */ |
175 | | { 0xFF51, 0x0071 }, /* FULLWIDTH ASCII FORMS */ |
176 | | { 0xFF52, 0x0072 }, /* FULLWIDTH ASCII FORMS*/ |
177 | | { 0xFF53, 0x0073 }, /* FULLWIDTH ASCII FORMS */ |
178 | | { 0xFF54, 0x0074 }, /* FULLWIDTH ASCII FORMS*/ |
179 | | { 0xFF55, 0x0075 }, /* FULLWIDTH ASCII FORMS */ |
180 | | { 0xFF56, 0x0076 }, /* FULLWIDTH ASCII FORMS*/ |
181 | | { 0xFF57, 0x0077 }, /* FULLWIDTH ASCII FORMS */ |
182 | | { 0xFF58, 0x0078 }, /* FULLWIDTH ASCII FORMS*/ |
183 | | { 0xFF59, 0x0079 }, /* FULLWIDTH ASCII FORMS */ |
184 | | { 0xFF5A, 0x007A }, /* FULLWIDTH ASCII FORMS*/ |
185 | | { 0xFF5B, 0x007B }, /* FULLWIDTH ASCII FORMS */ |
186 | | { 0xFF5C, 0x007C }, /* FULLWIDTH ASCII FORMS*/ |
187 | | { 0xFF5D, 0x007D }, /* FULLWIDTH ASCII FORMS */ |
188 | | { 0xFF5E, 0x007E }, /* FULLWIDTH ASCII FORMS*/ |
189 | | { 0xFF5F, 0x007F }, /* FULLWIDTH ASCII FORMS */ |
190 | | { 0xFF61, 0x3002 }, /* HALFWIDTH KATAKANA FORMS */ |
191 | | { 0xFF62, 0x300C }, /* HALFWIDTH KATAKANA FORMS */ |
192 | | { 0xFF63, 0x300D }, /* HALFWIDTH KATAKANA FORMS */ |
193 | | { 0xFF64, 0x3001 }, /* HALFWIDTH KATAKANA FORMS */ |
194 | | { 0xFF65, 0x30FB }, /* HALFWIDTH KATAKANA FORMS */ |
195 | | { 0xFF66, 0x30F2 }, /* HALFWIDTH KATAKANA FORMS */ |
196 | | { 0xFF67, 0x30A1 }, /* HALFWIDTH KATAKANA FORMS */ |
197 | | { 0xFF68, 0x30A3 }, /* HALFWIDTH KATAKANA FORMS */ |
198 | | { 0xFF69, 0x30A5 }, /* HALFWIDTH KATAKANA FORMS */ |
199 | | { 0xFF6A, 0x30A7 }, /* HALFWIDTH KATAKANA FORMS */ |
200 | | { 0xFF6B, 0x30A9 }, /* HALFWIDTH KATAKANA FORMS */ |
201 | | { 0xFF6C, 0x30E3 }, /* HALFWIDTH KATAKANA FORMS */ |
202 | | { 0xFF6D, 0x30E5 }, /* HALFWIDTH KATAKANA FORMS */ |
203 | | { 0xFF6E, 0x30E7 }, /* HALFWIDTH KATAKANA FORMS */ |
204 | | { 0xFF6F, 0x30C3 }, /* HALFWIDTH KATAKANA FORMS */ |
205 | | { 0xFF70, 0x30FC }, /* HALFWIDTH KATAKANA FORMS */ |
206 | | { 0xFF71, 0x30A2 }, /* HALFWIDTH KATAKANA FORMS */ |
207 | | { 0xFF72, 0x30A4 }, /* HALFWIDTH KATAKANA FORMS */ |
208 | | { 0xFF73, 0x30A6 }, /* HALFWIDTH KATAKANA FORMS */ |
209 | | { 0xFF74, 0x30A8 }, /* HALFWIDTH KATAKANA FORMS */ |
210 | | { 0xFF75, 0x30AA }, /* HALFWIDTH KATAKANA FORMS */ |
211 | | { 0xFF76, 0x30AB }, /* HALFWIDTH KATAKANA FORMS */ |
212 | | { 0xFF77, 0x30AD }, /* HALFWIDTH KATAKANA FORMS */ |
213 | | { 0xFF78, 0x30AF }, /* HALFWIDTH KATAKANA FORMS */ |
214 | | { 0xFF79, 0x30B1 }, /* HALFWIDTH KATAKANA FORMS */ |
215 | | { 0xFF7A, 0x30B3 }, /* HALFWIDTH KATAKANA FORMS */ |
216 | | { 0xFF7B, 0x30B5 }, /* HALFWIDTH KATAKANA FORMS */ |
217 | | { 0xFF7C, 0x30B7 }, /* HALFWIDTH KATAKANA FORMS */ |
218 | | { 0xFF7D, 0x30B9 }, /* HALFWIDTH KATAKANA FORMS */ |
219 | | { 0xFF7E, 0x30BB }, /* HALFWIDTH KATAKANA FORMS */ |
220 | | { 0xFF7F, 0x30BD }, /* HALFWIDTH KATAKANA FORMS */ |
221 | | { 0xFF80, 0x30BF }, /* HALFWIDTH KATAKANA FORMS */ |
222 | | { 0xFF81, 0x30C1 }, /* HALFWIDTH KATAKANA FORMS */ |
223 | | { 0xFF82, 0x30C4 }, /* HALFWIDTH KATAKANA FORMS */ |
224 | | { 0xFF83, 0x30C6 }, /* HALFWIDTH KATAKANA FORMS */ |
225 | | { 0xFF84, 0x30C8 }, /* HALFWIDTH KATAKANA FORMS */ |
226 | | { 0xFF85, 0x30CA }, /* HALFWIDTH KATAKANA FORMS */ |
227 | | { 0xFF86, 0x30CB }, /* HALFWIDTH KATAKANA FORMS */ |
228 | | { 0xFF87, 0x30CC }, /* HALFWIDTH KATAKANA FORMS */ |
229 | | { 0xFF88, 0x30CD }, /* HALFWIDTH KATAKANA FORMS */ |
230 | | { 0xFF89, 0x30CE }, /* HALFWIDTH KATAKANA FORMS */ |
231 | | { 0xFF8A, 0x30CF }, /* HALFWIDTH KATAKANA FORMS */ |
232 | | { 0xFF8B, 0x30D2 }, /* HALFWIDTH KATAKANA FORMS */ |
233 | | { 0xFF8C, 0x30D5 }, /* HALFWIDTH KATAKANA FORMS */ |
234 | | { 0xFF8D, 0x30D8 }, /* HALFWIDTH KATAKANA FORMS */ |
235 | | { 0xFF8E, 0x30DB }, /* HALFWIDTH KATAKANA FORMS */ |
236 | | { 0xFF8F, 0x30DE }, /* HALFWIDTH KATAKANA FORMS */ |
237 | | { 0xFF90, 0x30DF }, /* HALFWIDTH KATAKANA FORMS */ |
238 | | { 0xFF91, 0x30E0 }, /* HALFWIDTH KATAKANA FORMS */ |
239 | | { 0xFF92, 0x30E1 }, /* HALFWIDTH KATAKANA FORMS */ |
240 | | { 0xFF93, 0x30E2 }, /* HALFWIDTH KATAKANA FORMS */ |
241 | | { 0xFF94, 0x30E4 }, /* HALFWIDTH KATAKANA FORMS */ |
242 | | { 0xFF95, 0x30E6 }, /* HALFWIDTH KATAKANA FORMS */ |
243 | | { 0xFF96, 0x30E8 }, /* HALFWIDTH KATAKANA FORMS */ |
244 | | { 0xFF97, 0x30E9 }, /* HALFWIDTH KATAKANA FORMS */ |
245 | | { 0xFF98, 0x30EA }, /* HALFWIDTH KATAKANA FORMS */ |
246 | | { 0xFF99, 0x30EB }, /* HALFWIDTH KATAKANA FORMS */ |
247 | | { 0xFF9A, 0x30EC }, /* HALFWIDTH KATAKANA FORMS */ |
248 | | { 0xFF9B, 0x30ED }, /* HALFWIDTH KATAKANA FORMS */ |
249 | | { 0xFF9C, 0x30EF }, /* HALFWIDTH KATAKANA FORMS */ |
250 | | { 0xFF9D, 0x30F3 }, /* HALFWIDTH KATAKANA FORMS */ |
251 | | { 0xFF9E, 0x309B }, /* HALFWIDTH KATAKANA FORMS */ |
252 | | { 0xFF9F, 0x309C }, /* HALFWIDTH KATAKANA FORMS */ |
253 | | { 0xFFA0, 0x3164 }, /* HALFWIDTH HANGUL FORMS */ |
254 | | { 0xFFA1, 0x3131 }, /* HALFWIDTH HANGUL FORMS */ |
255 | | { 0xFFA2, 0x3132 }, /* HALFWIDTH HANGUL FORMS */ |
256 | | { 0xFFA3, 0x3133 }, /* HALFWIDTH HANGUL FORMS */ |
257 | | { 0xFFA4, 0x3134 }, /* HALFWIDTH HANGUL FORMS */ |
258 | | { 0xFFA5, 0x3135 }, /* HALFWIDTH HANGUL FORMS */ |
259 | | { 0xFFA6, 0x3136 }, /* HALFWIDTH HANGUL FORMS */ |
260 | | { 0xFFA7, 0x3137 }, /* HALFWIDTH HANGUL FORMS */ |
261 | | { 0xFFA8, 0x3138 }, /* HALFWIDTH HANGUL FORMS */ |
262 | | { 0xFFA9, 0x3139 }, /* HALFWIDTH HANGUL FORMS */ |
263 | | { 0xFFAA, 0x313A }, /* HALFWIDTH HANGUL FORMS */ |
264 | | { 0xFFAB, 0x313B }, /* HALFWIDTH HANGUL FORMS */ |
265 | | { 0xFFAC, 0x313C }, /* HALFWIDTH HANGUL FORMS */ |
266 | | { 0xFFAD, 0x313D }, /* HALFWIDTH HANGUL FORMS */ |
267 | | { 0xFFAE, 0x313E }, /* HALFWIDTH HANGUL FORMS */ |
268 | | { 0xFFAF, 0x313F }, /* HALFWIDTH HANGUL FORMS */ |
269 | | { 0xFFB0, 0x3140 }, /* HALFWIDTH HANGUL FORMS */ |
270 | | { 0xFFB1, 0x3141 }, /* HALFWIDTH HANGUL FORMS */ |
271 | | { 0xFFB2, 0x3142 }, /* HALFWIDTH HANGUL FORMS */ |
272 | | { 0xFFB3, 0x3143 }, /* HALFWIDTH HANGUL FORMS */ |
273 | | { 0xFFB4, 0x3144 }, /* HALFWIDTH HANGUL FORMS */ |
274 | | { 0xFFB5, 0x3145 }, /* HALFWIDTH HANGUL FORMS */ |
275 | | { 0xFFB6, 0x3146 }, /* HALFWIDTH HANGUL FORMS */ |
276 | | { 0xFFB7, 0x3147 }, /* HALFWIDTH HANGUL FORMS */ |
277 | | { 0xFFB8, 0x3148 }, /* HALFWIDTH HANGUL FORMS */ |
278 | | { 0xFFB9, 0x3149 }, /* HALFWIDTH HANGUL FORMS */ |
279 | | { 0xFFBA, 0x314A }, /* HALFWIDTH HANGUL FORMS */ |
280 | | { 0xFFBB, 0x314B }, /* HALFWIDTH HANGUL FORMS */ |
281 | | { 0xFFBC, 0x314C }, /* HALFWIDTH HANGUL FORMS */ |
282 | | { 0xFFBD, 0x314D }, /* HALFWIDTH HANGUL FORMS */ |
283 | | { 0xFFBE, 0x314E }, /* HALFWIDTH HANGUL FORMS */ |
284 | | { 0xFFC2, 0x314F }, /* HALFWIDTH HANGUL FORMS */ |
285 | | { 0xFFC3, 0x3150 }, /* HALFWIDTH HANGUL FORMS */ |
286 | | { 0xFFC4, 0x3151 }, /* HALFWIDTH HANGUL FORMS */ |
287 | | { 0xFFC5, 0x3152 }, /* HALFWIDTH HANGUL FORMS */ |
288 | | { 0xFFC6, 0x3153 }, /* HALFWIDTH HANGUL FORMS */ |
289 | | { 0xFFC7, 0x3154 }, /* HALFWIDTH HANGUL FORMS */ |
290 | | { 0xFFCA, 0x3155 }, /* HALFWIDTH HANGUL FORMS */ |
291 | | { 0xFFCB, 0x3156 }, /* HALFWIDTH HANGUL FORMS */ |
292 | | { 0xFFCC, 0x3157 }, /* HALFWIDTH HANGUL FORMS */ |
293 | | { 0xFFCD, 0x3158 }, /* HALFWIDTH HANGUL FORMS */ |
294 | | { 0xFFCE, 0x3159 }, /* HALFWIDTH HANGUL FORMS */ |
295 | | { 0xFFCF, 0x315A }, /* HALFWIDTH HANGUL FORMS */ |
296 | | { 0xFFD2, 0x315B }, /* HALFWIDTH HANGUL FORMS */ |
297 | | { 0xFFD3, 0x315C }, /* HALFWIDTH HANGUL FORMS */ |
298 | | { 0xFFD4, 0x315D }, /* HALFWIDTH HANGUL FORMS */ |
299 | | { 0xFFD5, 0x315E }, /* HALFWIDTH HANGUL FORMS */ |
300 | | { 0xFFD6, 0x315F }, /* HALFWIDTH HANGUL FORMS */ |
301 | | { 0xFFD7, 0x3160 }, /* HALFWIDTH HANGUL FORMS */ |
302 | | { 0xFFDA, 0x3161 }, /* HALFWIDTH HANGUL FORMS */ |
303 | | { 0xFFDB, 0x3162 }, /* HALFWIDTH HANGUL FORMS */ |
304 | | { 0xFFDC, 0x3163 }, /* HALFWIDTH HANGUL FORMS */ |
305 | | { 0xFFE0, 0x00A2 }, /* FULLWIDTH CENT SIGN */ |
306 | | { 0xFFE1, 0x00A3 }, /* FULLWIDTH POUND SIGN */ |
307 | | { 0xFFE2, 0x00AC }, /* FULLWIDTH NOT SIGN */ |
308 | | { 0xFFE3, 0x00AF }, /* FULLWIDTH MACRON */ |
309 | | { 0xFFE4, 0x00A6 }, /* FULLWIDTH BROKEN BAR */ |
310 | | { 0xFFE5, 0x00A5 }, /* FULLWIDTH YEN SIGN */ |
311 | | { 0xFFE6, 0x20A9 }, /* FULLWIDTH WON SIGN */ |
312 | | { 0xFFE8, 0x2502 }, /* HALFWIDTH FORMS LIGHT VERTICAL */ |
313 | | { 0xFFE9, 0x2190 }, /* HALFWIDTH LEFTWARDS ARROW */ |
314 | | { 0xFFEA, 0x2191 }, /* HALFWIDTH UPWARDS ARROW */ |
315 | | { 0xFFEB, 0x2192 }, /* HALFWIDTH RIGHTWARDS ARROW */ |
316 | | { 0xFFEC, 0x2193 }, /* HALFWIDTH DOWNWARDS ARROW */ |
317 | | { 0xFFED, 0x25A0 }, /* HALFWIDTH BLACK SQUARE */ |
318 | | { 0xFFEE, 0x25CB }, /* HALFWIDTH WHITE CIRCLE */ |
319 | | { 0xFFFD, 0x003F } /* REPLACEMENT CHARACTER */ |
320 | | }; |
321 | | |
322 | | sal_uInt16 ImplGetReplaceChar( sal_Unicode c ) |
323 | 26.2M | { |
324 | 26.2M | sal_uInt16 nLow; |
325 | 26.2M | sal_uInt16 nHigh; |
326 | 26.2M | sal_uInt16 nMid; |
327 | 26.2M | sal_uInt16 nCompareChar; |
328 | 26.2M | const ImplReplaceCharData* pCharData; |
329 | | |
330 | 26.2M | nLow = 0; |
331 | 26.2M | nHigh = std::size( aImplRepCharTab ) - 1; |
332 | 26.2M | do |
333 | 224M | { |
334 | 224M | nMid = (nLow+nHigh)/2; |
335 | 224M | pCharData = aImplRepCharTab+nMid; |
336 | 224M | nCompareChar = pCharData->mnUniChar; |
337 | 224M | if ( c < nCompareChar ) |
338 | 116M | { |
339 | 116M | if ( !nMid ) |
340 | 277k | break; |
341 | 116M | nHigh = nMid-1; |
342 | 116M | } |
343 | 108M | else |
344 | 108M | { |
345 | 108M | if ( c > nCompareChar ) |
346 | 107M | nLow = nMid+1; |
347 | 892k | else |
348 | 892k | return pCharData->mnReplaceChar; |
349 | 108M | } |
350 | 224M | } |
351 | 223M | while ( nLow <= nHigh ); |
352 | | |
353 | 25.3M | return 0; |
354 | 26.2M | } |
355 | | |
356 | | struct ImplReplaceCharStrData |
357 | | { |
358 | | sal_uInt16 mnUniChar; |
359 | | sal_uInt16 maReplaceChars[IMPL_MAX_REPLACECHAR]; |
360 | | }; |
361 | | |
362 | | ImplReplaceCharStrData const aImplRepCharStrTab[] = |
363 | | { |
364 | | { 0x00A9, { 0x0028, 0x0063, 0x0029, 0x0000, 0x0000 } }, /* COPYRIGHT SIGN */ |
365 | | { 0x00AB, { 0x003C, 0x003C, 0x0000, 0x0000, 0x0000 } }, /* LEFT-POINTING-DOUBLE ANGLE QUOTATION MARK */ |
366 | | { 0x0AE0, { 0x0028, 0x0072, 0x0029, 0x0000, 0x0000 } }, /* REGISTERED SIGN */ |
367 | | { 0x00BB, { 0x003E, 0x003E, 0x0000, 0x0000, 0x0000 } }, /* RIGHT-POINTING-DOUBLE ANGLE QUOTATION MARK */ |
368 | | { 0x00BC, { 0x0031, 0x002F, 0x0034, 0x0000, 0x0000 } }, /* VULGAR FRACTION ONE QUARTER */ |
369 | | { 0x00BD, { 0x0031, 0x002F, 0x0032, 0x0000, 0x0000 } }, /* VULGAR FRACTION ONE HALF */ |
370 | | { 0x00BE, { 0x0033, 0x002F, 0x0034, 0x0000, 0x0000 } }, /* VULGAR FRACTION THREE QUARTERS */ |
371 | | { 0x00C6, { 0x0041, 0x0045, 0x0000, 0x0000, 0x0000 } }, /* LATIN CAPITAL LETTER AE */ |
372 | | { 0x00E6, { 0x0061, 0x0065, 0x0000, 0x0000, 0x0000 } }, /* LATIN SMALL LETTER AE */ |
373 | | { 0x0152, { 0x004F, 0x0045, 0x0000, 0x0000, 0x0000 } }, /* LATIN CAPITAL LIGATURE OE */ |
374 | | { 0x0153, { 0x006F, 0x0065, 0x0000, 0x0000, 0x0000 } }, /* LATIN SMALL LIGATURE OE */ |
375 | | { 0x2025, { 0x002E, 0x002E, 0x0000, 0x0000, 0x0000 } }, /* TWO DOT LEADER */ |
376 | | { 0x2026, { 0x002E, 0x002E, 0x002E, 0x0000, 0x0000 } }, /* HORIZONTAL ELLIPSES */ |
377 | | { 0x2034, { 0x0027, 0x0027, 0x0027, 0x0000, 0x0000 } }, /* TRIPLE PRIME */ |
378 | | { 0x2037, { 0x0027, 0x0027, 0x0027, 0x0000, 0x0000 } }, /* REVERSED TRIPLE PRIME */ |
379 | | { 0x20AC, { 0x0045, 0x0055, 0x0052, 0x0000, 0x0000 } }, /* EURO SIGN */ |
380 | | { 0x2122, { 0x0028, 0x0074, 0x006D, 0x0029, 0x0000 } }, /* TRADE MARK SIGN */ |
381 | | { 0x2153, { 0x0031, 0x002F, 0x0033, 0x0000, 0x0000 } }, /* VULGAR FRACTION ONE THIRD */ |
382 | | { 0x2154, { 0x0032, 0x002F, 0x0033, 0x0000, 0x0000 } }, /* VULGAR FRACTION TWO THIRD */ |
383 | | { 0x2155, { 0x0031, 0x002F, 0x0035, 0x0000, 0x0000 } }, /* VULGAR FRACTION ONE FIFTH */ |
384 | | { 0x2156, { 0x0032, 0x002F, 0x0035, 0x0000, 0x0000 } }, /* VULGAR FRACTION TWO FIFTH */ |
385 | | { 0x2157, { 0x0033, 0x002F, 0x0035, 0x0000, 0x0000 } }, /* VULGAR FRACTION THREE FIFTH */ |
386 | | { 0x2158, { 0x0034, 0x002F, 0x0035, 0x0000, 0x0000 } }, /* VULGAR FRACTION FOUR FIFTH */ |
387 | | { 0x2159, { 0x0031, 0x002F, 0x0036, 0x0000, 0x0000 } }, /* VULGAR FRACTION ONE SIXTH */ |
388 | | { 0x215A, { 0x0035, 0x002F, 0x0036, 0x0000, 0x0000 } }, /* VULGAR FRACTION FIVE SIXTH */ |
389 | | { 0x215B, { 0x0031, 0x002F, 0x0038, 0x0000, 0x0000 } }, /* VULGAR FRACTION ONE EIGHTH */ |
390 | | { 0x215C, { 0x0033, 0x002F, 0x0038, 0x0000, 0x0000 } }, /* VULGAR FRACTION THREE EIGHTH */ |
391 | | { 0x215D, { 0x0035, 0x002F, 0x0038, 0x0000, 0x0000 } }, /* VULGAR FRACTION FIVE EIGHTH */ |
392 | | { 0x215E, { 0x0037, 0x002F, 0x0038, 0x0000, 0x0000 } }, /* VULGAR FRACTION SEVEN EIGHTH */ |
393 | | { 0x215F, { 0x0031, 0x002F, 0x0000, 0x0000, 0x0000 } }, /* FRACTION NUMERATOR ONE */ |
394 | | { 0x2161, { 0x0049, 0x0049, 0x0000, 0x0000, 0x0000 } }, /* ROMAN NUMERAL TWO */ |
395 | | { 0x2162, { 0x0049, 0x0049, 0x0049, 0x0000, 0x0000 } }, /* ROMAN NUMERAL THREE */ |
396 | | { 0x2163, { 0x0049, 0x0056, 0x0000, 0x0000, 0x0000 } }, /* ROMAN NUMERAL FOUR */ |
397 | | { 0x2165, { 0x0056, 0x0049, 0x0000, 0x0000, 0x0000 } }, /* ROMAN NUMERAL SIX */ |
398 | | { 0x2166, { 0x0056, 0x0049, 0x0049, 0x0000, 0x0000 } }, /* ROMAN NUMERAL SEVEN */ |
399 | | { 0x2168, { 0x0056, 0x0049, 0x0049, 0x0049, 0x0000 } }, /* ROMAN NUMERAL EIGHT */ |
400 | | { 0x2169, { 0x0049, 0x0058, 0x0000, 0x0000, 0x0000 } }, /* ROMAN NUMERAL NINE */ |
401 | | { 0x216A, { 0x0058, 0x0049, 0x0000, 0x0000, 0x0000 } }, /* ROMAN NUMERAL ELEVEN */ |
402 | | { 0x216B, { 0x0058, 0x0049, 0x0049, 0x0000, 0x0000 } }, /* ROMAN NUMERAL TWELVE */ |
403 | | { 0x2171, { 0x0069, 0x0069, 0x0000, 0x0000, 0x0000 } }, /* SMALL ROMAN NUMERAL TWO */ |
404 | | { 0x2172, { 0x0069, 0x0069, 0x0069, 0x0000, 0x0000 } }, /* SMALL ROMAN NUMERAL THREE */ |
405 | | { 0x2173, { 0x0069, 0x0076, 0x0000, 0x0000, 0x0000 } }, /* SMALL ROMAN NUMERAL FOUR */ |
406 | | { 0x2175, { 0x0076, 0x0069, 0x0000, 0x0000, 0x0000 } }, /* SMALL ROMAN NUMERAL SIX */ |
407 | | { 0x2176, { 0x0076, 0x0069, 0x0069, 0x0000, 0x0000 } }, /* SMALL ROMAN NUMERAL SEVEN */ |
408 | | { 0x2178, { 0x0076, 0x0069, 0x0069, 0x0069, 0x0000 } }, /* SMALL ROMAN NUMERAL EIGHT */ |
409 | | { 0x2179, { 0x0069, 0x0078, 0x0000, 0x0000, 0x0000 } }, /* SMALL ROMAN NUMERAL NINE */ |
410 | | { 0x217A, { 0x0078, 0x0069, 0x0000, 0x0000, 0x0000 } }, /* SMALL ROMAN NUMERAL ELEVEN */ |
411 | | { 0x217B, { 0x0058, 0x0069, 0x0069, 0x0000, 0x0000 } } /* SMALL ROMAN NUMERAL TWELVE */ |
412 | | }; |
413 | | |
414 | | const sal_uInt16* ImplGetReplaceString( sal_Unicode c ) |
415 | 0 | { |
416 | 0 | sal_uInt16 nLow; |
417 | 0 | sal_uInt16 nHigh; |
418 | 0 | sal_uInt16 nMid; |
419 | 0 | sal_uInt16 nCompareChar; |
420 | 0 | const ImplReplaceCharStrData* pCharData; |
421 | |
|
422 | 0 | nLow = 0; |
423 | 0 | nHigh = std::size( aImplRepCharStrTab ) - 1; |
424 | 0 | do |
425 | 0 | { |
426 | 0 | nMid = (nLow+nHigh)/2; |
427 | 0 | pCharData = aImplRepCharStrTab+nMid; |
428 | 0 | nCompareChar = pCharData->mnUniChar; |
429 | 0 | if ( c < nCompareChar ) |
430 | 0 | { |
431 | 0 | if ( !nMid ) |
432 | 0 | break; |
433 | 0 | nHigh = nMid-1; |
434 | 0 | } |
435 | 0 | else |
436 | 0 | { |
437 | 0 | if ( c > nCompareChar ) |
438 | 0 | nLow = nMid+1; |
439 | 0 | else |
440 | 0 | return pCharData->maReplaceChars; |
441 | 0 | } |
442 | 0 | } |
443 | 0 | while ( nLow <= nHigh ); |
444 | | |
445 | 0 | return nullptr; |
446 | 0 | } |
447 | | |
448 | | // Writes 0--2 characters to dest: |
449 | | int ImplConvertUnicodeCharToChar( |
450 | | const ImplByteConvertData* pConvertData, sal_Unicode c, char * dest ) |
451 | 27.1M | { |
452 | 27.1M | const ImplUniCharTabData* pToCharExTab; |
453 | | |
454 | 27.1M | if ( c < 0x80 ) |
455 | 715k | { |
456 | 715k | dest[0] = static_cast< char >(c); |
457 | 715k | return 1; |
458 | 715k | } |
459 | 26.4M | if ( (c >= pConvertData->mnToCharStart1) && (c <= pConvertData->mnToCharEnd1) ) |
460 | 63.3k | { |
461 | 63.3k | dest[0] = static_cast< char >(pConvertData->mpToCharTab1[c-pConvertData->mnToCharStart1]); |
462 | 63.3k | if ( dest[0] != 0 ) |
463 | 63.3k | return 1; |
464 | 63.3k | } |
465 | 26.4M | else if ( (c >= pConvertData->mnToCharStart2) && (c <= pConvertData->mnToCharEnd2) ) |
466 | 35.0k | { |
467 | 35.0k | dest[0] = static_cast< char >(pConvertData->mpToCharTab2[c-pConvertData->mnToCharStart2]); |
468 | 35.0k | if ( dest[0] != 0 ) |
469 | 35.0k | return 1; |
470 | 35.0k | } |
471 | 26.3M | pToCharExTab = pConvertData->mpToCharExTab; |
472 | 26.3M | if ( pToCharExTab ) |
473 | 0 | { |
474 | 0 | sal_uInt16 nLow; |
475 | 0 | sal_uInt16 nHigh; |
476 | 0 | sal_uInt16 nMid; |
477 | 0 | sal_uInt16 nCompareChar; |
478 | 0 | const ImplUniCharTabData* pCharExData; |
479 | |
|
480 | 0 | nLow = 0; |
481 | 0 | nHigh = pConvertData->mnToCharExCount-1; |
482 | 0 | do |
483 | 0 | { |
484 | 0 | nMid = (nLow+nHigh)/2; |
485 | 0 | pCharExData = pToCharExTab+nMid; |
486 | 0 | nCompareChar = pCharExData->mnUniChar; |
487 | 0 | if ( c < nCompareChar ) |
488 | 0 | { |
489 | 0 | if ( !nMid ) |
490 | 0 | break; |
491 | 0 | nHigh = nMid-1; |
492 | 0 | } |
493 | 0 | else |
494 | 0 | { |
495 | 0 | if ( c > nCompareChar ) |
496 | 0 | nLow = nMid+1; |
497 | 0 | else |
498 | 0 | { |
499 | 0 | dest[0] = static_cast< char >(pCharExData->mnChar); |
500 | 0 | if ( pCharExData->mnChar2 == 0 ) |
501 | 0 | return 1; |
502 | 0 | dest[1] = static_cast< char >(pCharExData->mnChar2); |
503 | 0 | return 2; |
504 | 0 | } |
505 | 0 | } |
506 | 0 | } |
507 | 0 | while ( nLow <= nHigh ); |
508 | 0 | } |
509 | 26.3M | return 0; |
510 | 26.3M | } |
511 | | |
512 | | } |
513 | | |
514 | | sal_Size sal::detail::textenc::convertCharToUnicode( |
515 | | void const * pData, SAL_UNUSED_PARAMETER void *, char const * pSrcBuf, |
516 | | sal_Size nSrcBytes, sal_Unicode * pDestBuf, sal_Size nDestChars, |
517 | | sal_uInt32 nFlags, sal_uInt32 * pInfo, sal_Size * pSrcCvtBytes) |
518 | 32.7M | { |
519 | 32.7M | sal_Unicode cConv; |
520 | 32.7M | const ImplByteConvertData* pConvertData = static_cast<const ImplByteConvertData*>(pData); |
521 | 32.7M | sal_Unicode* pEndDestBuf; |
522 | 32.7M | const char* pEndSrcBuf; |
523 | | |
524 | 32.7M | *pInfo = 0; |
525 | 32.7M | pEndDestBuf = pDestBuf+nDestChars; |
526 | 32.7M | pEndSrcBuf = pSrcBuf+nSrcBytes; |
527 | 270M | while ( pSrcBuf < pEndSrcBuf ) |
528 | 238M | { |
529 | 238M | unsigned char c = static_cast<unsigned char>(*pSrcBuf); |
530 | 238M | if ( c < 0x80 ) |
531 | 195M | cConv = c; |
532 | 42.5M | else |
533 | 42.5M | { |
534 | 42.5M | if ( (c >= pConvertData->mnToUniStart1) && (c <= pConvertData->mnToUniEnd1) ) |
535 | 38.8M | cConv = pConvertData->mpToUniTab1[c-pConvertData->mnToUniStart1]; |
536 | 3.69M | else if ( (c >= pConvertData->mnToUniStart2) && (c <= pConvertData->mnToUniEnd2) ) |
537 | 2.33M | cConv = pConvertData->mpToUniTab2[c-pConvertData->mnToUniStart2]; |
538 | 1.36M | else |
539 | 1.36M | cConv = 0; |
540 | 42.5M | if ( !cConv ) |
541 | 3.20M | { |
542 | 3.20M | *pInfo |= RTL_TEXTTOUNICODE_INFO_UNDEFINED; |
543 | 3.20M | if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MASK) == RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR ) |
544 | 295k | { |
545 | 295k | if ((nFlags & RTL_TEXTTOUNICODE_FLAGS_FLUSH) == 0) { |
546 | 34.2k | ++pSrcBuf; |
547 | 34.2k | } |
548 | 295k | *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR; |
549 | 295k | break; |
550 | 295k | } |
551 | 2.91M | if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MASK) == RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_IGNORE ) |
552 | 259k | { |
553 | 259k | pSrcBuf++; |
554 | 259k | continue; |
555 | 259k | } |
556 | 2.65M | cConv = ImplGetUndefinedUnicodeChar(c, nFlags); |
557 | 2.65M | } |
558 | 42.5M | } |
559 | | |
560 | 237M | if ( pDestBuf == pEndDestBuf ) |
561 | 0 | { |
562 | 0 | *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOOSMALL; |
563 | 0 | break; |
564 | 0 | } |
565 | | |
566 | 237M | *pDestBuf = cConv; |
567 | 237M | pDestBuf++; |
568 | 237M | pSrcBuf++; |
569 | 237M | } |
570 | | |
571 | 32.7M | *pSrcCvtBytes = nSrcBytes - (pEndSrcBuf-pSrcBuf); |
572 | 32.7M | return (nDestChars - (pEndDestBuf-pDestBuf)); |
573 | 32.7M | } |
574 | | |
575 | | sal_Size sal::detail::textenc::convertUnicodeToChar( |
576 | | void const * pData, SAL_UNUSED_PARAMETER void *, |
577 | | sal_Unicode const * pSrcBuf, sal_Size nSrcChars, char * pDestBuf, |
578 | | sal_Size nDestBytes, sal_uInt32 nFlags, sal_uInt32 * pInfo, |
579 | | sal_Size * pSrcCvtChars) |
580 | 23.3M | { |
581 | 23.3M | sal_Unicode c; |
582 | 23.3M | const ImplByteConvertData* pConvertData = static_cast<const ImplByteConvertData*>(pData); |
583 | 23.3M | char* pEndDestBuf; |
584 | 23.3M | const sal_Unicode* pEndSrcBuf; |
585 | 23.3M | int i; |
586 | 23.3M | int n; |
587 | 23.3M | sal_uInt16 cTemp; |
588 | 23.3M | char aTempBuf[IMPL_MAX_REPLACECHAR+2]; |
589 | 23.3M | const sal_uInt16* pReplace; |
590 | | |
591 | 23.3M | *pInfo = 0; |
592 | 23.3M | pEndDestBuf = pDestBuf+nDestBytes; |
593 | 23.3M | pEndSrcBuf = pSrcBuf+nSrcChars; |
594 | 220M | while ( pSrcBuf < pEndSrcBuf ) |
595 | 197M | { |
596 | 197M | c = *pSrcBuf; |
597 | 197M | if ( c < 0x80 ) |
598 | 171M | { |
599 | 171M | aTempBuf[0] = static_cast< char >(c); |
600 | 171M | n = 1; |
601 | 171M | } |
602 | 26.3M | else |
603 | 26.3M | { |
604 | 26.3M | n = ImplConvertUnicodeCharToChar( pConvertData, c, aTempBuf ); |
605 | | |
606 | 26.3M | if ( n == 0 ) |
607 | 26.2M | { |
608 | 26.2M | if ( nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACE ) |
609 | 26.2M | { |
610 | 26.2M | cTemp = ImplGetReplaceChar( c ); |
611 | 26.2M | if ( cTemp ) |
612 | 892k | n = ImplConvertUnicodeCharToChar( |
613 | 892k | pConvertData, cTemp, aTempBuf ); |
614 | 26.2M | } |
615 | | |
616 | 26.2M | if ( n == 0 ) |
617 | 25.4M | { |
618 | 25.4M | if ( nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACESTR ) |
619 | 0 | { |
620 | 0 | pReplace = ImplGetReplaceString( c ); |
621 | 0 | if ( pReplace ) |
622 | 0 | { |
623 | 0 | while ( *pReplace && (n < IMPL_MAX_REPLACECHAR) ) |
624 | 0 | { |
625 | 0 | i = ImplConvertUnicodeCharToChar( |
626 | 0 | pConvertData, *pReplace, aTempBuf + n ); |
627 | 0 | if ( i == 0 ) |
628 | 0 | { |
629 | 0 | n = 0; |
630 | 0 | break; |
631 | 0 | } |
632 | 0 | pReplace++; |
633 | 0 | n += i; |
634 | 0 | } |
635 | 0 | } |
636 | 0 | } |
637 | | |
638 | | /* Handle undefined and surrogates characters */ |
639 | | /* (all surrogates characters are undefined) */ |
640 | 25.4M | if ( n == 0 ) |
641 | 25.4M | { |
642 | 25.4M | if (sal::detail::textenc::handleUndefinedUnicodeToTextChar( |
643 | 25.4M | &pSrcBuf, pEndSrcBuf, &pDestBuf, pEndDestBuf, |
644 | 25.4M | nFlags, pInfo)) |
645 | 25.4M | continue; |
646 | 1.26k | break; |
647 | 25.4M | } |
648 | 25.4M | } |
649 | 26.2M | } |
650 | 26.3M | } |
651 | | |
652 | 172M | if ( pEndDestBuf - pDestBuf < n ) |
653 | 0 | { |
654 | 0 | *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL; |
655 | 0 | break; |
656 | 0 | } |
657 | | |
658 | 344M | for ( i = 0; i < n; ++i ) |
659 | 172M | *pDestBuf++ = aTempBuf[i]; |
660 | 172M | pSrcBuf++; |
661 | 172M | } |
662 | | |
663 | 23.3M | *pSrcCvtChars = nSrcChars - (pEndSrcBuf-pSrcBuf); |
664 | 23.3M | return (nDestBytes - (pEndDestBuf-pDestBuf)); |
665 | 23.3M | } |
666 | | |
667 | | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |