about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog32
-rw-r--r--iconvdata/gconv-modules8
-rw-r--r--iconvdata/iso646.c67
-rw-r--r--localedata/Makefile8
-rw-r--r--sysdeps/unix/sysv/linux/bits/ioctls.h2
5 files changed, 95 insertions, 22 deletions
diff --git a/ChangeLog b/ChangeLog
index 052f2e90a8..3c06996518 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,34 @@
+1998-04-02 11:45  Ulrich Drepper  <drepper@cygnus.com>
+
+	* localedata/Makefile: Correct testsuite rules.
+
+	* iconvdata/gconv-modules: Set cost of ISO646 module to 2.
+	* iconvdata/iso646.c: Fix conversion from UCS4.
+
+	* elf/ldsodefs.h: Mark internal function with internal_function.
+	* elf/dl-addr.c: Likewise.
+	* elf/dl-close.c: Likewise.
+	* elf/dl-debug.c: Likewise.
+	* elf/dl-deps.c: Likewise.
+	* elf/dl-error.c: Likewise.
+	* elf/dl-fini.c: Likewise.
+	* elf/dl-init.c: Likewise.
+	* elf/dl-load.c: Likewise.
+	* elf/dl-lookup.c: Likewise.
+	* elf/dl-object.c: Likewise.
+	* elf/dl-open.c: Likewise.
+	* elf/dl-profile.c: Likewise.
+	* elf/dl-reloc.c: Likewise.
+	* elf/dl-runtime.c: Likewise.
+	* elf/dl-symbol.c: Likewise.
+	* elf/dl-version.c: Likewise.
+	* elf/dlerror.c: Likewise.
+	* sysdeps/generic/dl-sysdep.c: Likewise.
+	* sysdeps/i386/dl-machine.h: Likewise.
+
 1998-04-01 17:38  Ulrich Drepper  <drepper@cygnus.com>
 
-	* iconv/gconv?simple.c: New builtins for UCS en/decoding.
+	* iconv/gconv_simple.c: New builtins for UCS en/decoding.
 	* iconv/gconv_builtin.h: Add definitions for new builtins.
 	* iconv/gconv.h: Add prototypes for new builtins.
 
@@ -29,7 +57,7 @@
 
 	* iconv/gconv_conf.c (builtin_aliases): New variable.
 	(__gconv_read_conf): Add builtin aliases.
-	* iconv/gconv_builtin.c (builtin_map): Define BUILTIN?ALIAS as an
+	* iconv/gconv_builtin.c (builtin_map): Define BUILTIN_ALIAS as an
 	noop macro before including gconv_builtin.h.
 	* iconv/gconv_builtin.h: Add alias names.
 
diff --git a/iconvdata/gconv-modules b/iconvdata/gconv-modules
index adbf2f07a1..be03e9608e 100644
--- a/iconvdata/gconv-modules
+++ b/iconvdata/gconv-modules
@@ -48,15 +48,15 @@ alias	US-ASCII//		ANSI_X3.4-1968//
 alias	US//			ANSI_X3.4-1968//
 alias	IBM367//		ANSI_X3.4-1968//
 alias	CP367//			ANSI_X3.4-1968//
-module	ANSI_X3.4-1968//	ISO-10646/UCS4/		ISO646		1
-module	ISO-10646/UCS4/		ANSI_X3.4-1968//	ISO646		1
+module	ANSI_X3.4-1968//	ISO-10646/UCS4/		ISO646		2
+module	ISO-10646/UCS4/		ANSI_X3.4-1968//	ISO646		2
 
 alias	ISO-IR-4//		BS_4730//
 alias	ISO646-GB//		BS_4730//
 alias	GB//			BS_4730//
 alias	UK//			BS_4730//
-module	BS_4730//		ISO-10646/UCS4/		ISO646
-module	ISO-10646/UCS4/		BS_4730//		ISO646
+module	BS_4730//		ISO-10646/UCS4/		ISO646		2
+module	ISO-10646/UCS4/		BS_4730//		ISO646		2
 
 #	from			  to			  module	cost
 alias	ISO-IR-100//		ISO-8859-1//
diff --git a/iconvdata/iso646.c b/iconvdata/iso646.c
index db0c0893e7..3b4864ef11 100644
--- a/iconvdata/iso646.c
+++ b/iconvdata/iso646.c
@@ -18,6 +18,19 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+/* 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 <gconv.h>
 #include <stdlib.h>
 #include <string.h>
@@ -25,13 +38,14 @@
 /* Direction of the transformation.  */
 enum direction
 {
-  illegal,
+  illegal_dir,
   to_iso646,
   from_iso646
 };
 
 enum variant
 {
+  illegal_var,
   US,		/* ANSI_X3.4-1968 */
   GB,		/* BS_4730 */
 };
@@ -73,10 +87,13 @@ gconv_init (struct gconv_step *step, struct gconv_step_data *data)
       var = GB;
     }
   else
