about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--locale/C-ctype.c19
-rw-r--r--locale/programs/charmap.c10
-rw-r--r--locale/programs/config.h4
-rw-r--r--locale/programs/ld-ctype.c40
-rw-r--r--localedata/ChangeLog4
-rw-r--r--localedata/charmaps/ISO-IR-1976
-rw-r--r--wcsmbs/wcwidth.h13
7 files changed, 62 insertions, 34 deletions
diff --git a/locale/C-ctype.c b/locale/C-ctype.c
index f9eee1ca94..6e036f6266 100644
--- a/locale/C-ctype.c
+++ b/locale/C-ctype.c
@@ -504,18 +504,27 @@ const struct
 {
   uint32_t header[5];
   uint32_t level1[1];
-  uint32_t level2[1];
-  uint8_t level3[1];
+  uint32_t level2[8];
+  int8_t level3[33];
 }
 _nl_C_LC_CTYPE_width =
 {
-  { 7, 1, 0, 0, 0 },
+  { 7, 1, 4, 7, 15 },
   /* 1st-level table */
   { 6 * sizeof (uint32_t) },
   /* 2nd-level table */
-  { 7 * sizeof (uint32_t) },
+  {
+    14 * sizeof (uint32_t) +  0, 0,
+    14 * sizeof (uint32_t) + 16, 14 * sizeof (uint32_t) + 16,
+    14 * sizeof (uint32_t) + 16, 14 * sizeof (uint32_t) + 16,
+    14 * sizeof (uint32_t) + 16, 14 * sizeof (uint32_t) + 17
+  },
   /* 3rd-level table */
-  { 1 }
+  {
+     0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+     -1
+  }
 };
 
 /* Number of fields with fixed meanings, starting at 0.  */
diff --git a/locale/programs/charmap.c b/locale/programs/charmap.c
index f76bc24709..b8e994fdac 100644
--- a/locale/programs/charmap.c
+++ b/locale/programs/charmap.c
@@ -120,7 +120,7 @@ charmap_read (const char *filename)
 	}
     }
 
