summary refs log tree commit diff
path: root/iconvdata/iso646.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1998-04-24 07:07:59 +0000
committerUlrich Drepper <drepper@redhat.com>1998-04-24 07:07:59 +0000
commit9b26f5c47dd7efd663119d02e2d2e3d9886c422c (patch)
treef4d1ee8bb914745b0931a499520535eb1d52531e /iconvdata/iso646.c
parented838925efcb30fab98a0a118c862cc68c3307c2 (diff)
downloadglibc-9b26f5c47dd7efd663119d02e2d2e3d9886c422c.tar.gz
glibc-9b26f5c47dd7efd663119d02e2d2e3d9886c422c.tar.xz
glibc-9b26f5c47dd7efd663119d02e2d2e3d9886c422c.zip
Update.
<<<<<<< ChangeLog
1998-04-23 22:43  Ulrich Drepper  <drepper@cygnus.com>

	* elf/dl-load.c (fillin_rpath): Handle empty element returned by
	strsep as current directory.

	* iconv/gconv_builtin.h: Add aliases unicode and unicodebig for
	Java.  Add definitions for unicodelittle implementation.
	* iconv/gconv_int.h: Add declaration for unicodelittle functions.
	* iconv/gconv_simple.c: Define unicodelittle functions.

	* iconv/iconv_prog.c: Make program print information about position
	of illegal character in input.

	* iconv/skeleton.c: Use __strcasecmp instead of __strcasestr for
	comparison of charset name.
	* iconvdata/big5.c (CHARSET_NAME): Adapt for this.
	* iconvdata/ebcdic-at-de-a.c: Likewise.
	* iconvdata/ebcdic-at-de.c: Likewise.
	* iconvdata/ebcdic-ca-fr.c: Likewise.
	* iconvdata/euccn.c: Likewise.
	* iconvdata/eucjp.c: Likewise.
	* iconvdata/euckr.c: Likewise.
	* iconvdata/euctw.c: Likewise.
	* iconvdata/hp-roman8.c: Likewise.
	* iconvdata/iso6937.c: Likewise.
	* iconvdata/iso8859-1.c: Likewise.
	* iconvdata/iso8859-10.c: Likewise.
	* iconvdata/iso8859-2.c: Likewise.
	* iconvdata/iso8859-3.c: Likewise.
	* iconvdata/iso8859-4.c: Likewise.
	* iconvdata/iso8859-5.c: Likewise.
	* iconvdata/iso8859-6.c: Likewise.
	* iconvdata/iso8859-7.c: Likewise.
	* iconvdata/iso8859-8.c: Likewise.
	* iconvdata/iso8859-9.c: Likewise.
	* iconvdata/johab.c: Likewise.
	* iconvdata/koi-8.c: Likewise.
	* iconvdata/koi8-r.c: Likewise.
	* iconvdata/latin-greek-1.c: Likewise.
	* iconvdata/latin-greek.c: Likewise.
	* iconvdata/sjis.c: Likewise.
	* iconvdata/t61.c: Likewise.
	* iconvdata/uhc.c: Likewise.

	* iconvdata/iso646.c: Add support for more ISO 646 variants.
	* iconvdata/TESTS: Add tests for ISO646 module.
	* iconvdata/gconv-modules: Add new modules.
	* iconvdata/testdate/CSA_Z243.4-1985-1: New tests for ISO646 module.
	* iconvdata/testdate/CSA_Z243.4-1985-1..UCS2: Likewise.
	* iconvdata/testdate/CSA_Z243.4-1985-2: Likewise.
	* iconvdata/testdate/CSA_Z243.4-1985-2..UCS4: Likewise.
	* iconvdata/testdate/DIN_66003: Likewise.
	* iconvdata/testdate/DIN_66003..UTF8: Likewise.
	* iconvdata/testdate/DS_2089: Likewise.
	* iconvdata/testdate/DS_2089..UTF8: Likewise.
	* iconvdata/testdate/ES: Likewise.
	* iconvdata/testdate/ES..UTF8: Likewise.
	* iconvdata/testdate/ES2: Likewise.
	* iconvdata/testdate/ES2..UTF8: Likewise.
	* iconvdata/testdate/GB_1988-80: Likewise.
	* iconvdata/testdate/GB_1988-80..UTF8: Likewise.
	* iconvdata/testdate/IT: Likewise.
	* iconvdata/testdate/IT..UTF8: Likewise.
	* iconvdata/testdate/JIS_C6220-1969-RO: Likewise.
	* iconvdata/testdate/JIS_C6220-1969-RO..UTF8: Likewise.
	* iconvdata/testdate/JIS_C6229-1984-B: Likewise.
	* iconvdata/testdate/JIS_C6229-1984-B..UTF8: Likewise.
	* iconvdata/testdate/JUS_I.B1.002: Likewise.
	* iconvdata/testdate/JUS_I.B1.002..UTF8: Likewise.
	* iconvdata/testdate/KSC5636: Likewise.
	* iconvdata/testdate/KSC5636..UTF8: Likewise.
	* iconvdata/testdate/MSZ_7795.3: Likewise.
	* iconvdata/testdate/MSZ_7795.3..UTF8: Likewise.
	* iconvdata/testdate/NC_NC00-10: Likewise.
	* iconvdata/testdate/NC_NC00-10..UTF8: Likewise.
	* iconvdata/testdate/NF_Z_62-010: Likewise.
	* iconvdata/testdate/NF_Z_62-010..UTF8: Likewise.
	* iconvdata/testdate/NF_Z_62-010_1973: Likewise.
	* iconvdata/testdate/NF_Z_62-010_1973..UTF8: Likewise.
	* iconvdata/testdate/NS_4551-1: Likewise.
	* iconvdata/testdate/NS_4551-1..UTF8: Likewise.
	* iconvdata/testdate/NS_4551-2: Likewise.
	* iconvdata/testdate/NS_4551-2..UTF8: Likewise.
	* iconvdata/testdate/PT: Likewise.
	* iconvdata/testdate/PT..UTF8: Likewise.
	* iconvdata/testdate/PT2: Likewise.
	* iconvdata/testdate/PT2..UTF8: Likewise.
	* iconvdata/testdate/SEN_850200_B: Likewise.
	* iconvdata/testdate/SEN_850200_B..UTF8: Likewise.
	* iconvdata/testdate/SEN_850200_C: Likewise.
	* iconvdata/testdate/SEN_850200_C..UTF8: Likewise.

	* iconvdata/cns11643.h: Use uint32_t instead of wchar_t.
	* iconvdata/cns11643l1.h: Likewise.
	* iconvdata/latin-greek-1.h: Likewise.
	* iconvdata/latin-greek.h: Likewise.
	* iconvdata/koi8-r.h: Likewise.
	* iconvdata/jis0212.h: Likewise.
	* iconvdata/gb2312.h: Likewise.
	* iconvdata/ksc5601.h: Likewise.

	* iconvdata/8bit-gap.c: Use 32 bit type for idx element of struct gap.

	* iconvdata/Makefile: Add rules for lots of more modules.
	* iconvdata/cp1250.c: New file.
	* iconvdata/cp1251.c: New file.
	* iconvdata/cp1252.c: New file.
	* iconvdata/cp1253.c: New file.
	* iconvdata/cp1254.c: New file.
	* iconvdata/cp1255.c: New file.
	* iconvdata/cp1256.c: New file.
	* iconvdata/cp1257.c: New file.
	* iconvdata/ebcdic-dk-no-a.c: New file.
	* iconvdata/ebcdic-dk-no.c: New file.
	* iconvdata/ebcdic-es-a.c: New file.
	* iconvdata/ebcdic-es-s.c: New file.
	* iconvdata/ebcdic-es.c: New file.
	* iconvdata/ebcdic-fi-se-a.c: New file.
	* iconvdata/ebcdic-fi-se.c: New file.
	* iconvdata/ebcdic-fr.c: New file.
	* iconvdata/ebcdic-is-friss.c: New file.
	* iconvdata/ebcdic-it.c: New file.
	* iconvdata/ebcdic-pt.c: New file.
	* iconvdata/ebcdic-uk.c: New file.
	* iconvdata/ebcdic-us.c: New file.
	* iconvdata/ibm037.c: New file.
	* iconvdata/ibm038.c: New file.
	* iconvdata/ibm1004.c: New file.
	* iconvdata/ibm1026.c: New file.
	* iconvdata/ibm1047.c: New file.
	* iconvdata/ibm256.c: New file.
	* iconvdata/ibm273.c: New file.
	* iconvdata/ibm274.c: New file.
	* iconvdata/ibm275.c: New file.
	* iconvdata/ibm277.c: New file.
	* iconvdata/ibm278.c: New file.
	* iconvdata/ibm280.c: New file.
	* iconvdata/ibm281.c: New file.
	* iconvdata/ibm284.c: New file.
	* iconvdata/ibm285.c: New file.
	* iconvdata/ibm290.c: New file.
	* iconvdata/ibm297.c: New file.
	* iconvdata/ibm420.c: New file.
	* iconvdata/ibm423.c: New file.
	* iconvdata/ibm424.c: New file.
	* iconvdata/ibm437.c: New file.
	* iconvdata/ibm500.c: New file.
	* iconvdata/ibm850.c: New file.
	* iconvdata/ibm851.c: New file.
	* iconvdata/ibm852.c: New file.
	* iconvdata/ibm855.c: New file.
	* iconvdata/ibm857.c: New file.
	* iconvdata/ibm860.c: New file.
	* iconvdata/ibm861.c: New file.
	* iconvdata/ibm862.c: New file.
	* iconvdata/ibm863.c: New file.
	* iconvdata/ibm864.c: New file.
	* iconvdata/ibm865.c: New file.
	* iconvdata/ibm868.c: New file.
	* iconvdata/ibm869.c: New file.
	* iconvdata/ibm870.c: New file.
	* iconvdata/ibm871.c: New file.
	* iconvdata/ibm875.c: New file.
	* iconvdata/ibm880.c: New file.
	* iconvdata/ibm891.c: New file.
	* iconvdata/ibm903.c: New file.
	* iconvdata/ibm904.c: New file.
	* iconvdata/ibm905.c: New file.
	* iconvdata/ibm918.c: New file.

	* locale/iso-4217.def: Update.
	* localedata/locales/pt_BR: Correct.  Patches by Andreas Jaeger.

	* stdio-common/vfscanf.h: Recognize nan and inf in floating-point
	formats.

