about summary refs log tree commit diff
path: root/REORG.TODO/iconvdata/iso646.c
diff options
context:
space:
mode:
Diffstat (limited to 'REORG.TODO/iconvdata/iso646.c')
-rw-r--r--REORG.TODO/iconvdata/iso646.c901
1 files changed, 901 insertions, 0 deletions
diff --git a/REORG.TODO/iconvdata/iso646.c b/REORG.TODO/iconvdata/iso646.c
new file mode 100644
index 0000000000..abdf044801
--- /dev/null
+++ b/REORG.TODO/iconvdata/iso646.c
@@ -0,0 +1,901 @@
+/* Conversion to and from the various ISO 646 CCS.
+   Copyright (C) 1998-2017 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* The implementation of the conversion which can be performed by this
+   module are not very sophisticated and not tuned at all.  There are
+   zillions of ISO 646 derivates and supporting them all in a separate
+   module is overkill since these coded character sets are hardly ever
+   used anymore (except ANSI_X3.4-1968 == ASCII, which is compatible
+   with ISO 8859-1).  The European variants are superceded by the
+   various ISO 8859-? standards and the Asian variants are embedded in
+   larger character sets.  Therefore this implementation is simply
+   here to make it possible to do the conversion if it is necessary.
+   The cost in the gconv-modules file is set to `2' and therefore
+   allows one to easily provide a tuned implementation in case this
+   proofs to be necessary.  */
+
+#include <dlfcn.h>
+#include <gconv.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Definitions used in the body of the `gconv' function.  */
+#define FROM_LOOP		from_ascii
+#define TO_LOOP			to_ascii
+#define DEFINE_INIT		0
+#define DEFINE_FINI		0
+#define MIN_NEEDED_FROM		1
+#define MIN_NEEDED_TO		4
+#define ONE_DIRECTION		0
+
+#define FROM_DIRECTION		(dir == from_iso646)
+#define PREPARE_LOOP \
+  enum direction dir = ((struct iso646_data *) step->__data)->dir;	      \
+  enum variant var = ((struct iso646_data *) step->__data)->var;
+#define EXTRA_LOOP_ARGS		, var
+
+
+/* Direction of the transformation.  */
+enum direction
+{
+  illegal_dir,
+  to_iso646,
+  from_iso646
+};
+
+/* See names below, must be in the same order.  */
+enum variant
+{
+  GB,		/* BS_4730 */
+  CA,		/* CSA_Z243.4-1985-1 */
+  CA2,		/* CSA_Z243.4-1985-2 */
+  DE,		/* DIN_66003 */
+  DK,		/* DS_2089 */
+  ES,		/* ES */
+  ES2,		/* ES2 */
+  CN,		/* GB_1988-80 */
+  IT,		/* IT */
+  JP,		/* JIS_C6220-1969-RO */
+  JP_OCR_B,	/* JIS_C6229-1984-B */
+  YU,		/* JUS_I.B1.002 */
+  KR,		/* KSC5636 */
+  HU,		/* MSZ_7795.3 */
+  CU,		/* NC_NC00-10 */
+  FR,		/* NF_Z_62-010 */
+  FR1,		/* NF_Z_62-010_(1973) */
+  NO,		/* NS_4551-1 */
+  NO2,		/* NS_4551-2 */
+  PT,		/* PT */
+  PT2,		/* PT2 */
+  SE,		/* SEN_850200_B */
+  SE2		/* SEN_850200_C */
+};
+
+/* Must be in the same order as enum variant above.  */
+static const char names[] =
+  "BS_4730//\0"
+  "CSA_Z243.4-1985-1//\0"
+  "CSA_Z243.4-1985-2//\0"
+  "DIN_66003//\0"
+  "DS_2089//\0"
+  "ES//\0"
+  "ES2//\0"
+  "GB_1988-80//\0"
+  "IT//\0"
+  "JIS_C6220-1969-RO//\0"
+  "JIS_C6229-1984-B//\0"
+  "JUS_I.B1.002//\0"
+  "KSC5636//\0"
+  "MSZ_7795.3//\0"
+  "NC_NC00-10//\0"
+  "NF_Z_62-010//\0"
+  "NF_Z_62-010_1973//\0" /* Note that we don't have the parenthesis in
+			    the name.  */
+  "NS_4551-1//\0"
+  "NS_4551-2//\0"
+  "PT//\0"
+  "PT2//\0"
+  "SEN_850200_B//\0"
+  "SEN_850200_C//\0"
+  "\0";
+
+struct iso646_data
+{
+  enum direction dir;
+  enum variant var;
+};
+
+
+extern int gconv_init (struct __gconv_step *step);
+int
+gconv_init (struct __gconv_step *step)
+{
+  /* Determine which direction.  */
+  struct iso646_data *new_data;
+  enum direction dir = illegal_dir;
+  int result;
+
+  enum variant var = 0;
+  for (const char *name = names; *name != '\0';
+       name = __rawmemchr (name, '\0') + 1)
+    {
+      if (__strcasecmp (step->__from_name, name) == 0)
+	{
+	  dir = from_iso646;
+	  break;
+	}
+      else if (__strcasecmp (step->__to_name, name) == 0)
+	{
+	  dir = to_iso646;
+	  break;
+	}
+      ++var;
+    }
+
+  result = __GCONV_NOCONV;
+  if (__builtin_expect (dir, from_iso646) != illegal_dir)
+    {
+      new_data = (struct iso646_data *) malloc (sizeof (struct iso646_data));
+
+      result = __GCONV_NOMEM;
+      if (new_data != NULL)
+	{
+	  new_data->dir = dir;
+	  new_data->var = var;
+	  step->__data = new_data;
+
+	  if (dir == from_iso646)
+	    {
+	      step->__min_needed_from = MIN_NEEDED_FROM;
+	      step->__max_needed_from = MIN_NEEDED_FROM;
+	      step->__min_needed_to = MIN_NEEDED_TO;
+	      step->__max_needed_to = MIN_NEEDED_TO;
+	    }
+	  else
+	    {
+	      step->__min_needed_from = MIN_NEEDED_TO;
+	      step->__max_needed_from = MIN_NEEDED_TO;
+	      step->__min_needed_to = MIN_NEEDED_FROM;
+	      step->__max_needed_to = MIN_NEEDED_FROM;
+	    }
+
+	  step->__stateful = 0;
+
+	  result = __GCONV_OK;
+	}
+    }
+
+  return result;
+}
+
+
+extern void gconv_end (struct __gconv_step *data);
+void
+gconv_end (struct __gconv_step *data)
+{
+  free (data->__data);
+}
+
+
+/* First define the conversion function from ASCII to UCS4.  */
+#define MIN_NEEDED_INPUT	MIN_NEEDED_FROM
+#define MIN_NEEDED_OUTPUT	MIN_NEEDED_TO
+#define LOOPFCT			FROM_LOOP
+#define BODY \
+  {									      \
+    uint32_t ch;							      \
+    int failure = __GCONV_OK;						      \
+									      \
+    ch = *inptr;							      \
+    switch (ch)								      \
+      {									      \
+      case 0x23:							      \
+	if (var == GB || var == ES || var == IT || var == FR || var == FR1)   \
+	  ch = 0xa3;							      \
+	else if (var == NO2)						      \
+	  ch = 0xa7;							      \
+	break;								      \
+      case 0x24:							      \
+	if (var == CN)							      \
+	  ch = 0xa5;							      \
+	else if (var == HU || var == CU || var == SE || var == SE2)	      \
+	  ch = 0xa4;							      \
+	break;								      \
+      case 0x40:							      \
+	if (var == CA || var == CA2 || var == FR || var == FR1)		      \
+	  ch = 0xe0;							      \
+	else if (var == DE || var == ES || var == IT || var == PT)	      \
+	  ch = 0xa7;							      \
+	else if (var == ES2)						      \
+	  ch = 0x2022;							      \
+	else if (var == YU)						      \
+	  ch = 0x17d;							      \
+	else if (var == HU)						      \
+	  ch = 0xc1;							      \
+	else if (var == PT2)						      \
+	  ch = 0xb4;							      \
+	else if (var == SE2)						      \
+	  ch = 0xc9;							      \
+	break;								      \
+      case 0x5b:							      \
+	if (var == CA || var == CA2)					      \
+	  ch = 0xe2;							      \
+	else if (var == DE || var == SE || var == SE2)			      \
+	  ch = 0xc4;							      \
+	else if (var == DK || var == NO || var == NO2)			      \
+	  ch = 0xc6;							      \
+	else if (var == ES || var == ES2 || var == CU)			      \
+	  ch = 0xa1;							      \
+	else if (var == IT || var == FR || var == FR1)			      \
+	  ch = 0xb0;							      \
+	else if (var == JP_OCR_B)					      \
+	  ch = 0x2329;							      \
+	else if (var == YU)						      \
+	  ch = 0x160;							      \
+	else if (var == HU)						      \
+	  ch = 0xc9;							      \
+	else if (var == PT || var == PT2)				      \
+	  ch = 0xc3;							      \
+	break;								      \
+      case 0x5c:							      \
+	if (var == CA || var == CA2 || var == IT || var == FR || var == FR1)  \
+	  ch = 0xe7;							      \
+	else if (var == DE || var == HU || var == SE || var == SE2)	      \
+	  ch = 0xd6;							      \
+	else if (var == DK || var == NO || var == NO2)			      \
+	  ch = 0xd8;							      \
+	else if (var == ES || var == ES2 || var == CU)			      \
+	  ch = 0xd1;							      \
+	else if (var == JP || var == JP_OCR_B)				      \
+	  ch = 0xa5;							      \
+	else if (var == YU)						      \
+	  ch = 0x110;							      \
+	else if (var == KR)						      \
+	  ch = 0x20a9;							      \
+	else if (var == PT || var == PT2)				      \
+	  ch = 0xc7;							      \
+	break;								      \
+      case 0x5d:							      \
+	if (var == CA || var == CA2)					      \
+	  ch = 0xea;							      \
+	else if (var == DE || var == HU)				      \
+	  ch = 0xdc;							      \
+	else if (var == DK || var == NO || var == NO2 || var == SE	      \
+		 || var == SE2)						      \
+	  ch = 0xc5;							      \
+	else if (var == ES)						      \
+	  ch = 0xbf;							      \
+	else if (var == ES2)						      \
+	  ch = 0xc7;							      \
+	else if (var == IT)						      \
+	  ch = 0xe9;							      \
+	else if (var == JP_OCR_B)					      \
+	  ch = 0x232a;							      \
+	else if (var == YU)						      \
+	  ch = 0x106;							      \
+	else if (var == FR || var == FR1)				      \
+	  ch = 0xa7;							      \
+	else if (var == PT || var == PT2)				      \
+	  ch = 0xd5;							      \
+	break;								      \
+      case 0x5e:							      \
+	if (var == CA)							      \
+	  ch = 0xee;							      \
+	else if (var == CA2)						      \
+	  ch = 0xc9;							      \
+	else if (var == ES2 || var == CU)				      \
+	  ch = 0xbf;							      \
+	else if (var == YU)						      \
+	  ch = 0x10c;							      \
+	else if (var == SE2)						      \
+	  ch = 0xdc;							      \
+	break;								      \
+      case 0x60:							      \
+	if (var == CA || var == CA2)					      \
+	  ch = 0xf4;							      \
+	else if (var == IT)						      \
+	  ch = 0xf9;							      \
+	else if (var == JP_OCR_B)					      \
+	  /* Illegal character.  */					      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	else if (var == YU)						      \
+	  ch = 0x17e;							      \
+	else if (var == HU)						      \
+	  ch = 0xe1;							      \
+	else if (var == FR)						      \
+	  ch = 0xb5;							      \
+	else if (var == SE2)						      \
+	  ch = 0xe9;							      \
+	break;								      \
+      case 0x7b:							      \
+	if (var == CA || var == CA2 || var == HU || var == FR || var == FR1)  \
+	  ch = 0xe9;							      \
+	else if (var == DE || var == SE || var == SE2)			      \
+	  ch = 0xe4;							      \
+	else if (var == DK || var == NO || var == NO2)			      \
+	  ch = 0xe6;							      \
+	else if (var == ES)						      \
+	  ch = 0xb0;							      \
+	else if (var == ES2 || var == CU)				      \
+	  ch = 0xb4;							      \
+	else if (var == IT)						      \
+	  ch = 0xe0;							      \
+	else if (var == YU)						      \
+	  ch = 0x161;							      \
+	else if (var == PT || var == PT2)				      \
+	  ch = 0xe3;							      \
+	break;								      \
+      case 0x7c:							      \
+	if (var == CA || var == CA2 || var == FR || var == FR1)		      \
+	  ch = 0xf9;							      \
+	else if (var == DE || var == HU || var == SE || var == SE2)	      \
+	  ch = 0xf6;							      \
+	else if (var == DK || var == NO || var == NO2)			      \
+	  ch = 0xf8;							      \
+	else if (var == ES || var == ES2 || var == CU)			      \
+	  ch = 0xf1;							      \
+	else if (var == IT)						      \
+	  ch = 0xf2;							      \
+	else if (var == YU)						      \
+	  ch = 0x111;							      \
+	else if (var == PT || var == PT2)				      \
+	  ch = 0xe7;							      \
+	break;								      \
+      case 0x7d:							      \
+	if (var == CA || var == CA2 || var == IT || var == FR || var == FR1)  \
+	  ch = 0xe8;							      \
+	else if (var == DE || var == HU)				      \
+	  ch = 0xfc;							      \
+	else if (var == DK || var == NO || var == NO2 || var == SE	      \
+		 || var == SE2)						      \
+	  ch = 0xe5;							      \
+	else if (var == ES || var == ES2)				      \
+	  ch = 0xe7;							      \
+	else if (var == YU)						      \
+	  ch = 0x107;							      \
+	else if (var == CU)						      \
+	  ch = 0x5b;							      \
+	else if (var == PT || var == PT2)				      \
+	  ch = 0xf5;							      \
+	break;								      \
+      case 0x7e:							      \
+	if (var == GB || var == CN || var == JP || var == NO || var == SE)    \
+	  ch = 0x203e;							      \
+	else if (var == CA || var == CA2)				      \
+	  ch = 0xfb;							      \
+	else if (var == DE)						      \
+	  ch = 0xdf;							      \
+	else if (var == ES2 || var == CU || var == FR || var == FR1)	      \
+	  ch = 0xa8;							      \
+	else if (var == IT)						      \
+	  ch = 0xec;							      \
+	else if (var == JP_OCR_B)					      \
+	  /* Illegal character.  */					      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	else if (var == YU)						      \
+	  ch = 0x10d;							      \
+	else if (var == HU)						      \
+	  ch = 0x2dd;							      \
+	else if (var == NO2)						      \
+	  ch = 0x7c;							      \
+	else if (var == PT)						      \
+	  ch = 0xb0;							      \
+	else if (var == SE2)						      \
+	  ch = 0xfc;							      \
+	break;								      \
+      default:								      \
+	break;								      \
+      case 0x80 ... 0xff:						      \
+	/* Illegal character.  */					      \
+	failure = __GCONV_ILLEGAL_INPUT;				      \
+	break;								      \
+      }									      \
+									      \
+    /* Hopefully gcc can recognize that the following `if' is only true	      \
+       when we reach the default case in the `switch' statement.  */	      \
+    if (__builtin_expect (failure, __GCONV_OK) == __GCONV_ILLEGAL_INPUT)      \
+      {									      \
+	STANDARD_FROM_LOOP_ERR_HANDLER (1);				      \
+      }									      \
+    else								      \
+      {									      \
+	put32 (outptr, ch);						      \
+	outptr += 4;							      \
+      }									      \
+    ++inptr;								      \
+  }
+#define LOOP_NEED_FLAGS
+#define EXTRA_LOOP_DECLS	, enum variant var
+#include <iconv/loop.c>
+
+
+/* Next, define the other direction.  */
+#define MIN_NEEDED_INPUT	MIN_NEEDED_TO
+#define MIN_NEEDED_OUTPUT	MIN_NEEDED_FROM
+#define LOOPFCT			TO_LOOP
+#define BODY \
+  {									      \
+    unsigned int ch;							      \
+    int failure = __GCONV_OK;						      \
+									      \
+    ch = get32 (inptr);							      \
+    switch (ch)								      \
+      {									      \
+      case 0x23:							      \
+	if (var == GB || var == ES || var == IT || var == FR || var == FR1    \
+	    || var == NO2)						      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	break;								      \
+      case 0x24:							      \
+	if (var == CN || var == HU || var == CU || var == SE || var == SE2)   \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	break;								      \
+      case 0x40:							      \
+	if (var == CA || var == CA2 || var == DE || var == ES || var == ES2   \
+	    || var == IT || var == YU || var == HU || var == FR || var == FR1 \
+	    || var == PT || var == PT2 || var == SE2)			      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	break;								      \
+      case 0x5b:							      \
+	if (var == CA || var == CA2 || var == DE || var == DK || var == ES    \
+	    || var == ES2 || var == IT || var == JP_OCR_B || var == YU	      \
+	    || var == HU || var == FR || var == FR1 || var == NO	      \
+	    || var == NO2 || var == PT || var == PT2 || var == SE	      \
+	    || var == SE2)						      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	else if (var == CU)						      \
+	  ch = 0x7d;							      \
+	break;								      \
+      case 0x5c:							      \
+	if (var == CA || var == CA2 || var == DE || var == DK || var == ES    \
+	    || var == ES2 || var == IT || var == JP || var == JP_OCR_B	      \
+	    || var == YU || var == KR || var == HU || var == CU || var == FR  \
+	    || var == FR1 || var == NO || var == NO2 || var == PT	      \
+	    || var == PT2 || var == SE || var == SE2)			      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	break;								      \
+      case 0x5d:							      \
+	if (var == CA || var == CA2 || var == DE || var == DK || var == ES    \
+	    || var == ES2 || var == IT || var == JP_OCR_B || var == YU	      \
+	    || var == HU || var == FR || var == FR1 || var == NO	      \
+	    || var == NO2 || var == PT || var == PT2 || var == SE	      \
+	    || var == SE2)						      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	break;								      \
+      case 0x5e:							      \
+	if (var == CA || var == CA2 || var == ES2 || var == YU || var == CU   \
+	    || var == SE2)						      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	break;								      \
+      case 0x60:							      \
+	if (var == CA || var == CA2 || var == IT || var == JP_OCR_B	      \
+	    || var == YU || var == HU || var == FR || var == SE2)	      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	break;								      \
+      case 0x7b:							      \
+	if (var == CA || var == CA2 || var == DE || var == DK || var == ES    \
+	    || var == ES2 || var == IT || var == YU || var == HU	      \
+	    || var == CU || var == FR || var == FR1 || var == NO	      \
+	    || var == NO2 || var == PT || var == PT2 || var == SE	      \
+	    || var == SE2)						      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	break;								      \
+      case 0x7c:							      \
+	if (var == CA || var == CA2 || var == DE || var == DK || var == ES    \
+	    || var == ES2 || var == IT || var == YU || var == HU || var == CU \
+	    || var == FR || var == FR1 || var == NO || var == PT	      \
+	    || var == PT2 || var == SE || var == SE2)			      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	else if (var == NO2)						      \
+	  ch = 0x7e;							      \
+	break;								      \
+      case 0x7d:							      \
+	if (var == CA || var == CA2 || var == DE || var == DK || var == ES    \
+	    || var == ES2 || var == IT || var == YU || var == HU || var == CU \
+	    || var == FR || var == FR1 || var == NO || var == NO2	      \
+	    || var == PT || var == PT2 || var == SE || var == SE2)	      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	break;								      \
+      case 0x7e:							      \
+	if (var == GB || var == CA || var == CA2 || var == DE || var == ES2   \
+	    || var == CN || var == IT || var == JP || var == JP_OCR_B	      \
+	    || var == YU || var == HU || var == CU || var == FR || var == FR1 \
+	    || var == NO || var == NO2 || var == PT || var == SE	      \
+	    || var == SE2)						      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	break;								      \
+      case 0xa1:							      \
+	if (var != ES && var != ES2 && var != CU)			      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x5b;							      \
+	break;								      \
+      case 0xa3:							      \
+	if (var != GB && var != ES && var != IT && var != FR && var != FR1)   \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x23;							      \
+	break;								      \
+      case 0xa4:							      \
+	if (var != HU && var != CU && var != SE && var != SE2)		      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x24;							      \
+	break;								      \
+      case 0xa5:							      \
+	if (var == CN)							      \
+	  ch = 0x24;							      \
+	else if (var == JP || var == JP_OCR_B)				      \
+	  ch = 0x5c;							      \
+	else								      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	break;								      \
+      case 0xa7:							      \
+	if (var == DE || var == ES || var == IT || var == PT)		      \
+	  ch = 0x40;							      \
+	else if (var == FR || var == FR1)				      \
+	  ch = 0x5d;							      \
+	else if (var == NO2)						      \
+	  ch = 0x23;							      \
+	else								      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	break;								      \
+      case 0xa8:							      \
+	if (var != ES2 && var != CU && var != FR && var != FR1)		      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x7e;							      \
+	break;								      \
+      case 0xb0:							      \
+	if (var == ES)							      \
+	  ch = 0x7b;							      \
+	else if (var == IT || var == FR || var == FR1)			      \
+	  ch = 0x5b;							      \
+	else if (var == PT)						      \
+	  ch = 0x7e;							      \
+	else								      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	break;								      \
+      case 0xb4:							      \
+	if (var == ES2 || var == CU)					      \
+	  ch = 0x7b;							      \
+	else if (var == PT2)						      \
+	  ch = 0x40;							      \
+	else								      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	break;								      \
+      case 0xb5:							      \
+	if (var != FR)							      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x60;							      \
+	break;								      \
+      case 0xbf:							      \
+	if (var == ES)							      \
+	  ch = 0x5d;							      \
+	else if (var == ES2 || var == CU)				      \
+	  ch = 0x5e;							      \
+	else								      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	break;								      \
+      case 0xc1:							      \
+	if (var != HU)							      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x40;							      \
+	break;								      \
+      case 0xc3:							      \
+	if (var != PT && var != PT2)					      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x5b;							      \
+	break;								      \
+      case 0xc4:							      \
+	if (var != DE && var != SE && var != SE2)			      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x5b;							      \
+	break;								      \
+      case 0xc5:							      \
+	if (var != DK && var != NO && var != NO2 && var != SE && var != SE2)  \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x5d;							      \
+	break;								      \
+      case 0xc6:							      \
+	if (var != DK && var != NO && var != NO2)			      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x5b;							      \
+	break;								      \
+      case 0xc7:							      \
+	if (var == ES2)							      \
+	  ch = 0x5d;							      \
+	else if (var == PT || var == PT2)				      \
+	  ch = 0x5c;							      \
+	else								      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	break;								      \
+      case 0xc9:							      \
+	if (var == CA2)							      \
+	  ch = 0x5e;							      \
+	else if (var == HU)						      \
+	  ch = 0x5b;							      \
+	else if (var == SE2)						      \
+	  ch = 0x40;							      \
+	else								      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	break;								      \
+      case 0xd1:							      \
+	if (var != ES && var != ES2 && var != CU)			      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x5c;							      \
+	break;								      \
+      case 0xd5:							      \
+	if (var != PT && var != PT2)					      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x5d;							      \
+	break;								      \
+      case 0xd6:							      \
+	if (var != DE && var != HU && var != SE && var != SE2)		      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x5c;							      \
+	break;								      \
+      case 0xd8:							      \
+	if (var != DK && var != NO && var != NO2)			      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x5c;							      \
+	break;								      \
+      case 0xdc:							      \
+	if (var == DE || var == HU)					      \
+	  ch = 0x5d;							      \
+	else if (var == SE2)						      \
+	  ch = 0x5e;							      \
+	else								      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	break;								      \
+      case 0xdf:							      \
+	if (var != DE)							      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x7e;							      \
+	break;								      \
+      case 0xe0:							      \
+	if (var == CA || var == CA2 || var == FR || var == FR1)		      \
+	  ch = 0x40;							      \
+	else if (var == IT)						      \
+	  ch = 0x7b;							      \
+	else								      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	break;								      \
+      case 0xe1:							      \
+	if (var != HU)							      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x60;							      \
+	break;								      \
+      case 0xe2:							      \
+	if (var != CA && var != CA2)					      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x5b;							      \
+	break;								      \
+      case 0xe3:							      \
+	if (var != PT && var != PT2)					      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x7b;							      \
+	break;								      \
+      case 0xe4:							      \
+	if (var != DE && var != SE && var != SE2)			      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x7b;							      \
+	break;								      \
+      case 0xe5:							      \
+	if (var != DK && var != NO && var != NO2 && var != SE && var != SE2)  \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x7d;							      \
+	break;								      \
+      case 0xe6:							      \
+	if (var != DK && var != NO && var != NO2)			      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x7b;							      \
+	break;								      \
+      case 0xe7:							      \
+	if (var == CA || var == CA2 || var == IT || var == FR || var == FR1)  \
+	  ch = 0x5c;							      \
+	else if (var == ES || var == ES2)				      \
+	  ch = 0x7d;							      \
+	else if (var == PT || var == PT2)				      \
+	  ch = 0x7c;							      \
+	else								      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	break;								      \
+      case 0xe8:							      \
+	if (var != CA && var != CA2 && var != IT && var != FR && var != FR1)  \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x7d;							      \
+	break;								      \
+      case 0xe9:							      \
+	if (var == CA || var == CA2 || var == HU || var == FR || var == FR1)  \
+	  ch = 0x7b;							      \
+	else if (var == IT)						      \
+	  ch = 0x5d;							      \
+	else if (var == SE2)						      \
+	  ch = 0x60;							      \
+	else								      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	break;								      \
+      case 0xea:							      \
+	if (var != CA && var != CA2)					      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x5d;							      \
+	break;								      \
+      case 0xec:							      \
+	if (var != IT)							      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x7e;							      \
+	break;								      \
+      case 0xee:							      \
+	if (var != CA)							      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x5e;							      \
+	break;								      \
+      case 0xf1:							      \
+	if (var != ES && var != ES2 && var != CU)			      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x7c;							      \
+	break;								      \
+      case 0xf2:							      \
+	if (var != IT)							      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x7c;							      \
+	break;								      \
+      case 0xf4:							      \
+	if (var != CA && var != CA2)					      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x60;							      \
+	break;								      \
+      case 0xf5:							      \
+	if (var != PT && var != PT2)					      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x7d;							      \
+	break;								      \
+      case 0xf6:							      \
+	if (var != DE && var != HU && var != SE && var != SE2)		      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x7c;							      \
+	break;								      \
+      case 0xf8:							      \
+	if (var != DK && var != NO && var != NO2)			      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x7c;							      \
+	break;								      \
+      case 0xf9:							      \
+	if (var == CA || var == CA2 || var == FR || var == FR1)		      \
+	  ch = 0x7c;							      \
+	else if (var == IT)						      \
+	  ch = 0x60;							      \
+	else								      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	break;								      \
+      case 0xfb:							      \
+	if (var != CA && var != CA2)					      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x7e;							      \
+	break;								      \
+      case 0xfc:							      \
+	if (var == DE || var == HU)					      \
+	  ch = 0x7d;							      \
+	else if (var == SE2)						      \
+	  ch = 0x7e;							      \
+	else								      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	break;								      \
+      case 0x160:							      \
+	if (var != YU)							      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x5b;							      \
+	break;								      \
+      case 0x106:							      \
+	if (var != YU)							      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x5d;							      \
+	break;								      \
+      case 0x107:							      \
+	if (var != YU)							      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x7d;							      \
+	break;								      \
+      case 0x10c:							      \
+	if (var != YU)							      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x5e;							      \
+	break;								      \
+      case 0x10d:							      \
+	if (var != YU)							      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x7e;							      \
+	break;								      \
+      case 0x110:							      \
+	if (var != YU)							      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x5c;							      \
+	break;								      \
+      case 0x111:							      \
+	if (var != YU)							      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x7c;							      \
+	break;								      \
+      case 0x161:							      \
+	if (var != YU)							      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x7b;							      \
+	break;								      \
+      case 0x17d:							      \
+	if (var != YU)							      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x40;							      \
+	break;								      \
+      case 0x17e:							      \
+	if (var != YU)							      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x60;							      \
+	break;								      \
+      case 0x2dd:							      \
+	if (var != HU)							      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x7e;							      \
+	break;								      \
+      case 0x2022:							      \
+	if (var != ES2)							      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x40;							      \
+	break;								      \
+      case 0x203e:							      \
+	if (var != GB && var != CN && var != JP && var != NO && var != SE)    \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x7e;							      \
+	break;								      \
+      case 0x20a9:							      \
+	if (var != KR)							      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x5c;							      \
+	break;								      \
+      case 0x2329:							      \
+	if (var != JP_OCR_B)						      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x5b;							      \
+	break;								      \
+      case 0x232a:							      \
+	if (var != JP_OCR_B)						      \
+	  failure = __GCONV_ILLEGAL_INPUT;				      \
+	ch = 0x5d;							      \
+	break;								      \
+      default:								      \
+	if (__glibc_unlikely (ch > 0x7f))				      \
+	  {								      \
+	    UNICODE_TAG_HANDLER (ch, 4);				      \
+	    failure = __GCONV_ILLEGAL_INPUT;				      \
+	  }								      \
+	break;								      \
+      }									      \
+									      \
+    if (__builtin_expect (failure, __GCONV_OK) == __GCONV_ILLEGAL_INPUT)      \
+      {									      \
+	STANDARD_TO_LOOP_ERR_HANDLER (4);				      \
+      }									      \
+									      \
+    *outptr++ = (unsigned char) ch;					      \
+    inptr += 4;								      \
+  }
+#define LOOP_NEED_FLAGS
+#define EXTRA_LOOP_DECLS	, enum variant var
+#include <iconv/loop.c>
+
+
+/* Now define the toplevel functions.  */
+#include <iconv/skeleton.c>