* inet/getnetgrent_r.c (endnetgrent, __getnetgrent_r): Actually call
authorRoland McGrath <roland@gnu.org>
Thu, 8 Aug 2002 01:33:05 +0000 (01:33 +0000)
committerRoland McGrath <roland@gnu.org>
Thu, 8 Aug 2002 01:33:05 +0000 (01:33 +0000)
the static symbols added in the last change (doofus is me).

* locale/newlocale.c (__newlocale): Use a bit mask instead of a second
loop to notice missing categories in a composite name.

* locale/locale.h (LC_CTYPE_MASK, LC_NUMERIC_MASK, LC_TIME_MASK,
LC_COLLATE_MASK, LC_MONETARY_MASK, LC_MESSAGES_MASK, LC_ALL_MASK,
LC_PAPER_MASK, LC_NAME_MASK, LC_ADDRESS_MASK, LC_TELEPHONE_MASK,
LC_MEASUREMENT_MASK, LC_IDENTIFICATION_MASK, LC_ALL_MASK): New macros.

* malloc/tst-calloc.c: Add tests for one or both parameters being zero.

ChangeLog
locale/locale.h
locale/newlocale.c

index 72c873a..0fabaa4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,19 @@
+2002-08-07  Roland McGrath  <roland@redhat.com>
+
+       * inet/getnetgrent_r.c (endnetgrent, __getnetgrent_r): Actually call
+       the static symbols added in the last change (doofus is me).
+
+       * locale/newlocale.c (__newlocale): Use a bit mask instead of a second
+       loop to notice missing categories in a composite name.
+
+       * locale/locale.h (LC_CTYPE_MASK, LC_NUMERIC_MASK, LC_TIME_MASK,
+       LC_COLLATE_MASK, LC_MONETARY_MASK, LC_MESSAGES_MASK, LC_ALL_MASK,
+       LC_PAPER_MASK, LC_NAME_MASK, LC_ADDRESS_MASK, LC_TELEPHONE_MASK,
+       LC_MEASUREMENT_MASK, LC_IDENTIFICATION_MASK, LC_ALL_MASK): New macros.
+
 2002-08-07  Ulrich Drepper  <drepper@redhat.com>
 
-       * malloc/tst-calloc.c: Add tests for one or both parameters being
-       zero.
+       * malloc/tst-calloc.c: Add tests for one or both parameters being zero.
 
 2002-08-07  Roland McGrath  <roland@redhat.com>
 
index 34463fd..c84eb01 100644 (file)
@@ -144,15 +144,43 @@ typedef __locale_t locale_t;
 
 /* Return a reference to a data structure representing a set of locale
    datasets.  Unlike for the CATEGORY parameter for `setlocale' the
-   CATEGORY_MASK parameter here uses a single bit for each category.
-   I.e., 1 << LC_CTYPE means to load data for this category.  If
-   BASE is non-null the appropriate category information in the BASE
-   record is replaced.  */
+   CATEGORY_MASK parameter here uses a single bit for each category,
+   made by OR'ing together LC_*_MASK bits above.  */
 extern __locale_t __newlocale (int __category_mask, __const char *__locale,
                               __locale_t __base) __THROW;
 extern __locale_t newlocale (int __category_mask, __const char *__locale,
                             __locale_t __base) __THROW;
 
+/* These are the bits that can be set in the CATEGORY_MASK argument to
+   `newlocale'.  In the GNU implementation, LC_FOO_MASK has the value
+   of (1 << LC_FOO), but this is not a part of the interface that
+   callers can assume will be true.  */
+# define LC_CTYPE_MASK         (1 << __LC_CTYPE)
+# define LC_NUMERIC_MASK       (1 << __LC_NUMERIC)
+# define LC_TIME_MASK          (1 << __LC_TIME)
+# define LC_COLLATE_MASK       (1 << __LC_COLLATE)
+# define LC_MONETARY_MASK      (1 << __LC_MONETARY)
+# define LC_MESSAGES_MASK      (1 << __LC_MESSAGES)
+# define LC_PAPER_MASK         (1 << __LC_PAPER)
+# define LC_NAME_MASK          (1 << __LC_NAME)
+# define LC_ADDRESS_MASK       (1 << __LC_ADDRESS)
+# define LC_TELEPHONE_MASK     (1 << __LC_TELEPHONE)
+# define LC_MEASUREMENT_MASK   (1 << __LC_MEASUREMENT)
+# define LC_IDENTIFICATION_MASK        (1 << __LC_IDENTIFICATION)
+# define LC_ALL_MASK           (LC_CTYPE_MASK \
+                                | LC_NUMERIC_MASK \
+                                | LC_TIME_MASK \
+                                | LC_COLLATE_MASK \
+                                | LC_MONETARY_MASK \
+                                | LC_MESSAGES_MASK \
+                                | LC_PAPER_MASK \
+                                | LC_NAME_MASK \
+                                | LC_ADDRESS_MASK \
+                                | LC_TELEPHONE_MASK \
+                                | LC_MEASUREMENT_MASK \
+                                | LC_IDENTIFICATION_MASK \
+                                )
+
 /* Return a duplicate of the set of locale in DATASET.  All usage
    counters are increased if necessary.  */
 extern __locale_t __duplocale (__locale_t __dataset) __THROW;
index 1442f86..6bab98e 100644 (file)
@@ -104,6 +104,7 @@ __newlocale (int category_mask, const char *locale, __locale_t base)
       /* This is a composite name.  Make a copy and split it up.  */
       char *np = strdupa (locale);
       char *cp;
+      int specified_mask = 0;
 
       while ((cp = strchr (np, '=')) != NULL)
        {
@@ -118,6 +119,7 @@ __newlocale (int category_mask, const char *locale, __locale_t base)
            ERROR_RETURN;
 
          /* Found the category this clause sets.  */
+         specified_mask |= 1 << cnt;
          newnames[cnt] = ++cp;
          cp = strchr (cp, ';');
          if (cp != NULL)
@@ -131,11 +133,9 @@ __newlocale (int category_mask, const char *locale, __locale_t base)
            break;
        }
 
-      for (cnt = 0; cnt < __LC_LAST; ++cnt)
-       if (cnt != LC_ALL
-           && (category_mask & 1 << cnt) != 0 && newnames[cnt] == locale)
-         /* The composite name did not specify the category we need.  */
-         ERROR_RETURN;
+      if (category_mask &~ specified_mask)
+       /* The composite name did not specify all categories we need.  */
+       ERROR_RETURN;
     }
 
   /* Now process all categories we are interested in.  */