Update.
authorUlrich Drepper <drepper@redhat.com>
Mon, 17 Jan 2000 08:39:58 +0000 (08:39 +0000)
committerUlrich Drepper <drepper@redhat.com>
Mon, 17 Jan 2000 08:39:58 +0000 (08:39 +0000)
2000-01-17  Ulrich Drepper  <drepper@cygnus.com>

* locale/programs/repertoire.c (repertoire_read): Don't print
error message when repertoire map is missing.
(repertoire_complain): Print error message for missing map, but only
once.
* locale/programs/repertoire.h (repertoire_complain): Add prototype.

* locale/programs/linereader.c (get_string): Prefer getting names
from charseq entries.  Try finding Uxxxxxxxx names in charmap
before trying to map from repertoire.

ChangeLog
locale/programs/ld-collate.c
locale/programs/ld-measurement.c
locale/programs/linereader.c
locale/programs/repertoire.c
locale/programs/repertoire.h

index ff4a5cf..244abe8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2000-01-17  Ulrich Drepper  <drepper@cygnus.com>
+
+       * locale/programs/repertoire.c (repertoire_read): Don't print
+       error message when repertoire map is missing.
+       (repertoire_complain): Print error message for missing map, but only
+       once.
+       * locale/programs/repertoire.h (repertoire_complain): Add prototype.
+
+       * locale/programs/linereader.c (get_string): Prefer getting names
+       from charseq entries.  Try finding Uxxxxxxxx names in charmap
+       before trying to map from repertoire.
+
 2000-01-16  Ulrich Drepper  <drepper@cygnus.com>
 
        * sysdeps/unix/sysv/linux/i386/getgroups.c: Fix missing brace
index 2cbea38..a9f42fe 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1995-1999, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@gnu.org>, 1995.
 
@@ -1514,7 +1514,7 @@ collate_finish (struct localedef_t *locale, struct charmap_t *charmap)
                         to symbols with the same byte sequence.  It is
                         of course an error.  */
                      error_at_line (0, 0, (*eptr)->file, (*eptr)->line,
-                                    _("symbol `%s' has same encoding as"),
+                                    _("symbol `%s' has the same encoding as"),
                                     (*eptr)->name);
                      error_at_line (0, 0, runp->file, runp->line,
                                     _("symbol `%s'"), runp->name);
@@ -1691,7 +1691,7 @@ Computing table size for collation table might take a while..."),
                         to symbols with the same byte sequence.  It is
                         of course an error.  */
                      error_at_line (0, 0, (*eptr)->file, (*eptr)->line,
-                                    _("symbol `%s' has same encoding as"),
+                                    _("symbol `%s' has the same encoding as"),
                                     (*eptr)->name);
                      error_at_line (0, 0, runp->file, runp->line,
                                     _("symbol `%s'"), runp->name);
index 68bb3a2..e0ee592 100644 (file)
@@ -154,7 +154,6 @@ measurement_read (struct linereader *ldfile, struct localedef_t *result,
                  struct charmap_t *charmap, const char *repertoire_name,
                  int ignore_content)
 {
-  struct repertoire_t *repertoire = NULL;
   struct locale_measurement_t *measurement;
   struct token *now;
   struct token *arg;
index 370f091..f6532a4 100644 (file)
@@ -651,6 +651,7 @@ non-symbolic character value should not be used"));
 
              if (cp == &buf[bufact])
                {
+                 char utmp[10];
                  const char *symbol = NULL;
 
                  /* Yes, it is.  */
@@ -663,49 +664,80 @@ non-symbolic character value should not be used"));
                  if (return_widestr)
                    ADDWC (wch);
 
-                 /* Now determine from the repertoire the name of the
-                    character and find it in the charmap.  */
-                 if (repertoire != NULL)
-                   symbol = repertoire_find_symbol (repertoire, wch);
+                 /* See whether the charmap contains the Uxxxxxxxx names.  */
+                 snprintf (utmp, sizeof (utmp), "U%08X", wch);
+                 seq = charmap_find_value (charmap, utmp, 9);
 
-                 if (symbol == NULL)
+                 if (seq == NULL)
                    {
-                     /* We cannot generate a string since we cannot map
-                        from the Unicode number to the character symbol.  */
-                     lr_error (lr,
-                               _("character <U%0*X> not in repertoire map"),
-                               wch > 0xffff ? 8 : 4, wch);
+                    /* No, this isn't the case.  Now determine from
+                       the repertoire the name of the character and
+                       find it in the charmap.  */
+                     if (repertoire != NULL)
+                       symbol = repertoire_find_symbol (repertoire, wch);
 
-                     illegal_string = 1;
-                   }
-                 else
-                   {
-                     seq = charmap_find_value (charmap, symbol,
-                                               strlen (symbol));
-
-                     if (seq == NULL)
+                     if (symbol == NULL)
                        {
-                         /* Not a known name.  */
-                         lr_error (lr,
-                                   _("symbol `%s' not in charmap"), symbol);
+                         /* We cannot generate a string since we
+                            cannot map from the Unicode number to the
+                            character symbol.  */
+                         lr_error (lr, _("\
+character <U%0*X> not in repertoire map"),
+                                   wch > 0xffff ? 8 : 4, wch);
+
                          illegal_string = 1;
                        }
                      else
-                       ADDS (seq->bytes, seq->nbytes);
+                       {
+                         seq = charmap_find_value (charmap, symbol,
+                                                   strlen (symbol));
+
+                         if (seq == NULL)
+                           {
+                             /* Not a known name.  */
+                             lr_error (lr,
+                                       _("symbol `%s' not in charmap"),
+                                       symbol);
+                             illegal_string = 1;
+                           }
+                       }
                    }
 
+                 if (seq != NULL)
+                   ADDS (seq->bytes, seq->nbytes);
+
                  continue;
                }
            }
 
