diff options
-rw-r--r-- | locale.c | 33 | ||||
-rw-r--r-- | perl.h | 14 |
2 files changed, 11 insertions, 36 deletions
@@ -767,7 +767,8 @@ S_less_dicey_bool_setlocale_r(pTHX_ const int cat, const char * locale) * all instances of that have been removed */ # define QUERYLOCALE_ASSERT(index) \ __ASSERT_(isSINGLE_BIT_SET(category_masks[index])) -# if ! defined(HAS_QUERYLOCALE) && defined(_NL_LOCALE_NAME) +# if ! defined(HAS_QUERYLOCALE) && ( defined(_NL_LOCALE_NAME) \ + && defined(HAS_NL_LANGINFO_L)) # define querylocale_l(index, locale_obj) \ (QUERYLOCALE_ASSERT(index) \ mortalized_pv_copy(nl_langinfo_l( \ @@ -4185,36 +4186,8 @@ S_my_langinfo_i(pTHX_ * implementation doesn't currently worry about it. But it is a problem on * Windows boxes, which don't have nl_langinfo(). */ -# if defined(HAS_THREAD_SAFE_NL_LANGINFO_L) && defined(USE_POSIX_2008_LOCALE) - - /* Simplest is if we can use nl_langinfo_l() - * - * With it, we can change LC_CTYPE in the same call as the other category */ -# ifdef USE_LOCALE_CTYPE -# define CTYPE_SAFETY_MASK LC_CTYPE_MASK -# else -# define CTYPE_SAFETY_MASK 0 -# endif - - locale_t cur = newlocale((category_masks[cat_index] | CTYPE_SAFETY_MASK), - locale, (locale_t) 0); - - retval = save_to_buffer(nl_langinfo_l(item, cur), retbufp, retbuf_sizep); - - if (utf8ness) { - *utf8ness = get_locale_string_utf8ness_i(retval, - LOCALE_UTF8NESS_UNKNOWN, - locale, cat_index); - } - - freelocale(cur); - - return retval; /*--------------------------------------------------------------------------*/ -# elif defined(HAS_NL_LANGINFO) /* nl_langinfo() is available. */ - - /* The second version of my_langinfo() is if we have plain nl_langinfo() */ - +# if defined(HAS_NL_LANGINFO) /* nl_langinfo() is available. */ # ifdef USE_LOCALE_CTYPE /* Ths function sorts out if things actually have to be switched or not, @@ -1260,17 +1260,19 @@ violations are fatal. # include "perl_langinfo.h" /* Needed for _NL_LOCALE_NAME */ -/* Allow use of glibc's undocumented querylocale() equivalent if asked for, and - * appropriate */ # ifdef USE_POSIX_2008_LOCALE # if defined(HAS_QUERYLOCALE) \ - /* Has this internal undocumented item for nl_langinfo() */ \ + /* Use querylocale if has it, or has the glibc internal \ + * undocumented equivalent. */ \ || ( defined(_NL_LOCALE_NAME) \ /* And asked for */ \ && defined(USE_NL_LOCALE_NAME) \ - /* We need the below because we will be calling it within a \ - * macro, can't have it get messed up by another thread. */ \ - && defined(HAS_THREAD_SAFE_NL_LANGINFO_L) \ + /* nl_langinfo_l almost certainly will exist on systems that \ + * have _NL_LOCALE_NAME, so there is nothing lost by \ + * requiring it instead of also allowing plain nl_langinfo(). \ + * And experience indicates that its glibc implementation is \ + * thread-safe, eliminating code complications */ \ + && defined(HAS_NL_LANGINFO_L) \ /* On systems that accept any locale name, the real \ * underlying locale is often returned by this internal \ * item, so we can't use it */ \ |