diff options
author | Rich Felker <dalias@aerifal.cx> | 2017-07-31 23:08:27 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2017-07-31 23:08:27 -0400 |
commit | 947d330f68c49680dcc54439f56da2a297228962 (patch) | |
tree | db501c0de78202bee078e418c5b9a9a47ece0712 | |
parent | a08910fc2cc739f631b75b2d09b8d72a0d64d285 (diff) | |
download | musl-947d330f68c49680dcc54439f56da2a297228962.tar.gz musl-947d330f68c49680dcc54439f56da2a297228962.tar.bz2 musl-947d330f68c49680dcc54439f56da2a297228962.tar.xz musl-947d330f68c49680dcc54439f56da2a297228962.zip |
add _NL_LOCALE_NAME extension to nl_langinfo
since setlocale(cat, NULL) is required to return the setting for the
global locale, there is no standard mechanism to obtain the name of
the currently active thread-local locale set by uselocale. this makes
it impossible for application/library software to load appropriate
translations, etc. unless using the gettext implementation provided by
libc, which has privileged access to libc internals.
to fill this gap, glibc introduced the _NL_LOCALE_NAME macro which can
be used with nl_langinfo to obtain the name. GNU gettext/gnulib code
already use this functionality on glibc, and can easily be adapted to
make use of it on non-glibc systems if it's available; for other
systems they poke at locale implementation internals, which we want to
avoid. this patch provides a compatible interface to the one glibc
introduced.
-rw-r--r-- | include/langinfo.h | 6 | ||||
-rw-r--r-- | src/locale/langinfo.c | 4 |
2 files changed, 10 insertions, 0 deletions
diff --git a/include/langinfo.h b/include/langinfo.h index 2153c42e..519c0612 100644 --- a/include/langinfo.h +++ b/include/langinfo.h @@ -77,6 +77,12 @@ extern "C" { #define YESEXPR 0x50000 #define NOEXPR 0x50001 +#define _NL_LOCALE_NAME(cat) (((cat)<<16) | 0xffff) + +#if defined(_GNU_SOURCE) +#define NL_LOCALE_NAME(cat) _NL_LOCALE_NAME(cat) +#endif + #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) #define YESSTR 0x50002 #define NOSTR 0x50003 diff --git a/src/locale/langinfo.c b/src/locale/langinfo.c index b2c8569e..b16caf44 100644 --- a/src/locale/langinfo.c +++ b/src/locale/langinfo.c @@ -34,6 +34,10 @@ char *__nl_langinfo_l(nl_item item, locale_t loc) const char *str; if (item == CODESET) return MB_CUR_MAX==1 ? "ASCII" : "UTF-8"; + + /* _NL_LOCALE_NAME extension */ + if (idx == 65535 && cat < LC_ALL) + return loc->cat[cat] ? (char *)loc->cat[cat]->name : "C"; switch (cat) { case LC_NUMERIC: |