about summary refs log tree commit diff
path: root/locale/programs/ld-ctype.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1999-11-18 07:22:53 +0000
committerUlrich Drepper <drepper@redhat.com>1999-11-18 07:22:53 +0000
commit5491da0dfa50a969aca174742c64e114fe068af4 (patch)
tree06cf1a3e5b8b58cfbd76f575e6a2e0363c0ab61e /locale/programs/ld-ctype.c
parent35946fb706d6333c5c11663fd0b46c1e9116ae0f (diff)
downloadglibc-5491da0dfa50a969aca174742c64e114fe068af4.tar.gz
glibc-5491da0dfa50a969aca174742c64e114fe068af4.tar.xz
glibc-5491da0dfa50a969aca174742c64e114fe068af4.zip
Update.
	* locale/programs/ld-ctype.c (ctype_output): Correct computation of
	nelems.  Correctly compute index for additional character classes.
	(ctype_read): Handle charclass and charconv definitions.  Also
	recognize arbitrary strings as mapping names.
	* locale/programs/ld-time.c (time_finish): Correctly skip over wide
	character era strings.
	* locale/lc-time.c (_nl_get_era_entry): Correctly skip era name
	and format for wide characters.
	* time/strftime.c: Correctly determine era information for wide
	wcsftime.
	* wctrans.c: Fix after removal of second endianess table.
	* wctype/wctype.h (_ISwbit): Correctly handle bits > 16.
	Patches by Shinya Hanataka <hanataka@abyss.rim.or.jp>.

	* wcsmbs/wcwidth.h (internal_wcwidth): Reject non-printable characters.
Diffstat (limited to 'locale/programs/ld-ctype.c')
-rw-r--r--locale/programs/ld-ctype.c43
1 files changed, 41 insertions, 2 deletions
diff --git a/locale/programs/ld-ctype.c b/locale/programs/ld-ctype.c
index 5d88fd0509..90a4492118 100644
--- a/locale/programs/ld-ctype.c
+++ b/locale/programs/ld-ctype.c
@@ -729,7 +729,7 @@ ctype_output (struct localedef_t *locale, struct charmap_t *charmap,
 {
   struct locale_ctype_t *ctype = locale->categories[LC_CTYPE].ctype;
   const size_t nelems = (_NL_ITEM_INDEX (_NL_NUM_LC_CTYPE)
-			 + 2 * (ctype->map_collection_nr - 2));
+			 + (ctype->map_collection_nr - 2));
   struct iovec iov[2 + nelems + ctype->nr_charclass
 		  + ctype->map_collection_nr];
   struct locale_file data;
@@ -951,7 +951,7 @@ ctype_output (struct localedef_t *locale, struct charmap_t *charmap,
       else
 	{
 	  /* Handle extra maps.  */
-	  size_t nr = (elem - _NL_ITEM_INDEX (_NL_NUM_LC_CTYPE)) >> 1;
+	  size_t nr = (elem - _NL_ITEM_INDEX (_NL_NUM_LC_CTYPE)) + 2;
 
 	  iov[2 + elem + offset].iov_base = ctype->map[nr];
 	  iov[2 + elem + offset].iov_len = ((ctype->plane_size
@@ -1712,6 +1712,36 @@ ctype_read (struct linereader *ldfile, struct localedef_t *result,
 
       switch (nowtok)
 	{
+	case tok_charclass:
+	  now = lr_token (ldfile, charmap, NULL);
+	  while (now->tok == tok_ident || now->tok == tok_string)
+	    {
+	      ctype_class_new (ldfile, ctype, now->val.str.startmb);
+	      now = lr_token (ldfile, charmap, NULL);
+	      if (now->tok != tok_semicolon)
+		break;
+	      now = lr_token (ldfile, charmap, NULL);
+	    }
+	  if (now->tok != tok_eol)
+	    SYNTAX_ERROR (_("\
+%s: syntax error in definition of new character class"), "LC_CTYPE");
+	  break;
+
+	case tok_charconv:
+	  now = lr_token (ldfile, charmap, NULL);
+	  while (now->tok == tok_ident || now->tok == tok_string)
+	    {
+	      ctype_map_new (ldfile, ctype, now->val.str.startmb, charmap);
+	      now = lr_token (ldfile, charmap, NULL);
+	      if (now->tok != tok_semicolon)
+		break;
+	      now = lr_token (ldfile, charmap, NULL);
+	    }
+	  if (now->tok != tok_eol)
+	    SYNTAX_ERROR (_("\
+%s: syntax error in definition of new character map"), "LC_CTYPE");
+	  break;
+
 	case tok_class:
 	  /* Ignore the rest of the line if we don't need the input of
 	     this line.  */
@@ -2219,6 +2249,15 @@ with character code range values one must use the absolute ellipsis `...'"));
 	      free (now->val.str.startmb);
 	      goto read_charclass;
 	    }
+	  for (cnt = 0; cnt < ctype->map_collection_nr; ++cnt)
+	    if (strcmp (now->val.str.startmb, ctype->mapnames[cnt]) == 0)
+	      break;
+	  if (cnt < ctype->map_collection_nr)
+	    {
+	      mapidx = cnt;
+	      free (now->val.str.startmb);
+	      goto read_mapping;
+            }
 	  if (strcmp (now->val.str.startmb, "special1") == 0)
 	    {
 	      class_bit = _ISwspecial1;