summary refs log tree commit diff
path: root/locale/newlocale.c
diff options
context:
space:
mode:
Diffstat (limited to 'locale/newlocale.c')
-rw-r--r--locale/newlocale.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/locale/newlocale.c b/locale/newlocale.c
index c54d1c82c6..61a72c4aeb 100644
--- a/locale/newlocale.c
+++ b/locale/newlocale.c
@@ -1,5 +1,5 @@
 /* Return a reference to locale information record.
-   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
@@ -41,7 +41,7 @@ __locale_t
 __newlocale (int category_mask, const char *locale, __locale_t base)
 {
   /* Intermediate memory for result.  */
-  const char *newnames[LC_ALL];
+  const char *newnames[__LC_LAST];
   struct __locale_struct result;
   __locale_t result_ptr;
   char *locale_path;
@@ -51,10 +51,10 @@ __newlocale (int category_mask, const char *locale, __locale_t base)
 
   /* We treat LC_ALL in the same way as if all bits were set.  */
   if (category_mask == LC_ALL)
-    category_mask = (1 << LC_ALL) - 1;
+    category_mask = (1 << __LC_LAST) - 1 - (1 << LC_ALL);
 
   /* Sanity check for CATEGORY argument.  */
-  if ((category_mask & ~((1 << LC_ALL) - 1)) != 0)
+  if ((category_mask & ~((1 << LC_ALL) - 1 - (1 << LC_ALL))) != 0)
     ERROR_RETURN;
 
   /* `newlocale' does not support asking for the locale name. */
@@ -72,8 +72,9 @@ __newlocale (int category_mask, const char *locale, __locale_t base)
   else
     {
       /* Fill with pointers to C locale data to .  */
-      for (cnt = 0; cnt < LC_ALL; ++cnt)
-	result.__locales[cnt] = _nl_C[cnt];
+      for (cnt = 0; cnt < __LC_LAST; ++cnt)
+	if (cnt != LC_ALL)
+	  result.__locales[cnt] = _nl_C[cnt];
 
       /* If no category is to be set we return BASE if available or a
 	 dataset using the C locale data.  */
@@ -105,8 +106,9 @@ __newlocale (int category_mask, const char *locale, __locale_t base)
 
   /* Get the names for the locales we are interested in.  We either
      allow a composite name or a single name.  */
-  for (cnt = 0; cnt < LC_ALL; ++cnt)
-    newnames[cnt] = locale;
+  for (cnt = 0; cnt < __LC_LAST; ++cnt)
+    if (cnt != LC_ALL)
+      newnames[cnt] = locale;
   if (strchr (locale, ';') != NULL)
     {
       /* This is a composite name.  Make a copy and split it up.  */
@@ -115,12 +117,13 @@ __newlocale (int category_mask, const char *locale, __locale_t base)
 
       while ((cp = strchr (np, '=')) != NULL)
 	{
-	  for (cnt = 0; cnt < LC_ALL; ++cnt)
-	    if ((size_t) (cp - np) == _nl_category_name_sizes[cnt]
+	  for (cnt = 0; cnt < __LC_LAST; ++cnt)
+	    if (cnt != LC_ALL
+		&& (size_t) (cp - np) == _nl_category_name_sizes[cnt]
 		&& memcmp (np, _nl_category_names[cnt], cp - np) == 0)
 	      break;
 
-	  if (cnt == LC_ALL)
+	  if (cnt == __LC_LAST)
 	    /* Bogus category name.  */
 	    ERROR_RETURN;
 
@@ -138,15 +141,16 @@ __newlocale (int category_mask, const char *locale, __locale_t base)
 	    break;
 	}
 
-      for (cnt = 0; cnt < LC_ALL; ++cnt)
-	if ((category_mask & 1 << cnt) != 0 && newnames[cnt] == locale)
+      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;
     }
 
   /* Now process all categories we are interested in.  */
-  for (cnt = 0; cnt < LC_ALL; ++cnt)
-    if ((category_mask & 1 << cnt) != 0)
+  for (cnt = 0; cnt < __LC_LAST; ++cnt)
+    if (cnt != LC_ALL && (category_mask & 1 << cnt) != 0)
       {
 	result.__locales[cnt] = _nl_find_locale (locale_path, locale_path_len,
 						 cnt, &newnames[cnt]);