1998-04-22  Andreas Jaeger  <aj@arthur.rhein-neckar.de>

	* elf/dl-load.c (_dl_init_paths): ';' is also a terminal for
	LD_LIBRARY_PATH.

1998-04-22  Gordon Matzigkeit  <gord@profitpress.com>

	* Makerules: Change occurances of `cd dir; cmd' to `cd dir && cmd'.
	* Makefile: Likewise.
	* posix/Makefile: Likewise.
	* sysdeps/mach/hurd/Makefile: Likewise.

1998-04-22  Gordon Matzigkeit  <gord@profitpress.com>

	* sysdeps/mach/hurd/bits/dirent.h: New file.
	* sysdeps/mach/hurd/readdir64.c: New file.
	* sysdeps/mach/hurd/readdir64_r.c: New file.

1998-04-21  Gordon Matzigkeit  <gord@profitpress.com>

	* stdio/stdio.h (vasprintf, __asprintf, asprintf, vdprintf,
	dprintf): Synchronize declarations with libio/stdio.h.

1998-04-21  Gordon Matzigkeit  <gord@profitpress.com>

	* elf/dlerror.c (dlerror): Don't assume that
	__libc_internal_tsd_get is defined.  __libc_getspecific is already
	well-protected, so just use it directly.

1998-04-22  Gordon Matzigkeit  <gord@profitpress.com>

	* io/ftw.h (ftw): Fix typo.

