]> git.ipfire.org Git - thirdparty/glibc.git/blame - iconvdata/iso646.c
NEWS: Add 16885 to fixed bug list.
[thirdparty/glibc.git] / iconvdata / iso646.c
CommitLineData
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. */
54enum direction
55{
b60816b1 56 illegal_dir,
d2374599
UD
57 to_iso646,
58 from_iso646
59};
60
61enum 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
89static 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
117struct iso646_data
118{
119 enum direction dir;
120 enum variant var;
121};
122
123
8c0b7170 124extern int gconv_init (struct __gconv_step *step);
d2374599 125int
d64b6ad0 126gconv_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 183extern void gconv_end (struct __gconv_step *data);
d2374599 184void
d64b6ad0 185gconv_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>