2002-08-28 Roland McGrath <roland@redhat.com>
+ * 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/nl_langinfo.c [NL_CURRENT_INDIRECT]: Use a categories.def
iterator to refer to each category's _nl_current_LC_FOO symbol, so
we know they are all linked in.
#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
&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. */