1998-04-21  Gordon Matzigkeit  <gord@profitpress.com>

	* sysdeps/gnu/utmp_file.c: Fix typo.

1998-04-22 11:06  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* iconvdata/run-iconv-test.sh: Fix more portability bugs.  When
	one part of a test fails move on to the next test.

1998-04-21  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/i386/bits/setjmp.h (_JMPBUF_UNWINDS): Compare addresses
	as pointers, not signed integers.

1998-04-22 11:06  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
Diffstat (limited to 'iconvdata/iso646.c')
-rw-r--r--iconvdata/iso646.c788
1 files changed, 707 insertions, 81 deletions
diff --git a/iconvdata/iso646.c b/iconvdata/iso646.c
index 4b7c2bbbbf..fa54371be3 100644
--- a/iconvdata/iso646.c
+++ b/iconvdata/iso646.c
@@ -62,6 +62,56 @@ enum variant
   illegal_var,
   US,		/* ANSI_X3.4-1968 */
   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 */
+};
+
+static const char *names[] =
+{
+  [US] = "ANSI_X3.4-1968//",
+  [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//"
 };
 
 struct iso646_data
@@ -76,35 +126,21 @@ gconv_init (struct gconv_step *step)
 {
   /* Determine which direction.  */
   struct iso646_data *new_data;
-  enum direction dir;
+  enum direction dir = illegal_dir;
   enum variant var;
   int result;
 
-  if (__strcasestr (step->from_name, "ANSI_X3.4-1968") != NULL)
-    {
-      dir = from_iso646;
-      var = US;
-    }
-  else if (__strcasestr (step->from_name, "BS_4730") != NULL)
-    {
-      dir = from_iso646;
-      var = GB;
-    }
-  else if (__strcasestr (step->to_name, "ANSI_X3.4-1968") != NULL)
-    {
-      dir = to_iso646;
-      var = US;
-    }
-  else if (__strcasestr (step->to_name, "BS_4730") != NULL)
-    {
-      dir = to_iso646;
-      var = GB;
-    }
-  else
-    {
-      dir = illegal_dir;
-      var = illegal_var;
-    }
+  for (var = sizeof (names) / sizeof (names[0]) - 1; var > illegal_var; --var)
+    if (__strcasecmp (step->from_name, names[var]) == 0)
+      {
+	dir = from_iso646;
+	break;
+      }
+    else if (__strcasecmp (step->to_name, names[var]) == 0)
+      {
+	dir = to_iso646;
+	break;
+      }
 
   result = GCONV_NOCONV;
   if (dir != illegal_dir
@@ -115,15 +151,16 @@ gconv_init (struct gconv_step *step)
       new_data->dir = dir;
       new_data->var = var;
       step->data = new_data;
-      result = GCONV_OK;
-    }
 
-  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;
+      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;
 
-  step->stateful = 0;
+      step->stateful = 0;
+
+      result = GCONV_OK;
+    }
 
   return result;
 }
