summary refs log tree commit diff
path: root/locale/programs/charmap.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1998-04-30 16:57:48 +0000
committerUlrich Drepper <drepper@redhat.com>1998-04-30 16:57:48 +0000
commit69f155d4fc11f2f0e1dd1bfcd804192303ba1627 (patch)
treeced40eb216ea58b252952737a6747f19d1db8e4f /locale/programs/charmap.c
parent3dd2c3e24702b91473b30d5a0baf9954c37fd35b (diff)
downloadglibc-69f155d4fc11f2f0e1dd1bfcd804192303ba1627.tar.gz
glibc-69f155d4fc11f2f0e1dd1bfcd804192303ba1627.tar.xz
glibc-69f155d4fc11f2f0e1dd1bfcd804192303ba1627.zip
Update.
1998-04-30 16:45  Ulrich Drepper  <drepper@cygnus.com>

	* inet/ether_aton.c: Including netinet/if_ether.h is not necessary.

	* locale/Makefile (distribute): Add programs/repertoire.h.
	(localedef-modules): Add repertoire.
	(CPPFLAGS): Define REPERTOIREMAP_PATH.
	* locale/programs/repertoire.c: New file.
	* locale/programs/repertoire.h: New file.
	* locale/programs/charmap.c: Starting fixing character set handling
	to handle multi-byte encodings.
	* locale/programs/charset.c: Likewise.
	* locale/programs/charset.h: Likewise.
	* locale/programs/ld-collate.c: Likewise.
	* locale/programs/ld-ctype.c: Likewise.
	* locale/programs/linereader.c: Likewise.
	* locale/programs/localedef.c: Likewise.
	* locale/programs/locfile-kw.gperf: Likewise.
	* locale/programs/locfile-kw.h: Likewise.
	* locale/programs/locfile-token.h: Likewise.
	* locale/programs/locfile.h: Likewise.
	* locale/programs/stringtrans.c: Likewise.

1998-04-18  Philip Blundell  <Philip.Blundell@pobox.com>

	* sysdeps/arm/memset.S: Fix off by one error.

	* sysdeps/unix/sysv/linux/arm/sysdep.h (PSEUDO): On error, call
	__syscall_error rather than syscall_error directly.

1998-04-17  Philip Blundell  <Philip.Blundell@pobox.com>

	* sysdeps/unix/sysv/linux/arm/mmap.S: New file; implementation of
	mmap() syscall for ARM.

	* sysdeps/unix/arm/start.c: New file; startup code for ARM a.out
	binaries.
Diffstat (limited to 'locale/programs/charmap.c')
-rw-r--r--locale/programs/charmap.c50
1 files changed, 38 insertions, 12 deletions
diff --git a/locale/programs/charmap.c b/locale/programs/charmap.c
index 0cd62fbfd4..7114a237a0 100644
--- a/locale/programs/charmap.c
+++ b/locale/programs/charmap.c
@@ -33,6 +33,8 @@
 #include "error.h"
 #include "linereader.h"
 #include "charset.h"
+#include "locfile.h"
+#include "repertoire.h"
 
 
 /* Uncomment following line for production version.  */
@@ -209,6 +211,8 @@ parse_charmap (const char *filename)
   memset (result, '\0', sizeof (struct charset_t));
   /* The default DEFAULT_WIDTH is 1.  */
   result->width_default = 1;
+  /* Let the user overwrite the repertoire map we use.  */
+  result->repertoiremap = repertoiremap;
 
 #define obstack_chunk_alloc malloc
 #define obstack_chunk_free free
@@ -265,6 +269,17 @@ parse_charmap (const char *filename)
 
 	      lr_ignore_rest (cmfile, 1);
 
