]>
Commit | Line | Data |
---|---|---|
d2374599 | 1 | /* Conversion to and from the various ISO 646 CCS. |
d4697bc9 | 2 | Copyright (C) 1998-2014 Free Software Foundation, Inc. |
d2374599 UD |
3 | This file is part of the GNU C Library. |
4 | Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. | |
5 | ||
6 | The GNU C Library is free software; you can redistribute it and/or | |
41bdb6e2 AJ |
7 | modify it under the terms of the GNU Lesser General Public |
8 | License as published by the Free Software Foundation; either | |
9 | version 2.1 of the License, or (at your option) any later version. | |
d2374599 UD |
10 | |
11 | The GNU C Library is distributed in the hope that it will be useful, | |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
41bdb6e2 | 14 | Lesser General Public License for more details. |
d2374599 | 15 | |
41bdb6e2 | 16 | You should have received a copy of the GNU Lesser General Public |
59ba27a6 PE |
17 | License along with the GNU C Library; if not, see |
18 | <http://www.gnu.org/licenses/>. */ | |
d2374599 | 19 | |
b60816b1 UD |
20 | /* The implementation of the conversion which can be performed by this |
21 | module are not very sophisticated and not tuned at all. There are | |
22 | zillions of ISO 646 derivates and supporting them all in a separate | |
23 | module is overkill since these coded character sets are hardly ever | |
24 | used anymore (except ANSI_X3.4-1968 == ASCII, which is compatible | |
25 | with ISO 8859-1). The European variants are superceded by the | |
26 | various ISO 8859-? standards and the Asian variants are embedded in | |
27 | larger character sets. Therefore this implementation is simply | |
28 | here to make it possible to do the conversion if it is necessary. | |
29 | The cost in the gconv-modules file is set to `2' and therefore | |
30 | allows one to easily provide a tuned implementation in case this | |
31 | proofs to be necessary. */ | |
32 | ||
55985355 | 33 | #include <dlfcn.h> |
d2374599 | 34 | #include <gconv.h> |
28f1c862 | 35 | #include <stdint.h> |
7ef90c15 | 36 | #include <stdlib.h> |
d2374599 UD |
37 | #include <string.h> |
38 | ||
28f1c862 UD |
39 | /* Definitions used in the body of the `gconv' function. */ |
40 | #define FROM_LOOP from_ascii | |
41 | #define TO_LOOP to_ascii | |
42 | #define DEFINE_INIT 0 | |
43 | #define DEFINE_FINI 0 | |
44 | #define MIN_NEEDED_FROM 1 | |
45 | #define MIN_NEEDED_TO 4 | |
e3e0a182 | 46 | #define FROM_DIRECTION (dir == from_iso646) |
28f1c862 | 47 | #define PREPARE_LOOP \ |
d64b6ad0 UD |
48 | enum direction dir = ((struct iso646_data *) step->__data)->dir; \ |
49 | enum variant var = ((struct iso646_data *) step->__data)->var; | |
28f1c862 UD |
50 | #define EXTRA_LOOP_ARGS , var |
51 | ||
52 | ||
d2374599 UD |
53 | /* Direction of the transformation. */ |
54 | enum direction | |
55 | { | |
b60816b1 | 56 | illegal_dir, |
d2374599 UD |
57 | to_iso646, |
58 | from_iso646 | |
59 | }; | |
60 | ||
61 | enum variant | |
62 | { | |
b60816b1 | 63 | illegal_var, |
d2374599 | 64 | GB, /* BS_4730 */ |
9b26f5c4 UD |
65 | CA, /* CSA_Z243.4-1985-1 */ |
66 | CA2, /* CSA_Z243.4-1985-2 */ | |
67 | DE, /* DIN_66003 */ | |
68 | DK, /* DS_2089 */ | |
69 | ES, /* ES */ | |
70 | ES2, /* ES2 */ | |
71 | CN, /* GB_1988-80 */ | |
72 | IT, /* IT */ | |
73 | JP, /* JIS_C6220-1969-RO */ | |
74 | JP_OCR_B, /* JIS_C6229-1984-B */ | |
75 | YU, /* JUS_I.B1.002 */ | |
76 | KR, /* KSC5636 */ | |
77 | HU, /* MSZ_7795.3 */ | |
78 | CU, /* NC_NC00-10 */ | |
79 | FR, /* NF_Z_62-010 */ | |
80 | FR1, /* NF_Z_62-010_(1973) */ | |
81 | NO, /* NS_4551-1 */ | |
82 | NO2, /* NS_4551-2 */ | |
83 | PT, /* PT */ | |
84 | PT2, /* PT2 */ | |
85 | SE, /* SEN_850200_B */ | |
86 | SE2 /* SEN_850200_C */ | |
87 | }; | |
88 | ||
89 | static const char *names[] = | |
90 | { | |
9b26f5c4 UD |
91 | [GB] = "BS_4730//", |
92 | [CA] = "CSA_Z243.4-1985-1//", | |
93 | [CA2] = "CSA_Z243.4-1985-2//", | |
94 | [DE] = "DIN_66003//", | |
95 | [DK] = "DS_2089//", | |
96 | [ES] = "ES//", | |
97 | [ES2] = "ES2//", | |
98 | [CN] = "GB_1988-80//", | |
99 | [IT] = "IT//", | |
100 | [JP] = "JIS_C6220-1969-RO//", | |
101 | [JP_OCR_B] = "JIS_C6229-1984-B//", | |
102 | [YU] = "JUS_I.B1.002//", | |
103 | [KR] = "KSC5636//", | |
104 | [HU] = "MSZ_7795.3//", | |
105 | [CU] = "NC_NC00-10//", | |
106 | [FR] = "NF_Z_62-010//", | |
09376451 | 107 | [FR1] = "NF_Z_62-010_1973//", /* Note that we don't have the parenthesis |
4798763f | 108 | in the name. */ |
9b26f5c4 UD |
109 | [NO] = "NS_4551-1//", |
110 | [NO2] = "NS_4551-2//", | |
111 | [PT] = "PT//", | |
112 | [PT2] = "PT2//", | |
113 | [SE] = "SEN_850200_B//", | |
114 | [SE2] = "SEN_850200_C//" | |
d2374599 UD |
115 | }; |
116 | ||
117 | struct iso646_data | |
118 | { | |
119 | enum direction dir; | |
120 | enum variant var; | |
121 | }; | |
122 | ||
123 | ||
8c0b7170 | 124 | extern int gconv_init (struct __gconv_step *step); |
d2374599 | 125 | int |
d64b6ad0 | 126 | gconv_init (struct __gconv_step *step) |
d2374599 UD |
127 | { |
128 | /* Determine which direction. */ | |
129 | struct iso646_data *new_data; | |
9b26f5c4 | 130 | enum direction dir = illegal_dir; |
d2374599 UD |
131 | enum variant var; |
132 | int result; | |
133 | ||
9b26f5c4 | 134 | for (var = sizeof (names) / sizeof (names[0]) - 1; var > illegal_var; --var) |
d64b6ad0 | 135 | if (__strcasecmp (step->__from_name, names[var]) == 0) |
9b26f5c4 UD |
136 | { |
137 | dir = from_iso646; | |
138 | break; | |
139 | } | |
d64b6ad0 | 140 | else if (__strcasecmp (step->__to_name, names[var]) == 0) |
9b26f5c4 UD |
141 | { |
142 | dir = to_iso646; | |
143 | break; | |
144 | } | |
d2374599 | 145 | |
d64b6ad0 | 146 | result = __GCONV_NOCONV; |
019357d2 | 147 | if (__builtin_expect (dir, from_iso646) != illegal_dir) |
d2374599 | 148 | { |
09376451 | 149 | new_data = (struct iso646_data *) malloc (sizeof (struct iso646_data)); |
d2374599 | 150 | |
d64b6ad0 | 151 | result = __GCONV_NOMEM; |
09376451 | 152 | if (new_data != NULL) |
918b9d72 | 153 | { |
09376451 UD |
154 | new_data->dir = dir; |
155 | new_data->var = var; | |
d64b6ad0 | 156 | step->__data = new_data; |
09376451 | 157 | |
ae0f0dbd | 158 | if (dir == from_iso646) |
09376451 | 159 | { |
d64b6ad0 UD |
160 | step->__min_needed_from = MIN_NEEDED_FROM; |
161 | step->__max_needed_from = MIN_NEEDED_FROM; | |
162 | step->__min_needed_to = MIN_NEEDED_TO; | |
163 | step->__max_needed_to = MIN_NEEDED_TO; | |
09376451 UD |
164 | } |
165 | else | |
166 | { | |
d64b6ad0 UD |
167 | step->__min_needed_from = MIN_NEEDED_TO; |
168 | step->__max_needed_from = MIN_NEEDED_TO; | |
169 | step->__min_needed_to = MIN_NEEDED_FROM; | |
170 | step->__max_needed_to = MIN_NEEDED_FROM; | |
09376451 UD |
171 | } |
172 | ||
d64b6ad0 | 173 | step->__stateful = 0; |
09376451 | 174 | |
d64b6ad0 | 175 | result = __GCONV_OK; |
918b9d72 | 176 | } |
9b26f5c4 | 177 | } |
28f1c862 | 178 | |
d2374599 UD |
179 | return result; |
180 | } | |
181 | ||
182 | ||
8c0b7170 | 183 | extern void gconv_end (struct __gconv_step *data); |
d2374599 | 184 | void |
d64b6ad0 | 185 | gconv_end (struct __gconv_step *data) |
d2374599 | 186 | { |
d64b6ad0 | 187 | free (data->__data); |
d2374599 UD |
188 | } |
189 | ||
190 | ||
28f1c862 UD |
191 | /* First define the conversion function from ASCII to UCS4. */ |
192 | #define MIN_NEEDED_INPUT MIN_NEEDED_FROM | |
193 | #define MIN_NEEDED_OUTPUT MIN_NEEDED_TO | |
194 | #define LOOPFCT FROM_LOOP | |
195 | #define BODY \ | |
196 | { \ | |
197 | uint32_t ch; \ | |
d64b6ad0 | 198 | int failure = __GCONV_OK; \ |
28f1c862 | 199 | \ |
9b26f5c4 UD |
200 | ch = *inptr; \ |
201 | switch (ch) \ | |
28f1c862 | 202 | { \ |
9b26f5c4 UD |
203 | case 0x23: \ |
204 | if (var == GB || var == ES || var == IT || var == FR || var == FR1) \ | |
28f1c862 | 205 | ch = 0xa3; \ |
9b26f5c4 UD |
206 | else if (var == NO2) \ |
207 | ch = 0xa7; \ | |
208 | break; \ | |
209 | case 0x24: \ | |
210 | if (var == CN) \ | |
211 | ch = 0xa5; \ | |
212 | else if (var == HU || var == CU || var == SE || var == SE2) \ | |
213 | ch = 0xa4; \ | |
214 | break; \ | |
215 | case 0x40: \ | |
216 | if (var == CA || var == CA2 || var == FR || var == FR1) \ | |
217 | ch = 0xe0; \ | |
218 | else if (var == DE || var == ES || var == IT || var == PT) \ | |
219 | ch = 0xa7; \ | |
220 | else if (var == ES2) \ | |
221 | ch = 0x2022; \ | |
222 | else if (var == YU) \ | |
223 | ch = 0x17d; \ | |
224 | else if (var == HU) \ | |
225 | ch = 0xc1; \ | |
226 | else if (var == PT2) \ | |
227 | ch = 0xb4; \ | |
228 | else if (var == SE2) \ | |
229 | ch = 0xc9; \ | |
230 | break; \ | |
231 | case 0x5b: \ | |
232 | if (var == CA || var == CA2) \ | |
233 | ch = 0xe2; \ | |
234 | else if (var == DE || var == SE || var == SE2) \ | |
235 | ch = 0xc4; \ | |
236 | else if (var == DK || var == NO || var == NO2) \ | |
237 | ch = 0xc6; \ | |
238 | else if (var == ES || var == ES2 || var == CU) \ | |
239 | ch = 0xa1; \ | |
240 | else if (var == IT || var == FR || var == FR1) \ | |
241 | ch = 0xb0; \ | |
242 | else if (var == JP_OCR_B) \ | |
243 | ch = 0x2329; \ | |
244 | else if (var == YU) \ | |
245 | ch = 0x160; \ | |
246 | else if (var == HU) \ | |
247 | ch = 0xc9; \ | |
248 | else if (var == PT || var == PT2) \ | |
249 | ch = 0xc3; \ | |
28f1c862 | 250 | break; \ |
9b26f5c4 UD |
251 | case 0x5c: \ |
252 | if (var == CA || var == CA2 || var == IT || var == FR || var == FR1) \ | |
253 | ch = 0xe7; \ | |
254 | else if (var == DE || var == HU || var == SE || var == SE2) \ | |
255 | ch = 0xd6; \ | |
256 | else if (var == DK || var == NO || var == NO2) \ | |
257 | ch = 0xd8; \ | |
258 | else if (var == ES || var == ES2 || var == CU) \ | |
259 | ch = 0xd1; \ | |
260 | else if (var == JP || var == JP_OCR_B) \ | |
261 | ch = 0xa5; \ | |
262 | else if (var == YU) \ | |
263 | ch = 0x110; \ | |
264 | else if (var == KR) \ | |
265 | ch = 0x20a9; \ | |
266 | else if (var == PT || var == PT2) \ | |
267 | ch = 0xc7; \ | |
268 | break; \ | |
269 | case 0x5d: \ | |
270 | if (var == CA || var == CA2) \ | |
271 | ch = 0xea; \ | |
272 | else if (var == DE || var == HU) \ | |
273 | ch = 0xdc; \ | |
274 | else if (var == DK || var == NO || var == NO2 || var == SE \ | |
275 | || var == SE2) \ | |
276 | ch = 0xc5; \ | |
277 | else if (var == ES) \ | |
278 | ch = 0xbf; \ | |
279 | else if (var == ES2) \ | |
280 | ch = 0xc7; \ | |
281 | else if (var == IT) \ | |
282 | ch = 0xe9; \ | |
283 | else if (var == JP_OCR_B) \ | |
284 | ch = 0x232a; \ | |
285 | else if (var == YU) \ | |
286 | ch = 0x106; \ | |
287 | else if (var == FR || var == FR1) \ | |
288 | ch = 0xa7; \ | |
289 | else if (var == PT || var == PT2) \ | |
290 | ch = 0xd5; \ | |
291 | break; \ | |
292 | case 0x5e: \ | |
293 | if (var == CA) \ | |
294 | ch = 0xee; \ | |
295 | else if (var == CA2) \ | |
296 | ch = 0xc9; \ | |
297 | else if (var == ES2 || var == CU) \ | |
298 | ch = 0xbf; \ | |
299 | else if (var == YU) \ | |
300 | ch = 0x10c; \ | |
301 | else if (var == SE2) \ | |
302 | ch = 0xdc; \ | |
303 | break; \ | |
304 | case 0x60: \ | |
305 | if (var == CA || var == CA2) \ | |
306 | ch = 0xf4; \ | |
307 | else if (var == IT) \ | |
308 | ch = 0xf9; \ | |
309 | else if (var == JP_OCR_B) \ | |
310 | /* Illegal character. */ \ | |
d64b6ad0 | 311 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
312 | else if (var == YU) \ |
313 | ch = 0x17e; \ | |
314 | else if (var == HU) \ | |
315 | ch = 0xe1; \ | |
316 | else if (var == FR) \ | |
317 | ch = 0xb5; \ | |
318 | else if (var == SE2) \ | |
319 | ch = 0xe9; \ | |
320 | break; \ | |
321 | case 0x7b: \ | |
322 | if (var == CA || var == CA2 || var == HU || var == FR || var == FR1) \ | |
323 | ch = 0xe9; \ | |
324 | else if (var == DE || var == SE || var == SE2) \ | |
325 | ch = 0xe4; \ | |
326 | else if (var == DK || var == NO || var == NO2) \ | |
327 | ch = 0xe6; \ | |
328 | else if (var == ES) \ | |
329 | ch = 0xb0; \ | |
330 | else if (var == ES2 || var == CU) \ | |
331 | ch = 0xb4; \ | |
332 | else if (var == IT) \ | |
333 | ch = 0xe0; \ | |
334 | else if (var == YU) \ | |
335 | ch = 0x161; \ | |
336 | else if (var == PT || var == PT2) \ | |
337 | ch = 0xe3; \ | |
338 | break; \ | |
339 | case 0x7c: \ | |
340 | if (var == CA || var == CA2 || var == FR || var == FR1) \ | |
341 | ch = 0xf9; \ | |
342 | else if (var == DE || var == HU || var == SE || var == SE2) \ | |
343 | ch = 0xf6; \ | |
344 | else if (var == DK || var == NO || var == NO2) \ | |
345 | ch = 0xf8; \ | |
346 | else if (var == ES || var == ES2 || var == CU) \ | |
347 | ch = 0xf1; \ | |
348 | else if (var == IT) \ | |
349 | ch = 0xf2; \ | |
350 | else if (var == YU) \ | |
351 | ch = 0x111; \ | |
352 | else if (var == PT || var == PT2) \ | |
353 | ch = 0xe7; \ | |
354 | break; \ | |
355 | case 0x7d: \ | |
356 | if (var == CA || var == CA2 || var == IT || var == FR || var == FR1) \ | |
357 | ch = 0xe8; \ | |
358 | else if (var == DE || var == HU) \ | |
359 | ch = 0xfc; \ | |
360 | else if (var == DK || var == NO || var == NO2 || var == SE \ | |
361 | || var == SE2) \ | |
362 | ch = 0xe5; \ | |
363 | else if (var == ES || var == ES2) \ | |
364 | ch = 0xe7; \ | |
365 | else if (var == YU) \ | |
366 | ch = 0x107; \ | |
367 | else if (var == CU) \ | |
368 | ch = 0x5b; \ | |
369 | else if (var == PT || var == PT2) \ | |
370 | ch = 0xf5; \ | |
371 | break; \ | |
372 | case 0x7e: \ | |
373 | if (var == GB || var == CN || var == JP || var == NO || var == SE) \ | |
28f1c862 | 374 | ch = 0x203e; \ |
9b26f5c4 UD |
375 | else if (var == CA || var == CA2) \ |
376 | ch = 0xfb; \ | |
377 | else if (var == DE) \ | |
378 | ch = 0xdf; \ | |
379 | else if (var == ES2 || var == CU || var == FR || var == FR1) \ | |
380 | ch = 0xa8; \ | |
381 | else if (var == IT) \ | |
382 | ch = 0xec; \ | |
383 | else if (var == JP_OCR_B) \ | |
384 | /* Illegal character. */ \ | |
d64b6ad0 | 385 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
386 | else if (var == YU) \ |
387 | ch = 0x10d; \ | |
388 | else if (var == HU) \ | |
389 | ch = 0x2dd; \ | |
390 | else if (var == NO2) \ | |
391 | ch = 0x7c; \ | |
392 | else if (var == PT) \ | |
393 | ch = 0xb0; \ | |
394 | else if (var == SE2) \ | |
395 | ch = 0xfc; \ | |
28f1c862 UD |
396 | break; \ |
397 | default: \ | |
28f1c862 | 398 | break; \ |
4b8f94d3 | 399 | case 0x80 ... 0xff: \ |
28f1c862 | 400 | /* Illegal character. */ \ |
d64b6ad0 | 401 | failure = __GCONV_ILLEGAL_INPUT; \ |
28f1c862 UD |
402 | break; \ |
403 | } \ | |
404 | \ | |
405 | /* Hopefully gcc can recognize that the following `if' is only true \ | |
406 | when we reach the default case in the `switch' statement. */ \ | |
019357d2 | 407 | if (__builtin_expect (failure, __GCONV_OK) == __GCONV_ILLEGAL_INPUT) \ |
28f1c862 | 408 | { \ |
e438a468 | 409 | STANDARD_FROM_LOOP_ERR_HANDLER (1); \ |
85830c4c UD |
410 | } \ |
411 | else \ | |
412 | { \ | |
413 | put32 (outptr, ch); \ | |
414 | outptr += 4; \ | |
28f1c862 | 415 | } \ |
28f1c862 UD |
416 | ++inptr; \ |
417 | } | |
55985355 | 418 | #define LOOP_NEED_FLAGS |
28f1c862 UD |
419 | #define EXTRA_LOOP_DECLS , enum variant var |
420 | #include <iconv/loop.c> | |
421 | ||
422 | ||
423 | /* Next, define the other direction. */ | |
424 | #define MIN_NEEDED_INPUT MIN_NEEDED_TO | |
425 | #define MIN_NEEDED_OUTPUT MIN_NEEDED_FROM | |
426 | #define LOOPFCT TO_LOOP | |
427 | #define BODY \ | |
428 | { \ | |
7888313d | 429 | unsigned int ch; \ |
d64b6ad0 | 430 | int failure = __GCONV_OK; \ |
28f1c862 | 431 | \ |
77e1d15a | 432 | ch = get32 (inptr); \ |
7888313d | 433 | switch (ch) \ |
28f1c862 | 434 | { \ |
9b26f5c4 UD |
435 | case 0x23: \ |
436 | if (var == GB || var == ES || var == IT || var == FR || var == FR1 \ | |
437 | || var == NO2) \ | |
d64b6ad0 | 438 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
439 | break; \ |
440 | case 0x24: \ | |
441 | if (var == CN || var == HU || var == CU || var == SE || var == SE2) \ | |
d64b6ad0 | 442 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
443 | break; \ |
444 | case 0x40: \ | |
445 | if (var == CA || var == CA2 || var == DE || var == ES || var == ES2 \ | |
446 | || var == IT || var == YU || var == HU || var == FR || var == FR1 \ | |
447 | || var == PT || var == PT2 || var == SE2) \ | |
d64b6ad0 | 448 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
449 | break; \ |
450 | case 0x5b: \ | |
451 | if (var == CA || var == CA2 || var == DE || var == DK || var == ES \ | |
452 | || var == ES2 || var == IT || var == JP_OCR_B || var == YU \ | |
453 | || var == HU || var == FR || var == FR1 || var == NO \ | |
454 | || var == NO2 || var == PT || var == PT2 || var == SE \ | |
455 | || var == SE2) \ | |
d64b6ad0 | 456 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
457 | else if (var == CU) \ |
458 | ch = 0x7d; \ | |
459 | break; \ | |
460 | case 0x5c: \ | |
461 | if (var == CA || var == CA2 || var == DE || var == DK || var == ES \ | |
462 | || var == ES2 || var == IT || var == JP || var == JP_OCR_B \ | |
463 | || var == YU || var == KR || var == HU || var == CU || var == FR \ | |
464 | || var == FR1 || var == NO || var == NO2 || var == PT \ | |
465 | || var == PT2 || var == SE || var == SE2) \ | |
d64b6ad0 | 466 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
467 | break; \ |
468 | case 0x5d: \ | |
469 | if (var == CA || var == CA2 || var == DE || var == DK || var == ES \ | |
470 | || var == ES2 || var == IT || var == JP_OCR_B || var == YU \ | |
471 | || var == HU || var == FR || var == FR1 || var == NO \ | |
472 | || var == NO2 || var == PT || var == PT2 || var == SE \ | |
473 | || var == SE2) \ | |
d64b6ad0 | 474 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
475 | break; \ |
476 | case 0x5e: \ | |
477 | if (var == CA || var == CA2 || var == ES2 || var == YU || var == CU \ | |
478 | || var == SE2) \ | |
d64b6ad0 | 479 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
480 | break; \ |
481 | case 0x60: \ | |
482 | if (var == CA || var == CA2 || var == IT || var == JP_OCR_B \ | |
483 | || var == YU || var == HU || var == FR || var == SE2) \ | |
d64b6ad0 | 484 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
485 | break; \ |
486 | case 0x7b: \ | |
487 | if (var == CA || var == CA2 || var == DE || var == DK || var == ES \ | |
488 | || var == ES2 || var == IT || var == YU || var == HU \ | |
489 | || var == CU || var == FR || var == FR1 || var == NO \ | |
490 | || var == NO2 || var == PT || var == PT2 || var == SE \ | |
491 | || var == SE2) \ | |
d64b6ad0 | 492 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
493 | break; \ |
494 | case 0x7c: \ | |
495 | if (var == CA || var == CA2 || var == DE || var == DK || var == ES \ | |
496 | || var == ES2 || var == IT || var == YU || var == HU || var == CU \ | |
497 | || var == FR || var == FR1 || var == NO || var == PT \ | |
498 | || var == PT2 || var == SE || var == SE2) \ | |
d64b6ad0 | 499 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
500 | else if (var == NO2) \ |
501 | ch = 0x7e; \ | |
502 | break; \ | |
503 | case 0x7d: \ | |
504 | if (var == CA || var == CA2 || var == DE || var == DK || var == ES \ | |
505 | || var == ES2 || var == IT || var == YU || var == HU || var == CU \ | |
506 | || var == FR || var == FR1 || var == NO || var == NO2 \ | |
507 | || var == PT || var == PT2 || var == SE || var == SE2) \ | |
d64b6ad0 | 508 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
509 | break; \ |
510 | case 0x7e: \ | |
511 | if (var == GB || var == CA || var == CA2 || var == DE || var == ES2 \ | |
512 | || var == CN || var == IT || var == JP || var == JP_OCR_B \ | |
513 | || var == YU || var == HU || var == CU || var == FR || var == FR1 \ | |
514 | || var == NO || var == NO2 || var == PT || var == SE \ | |
515 | || var == SE2) \ | |
d64b6ad0 | 516 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
517 | break; \ |
518 | case 0xa1: \ | |
519 | if (var != ES && var != ES2 && var != CU) \ | |
d64b6ad0 | 520 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
521 | ch = 0x5b; \ |
522 | break; \ | |
523 | case 0xa3: \ | |
524 | if (var != GB && var != ES && var != IT && var != FR && var != FR1) \ | |
d64b6ad0 | 525 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
526 | ch = 0x23; \ |
527 | break; \ | |
528 | case 0xa4: \ | |
529 | if (var != HU && var != CU && var != SE && var != SE2) \ | |
d64b6ad0 | 530 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
531 | ch = 0x24; \ |
532 | break; \ | |
533 | case 0xa5: \ | |
534 | if (var == CN) \ | |
535 | ch = 0x24; \ | |
536 | else if (var == JP || var == JP_OCR_B) \ | |
537 | ch = 0x5c; \ | |
538 | else \ | |
d64b6ad0 | 539 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
540 | break; \ |
541 | case 0xa7: \ | |
542 | if (var == DE || var == ES || var == IT || var == PT) \ | |
543 | ch = 0x40; \ | |
544 | else if (var == FR || var == FR1) \ | |
545 | ch = 0x5d; \ | |
546 | else if (var == NO2) \ | |
547 | ch = 0x23; \ | |
548 | else \ | |
d64b6ad0 | 549 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
550 | break; \ |
551 | case 0xa8: \ | |
552 | if (var != ES2 && var != CU && var != FR && var != FR1) \ | |
d64b6ad0 | 553 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
554 | ch = 0x7e; \ |
555 | break; \ | |
556 | case 0xb0: \ | |
557 | if (var == ES) \ | |
558 | ch = 0x7b; \ | |
559 | else if (var == IT || var == FR || var == FR1) \ | |
560 | ch = 0x5b; \ | |
561 | else if (var == PT) \ | |
562 | ch = 0x7e; \ | |
563 | else \ | |
d64b6ad0 | 564 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
565 | break; \ |
566 | case 0xb4: \ | |
567 | if (var == ES2 || var == CU) \ | |
568 | ch = 0x7b; \ | |
569 | else if (var == PT2) \ | |
570 | ch = 0x40; \ | |
571 | else \ | |
d64b6ad0 | 572 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
573 | break; \ |
574 | case 0xb5: \ | |
575 | if (var != FR) \ | |
d64b6ad0 | 576 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
577 | ch = 0x60; \ |
578 | break; \ | |
579 | case 0xbf: \ | |
580 | if (var == ES) \ | |
581 | ch = 0x5d; \ | |
582 | else if (var == ES2 || var == CU) \ | |
583 | ch = 0x5e; \ | |
584 | else \ | |
d64b6ad0 | 585 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
586 | break; \ |
587 | case 0xc1: \ | |
588 | if (var != HU) \ | |
d64b6ad0 | 589 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
590 | ch = 0x40; \ |
591 | break; \ | |
592 | case 0xc3: \ | |
593 | if (var != PT && var != PT2) \ | |
d64b6ad0 | 594 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
595 | ch = 0x5b; \ |
596 | break; \ | |
597 | case 0xc4: \ | |
598 | if (var != DE && var != SE && var != SE2) \ | |
d64b6ad0 | 599 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
600 | ch = 0x5b; \ |
601 | break; \ | |
602 | case 0xc5: \ | |
603 | if (var != DK && var != NO && var != NO2 && var != SE && var != SE2) \ | |
d64b6ad0 | 604 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
605 | ch = 0x5d; \ |
606 | break; \ | |
607 | case 0xc6: \ | |
608 | if (var != DK && var != NO && var != NO2) \ | |
d64b6ad0 | 609 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
610 | ch = 0x5b; \ |
611 | break; \ | |
612 | case 0xc7: \ | |
613 | if (var == ES2) \ | |
614 | ch = 0x5d; \ | |
615 | else if (var == PT || var == PT2) \ | |
616 | ch = 0x5c; \ | |
617 | else \ | |
d64b6ad0 | 618 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
619 | break; \ |
620 | case 0xc9: \ | |
621 | if (var == CA2) \ | |
622 | ch = 0x5e; \ | |
623 | else if (var == HU) \ | |
624 | ch = 0x5b; \ | |
625 | else if (var == SE2) \ | |
626 | ch = 0x40; \ | |
627 | else \ | |
d64b6ad0 | 628 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
629 | break; \ |
630 | case 0xd1: \ | |
631 | if (var != ES && var != ES2 && var != CU) \ | |
d64b6ad0 | 632 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
633 | ch = 0x5c; \ |
634 | break; \ | |
635 | case 0xd5: \ | |
636 | if (var != PT && var != PT2) \ | |
d64b6ad0 | 637 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
638 | ch = 0x5d; \ |
639 | break; \ | |
640 | case 0xd6: \ | |
641 | if (var != DE && var != HU && var != SE && var != SE2) \ | |
d64b6ad0 | 642 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
643 | ch = 0x5c; \ |
644 | break; \ | |
645 | case 0xd8: \ | |
646 | if (var != DK && var != NO && var != NO2) \ | |
d64b6ad0 | 647 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
648 | ch = 0x5c; \ |
649 | break; \ | |
650 | case 0xdc: \ | |
651 | if (var == DE || var == HU) \ | |
652 | ch = 0x5d; \ | |
653 | else if (var == SE2) \ | |
654 | ch = 0x5e; \ | |
655 | else \ | |
d64b6ad0 | 656 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
657 | break; \ |
658 | case 0xdf: \ | |
659 | if (var != DE) \ | |
d64b6ad0 | 660 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
661 | ch = 0x7e; \ |
662 | break; \ | |
663 | case 0xe0: \ | |
664 | if (var == CA || var == CA2 || var == FR || var == FR1) \ | |
665 | ch = 0x40; \ | |
666 | else if (var == IT) \ | |
667 | ch = 0x7b; \ | |
668 | else \ | |
d64b6ad0 | 669 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
670 | break; \ |
671 | case 0xe1: \ | |
672 | if (var != HU) \ | |
d64b6ad0 | 673 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
674 | ch = 0x60; \ |
675 | break; \ | |
676 | case 0xe2: \ | |
677 | if (var != CA && var != CA2) \ | |
d64b6ad0 | 678 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
679 | ch = 0x5b; \ |
680 | break; \ | |
681 | case 0xe3: \ | |
682 | if (var != PT && var != PT2) \ | |
d64b6ad0 | 683 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
684 | ch = 0x7b; \ |
685 | break; \ | |
686 | case 0xe4: \ | |
687 | if (var != DE && var != SE && var != SE2) \ | |
d64b6ad0 | 688 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
689 | ch = 0x7b; \ |
690 | break; \ | |
691 | case 0xe5: \ | |
692 | if (var != DK && var != NO && var != NO2 && var != SE && var != SE2) \ | |
d64b6ad0 | 693 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
694 | ch = 0x7d; \ |
695 | break; \ | |
696 | case 0xe6: \ | |
697 | if (var != DK && var != NO && var != NO2) \ | |
d64b6ad0 | 698 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
699 | ch = 0x7b; \ |
700 | break; \ | |
701 | case 0xe7: \ | |
702 | if (var == CA || var == CA2 || var == IT || var == FR || var == FR1) \ | |
703 | ch = 0x5c; \ | |
704 | else if (var == ES || var == ES2) \ | |
705 | ch = 0x7d; \ | |
706 | else if (var == PT || var == PT2) \ | |
707 | ch = 0x7c; \ | |
708 | else \ | |
d64b6ad0 | 709 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
710 | break; \ |
711 | case 0xe8: \ | |
712 | if (var != CA && var != CA2 && var != IT && var != FR && var != FR1) \ | |
d64b6ad0 | 713 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
714 | ch = 0x7d; \ |
715 | break; \ | |
716 | case 0xe9: \ | |
717 | if (var == CA || var == CA2 || var == HU || var == FR || var == FR1) \ | |
718 | ch = 0x7b; \ | |
719 | else if (var == IT) \ | |
720 | ch = 0x5d; \ | |
721 | else if (var == SE2) \ | |
722 | ch = 0x60; \ | |
723 | else \ | |
d64b6ad0 | 724 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
725 | break; \ |
726 | case 0xea: \ | |
727 | if (var != CA && var != CA2) \ | |
d64b6ad0 | 728 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
729 | ch = 0x5d; \ |
730 | break; \ | |
731 | case 0xec: \ | |
732 | if (var != IT) \ | |
d64b6ad0 | 733 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
734 | ch = 0x7e; \ |
735 | break; \ | |
736 | case 0xee: \ | |
737 | if (var != CA) \ | |
d64b6ad0 | 738 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
739 | ch = 0x5e; \ |
740 | break; \ | |
741 | case 0xf1: \ | |
742 | if (var != ES && var != ES2 && var != CU) \ | |
d64b6ad0 | 743 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
744 | ch = 0x7c; \ |
745 | break; \ | |
746 | case 0xf2: \ | |
747 | if (var != IT) \ | |
d64b6ad0 | 748 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
749 | ch = 0x7c; \ |
750 | break; \ | |
751 | case 0xf4: \ | |
752 | if (var != CA && var != CA2) \ | |
d64b6ad0 | 753 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
754 | ch = 0x60; \ |
755 | break; \ | |
756 | case 0xf5: \ | |
757 | if (var != PT && var != PT2) \ | |
d64b6ad0 | 758 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
759 | ch = 0x7d; \ |
760 | break; \ | |
761 | case 0xf6: \ | |
762 | if (var != DE && var != HU && var != SE && var != SE2) \ | |
d64b6ad0 | 763 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
764 | ch = 0x7c; \ |
765 | break; \ | |
766 | case 0xf8: \ | |
767 | if (var != DK && var != NO && var != NO2) \ | |
d64b6ad0 | 768 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
769 | ch = 0x7c; \ |
770 | break; \ | |
771 | case 0xf9: \ | |
772 | if (var == CA || var == CA2 || var == FR || var == FR1) \ | |
773 | ch = 0x7c; \ | |
774 | else if (var == IT) \ | |
775 | ch = 0x60; \ | |
776 | else \ | |
d64b6ad0 | 777 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
778 | break; \ |
779 | case 0xfb: \ | |
780 | if (var != CA && var != CA2) \ | |
d64b6ad0 | 781 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
782 | ch = 0x7e; \ |
783 | break; \ | |
784 | case 0xfc: \ | |
785 | if (var == DE || var == HU) \ | |
786 | ch = 0x7d; \ | |
787 | else if (var == SE2) \ | |
788 | ch = 0x7e; \ | |
789 | else \ | |
d64b6ad0 | 790 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
791 | break; \ |
792 | case 0x160: \ | |
793 | if (var != YU) \ | |
d64b6ad0 | 794 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
795 | ch = 0x5b; \ |
796 | break; \ | |
797 | case 0x106: \ | |
798 | if (var != YU) \ | |
d64b6ad0 | 799 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
800 | ch = 0x5d; \ |
801 | break; \ | |
802 | case 0x107: \ | |
803 | if (var != YU) \ | |
d64b6ad0 | 804 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
805 | ch = 0x7d; \ |
806 | break; \ | |
807 | case 0x10c: \ | |
808 | if (var != YU) \ | |
d64b6ad0 | 809 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
810 | ch = 0x5e; \ |
811 | break; \ | |
812 | case 0x10d: \ | |
813 | if (var != YU) \ | |
d64b6ad0 | 814 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
815 | ch = 0x7e; \ |
816 | break; \ | |
817 | case 0x110: \ | |
818 | if (var != YU) \ | |
d64b6ad0 | 819 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
820 | ch = 0x5c; \ |
821 | break; \ | |
822 | case 0x111: \ | |
823 | if (var != YU) \ | |
d64b6ad0 | 824 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
825 | ch = 0x7c; \ |
826 | break; \ | |
827 | case 0x161: \ | |
828 | if (var != YU) \ | |
d64b6ad0 | 829 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
830 | ch = 0x7b; \ |
831 | break; \ | |
832 | case 0x17d: \ | |
833 | if (var != YU) \ | |
d64b6ad0 | 834 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
835 | ch = 0x40; \ |
836 | break; \ | |
837 | case 0x17e: \ | |
838 | if (var != YU) \ | |
d64b6ad0 | 839 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
840 | ch = 0x60; \ |
841 | break; \ | |
842 | case 0x2dd: \ | |
843 | if (var != HU) \ | |
d64b6ad0 | 844 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
845 | ch = 0x7e; \ |
846 | break; \ | |
847 | case 0x2022: \ | |
848 | if (var != ES2) \ | |
d64b6ad0 | 849 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
850 | ch = 0x40; \ |
851 | break; \ | |
852 | case 0x203e: \ | |
853 | if (var != GB && var != CN && var != JP && var != NO && var != SE) \ | |
d64b6ad0 | 854 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
855 | ch = 0x7e; \ |
856 | break; \ | |
857 | case 0x20a9: \ | |
858 | if (var != KR) \ | |
d64b6ad0 | 859 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
860 | ch = 0x5c; \ |
861 | break; \ | |
862 | case 0x2329: \ | |
863 | if (var != JP_OCR_B) \ | |
d64b6ad0 | 864 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
865 | ch = 0x5b; \ |
866 | break; \ | |
867 | case 0x232a: \ | |
868 | if (var != JP_OCR_B) \ | |
d64b6ad0 | 869 | failure = __GCONV_ILLEGAL_INPUT; \ |
9b26f5c4 UD |
870 | ch = 0x5d; \ |
871 | break; \ | |
872 | default: \ | |
a1ffb40e | 873 | if (__glibc_unlikely (ch > 0x7f)) \ |
601d2942 UD |
874 | { \ |
875 | UNICODE_TAG_HANDLER (ch, 4); \ | |
876 | failure = __GCONV_ILLEGAL_INPUT; \ | |
877 | } \ | |
9b26f5c4 | 878 | break; \ |
28f1c862 | 879 | } \ |
28f1c862 | 880 | \ |
019357d2 | 881 | if (__builtin_expect (failure, __GCONV_OK) == __GCONV_ILLEGAL_INPUT) \ |
28f1c862 | 882 | { \ |
e438a468 | 883 | STANDARD_TO_LOOP_ERR_HANDLER (4); \ |
28f1c862 | 884 | } \ |
d6204268 UD |
885 | \ |
886 | *outptr++ = (unsigned char) ch; \ | |
28f1c862 UD |
887 | inptr += 4; \ |
888 | } | |
55985355 | 889 | #define LOOP_NEED_FLAGS |
28f1c862 UD |
890 | #define EXTRA_LOOP_DECLS , enum variant var |
891 | #include <iconv/loop.c> | |
892 | ||
893 | ||
894 | /* Now define the toplevel functions. */ | |
895 | #include <iconv/skeleton.c> |