+         /* We now have the symbolic name in buf[startidx] to
+            buf[bufact-1].  Now find out the value for this character
+            in the charmap as well as in the repertoire map (in this
+            order).  */
+         seq = charmap_find_value (charmap, &buf[startidx],
+                                   bufact - startidx);
+
+         if (seq == NULL)
+           {
+             /* This name is not in the charmap.  */
+             lr_error (lr, _("symbol `%.*s' not in charmap"),
+                       (int) (bufact - startidx), &buf[startidx]);
+             illegal_string = 1;
+           }
+
          if (return_widestr)
            {
-             /* We now have the symbolic name in buf[startidx] to
-                buf[bufact-1].  Now find out the value for this
-                character in the repertoire map as well as in the
-                charmap (in this order).  */
-             wch = repertoire_find_value (repertoire, &buf[startidx],
-                                          bufact - startidx);
+             /* Now the same for the multibyte representation.  */
+             if (seq != NULL && seq->ucs4 != UNINITIALIZED_CHAR_VALUE)
+               wch = seq->ucs4;
+             else
+               {
+                 wch = repertoire_find_value (repertoire, &buf[startidx],
+                                              bufact - startidx);
+                 if (seq != NULL)
+                   seq->ucs4 = wch;
+               }
+
              if (wch == ILLEGAL_CHAR_VALUE)
                {
                  /* This name is not in the repertoire map.  */
@@ -717,27 +749,12 @@ non-symbolic character value should not be used"));
                ADDWC (wch);
            }
 
-         /* Now the same for the multibyte representation.  */
-         seq = charmap_find_value (charmap, &buf[startidx],
-                                   bufact - startidx);
+         /* Now forget about the name we just added.  */
+         bufact = startidx;
 
-         if (seq == NULL)
-           {
-             /* This name is not in the charmap.  */
-             lr_error (lr, _("symbol `%.*s' not in charmap"),
-                       (int) (bufact - startidx), &buf[startidx]);
-             illegal_string = 1;
-
-             /* Now forget about the name we just added.  */
-             bufact = startidx;
-           }
-         else
-           {
-             /* Now forget about the name we just added.  */
-             bufact = startidx;
-
-             ADDS (seq->bytes, seq->nbytes);
-           }
+         /* And copy the bytes.  */
+         if (seq != NULL)
+           ADDS (seq->bytes, seq->nbytes);
        }
 
       if (ch == '\n' || ch == EOF)
index 9293c03..91ed41e 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
 
@@ -49,6 +49,10 @@ static int repertoire_compare (const void *p1, const void *p2);
 /* Already known repertoire maps.  */
 static void *known;
 
+/* List of repertoire maps which are not available and which have been
+   reported to not be.  */
+static void *unavailable;
+
 
 struct repertoire_t *
 repertoire_read (const char *filename)
@@ -115,10 +119,7 @@ repertoire_read (const char *filename)
        }
 
       if (repfile == NULL)
-       {
-         error (0, errno, _("repertoire map file `%s' not found"), filename);
-         return NULL;
-       }
+       return NULL;
     }
 
   /* We don't want symbolic names in string to be translated.  */
@@ -333,6 +334,19 @@ argument to <%s> must be a single character"),
 }
 
 
+void
+repertoire_complain (const char *name)
+{
+  if (tfind (name, &unavailable, (__compar_fn_t) strcmp) == NULL)
+    {
+      error (0, errno, _("repertoire map file `%s' not found"), name);
+
+      /* Remember that we reported this map.  */
+      tsearch (name, &unavailable, (__compar_fn_t) strcmp);
+    }
+}
+
+
 static int
 repertoire_compare (const void *p1, const void *p2)
 {
index ef80369..d89d4cb 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
 
@@ -48,6 +48,9 @@ struct repertoire_t
 /* Prototypes for repertoire map handling functions.  */
 extern struct repertoire_t *repertoire_read (const char *filename);
 
+/* Report missing repertoire map.  */
+extern void repertoire_complain (const char *name);
+
 /* Return UCS4 value of character with given NAME.  */
 extern uint32_t repertoire_find_value (const struct repertoire_t *repertoire,
                                       const char *name, size_t len);