mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-22 10:50:07 +00:00
* 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.
This commit is contained in:
parent
963e3b5880
commit
9a411bf59f
@ -1,5 +1,9 @@
|
||||
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.
|
||||
|
@ -30,9 +30,22 @@
|
||||
#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
|
||||
|
@ -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. */
|
||||
|
Loading…
Reference in New Issue
Block a user