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