-    dir = illegal;
+    {
+      dir = illegal_dir;
+      var = illegal_var;
+    }
 
   result = GCONV_NOCONV;
-  if (dir != illegal
+  if (dir != illegal_dir
       && ((new_data
 	   = (struct iso646_data *) malloc (sizeof (struct iso646_data)))
 	  != NULL))
@@ -167,11 +184,16 @@ gconv (struct gconv_step *step, struct gconv_step_data *data,
 		    default:
 		      *((wchar_t *) (outbuf + outwchars)) =
 			(unsigned char) inbuf[cnt];
+		    case '\x80' ... '\xff':
+		      /* Illegal character.  */
+		      result = GCONV_ILLEGAL_INPUT;
+		      goto out_from;
 		    }
 		  ++do_write;
 		  outwchars += sizeof (wchar_t);
 		  ++cnt;
 		}
+	    out_from:
 	      *inbufsize -= cnt;
 	      data->outbufavail = outwchars;
 	    }
@@ -179,24 +201,47 @@ gconv (struct gconv_step *step, struct gconv_step_data *data,
 	    {
 	      size_t inwchars = *inbufsize;
 	      size_t outchars = data->outbufavail;
-	      char *outbuf = data->outbuf;
+	      unsigned char *outbuf = data->outbuf;
 	      size_t cnt = 0;
 
 	      while (inwchars >= cnt + sizeof (wchar_t)
 		     && outchars < data->outbufsize)
 		{
-		  if (*((wchar_t *) (inbuf + cnt)) >= L'\0'
-		      && *((wchar_t *) (inbuf + cnt)) <= L'\177')
-		    outbuf[outchars] = *((wchar_t *) (inbuf + cnt));
-		  else
-		    /* Here is where the transliteration would enter the
-		       scene.  */
-		    break;
+		  switch (*((wchar_t *) (inbuf + cnt)))
+		    {
+		    case 0x23:
+		      if (var == GB)
+			goto out_to;
+		      outbuf[outchars] = 0x23;
+		      break;
+		    case 0x75:
+		      if (var == GB)
+			goto out_to;
+		      outbuf[outchars] = 0x75;
+		      break;
+		    case 0xa3:
+		      if (var != GB)
+			goto out_to;
+		      outbuf[outchars] = 0x23;
+		      break;
+		    case 0x203e:
+		      if (var != GB)
+			goto out_to;
+		      outbuf[outchars] = 0x75;
+		      break;
+		    default:
+		      if (*((wchar_t *) (inbuf + cnt)) > 0x7f)
+			goto out_to;
+		      outbuf[outchars] =
+			(unsigned char) *((wchar_t *) (inbuf + cnt));
+		      break;
+		    }
 
 		  ++do_write;
 		  ++outchars;
 		  cnt += sizeof (wchar_t);
 		}
+	    out_to:
 	      *inbufsize -= cnt;
 	      data->outbufavail = outchars;
 
diff --git a/localedata/Makefile b/localedata/Makefile
index c01454393b..dac662081e 100644
--- a/localedata/Makefile
+++ b/localedata/Makefile
@@ -65,11 +65,11 @@ tests: do-collate-test do-tst-fmon do-tst-locale do-tst-rpmatch
 do-collate-test: sort-test.sh $(objpfx)collate-test $(objpfx)xfrm-test \
 		 $(test-input:.ISO-8859-1=.in)
 	$(SHELL) -e $< $(common-objpfx) $(test-input)
-do-tst-fmon: tst-locale.sh $(objpfx)tst-fmon $(ld-test-srcs)
+do-tst-fmon: tst-fmon.sh $(objpfx)tst-fmon tst-fmon.data
+	$(SHELL) -e $< $(common-objpfx) tst-fmon.data
+do-tst-locale: tst-locale.sh $(ld-test-srcs)
 	$(SHELL) -e $< $(common-objpfx)
-do-tst-locale: tst-locale.sh
-	$(SHELL) -e $< $(common-objpfx)
-do-tst-rpmatch: tst-rpmatch.sh $(objpfx)tst-rpmatch
+do-tst-rpmatch: tst-rpmatch.sh $(objpfx)tst-rpmatch do-collate-test
 	$(SHELL) -e $< $(common-objpfx)
 endif
 
diff --git a/sysdeps/unix/sysv/linux/bits/ioctls.h b/sysdeps/unix/sysv/linux/bits/ioctls.h
index 7208d3bd4f..c103645f67 100644
--- a/sysdeps/unix/sysv/linux/bits/ioctls.h
+++ b/sysdeps/unix/sysv/linux/bits/ioctls.h
@@ -99,7 +99,7 @@
    names as their own. Because these are device dependent it is a good
    idea _NOT_ to issue them to random objects and hope.  */
 
-#define SIOCDEVPRIVATE	0x89F0	/* to 89FF */
+#define SIOCDEVPRIVATE 		0x89F0	/* to 89FF */
 
 /*
  *	These 16 ioctl calls are protocol private