@@ -145,27 +182,208 @@ gconv_end (struct gconv_step *data)
     uint32_t ch;							      \
     int failure = GCONV_OK;						      \
 									      \
-    switch (*inptr)							      \
+    ch = *inptr;							      \
+    switch (ch)								      \
       {									      \
-      case '\x23':							      \
-	if (var == GB)							      \
+      case 0x23:							      \
+	if (var == GB || var == ES || var == IT || var == FR || var == FR1)   \
 	  ch = 0xa3;							      \
-	else								      \
-	  ch = 0x23;							      \
+	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 '\x7e':							      \
-	if (var == GB)							      \
+      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								      \
-	  ch = 0x7e;							      \
+	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:								      \
-	ch = *inptr;							      \
 	break;								      \
       case '\x80' ... '\xff':						      \
 	/* Illegal character.  */					      \
 	failure = GCONV_ILLEGAL_INPUT;					      \
-	ch = '\0';	/* OK, gcc, here I initialize the variable.  */	      \
 	break;								      \
       }									      \
 									      \
@@ -190,54 +408,462 @@ gconv_end (struct gconv_step *data)
 #define LOOPFCT			TO_LOOP
 #define BODY \
   {									      \
-    unsigned char ch;							      \
+    unsigned char ch = '\0';						      \
     int failure = GCONV_OK;						      \
 									      \
-    do									      \
+    ch = *((uint32_t *) inptr);						      \
+    switch (*((uint32_t *) inptr))					      \
       {									      \
-	switch (*((uint32_t *) inptr))					      \
-	  {								      \
-	  case 0x23:							      \
-	    if (var == GB)						      \
-	      break;							      \
-	    ch = 0x23;							      \
-	    continue;							      \
-	  case 0x7e:							      \
-	    if (var == GB)						      \
-	      break;							      \
-	    ch = 0x7e;							      \
-	    continue;							      \
-	  case 0xa3:							      \
-	    if (var != GB)						      \
-	      break;							      \
-	    ch = 0x23;							      \
-	    continue;							      \
-	  case 0x203e:							      \
-	    if (var != GB)						      \
-	      break;							      \
-	    ch = 0x7e;							      \
-	    continue;							      \
-	  default:							      \
-	    if (*((uint32_t *) inptr) > 0x7f)				      \
-	      break;							      \
-	    ch = (unsigned char) *((uint32_t *) inptr);			      \
-	    continue;							      \
-	  }								      \
-	/* When we come to this place we saw an illegal character.  */	      \
-	failure = GCONV_ILLEGAL_INPUT;					      \
-	ch = '\0';	/* OK, gcc, here I initialize the variable.  */	      \
+      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 (*((uint32_t *) inptr) > 0x7f)				      \
+	  failure = GCONV_ILLEGAL_INPUT;				      \
+	break;								      \
       }									      \
-    while (0);								      \
 									      \
-    /* Hopefully gcc can recognize that the following `if' is only true	      \
-       when we fall through the `switch' statement.  */			      \
     if (failure == GCONV_ILLEGAL_INPUT)					      \
       {									      \
 	/* Exit the loop with an error.  */				      \
 	result = failure;						      \
 	break;								      \
       }									      \
-    *outptr++ = ch;							      \
+    *outptr++ = (unsigned char) ch;					      \
     inptr += 4;								      \
   }
 #define EXTRA_LOOP_DECLS	, enum variant var