about summary refs log tree commit diff
path: root/locale
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2000-06-28 04:27:24 +0000
committerUlrich Drepper <drepper@redhat.com>2000-06-28 04:27:24 +0000
commit0e16ecfa1e7689c0b3be626f9a3441ebb5710c70 (patch)
tree12a793be9d9a1f7a4a911239194bae33470dcb23 /locale
parent37696206076f6f075542adfdc4b1fe49100e9f32 (diff)
downloadglibc-0e16ecfa1e7689c0b3be626f9a3441ebb5710c70.tar.gz
glibc-0e16ecfa1e7689c0b3be626f9a3441ebb5710c70.tar.xz
glibc-0e16ecfa1e7689c0b3be626f9a3441ebb5710c70.zip
Update.
	* locale/programs/ld-ctype.c (ctype_finish): Take all characters from
	the input charset into account when generating the hash table.
	(allocate_arrays): Correct setting default width.  Not all empty slots
	in the table are filled, only those not covert explicitly by the
	locale description and in the charset.

	* stdio-common/vfscanf.c: Make sure to always return WEOF and EOF for
	wide character version.
	For %C handling, test correct pointer variable for NULL.

	* wcsmbs/wctob.c: Handle WEOF special.

	* wcsmbs/wcwidth.h: 0xff in width array means invalid character.

	* wctype/wctype.h: Protect gcc-isms with __extension__.  Avoid
	always-true test to avoid warning.
Diffstat (limited to 'locale')
-rw-r--r--locale/programs/ld-ctype.c64
1 files changed, 60 insertions, 4 deletions
diff --git a/locale/programs/ld-ctype.c b/locale/programs/ld-ctype.c
index ce097e741b..417660160f 100644
--- a/locale/programs/ld-ctype.c
+++ b/locale/programs/ld-ctype.c
@@ -345,6 +345,10 @@ ctype_finish (struct localedef_t *locale, struct charmap_t *charmap)
   struct charseq *space_seq;
   struct locale_ctype_t *ctype = locale->categories[LC_CTYPE].ctype;
   int warned;
+  const void *key;
+  size_t len;
+  void *vdata;
+  void *curs;
 
   /* Now resolve copying and also handle completely missing definitions.  */
   if (ctype == NULL)
@@ -637,6 +641,21 @@ character '%s' in class `%s' must not be in class `%s'"),
 	  }
       }
 
+  /* Now set all the other characters of the character set to the
+     default width.  */
+  curs = NULL;
+  while (iterate_table (&charmap->char_table, &curs, &key, &len, &vdata) == 0)
+    {
+      struct charseq *data = (struct charseq *) vdata;
+
+      if (data->ucs4 == UNINITIALIZED_CHAR_VALUE)
+	data->ucs4 = repertoire_find_value (ctype->repertoire,
+					    data->name, len);
+
+      if (data->ucs4 != ILLEGAL_CHAR_VALUE)
+	(void) find_idx (ctype, NULL, NULL, NULL, data->ucs4);
+    }
+
   /* There must be a multiple of 10 digits.  */
   if (ctype->mbdigits_act % 10 != 0)
     {
@@ -3158,6 +3177,10 @@ allocate_arrays (struct locale_ctype_t *ctype, struct charmap_t *charmap,
 {
   size_t idx;
   size_t width_table_size;
+  const void *key;
+  size_t len;
+  void *vdata;
+  void *curs;
 
   /* First we have to decide how we organize the arrays.  It is easy
      for a one-byte character set.  But multi-byte character set
@@ -3345,8 +3368,8 @@ Computing table size for character classes might take a while..."),
   width_table_size = (ctype->plane_size * ctype->plane_cnt + 3) & ~3ul;
   ctype->width = (unsigned char *) xmalloc (width_table_size);
 
-  /* Initialize with default width value.  */
-  memset (ctype->width, charmap->width_default, width_table_size);
+  /* Initialize with -1.  */
+  memset (ctype->width, '\xff', width_table_size);
   if (charmap->width_rules != NULL)
     {
       size_t cnt;
@@ -3389,8 +3412,10 @@ Computing table size for character classes might take a while..."),
 		  size_t depth = 0;
 
 		  while (ctype->names[nr + depth * ctype->plane_size] != wch)
-		    ++depth;
-		  assert (depth < ctype->plane_cnt);
+		    {
+		      ++depth;
+		      assert (depth < ctype->plane_cnt);
+		    }
 
 		  ctype->width[nr + depth * ctype->plane_size]
 		    = charmap->width_rules[cnt].width;
@@ -3421,6 +3446,37 @@ Computing table size for character classes might take a while..."),
 	}
     }
 
+  /* Now set all the other characters of the character set to the
+     default width.  */
+  curs = NULL;
+  while (iterate_table (&charmap->char_table, &curs, &key, &len, &vdata) == 0)
+    {
+      struct charseq *data = (struct charseq *) vdata;
+      size_t nr;
+      size_t depth;
+
+      if (data->ucs4 == UNINITIALIZED_CHAR_VALUE)
+	data->ucs4 = repertoire_find_value (ctype->repertoire,
+					    data->name, len);
+
+      if (data->ucs4 != ILLEGAL_CHAR_VALUE)
+	{
+	  nr = data->ucs4 % ctype->plane_size;
+	  depth = 0;
+
+	  while (ctype->names[nr + depth * ctype->plane_size] != data->ucs4)
+	    {
+	      ++depth;
+	      assert (depth < ctype->plane_cnt);
+	    }
+
+	  if (ctype->width[nr + depth * ctype->plane_size]
+	      == (unsigned char) '\xff')
+	    ctype->width[nr + depth * ctype->plane_size] =
+	      charmap->width_default;
+	}
+    }
+
   /* Set MB_CUR_MAX.  */
   ctype->mb_cur_max = charmap->mb_cur_max;