-  if (result == NULL)
+  if (result == NULL && filename != NULL)
     {
       /* OK, one more try.  We also accept the names given to the
 	 character sets in the files.  Sometimes they differ from the
@@ -155,12 +155,9 @@ charmap_read (const char *filename)
 			char junk[BUFSIZ];
 
 			if (fscanf (fp, " <code_set_name> %as", &name) == 1
-			    || (fscanf (fp, " <code_set_name> \"%as\"", &name)
-				== 1)
 			    || fscanf (fp, "%% alias %as", &name) == 1)
 			  {
-			    if (filename != NULL
-				&& strcasecmp (name, filename) == 0)
+			    if (strcasecmp (name, filename) == 0)
 			      break;
 
 			    free (name);
@@ -189,9 +186,6 @@ charmap_read (const char *filename)
 			result = (cmfile == NULL
 				  ? NULL : parse_charmap (cmfile));
 
-			if (result)
-			  return result;
-
 			break;
 		      }
 		  }
diff --git a/locale/programs/config.h b/locale/programs/config.h
index a293da3b09..512350449e 100644
--- a/locale/programs/config.h
+++ b/locale/programs/config.h
@@ -1,5 +1,5 @@
 /* Configuration for localedef program.
-   Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1995.
 
@@ -28,7 +28,7 @@
 #include "../../version.h"
 #endif
 
-#define DEFAULT_CHARMAP "POSIX"
+#define DEFAULT_CHARMAP "ANSI_X3.4-1968" /* ASCII */
 
 #ifndef PARAMS
 # if __STDC__
diff --git a/locale/programs/ld-ctype.c b/locale/programs/ld-ctype.c
index 1d10cec618..4f5653af23 100644
--- a/locale/programs/ld-ctype.c
+++ b/locale/programs/ld-ctype.c
@@ -1309,6 +1309,10 @@ find_idx (struct locale_ctype_t *ctype, uint32_t **table, size_t *max,
     /* We have done everything we are asked to do.  */
     return NULL;
 
+  if (max == NULL)
+    /* The caller does not want to extend the table.  */
+    return (cnt >= *act ? NULL : &(*table)[cnt]);
+
   if (cnt >= *act)
     {
       if (cnt >= *max)
@@ -3732,8 +3736,13 @@ allocate_arrays (struct locale_ctype_t *ctype, struct charmap_t *charmap,
   ctype->class_offset = _NL_ITEM_INDEX (_NL_CTYPE_EXTRA_MAP_1);
   ctype->map_offset = ctype->class_offset + ctype->nr_charclass;
 
-  /* Array for width information.  Because the expected width are very
-     small we use only one single byte.  This saves space.  */
+  /* Array for width information.  Because the expected widths are very
+     small (never larger than 2) we use only one single byte.  This
+     saves space.
+     We put only printable characters in the table.  wcwidth is specified
+     to return -1 for non-printable characters.  Doing the check here
+     saves a run-time check.
+     But we put L'\0' in the table.  This again saves a run-time check.  */
   {
     struct wcwidth_table t;
 
@@ -3741,7 +3750,8 @@ allocate_arrays (struct locale_ctype_t *ctype, struct charmap_t *charmap,
     t.q = 9;
     wcwidth_table_init (&t);
 
-    /* First set all the characters of the character set to the default width.  */
+    /* First set all the printable characters of the character set to
+       the default width.  */
     curs = NULL;
     while (iterate_table (&charmap->char_table, &curs, &key, &len, &vdata) == 0)
       {
@@ -3752,7 +3762,14 @@ allocate_arrays (struct locale_ctype_t *ctype, struct charmap_t *charmap,
 					      data->name, len);
 
 	if (data->ucs4 != ILLEGAL_CHAR_VALUE)
-	  wcwidth_table_add (&t, data->ucs4, charmap->width_default);
+	  {
+	    uint32_t *class_bits =
+	      find_idx (ctype, &ctype->class_collection, NULL,
+			&ctype->class_collection_act, data->ucs4);
+
+	    if (class_bits != NULL && (*class_bits & BITw (tok_print)))
+	      wcwidth_table_add (&t, data->ucs4, charmap->width_default);
+	  }
       }
 
     /* Now add the explicitly specified widths.  */
@@ -3792,8 +3809,16 @@ allocate_arrays (struct locale_ctype_t *ctype, struct charmap_t *charmap,
 					       strlen (seq->name));
 
 		if (wch != ILLEGAL_CHAR_VALUE)
-		  /* Store the value.  */
-		  wcwidth_table_add (&t, wch, charmap->width_rules[cnt].width);
+		  {
+		    /* Store the value.  */
+		    uint32_t *class_bits =
+		      find_idx (ctype, &ctype->class_collection, NULL,
+				&ctype->class_collection_act, wch);
+
+		    if (class_bits != NULL && (*class_bits & BITw (tok_print)))
+		      wcwidth_table_add (&t, wch,
+					 charmap->width_rules[cnt].width);
+		  }
 
 		/* "Increment" the bytes sequence.  */
 		inner = nbytes - 1;
@@ -3820,6 +3845,9 @@ allocate_arrays (struct locale_ctype_t *ctype, struct charmap_t *charmap,
 	  }
       }
 
+    /* Set the width of L'\0' to 0.  */
+    wcwidth_table_add (&t, 0, 0);
+
     wcwidth_table_finalize (&t);
 
     if (verbose)
diff --git a/localedata/ChangeLog b/localedata/ChangeLog
index 7fb70dd94a..fcfac24db9 100644
--- a/localedata/ChangeLog
+++ b/localedata/ChangeLog
@@ -1,5 +1,9 @@
 2000-09-30  Bruno Haible  <haible@clisp.cons.org>
 
+	* charmaps/ISO-IR-197: Remove alias "none".
+
+2000-09-30  Bruno Haible  <haible@clisp.cons.org>
+
 	* charmaps/UTF-8: Add the correct Hangul syllable names.  Change the
 	width of format control characters to 0.
 
diff --git a/localedata/charmaps/ISO-IR-197 b/localedata/charmaps/ISO-IR-197
index 6b2866d119..4334077d42 100644
--- a/localedata/charmaps/ISO-IR-197
+++ b/localedata/charmaps/ISO-IR-197
@@ -1,12 +1,10 @@
-<code_set_name>ISO-IR-197
+<code_set_name> ISO-IR-197
 <comment_char> %
 <escape_char> /
 % source:  http://www.itek.norut.no/project/barent/barsek/ip/197t.html
 % author:  Petter Reinholdtsen <pere@td.org.uit.no>
 % date:    1998-08-31
-% comment: Proposed nothern sami charset.  Superseeded by WS2
-
-% alias none
+% comment: Proposed nothern sami charset.  Superseded by WS2
 
 CHARMAP
 <U0000>     /x00         NULL (NUL)
diff --git a/wcsmbs/wcwidth.h b/wcsmbs/wcwidth.h
index d13a5f59ae..49ad7c0d1e 100644
--- a/wcsmbs/wcwidth.h
+++ b/wcsmbs/wcwidth.h
@@ -22,9 +22,6 @@
 #include <wctype.h>
 #include "../wctype/wchar-lookup.h"
 
-/* Tables containing character property information.  */
-extern const char *__ctype32_wctype[12];
-
 /* Table containing width information.  */
 extern const char *__ctype32_width;
 
@@ -33,12 +30,10 @@ internal_wcwidth (wint_t wc)
 {
   unsigned char res;
 
-  if (wc == L'\0')
-    return 0;
-
-  if (wctype_table_lookup (__ctype32_wctype[__ISwprint], wc) == 0)
-    return -1;
-
+  /* The tables have been prepared in such a way that
+     1. wc == L'\0' yields res = 0,
+     2. !iswprint (wc) implies res = '\xff'.  */
   res = wcwidth_table_lookup (__ctype32_width, wc);
+
   return res == (unsigned char) '\xff' ? -1 : (int) res;
 }