+	      /* Read the repertoire map now.  */
+	      if (result->repertoiremap == NULL)
+		/* This is fatal.  */
+		error (4, 0, _("no repertoire map specified: cannot proceed"));
+
+	      result->repertoire = repertoire_read (result->repertoiremap);
+	      if (result->repertoire == NULL)
+		/* This is also fatal.  */
+		error (4, errno, _("cannot read repertoire map `%s'"),
+		       result->repertoiremap);
+
 	      state = 2;
 	      continue;
 	    }
@@ -273,7 +288,7 @@ parse_charmap (const char *filename)
 	      && nowtok != tok_mb_cur_min && nowtok != tok_escape_char
 	      && nowtok != tok_comment_char && nowtok != tok_g0esc
 	      && nowtok != tok_g1esc && nowtok != tok_g2esc
-	      && nowtok != tok_g3esc)
+	      && nowtok != tok_g3esc && nowtok != tok_repertoiremap)
 	    {
 	      lr_error (cmfile, _("syntax error in prolog: %s"),
 			_("illegal definition"));
@@ -305,6 +320,18 @@ parse_charmap (const char *filename)
 	      lr_ignore_rest (cmfile, 1);
 	      continue;
 
+	    case tok_repertoiremap:
+	      if (arg->tok != tok_ident)
+		goto badarg;
+
+	      if (result->repertoiremap == NULL)
+		result->repertoiremap = obstack_copy0 (&result->mem_pool,
+						       arg->val.str.start,
+						       arg->val.str.len);
+
+	      lr_ignore_rest (cmfile, 1);
+	      continue;
+
 	    case tok_mb_cur_max:
 	    case tok_mb_cur_min:
 	      if (arg->tok != tok_number)
@@ -437,14 +464,14 @@ argument to <%s> must be a single character"),
 	      continue;
 	    }
 
-	  if (nowtok == tok_charcode)
-	    /* Write char value in table.  */
-	    charset_new_char (cmfile, result, now->val.charcode.nbytes,
-			      now->val.charcode.val, from_name, to_name);
+	  if (now->val.charcode.nbytes < result->mb_cur_min)
+	    lr_error (cmfile, _("too few bytes in character encoding"));
+	  else if (now->val.charcode.nbytes > result->mb_cur_max)
+	    lr_error (cmfile, _("too many bytes in character encoding"));
 	  else
-	    /* Determine ISO 10646 value and write into table.  */
-	    charset_new_unicode (cmfile, result, now->val.charcode.nbytes,
-				 now->val.charcode.val, from_name, to_name);
+	    charset_new_char (cmfile, &result->char_table,
+			      now->val.charcode.nbytes,
+			      now->val.charcode.val, from_name, to_name);
 
 	  /* Ignore trailing comment silently.  */
 	  lr_ignore_rest (cmfile, 0);
@@ -466,8 +493,7 @@ argument to <%s> must be a single character"),
 	      continue;
 	    }
 
-	  /* If the previous line was not completely correct free the
-	     used memory.  */
+	  /* Copy the to-name in a safe place.  */
 	  to_name = (char *) obstack_copy0 (&result->mem_pool,
 					    cmfile->token.val.str.start,
 					    cmfile->token.val.str.len);
@@ -694,7 +720,7 @@ new_width (struct linereader *cmfile, struct charset_t *result,
 {
   unsigned int from_val, to_val;
 
-  from_val = charset_find_value (result, from, strlen (from));
+  from_val = charset_find_value (&result->char_table, from, strlen (from));
   if ((wchar_t) from_val == ILLEGAL_CHAR_VALUE)
     {
       lr_error (cmfile, _("unknown character `%s'"), from);
@@ -705,7 +731,7 @@ new_width (struct linereader *cmfile, struct charset_t *result,
     to_val = from_val;
   else
     {
-      to_val = charset_find_value (result, to, strlen (to));
+      to_val = charset_find_value (&result->char_table, to, strlen (to));
       if ((wchar_t) to_val == ILLEGAL_CHAR_VALUE)
 	{
 	  lr_error (cmfile, _("unknown character `%s'"), to);