2002-08-28 Roland McGrath <roland@redhat.com>
authorroland <roland>
Thu, 29 Aug 2002 05:57:00 +0000 (05:57 +0000)
committerroland <roland>
Thu, 29 Aug 2002 05:57:00 +0000 (05:57 +0000)
* locale/findlocale.c [NL_CURRENT_INDIRECT] (_nl_C): New variable.
* locale/setlocale.c (setlocale) [NL_CURRENT_INDIRECT]: Null return
from _nl_find_locale ok if for _nl_C_name.

locale/findlocale.c
locale/setlocale.c

index 8048011..6ecfdc2 100644 (file)
 #include "../iconv/gconv_charset.h"
 
 
-#ifndef SHARED
-/* Constant data defined in setlocale.c.  */
-extern struct locale_data *const _nl_C[] attribute_hidden;
+#ifdef NL_CURRENT_INDIRECT
+# define DEFINE_CATEGORY(category, category_name, items, a) \
+extern struct locale_data _nl_C_##category; \
+weak_extern (_nl_C_##category)
+# include "categories.def"
+# undef        DEFINE_CATEGORY
+
+/* Array indexed by category of pointers to _nl_C_CATEGORY slots.
+   Elements are zero for categories whose data is never used.  */
+struct locale_data *const _nl_C[] attribute_hidden =
+  {
+# define DEFINE_CATEGORY(category, category_name, items, a) \
+    [category] = &_nl_C_##category,
+# include "categories.def"
+# undef        DEFINE_CATEGORY
+  };
 #else
 # define _nl_C         (_nl_C_locobj.__locales)
 #endif
index 1944336..c64db08 100644 (file)
@@ -307,7 +307,14 @@ setlocale (int category, const char *locale)
                                                 &newnames[category]);
 
            if (newdata[category] == NULL)
-             break;
+             {
+#ifdef NL_CURRENT_INDIRECT
+               if (newnames[category] == _nl_C_name)
+                 /* Null because it's the weak value of _nl_C_LC_FOO.  */
+                 continue;
+#endif
+               break;
+             }
 
            /* We must not simply free a global locale since we have no
               control over the usage.  So we mark it as un-deletable.  */