This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
perldelta for 9f300641fc6f
[perl5.git] / locale.c
1 /*    locale.c
2  *
3  *    Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
4  *    2002, 2003, 2005, 2006, 2007, 2008 by Larry Wall and others
5  *
6  *    You may distribute under the terms of either the GNU General Public
7  *    License or the Artistic License, as specified in the README file.
8  *
9  */
10
11 /*
12  *      A Elbereth Gilthoniel,
13  *      silivren penna míriel
14  *      o menel aglar elenath!
15  *      Na-chaered palan-díriel
16  *      o galadhremmin ennorath,
17  *      Fanuilos, le linnathon
18  *      nef aear, si nef aearon!
19  *
20  *     [p.238 of _The Lord of the Rings_, II/i: "Many Meetings"]
21  */
22
23 /* utility functions for handling locale-specific stuff like what
24  * character represents the decimal point.
25  *
26  * All C programs have an underlying locale.  Perl code generally doesn't pay
27  * any attention to it except within the scope of a 'use locale'.  For most
28  * categories, it accomplishes this by just using different operations if it is
29  * in such scope than if not.  However, various libc functions called by Perl
30  * are affected by the LC_NUMERIC category, so there are macros in perl.h that
31  * are used to toggle between the current locale and the C locale depending on
32  * the desired behavior of those functions at the moment.  And, LC_MESSAGES is
33  * switched to the C locale for outputting the message unless within the scope
34  * of 'use locale'.
35  *
36  * This code now has multi-thread-safe locale handling on systems that support
37  * that.  This is completely transparent to most XS code.  On earlier systems,
38  * it would be possible to emulate thread-safe locales, but this likely would
39  * involve a lot of locale switching, and would require XS code changes.
40  * Macros could be written so that the code wouldn't have to know which type of
41  * system is being used.  It's unlikely that we would ever do that, since most
42  * modern systems support thread-safe locales, but there was code written to
43  * this end, and is retained, #ifdef'd out.
44  */
45
46 #include "EXTERN.h"
47 #define PERL_IN_LOCALE_C
48 #include "perl_langinfo.h"
49 #include "perl.h"
50
51 #include "reentr.h"
52
53 #ifdef I_WCHAR
54 #  include <wchar.h>
55 #endif
56 #ifdef I_WCTYPE
57 #  include <wctype.h>
58 #endif
59
60 /* If the environment says to, we can output debugging information during
61  * initialization.  This is done before option parsing, and before any thread
62  * creation, so can be a file-level static */
63 #if ! defined(DEBUGGING) || defined(PERL_GLOBAL_STRUCT)
64 #  define debug_initialization 0
65 #  define DEBUG_INITIALIZATION_set(v)
66 #else
67 static bool debug_initialization = FALSE;
68 #  define DEBUG_INITIALIZATION_set(v) (debug_initialization = v)
69 #endif
70
71
72 /* Returns the Unix errno portion; ignoring any others.  This is a macro here
73  * instead of putting it into perl.h, because unclear to khw what should be
74  * done generally. */
75 #define GET_ERRNO   saved_errno
76
77 /* strlen() of a literal string constant.  We might want this more general,
78  * but using it in just this file for now.  A problem with more generality is
79  * the compiler warnings about comparing unlike signs */
80 #define STRLENs(s)  (sizeof("" s "") - 1)
81
82 /* Is the C string input 'name' "C" or "POSIX"?  If so, and 'name' is the
83  * return of setlocale(), then this is extremely likely to be the C or POSIX
84  * locale.  However, the output of setlocale() is documented to be opaque, but
85  * the odds are extremely small that it would return these two strings for some
86  * other locale.  Note that VMS in these two locales includes many non-ASCII
87  * characters as controls and punctuation (below are hex bytes):
88  *   cntrl:  84-97 9B-9F
89  *   punct:  A1-A3 A5 A7-AB B0-B3 B5-B7 B9-BD BF-CF D1-DD DF-EF F1-FD
90  * Oddly, none there are listed as alphas, though some represent alphabetics
91  * http://www.nntp.perl.org/group/perl.perl5.porters/2013/02/msg198753.html */
92 #define isNAME_C_OR_POSIX(name)                                              \
93                              (   (name) != NULL                              \
94                               && (( *(name) == 'C' && (*(name + 1)) == '\0') \
95                                    || strEQ((name), "POSIX")))
96
97 #ifdef USE_LOCALE
98
99 /* This code keeps a LRU cache of the UTF-8ness of the locales it has so-far
100  * looked up.  This is in the form of a C string:  */
101
102 #define UTF8NESS_SEP     "\v"
103 #define UTF8NESS_PREFIX  "\f"
104
105 /* So, the string looks like:
106  *
107  *      \vC\a0\vPOSIX\a0\vam_ET\a0\vaf_ZA.utf8\a1\ven_US.UTF-8\a1\0
108  *
109  * where the digit 0 after the \a indicates that the locale starting just
110  * after the preceding \v is not UTF-8, and the digit 1 mean it is. */
111
112 STATIC_ASSERT_DECL(STRLENs(UTF8NESS_SEP) == 1);
113 STATIC_ASSERT_DECL(STRLENs(UTF8NESS_PREFIX) == 1);
114
115 #define C_and_POSIX_utf8ness    UTF8NESS_SEP "C"     UTF8NESS_PREFIX "0"    \
116                                 UTF8NESS_SEP "POSIX" UTF8NESS_PREFIX "0"
117
118 /* The cache is initialized to C_and_POSIX_utf8ness at start up.  These are
119  * kept there always.  The remining portion of the cache is LRU, with the
120  * oldest looked-up locale at the tail end */
121
122 STATIC char *
123 S_stdize_locale(pTHX_ char *locs)
124 {
125     /* Standardize the locale name from a string returned by 'setlocale',
126      * possibly modifying that string.
127      *
128      * The typical return value of setlocale() is either
129      * (1) "xx_YY" if the first argument of setlocale() is not LC_ALL
130      * (2) "xa_YY xb_YY ..." if the first argument of setlocale() is LC_ALL
131      *     (the space-separated values represent the various sublocales,
132      *      in some unspecified order).  This is not handled by this function.
133      *
134      * In some platforms it has a form like "LC_SOMETHING=Lang_Country.866\n",
135      * which is harmful for further use of the string in setlocale().  This
136      * function removes the trailing new line and everything up through the '='
137      * */
138
139     const char * const s = strchr(locs, '=');
140     bool okay = TRUE;
141
142     PERL_ARGS_ASSERT_STDIZE_LOCALE;
143
144     if (s) {
145         const char * const t = strchr(s, '.');
146         okay = FALSE;
147         if (t) {
148             const char * const u = strchr(t, '\n');
149             if (u && (u[1] == 0)) {
150                 const STRLEN len = u - s;
151                 Move(s + 1, locs, len, char);
152                 locs[len] = 0;
153                 okay = TRUE;
154             }
155         }
156     }
157
158     if (!okay)
159         Perl_croak(aTHX_ "Can't fix broken locale name \"%s\"", locs);
160
161     return locs;
162 }
163
164 /* Two parallel arrays; first the locale categories Perl uses on this system;
165  * the second array is their names.  These arrays are in mostly arbitrary
166  * order. */
167
168 const int categories[] = {
169
170 #    ifdef USE_LOCALE_NUMERIC
171                              LC_NUMERIC,
172 #    endif
173 #    ifdef USE_LOCALE_CTYPE
174                              LC_CTYPE,
175 #    endif
176 #    ifdef USE_LOCALE_COLLATE
177                              LC_COLLATE,
178 #    endif
179 #    ifdef USE_LOCALE_TIME
180                              LC_TIME,
181 #    endif
182 #    ifdef USE_LOCALE_MESSAGES
183                              LC_MESSAGES,
184 #    endif
185 #    ifdef USE_LOCALE_MONETARY
186                              LC_MONETARY,
187 #    endif
188 #    ifdef USE_LOCALE_ADDRESS
189                              LC_ADDRESS,
190 #    endif
191 #    ifdef USE_LOCALE_IDENTIFICATION
192                              LC_IDENTIFICATION,
193 #    endif
194 #    ifdef USE_LOCALE_MEASUREMENT
195                              LC_MEASUREMENT,
196 #    endif
197 #    ifdef USE_LOCALE_PAPER
198                              LC_PAPER,
199 #    endif
200 #    ifdef USE_LOCALE_TELEPHONE
201                              LC_TELEPHONE,
202 #    endif
203 #    ifdef LC_ALL
204                              LC_ALL,
205 #    endif
206                             -1  /* Placeholder because C doesn't allow a
207                                    trailing comma, and it would get complicated
208                                    with all the #ifdef's */
209 };
210
211 /* The top-most real element is LC_ALL */
212
213 const char * const category_names[] = {
214
215 #    ifdef USE_LOCALE_NUMERIC
216                                  "LC_NUMERIC",
217 #    endif
218 #    ifdef USE_LOCALE_CTYPE
219                                  "LC_CTYPE",
220 #    endif
221 #    ifdef USE_LOCALE_COLLATE
222                                  "LC_COLLATE",
223 #    endif
224 #    ifdef USE_LOCALE_TIME
225                                  "LC_TIME",
226 #    endif
227 #    ifdef USE_LOCALE_MESSAGES
228                                  "LC_MESSAGES",
229 #    endif
230 #    ifdef USE_LOCALE_MONETARY
231                                  "LC_MONETARY",
232 #    endif
233 #    ifdef USE_LOCALE_ADDRESS
234                                  "LC_ADDRESS",
235 #    endif
236 #    ifdef USE_LOCALE_IDENTIFICATION
237                                  "LC_IDENTIFICATION",
238 #    endif
239 #    ifdef USE_LOCALE_MEASUREMENT
240                                  "LC_MEASUREMENT",
241 #    endif
242 #    ifdef USE_LOCALE_PAPER
243                                  "LC_PAPER",
244 #    endif
245 #    ifdef USE_LOCALE_TELEPHONE
246                                  "LC_TELEPHONE",
247 #    endif
248 #    ifdef LC_ALL
249                                  "LC_ALL",
250 #    endif
251                                  NULL  /* Placeholder */
252                             };
253
254 #  ifdef LC_ALL
255
256     /* On systems with LC_ALL, it is kept in the highest index position.  (-2
257      * to account for the final unused placeholder element.) */
258 #    define NOMINAL_LC_ALL_INDEX (C_ARRAY_LENGTH(categories) - 2)
259
260 #  else
261
262     /* On systems without LC_ALL, we pretend it is there, one beyond the real
263      * top element, hence in the unused placeholder element. */
264 #    define NOMINAL_LC_ALL_INDEX (C_ARRAY_LENGTH(categories) - 1)
265
266 #  endif
267
268 /* Pretending there is an LC_ALL element just above allows us to avoid most
269  * special cases.  Most loops through these arrays in the code below are
270  * written like 'for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++)'.  They will work
271  * on either type of system.  But the code must be written to not access the
272  * element at 'LC_ALL_INDEX' except on platforms that have it.  This can be
273  * checked for at compile time by using the #define LC_ALL_INDEX which is only
274  * defined if we do have LC_ALL. */
275
276 STATIC const char *
277 S_category_name(const int category)
278 {
279     unsigned int i;
280
281 #ifdef LC_ALL
282
283     if (category == LC_ALL) {
284         return "LC_ALL";
285     }
286
287 #endif
288
289     for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) {
290         if (category == categories[i]) {
291             return category_names[i];
292         }
293     }
294
295     {
296         const char suffix[] = " (unknown)";
297         int temp = category;
298         Size_t length = sizeof(suffix) + 1;
299         char * unknown;
300         dTHX;
301
302         if (temp < 0) {
303             length++;
304             temp = - temp;
305         }
306
307         /* Calculate the number of digits */
308         while (temp >= 10) {
309             temp /= 10;
310             length++;
311         }
312
313         Newx(unknown, length, char);
314         my_snprintf(unknown, length, "%d%s", category, suffix);
315         SAVEFREEPV(unknown);
316         return unknown;
317     }
318 }
319
320 /* Now create LC_foo_INDEX #defines for just those categories on this system */
321 #  ifdef USE_LOCALE_NUMERIC
322 #    define LC_NUMERIC_INDEX            0
323 #    define _DUMMY_NUMERIC              LC_NUMERIC_INDEX
324 #  else
325 #    define _DUMMY_NUMERIC              -1
326 #  endif
327 #  ifdef USE_LOCALE_CTYPE
328 #    define LC_CTYPE_INDEX              _DUMMY_NUMERIC + 1
329 #    define _DUMMY_CTYPE                LC_CTYPE_INDEX
330 #  else
331 #    define _DUMMY_CTYPE                _DUMMY_NUMERIC
332 #  endif
333 #  ifdef USE_LOCALE_COLLATE
334 #    define LC_COLLATE_INDEX            _DUMMY_CTYPE + 1
335 #    define _DUMMY_COLLATE              LC_COLLATE_INDEX
336 #  else
337 #    define _DUMMY_COLLATE              _DUMMY_CTYPE
338 #  endif
339 #  ifdef USE_LOCALE_TIME
340 #    define LC_TIME_INDEX               _DUMMY_COLLATE + 1
341 #    define _DUMMY_TIME                 LC_TIME_INDEX
342 #  else
343 #    define _DUMMY_TIME                 _DUMMY_COLLATE
344 #  endif
345 #  ifdef USE_LOCALE_MESSAGES
346 #    define LC_MESSAGES_INDEX           _DUMMY_TIME + 1
347 #    define _DUMMY_MESSAGES             LC_MESSAGES_INDEX
348 #  else
349 #    define _DUMMY_MESSAGES             _DUMMY_TIME
350 #  endif
351 #  ifdef USE_LOCALE_MONETARY
352 #    define LC_MONETARY_INDEX           _DUMMY_MESSAGES + 1
353 #    define _DUMMY_MONETARY             LC_MONETARY_INDEX
354 #  else
355 #    define _DUMMY_MONETARY             _DUMMY_MESSAGES
356 #  endif
357 #  ifdef USE_LOCALE_ADDRESS
358 #    define LC_ADDRESS_INDEX            _DUMMY_MONETARY + 1
359 #    define _DUMMY_ADDRESS              LC_ADDRESS_INDEX
360 #  else
361 #    define _DUMMY_ADDRESS              _DUMMY_MONETARY
362 #  endif
363 #  ifdef USE_LOCALE_IDENTIFICATION
364 #    define LC_IDENTIFICATION_INDEX     _DUMMY_ADDRESS + 1
365 #    define _DUMMY_IDENTIFICATION       LC_IDENTIFICATION_INDEX
366 #  else
367 #    define _DUMMY_IDENTIFICATION       _DUMMY_ADDRESS
368 #  endif
369 #  ifdef USE_LOCALE_MEASUREMENT
370 #    define LC_MEASUREMENT_INDEX        _DUMMY_IDENTIFICATION + 1
371 #    define _DUMMY_MEASUREMENT          LC_MEASUREMENT_INDEX
372 #  else
373 #    define _DUMMY_MEASUREMENT          _DUMMY_IDENTIFICATION
374 #  endif
375 #  ifdef USE_LOCALE_PAPER
376 #    define LC_PAPER_INDEX              _DUMMY_MEASUREMENT + 1
377 #    define _DUMMY_PAPER                LC_PAPER_INDEX
378 #  else
379 #    define _DUMMY_PAPER                _DUMMY_MEASUREMENT
380 #  endif
381 #  ifdef USE_LOCALE_TELEPHONE
382 #    define LC_TELEPHONE_INDEX          _DUMMY_PAPER + 1
383 #    define _DUMMY_TELEPHONE            LC_TELEPHONE_INDEX
384 #  else
385 #    define _DUMMY_TELEPHONE            _DUMMY_PAPER
386 #  endif
387 #  ifdef LC_ALL
388 #    define LC_ALL_INDEX                _DUMMY_TELEPHONE + 1
389 #  endif
390 #endif /* ifdef USE_LOCALE */
391
392 /* Windows requres a customized base-level setlocale() */
393 #ifdef WIN32
394 #  define my_setlocale(cat, locale) win32_setlocale(cat, locale)
395 #else
396 #  define my_setlocale(cat, locale) setlocale(cat, locale)
397 #endif
398
399 #ifndef USE_POSIX_2008_LOCALE
400
401 /* "do_setlocale_c" is intended to be called when the category is a constant
402  * known at compile time; "do_setlocale_r", not known until run time  */
403 #  define do_setlocale_c(cat, locale) my_setlocale(cat, locale)
404 #  define do_setlocale_r(cat, locale) my_setlocale(cat, locale)
405
406 #else   /* Below uses POSIX 2008 */
407
408 /* We emulate setlocale with our own function.  LC_foo is not valid for the
409  * POSIX 2008 functions.  Instead LC_foo_MASK is used, which we use an array
410  * lookup to convert to.  At compile time we have defined LC_foo_INDEX as the
411  * proper offset into the array 'category_masks[]'.  At runtime, we have to
412  * search through the array (as the actual numbers may not be small contiguous
413  * positive integers which would lend themselves to array lookup). */
414 #  define do_setlocale_c(cat, locale)                                       \
415                         emulate_setlocale(cat, locale, cat ## _INDEX, TRUE)
416 #  define do_setlocale_r(cat, locale) emulate_setlocale(cat, locale, 0, FALSE)
417
418 /* A third array, parallel to the ones above to map from category to its
419  * equivalent mask */
420 const int category_masks[] = {
421 #  ifdef USE_LOCALE_NUMERIC
422                                 LC_NUMERIC_MASK,
423 #  endif
424 #  ifdef USE_LOCALE_CTYPE
425                                 LC_CTYPE_MASK,
426 #  endif
427 #  ifdef USE_LOCALE_COLLATE
428                                 LC_COLLATE_MASK,
429 #  endif
430 #  ifdef USE_LOCALE_TIME
431                                 LC_TIME_MASK,
432 #  endif
433 #  ifdef USE_LOCALE_MESSAGES
434                                 LC_MESSAGES_MASK,
435 #  endif
436 #  ifdef USE_LOCALE_MONETARY
437                                 LC_MONETARY_MASK,
438 #  endif
439 #  ifdef USE_LOCALE_ADDRESS
440                                 LC_ADDRESS_MASK,
441 #  endif
442 #  ifdef USE_LOCALE_IDENTIFICATION
443                                 LC_IDENTIFICATION_MASK,
444 #  endif
445 #  ifdef USE_LOCALE_MEASUREMENT
446                                 LC_MEASUREMENT_MASK,
447 #  endif
448 #  ifdef USE_LOCALE_PAPER
449                                 LC_PAPER_MASK,
450 #  endif
451 #  ifdef USE_LOCALE_TELEPHONE
452                                 LC_TELEPHONE_MASK,
453 #  endif
454                                 /* LC_ALL can't be turned off by a Configure
455                                  * option, and in Posix 2008, should always be
456                                  * here, so compile it in unconditionally.
457                                  * This could catch some glitches at compile
458                                  * time */
459                                 LC_ALL_MASK
460                             };
461
462 STATIC const char *
463 S_emulate_setlocale(const int category,
464                     const char * locale,
465                     unsigned int index,
466                     const bool is_index_valid
467                    )
468 {
469     /* This function effectively performs a setlocale() on just the current
470      * thread; thus it is thread-safe.  It does this by using the POSIX 2008
471      * locale functions to emulate the behavior of setlocale().  Similar to
472      * regular setlocale(), the return from this function points to memory that
473      * can be overwritten by other system calls, so needs to be copied
474      * immediately if you need to retain it.  The difference here is that
475      * system calls besides another setlocale() can overwrite it.
476      *
477      * By doing this, most locale-sensitive functions become thread-safe.  The
478      * exceptions are mostly those that return a pointer to static memory.
479      *
480      * This function takes the same parameters, 'category' and 'locale', that
481      * the regular setlocale() function does, but it also takes two additional
482      * ones.  This is because the 2008 functions don't use a category; instead
483      * they use a corresponding mask.  Because this function operates in both
484      * worlds, it may need one or the other or both.  This function can
485      * calculate the mask from the input category, but to avoid this
486      * calculation, if the caller knows at compile time what the mask is, it
487      * can pass it, setting 'is_index_valid' to TRUE; otherwise the mask
488      * parameter is ignored.
489      *
490      * POSIX 2008, for some sick reason, chose not to provide a method to find
491      * the category name of a locale.  Some vendors have created a
492      * querylocale() function to do just that.  This function is a lot simpler
493      * to implement on systems that have this.  Otherwise, we have to keep
494      * track of what the locale has been set to, so that we can return its
495      * name to emulate setlocale().  It's also possible for C code in some
496      * library to change the locale without us knowing it, though as of
497      * September 2017, there are no occurrences in CPAN of uselocale().  Some
498      * libraries do use setlocale(), but that changes the global locale, and
499      * threads using per-thread locales will just ignore those changes.
500      * Another problem is that without querylocale(), we have to guess at what
501      * was meant by setting a locale of "".  We handle this by not actually
502      * ever setting to "" (unless querylocale exists), but to emulate what we
503      * think should happen for "".
504      */
505
506     int mask;
507     locale_t old_obj;
508     locale_t new_obj;
509     dTHX;
510
511 #  ifdef DEBUGGING
512
513     if (DEBUG_Lv_TEST || debug_initialization) {
514         PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale input=%d (%s), \"%s\", %d, %d\n", __FILE__, __LINE__, category, category_name(category), locale, index, is_index_valid);
515     }
516
517 #  endif
518
519     /* If the input mask might be incorrect, calculate the correct one */
520     if (! is_index_valid) {
521         unsigned int i;
522
523 #  ifdef DEBUGGING
524
525         if (DEBUG_Lv_TEST || debug_initialization) {
526             PerlIO_printf(Perl_debug_log, "%s:%d: finding index of category %d (%s)\n", __FILE__, __LINE__, category, category_name(category));
527         }
528
529 #  endif
530
531         for (i = 0; i <= LC_ALL_INDEX; i++) {
532             if (category == categories[i]) {
533                 index = i;
534                 goto found_index;
535             }
536         }
537
538         /* Here, we don't know about this category, so can't handle it.
539          * Fallback to the early POSIX usages */
540         Perl_warner(aTHX_ packWARN(WARN_LOCALE),
541                             "Unknown locale category %d; can't set it to %s\n",
542                                                      category, locale);
543         return NULL;
544
545       found_index: ;
546
547 #  ifdef DEBUGGING
548
549         if (DEBUG_Lv_TEST || debug_initialization) {
550             PerlIO_printf(Perl_debug_log, "%s:%d: index is %d for %s\n", __FILE__, __LINE__, index, category_name(category));
551         }
552
553 #  endif
554
555     }
556
557     mask = category_masks[index];
558
559 #  ifdef DEBUGGING
560
561     if (DEBUG_Lv_TEST || debug_initialization) {
562         PerlIO_printf(Perl_debug_log, "%s:%d: category name is %s; mask is 0x%x\n", __FILE__, __LINE__, category_names[index], mask);
563     }
564
565 #  endif
566
567     /* If just querying what the existing locale is ... */
568     if (locale == NULL) {
569         locale_t cur_obj = uselocale((locale_t) 0);
570
571 #  ifdef DEBUGGING
572
573         if (DEBUG_Lv_TEST || debug_initialization) {
574             PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale querying %p\n", __FILE__, __LINE__, cur_obj);
575         }
576
577 #  endif
578
579         if (cur_obj == LC_GLOBAL_LOCALE) {
580             return my_setlocale(category, NULL);
581         }
582
583 #  ifdef HAS_QUERYLOCALE
584
585         return (char *) querylocale(mask, cur_obj);
586
587 #  else
588
589         /* If this assert fails, adjust the size of curlocales in intrpvar.h */
590         STATIC_ASSERT_STMT(C_ARRAY_LENGTH(PL_curlocales) > LC_ALL_INDEX);
591
592 #    if   defined(_NL_LOCALE_NAME)                      \
593      &&   defined(DEBUGGING)                            \
594      && ! defined(SETLOCALE_ACCEPTS_ANY_LOCALE_NAME)
595           /* On systems that accept any locale name, the real underlying locale
596            * is often returned by this internal function, so we can't use it */
597         {
598             /* Internal glibc for querylocale(), but doesn't handle
599              * empty-string ("") locale properly; who knows what other
600              * glitches.  Check for it now, under debug. */
601
602             char * temp_name = nl_langinfo_l(_NL_LOCALE_NAME(category),
603                                              uselocale((locale_t) 0));
604             /*
605             PerlIO_printf(Perl_debug_log, "%s:%d: temp_name=%s\n", __FILE__, __LINE__, temp_name ? temp_name : "NULL");
606             PerlIO_printf(Perl_debug_log, "%s:%d: index=%d\n", __FILE__, __LINE__, index);
607             PerlIO_printf(Perl_debug_log, "%s:%d: PL_curlocales[index]=%s\n", __FILE__, __LINE__, PL_curlocales[index]);
608             */
609             if (temp_name && PL_curlocales[index] && strNE(temp_name, "")) {
610                 if (         strNE(PL_curlocales[index], temp_name)
611                     && ! (   isNAME_C_OR_POSIX(temp_name)
612                           && isNAME_C_OR_POSIX(PL_curlocales[index]))) {
613
614 #      ifdef USE_C_BACKTRACE
615
616                     dump_c_backtrace(Perl_debug_log, 20, 1);
617
618 #      endif
619
620                     Perl_croak(aTHX_ "panic: Mismatch between what Perl thinks %s is"
621                                      " (%s) and what internal glibc thinks"
622                                      " (%s)\n", category_names[index],
623                                      PL_curlocales[index], temp_name);
624                 }
625
626                 return temp_name;
627             }
628         }
629
630 #    endif
631
632         /* Without querylocale(), we have to use our record-keeping we've
633          *  done. */
634
635         if (category != LC_ALL) {
636
637 #    ifdef DEBUGGING
638
639             if (DEBUG_Lv_TEST || debug_initialization) {
640                 PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale returning %s\n", __FILE__, __LINE__, PL_curlocales[index]);
641             }
642
643 #    endif
644
645             return PL_curlocales[index];
646         }
647         else {  /* For LC_ALL */
648             unsigned int i;
649             Size_t names_len = 0;
650             char * all_string;
651             bool are_all_categories_the_same_locale = TRUE;
652
653             /* If we have a valid LC_ALL value, just return it */
654             if (PL_curlocales[LC_ALL_INDEX]) {
655
656 #    ifdef DEBUGGING
657
658                 if (DEBUG_Lv_TEST || debug_initialization) {
659                     PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale returning %s\n", __FILE__, __LINE__, PL_curlocales[LC_ALL_INDEX]);
660                 }
661
662 #    endif
663
664                 return PL_curlocales[LC_ALL_INDEX];
665             }
666
667             /* Otherwise, we need to construct a string of name=value pairs.
668              * We use the glibc syntax, like
669              *      LC_NUMERIC=C;LC_TIME=en_US.UTF-8;...
670              *  First calculate the needed size.  Along the way, check if all
671              *  the locale names are the same */
672             for (i = 0; i < LC_ALL_INDEX; i++) {
673
674 #    ifdef DEBUGGING
675
676                 if (DEBUG_Lv_TEST || debug_initialization) {
677                     PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale i=%d, name=%s, locale=%s\n", __FILE__, __LINE__, i, category_names[i], PL_curlocales[i]);
678                 }
679
680 #    endif
681
682                 names_len += strlen(category_names[i])
683                           + 1                       /* '=' */
684                           + strlen(PL_curlocales[i])
685                           + 1;                      /* ';' */
686
687                 if (i > 0 && strNE(PL_curlocales[i], PL_curlocales[i-1])) {
688                     are_all_categories_the_same_locale = FALSE;
689                 }
690             }
691
692             /* If they are the same, we don't actually have to construct the
693              * string; we just make the entry in LC_ALL_INDEX valid, and be
694              * that single name */
695             if (are_all_categories_the_same_locale) {
696                 PL_curlocales[LC_ALL_INDEX] = savepv(PL_curlocales[0]);
697                 return PL_curlocales[LC_ALL_INDEX];
698             }
699
700             names_len++;    /* Trailing '\0' */
701             SAVEFREEPV(Newx(all_string, names_len, char));
702             *all_string = '\0';
703
704             /* Then fill in the string */
705             for (i = 0; i < LC_ALL_INDEX; i++) {
706
707 #    ifdef DEBUGGING
708
709                 if (DEBUG_Lv_TEST || debug_initialization) {
710                     PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale i=%d, name=%s, locale=%s\n", __FILE__, __LINE__, i, category_names[i], PL_curlocales[i]);
711                 }
712
713 #    endif
714
715                 my_strlcat(all_string, category_names[i], names_len);
716                 my_strlcat(all_string, "=", names_len);
717                 my_strlcat(all_string, PL_curlocales[i], names_len);
718                 my_strlcat(all_string, ";", names_len);
719             }
720
721 #    ifdef DEBUGGING
722
723             if (DEBUG_L_TEST || debug_initialization) {
724                 PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale returning %s\n", __FILE__, __LINE__, all_string);
725             }
726
727     #endif
728
729             return all_string;
730         }
731
732 #    ifdef EINVAL
733
734         SETERRNO(EINVAL, LIB_INVARG);
735
736 #    endif
737
738         return NULL;
739
740 #  endif
741
742     }
743
744     /* Here, we are switching locales. */
745
746 #  ifndef HAS_QUERYLOCALE
747
748     if (strEQ(locale, "")) {
749
750         /* For non-querylocale() systems, we do the setting of "" ourselves to
751          * be sure that we really know what's going on.  We follow the Linux
752          * documented behavior (but if that differs from the actual behavior,
753          * this won't work exactly as the OS implements).  We go out and
754          * examine the environment based on our understanding of how the system
755          * works, and use that to figure things out */
756
757         const char * const lc_all = PerlEnv_getenv("LC_ALL");
758
759         /* Use any "LC_ALL" environment variable, as it overrides everything
760          * else. */
761         if (lc_all && strNE(lc_all, "")) {
762             locale = lc_all;
763         }
764         else {
765
766             /* Otherwise, we need to dig deeper.  Unless overridden, the
767              * default is the LANG environment variable; if it doesn't exist,
768              * then "C" */
769
770             const char * default_name;
771
772             default_name = PerlEnv_getenv("LANG");
773
774             if (! default_name || strEQ(default_name, "")) {
775                 default_name = "C";
776             }
777             else if (PL_scopestack_ix != 0) {
778                 /* To minimize other threads messing with the environment,
779                  * we copy the variable, making it a temporary.  But this
780                  * doesn't work upon program initialization before any
781                  * scopes are created, and at this time, there's nothing
782                  * else going on that would interfere.  So skip the copy
783                  * in that case */
784                 default_name = savepv(default_name);
785                 SAVEFREEPV(default_name);
786             }
787
788             if (category != LC_ALL) {
789                 const char * const name = PerlEnv_getenv(category_names[index]);
790
791                 /* Here we are setting a single category.  Assume will have the
792                  * default name */
793                 locale = default_name;
794
795                 /* But then look for an overriding environment variable */
796                 if (name && strNE(name, "")) {
797                     locale = name;
798                 }
799             }
800             else {
801                 bool did_override = FALSE;
802                 unsigned int i;
803
804                 /* Here, we are getting LC_ALL.  Any categories that don't have
805                  * a corresponding environment variable set should be set to
806                  * LANG, or to "C" if there is no LANG.  If no individual
807                  * categories differ from this, we can just set LC_ALL.  This
808                  * is buggy on systems that have extra categories that we don't
809                  * know about.  If there is an environment variable that sets
810                  * that category, we won't know to look for it, and so our use
811                  * of LANG or "C" improperly overrides it.  On the other hand,
812                  * if we don't do what is done here, and there is no
813                  * environment variable, the category's locale should be set to
814                  * LANG or "C".  So there is no good solution.  khw thinks the
815                  * best is to look at systems to see what categories they have,
816                  * and include them, and then to assume that we know the
817                  * complete set */
818
819                 for (i = 0; i < LC_ALL_INDEX; i++) {
820                     const char * const env_override
821                                     = savepv(PerlEnv_getenv(category_names[i]));
822                     const char * this_locale = (   env_override
823                                                 && strNE(env_override, ""))
824                                                ? env_override
825                                                : default_name;
826                     if (! emulate_setlocale(categories[i], this_locale, i, TRUE))
827                     {
828                         Safefree(env_override);
829                         return NULL;
830                     }
831
832                     if (strNE(this_locale, default_name)) {
833                         did_override = TRUE;
834                     }
835
836                     Safefree(env_override);
837                 }
838
839                 /* If all the categories are the same, we can set LC_ALL to
840                  * that */
841                 if (! did_override) {
842                     locale = default_name;
843                 }
844                 else {
845
846                     /* Here, LC_ALL is no longer valid, as some individual
847                      * categories don't match it.  We call ourselves
848                      * recursively, as that will execute the code that
849                      * generates the proper locale string for this situation.
850                      * We don't do the remainder of this function, as that is
851                      * to update our records, and we've just done that for the
852                      * individual categories in the loop above, and doing so
853                      * would cause LC_ALL to be done as well */
854                     return emulate_setlocale(LC_ALL, NULL, LC_ALL_INDEX, TRUE);
855                 }
856             }
857         }
858     }
859     else if (strchr(locale, ';')) {
860
861         /* LC_ALL may actually incude a conglomeration of various categories.
862          * Without querylocale, this code uses the glibc (as of this writing)
863          * syntax for representing that, but that is not a stable API, and
864          * other platforms do it differently, so we have to handle all cases
865          * ourselves */
866
867         unsigned int i;
868         const char * s = locale;
869         const char * e = locale + strlen(locale);
870         const char * p = s;
871         const char * category_end;
872         const char * name_start;
873         const char * name_end;
874
875         /* If the string that gives what to set doesn't include all categories,
876          * the omitted ones get set to "C".  To get this behavior, first set
877          * all the individual categories to "C", and override the furnished
878          * ones below */
879         for (i = 0; i < LC_ALL_INDEX; i++) {
880             if (! emulate_setlocale(categories[i], "C", i, TRUE)) {
881                 return NULL;
882             }
883         }
884
885         while (s < e) {
886
887             /* Parse through the category */
888             while (isWORDCHAR(*p)) {
889                 p++;
890             }
891             category_end = p;
892
893             if (*p++ != '=') {
894                 Perl_croak(aTHX_
895                     "panic: %s: %d: Unexpected character in locale name '%02X",
896                     __FILE__, __LINE__, *(p-1));
897             }
898
899             /* Parse through the locale name */
900             name_start = p;
901             while (p < e && *p != ';') {
902                 if (! isGRAPH(*p)) {
903                     Perl_croak(aTHX_
904                         "panic: %s: %d: Unexpected character in locale name '%02X",
905                         __FILE__, __LINE__, *(p-1));
906                 }
907                 p++;
908             }
909             name_end = p;
910
911             /* Space past the semi-colon */
912             if (p < e) {
913                 p++;
914             }
915
916             /* Find the index of the category name in our lists */
917             for (i = 0; i < LC_ALL_INDEX; i++) {
918                 char * individ_locale;
919
920                 /* Keep going if this isn't the index.  The strnNE() avoids a
921                  * Perl_form(), but would fail if ever a category name could be
922                  * a substring of another one, like if there were a
923                  * "LC_TIME_DATE" */
924                 if strnNE(s, category_names[i], category_end - s) {
925                     continue;
926                 }
927
928                 /* If this index is for the single category we're changing, we
929                  * have found the locale to set it to. */
930                 if (category == categories[i]) {
931                     locale = Perl_form(aTHX_ "%.*s",
932                                              (int) (name_end - name_start),
933                                              name_start);
934                     goto ready_to_set;
935                 }
936
937                 assert(category == LC_ALL);
938                 individ_locale = Perl_form(aTHX_ "%.*s",
939                                     (int) (name_end - name_start), name_start);
940                 if (! emulate_setlocale(categories[i], individ_locale, i, TRUE))
941                 {
942                     return NULL;
943                 }
944             }
945
946             s = p;
947         }
948
949         /* Here we have set all the individual categories by recursive calls.
950          * These collectively should have fixed up LC_ALL, so can just query
951          * what that now is */
952         assert(category == LC_ALL);
953
954         return do_setlocale_c(LC_ALL, NULL);
955     }
956
957   ready_to_set: ;
958
959     /* Here at the end of having to deal with the absence of querylocale().
960      * Some cases have already been fully handled by recursive calls to this
961      * function.  But at this point, we haven't dealt with those, but are now
962      * prepared to, knowing what the locale name to set this category to is.
963      * This would have come for free if this system had had querylocale() */
964
965 #  endif  /* end of ! querylocale */
966
967     assert(PL_C_locale_obj);
968
969     /* Switching locales generally entails freeing the current one's space (at
970      * the C library's discretion).  We need to stop using that locale before
971      * the switch.  So switch to a known locale object that we don't otherwise
972      * mess with.  This returns the locale object in effect at the time of the
973      * switch. */
974     old_obj = uselocale(PL_C_locale_obj);
975
976 #  ifdef DEBUGGING
977
978     if (DEBUG_Lv_TEST || debug_initialization) {
979         PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale was using %p\n", __FILE__, __LINE__, old_obj);
980     }
981
982 #  endif
983
984     if (! old_obj) {
985
986 #  ifdef DEBUGGING
987
988         if (DEBUG_L_TEST || debug_initialization) {
989             dSAVE_ERRNO;
990             PerlIO_printf(Perl_debug_log, "%s:%d: emulate_setlocale switching to C failed: %d\n", __FILE__, __LINE__, GET_ERRNO);
991             RESTORE_ERRNO;
992         }
993
994 #  endif
995
996         return NULL;
997     }
998
999 #  ifdef DEBUGGING
1000
1001     if (DEBUG_Lv_TEST || debug_initialization) {
1002         PerlIO_printf(Perl_debug_log,
1003                       "%s:%d: emulate_setlocale now using %p\n",
1004                       __FILE__, __LINE__, PL_C_locale_obj);
1005     }
1006
1007 #  endif
1008
1009     /* If we are switching to the LC_ALL C locale, it already exists.  Use
1010      * it instead of trying to create a new locale */
1011     if (mask == LC_ALL_MASK && isNAME_C_OR_POSIX(locale)) {
1012
1013 #  ifdef DEBUGGING
1014
1015         if (DEBUG_Lv_TEST || debug_initialization) {
1016             PerlIO_printf(Perl_debug_log,
1017                           "%s:%d: will stay in C object\n", __FILE__, __LINE__);
1018         }
1019
1020 #  endif
1021
1022         new_obj = PL_C_locale_obj;
1023
1024         /* We already had switched to the C locale in preparation for freeing
1025          * 'old_obj' */
1026         if (old_obj != LC_GLOBAL_LOCALE && old_obj != PL_C_locale_obj) {
1027             freelocale(old_obj);
1028         }
1029     }
1030     else {
1031         /* If we weren't in a thread safe locale, set so that newlocale() below
1032          * which uses 'old_obj', uses an empty one.  Same for our reserved C
1033          * object.  The latter is defensive coding, so that, even if there is
1034          * some bug, we will never end up trying to modify either of these, as
1035          * if passed to newlocale(), they can be. */
1036         if (old_obj == LC_GLOBAL_LOCALE || old_obj == PL_C_locale_obj) {
1037             old_obj = (locale_t) 0;
1038         }
1039
1040         /* Ready to create a new locale by modification of the exising one */
1041         new_obj = newlocale(mask, locale, old_obj);
1042
1043         if (! new_obj) {
1044             dSAVE_ERRNO;
1045
1046 #  ifdef DEBUGGING
1047
1048             if (DEBUG_L_TEST || debug_initialization) {
1049                 PerlIO_printf(Perl_debug_log,
1050                               "%s:%d: emulate_setlocale creating new object"
1051                               " failed: %d\n", __FILE__, __LINE__, GET_ERRNO);
1052             }
1053
1054 #  endif
1055
1056             if (! uselocale(old_obj)) {
1057
1058 #  ifdef DEBUGGING
1059
1060                 if (DEBUG_L_TEST || debug_initialization) {
1061                     PerlIO_printf(Perl_debug_log,
1062                                   "%s:%d: switching back failed: %d\n",
1063                                   __FILE__, __LINE__, GET_ERRNO);
1064                 }
1065
1066 #  endif
1067
1068             }
1069             RESTORE_ERRNO;
1070             return NULL;
1071         }
1072
1073 #  ifdef DEBUGGING
1074
1075         if (DEBUG_Lv_TEST || debug_initialization) {
1076             PerlIO_printf(Perl_debug_log,
1077                           "%s:%d: emulate_setlocale created %p",
1078                           __FILE__, __LINE__, new_obj);
1079             if (old_obj) {
1080                 PerlIO_printf(Perl_debug_log,
1081                               "; should have freed %p", old_obj);
1082             }
1083             PerlIO_printf(Perl_debug_log, "\n");
1084         }
1085
1086 #  endif
1087
1088         /* And switch into it */
1089         if (! uselocale(new_obj)) {
1090             dSAVE_ERRNO;
1091
1092 #  ifdef DEBUGGING
1093
1094             if (DEBUG_L_TEST || debug_initialization) {
1095                 PerlIO_printf(Perl_debug_log,
1096                               "%s:%d: emulate_setlocale switching to new object"
1097                               " failed\n", __FILE__, __LINE__);
1098             }
1099
1100 #  endif
1101
1102             if (! uselocale(old_obj)) {
1103
1104 #  ifdef DEBUGGING
1105
1106                 if (DEBUG_L_TEST || debug_initialization) {
1107                     PerlIO_printf(Perl_debug_log,
1108                                   "%s:%d: switching back failed: %d\n",
1109                                   __FILE__, __LINE__, GET_ERRNO);
1110                 }
1111
1112 #  endif
1113
1114             }
1115             freelocale(new_obj);
1116             RESTORE_ERRNO;
1117             return NULL;
1118         }
1119     }
1120
1121 #  ifdef DEBUGGING
1122
1123     if (DEBUG_Lv_TEST || debug_initialization) {
1124         PerlIO_printf(Perl_debug_log,
1125                       "%s:%d: emulate_setlocale now using %p\n",
1126                       __FILE__, __LINE__, new_obj);
1127     }
1128
1129 #  endif
1130
1131     /* We are done, except for updating our records (if the system doesn't keep
1132      * them) and in the case of locale "", we don't actually know what the
1133      * locale that got switched to is, as it came from the environment.  So
1134      * have to find it */
1135
1136 #  ifdef HAS_QUERYLOCALE
1137
1138     if (strEQ(locale, "")) {
1139         locale = querylocale(mask, new_obj);
1140     }
1141
1142 #  else
1143
1144     /* Here, 'locale' is the return value */
1145
1146     /* Without querylocale(), we have to update our records */
1147
1148     if (category == LC_ALL) {
1149         unsigned int i;
1150
1151         /* For LC_ALL, we change all individual categories to correspond */
1152                               /* PL_curlocales is a parallel array, so has same
1153                                * length as 'categories' */
1154         for (i = 0; i <= LC_ALL_INDEX; i++) {
1155             Safefree(PL_curlocales[i]);
1156             PL_curlocales[i] = savepv(locale);
1157         }
1158     }
1159     else {
1160
1161         /* For a single category, if it's not the same as the one in LC_ALL, we
1162          * nullify LC_ALL */
1163
1164         if (PL_curlocales[LC_ALL_INDEX] && strNE(PL_curlocales[LC_ALL_INDEX], locale)) {
1165             Safefree(PL_curlocales[LC_ALL_INDEX]);
1166             PL_curlocales[LC_ALL_INDEX] = NULL;
1167         }
1168
1169         /* Then update the category's record */
1170         Safefree(PL_curlocales[index]);
1171         PL_curlocales[index] = savepv(locale);
1172     }
1173
1174 #  endif
1175
1176     return locale;
1177 }
1178
1179 #endif /* USE_POSIX_2008_LOCALE */
1180
1181 #if 0   /* Code that was to emulate thread-safe locales on platforms that
1182            didn't natively support them */
1183
1184 /* The way this would work is that we would keep a per-thread list of the
1185  * correct locale for that thread.  Any operation that was locale-sensitive
1186  * would have to be changed so that it would look like this:
1187  *
1188  *      LOCALE_LOCK;
1189  *      setlocale to the correct locale for this operation
1190  *      do operation
1191  *      LOCALE_UNLOCK
1192  *
1193  * This leaves the global locale in the most recently used operation's, but it
1194  * was locked long enough to get the result.  If that result is static, it
1195  * needs to be copied before the unlock.
1196  *
1197  * Macros could be written like SETUP_LOCALE_DEPENDENT_OP(category) that did
1198  * the setup, but are no-ops when not needed, and similarly,
1199  * END_LOCALE_DEPENDENT_OP for the tear-down
1200  *
1201  * But every call to a locale-sensitive function would have to be changed, and
1202  * if a module didn't cooperate by using the mutex, things would break.
1203  *
1204  * This code was abandoned before being completed or tested, and is left as-is
1205 */
1206
1207 #  define do_setlocale_c(cat, locale) locking_setlocale(cat, locale, cat ## _INDEX, TRUE)
1208 #  define do_setlocale_r(cat, locale) locking_setlocale(cat, locale, 0, FALSE)
1209
1210 STATIC char *
1211 S_locking_setlocale(pTHX_
1212                     const int category,
1213                     const char * locale,
1214                     int index,
1215                     const bool is_index_valid
1216                    )
1217 {
1218     /* This function kind of performs a setlocale() on just the current thread;
1219      * thus it is kind of thread-safe.  It does this by keeping a thread-level
1220      * array of the current locales for each category.  Every time a locale is
1221      * switched to, it does the switch globally, but updates the thread's
1222      * array.  A query as to what the current locale is just returns the
1223      * appropriate element from the array, and doesn't actually call the system
1224      * setlocale().  The saving into the array is done in an uninterruptible
1225      * section of code, so is unaffected by whatever any other threads might be
1226      * doing.
1227      *
1228      * All locale-sensitive operations must work by first starting a critical
1229      * section, then switching to the thread's locale as kept by this function,
1230      * and then doing the operation, then ending the critical section.  Thus,
1231      * each gets done in the appropriate locale. simulating thread-safety.
1232      *
1233      * This function takes the same parameters, 'category' and 'locale', that
1234      * the regular setlocale() function does, but it also takes two additional
1235      * ones.  This is because as described earlier.  If we know on input the
1236      * index corresponding to the category into the array where we store the
1237      * current locales, we don't have to calculate it.  If the caller knows at
1238      * compile time what the index is, it it can pass it, setting
1239      * 'is_index_valid' to TRUE; otherwise the index parameter is ignored.
1240      *
1241      */
1242
1243     /* If the input index might be incorrect, calculate the correct one */
1244     if (! is_index_valid) {
1245         unsigned int i;
1246
1247         if (DEBUG_Lv_TEST || debug_initialization) {
1248             PerlIO_printf(Perl_debug_log, "%s:%d: converting category %d to index\n", __FILE__, __LINE__, category);
1249         }
1250
1251         for (i = 0; i <= LC_ALL_INDEX; i++) {
1252             if (category == categories[i]) {
1253                 index = i;
1254                 goto found_index;
1255             }
1256         }
1257
1258         /* Here, we don't know about this category, so can't handle it.
1259          * XXX best we can do is to unsafely set this
1260          * XXX warning */
1261
1262         return my_setlocale(category, locale);
1263
1264       found_index: ;
1265
1266         if (DEBUG_Lv_TEST || debug_initialization) {
1267             PerlIO_printf(Perl_debug_log, "%s:%d: index is 0x%x\n", __FILE__, __LINE__, index);
1268         }
1269     }
1270
1271     /* For a query, just return what's in our records */
1272     if (new_locale == NULL) {
1273         return curlocales[index];
1274     }
1275
1276
1277     /* Otherwise, we need to do the switch, and save the result, all in a
1278      * critical section */
1279
1280     Safefree(curlocales[[index]]);
1281
1282     /* It might be that this is called from an already-locked section of code.
1283      * We would have to detect and skip the LOCK/UNLOCK if so */
1284     LOCALE_LOCK;
1285
1286     curlocales[index] = savepv(my_setlocale(category, new_locale));
1287
1288     if (strEQ(new_locale, "")) {
1289
1290 #ifdef LC_ALL
1291
1292         /* The locale values come from the environment, and may not all be the
1293          * same, so for LC_ALL, we have to update all the others, while the
1294          * mutex is still locked */
1295
1296         if (category == LC_ALL) {
1297             unsigned int i;
1298             for (i = 0; i < LC_ALL_INDEX) {
1299                 curlocales[i] = my_setlocale(categories[i], NULL);
1300             }
1301         }
1302     }
1303
1304 #endif
1305
1306     LOCALE_UNLOCK;
1307
1308     return curlocales[index];
1309 }
1310
1311 #endif
1312 #ifdef USE_LOCALE
1313
1314 STATIC void
1315 S_set_numeric_radix(pTHX_ const bool use_locale)
1316 {
1317     /* If 'use_locale' is FALSE, set to use a dot for the radix character.  If
1318      * TRUE, use the radix character derived from the current locale */
1319
1320 #if defined(USE_LOCALE_NUMERIC) && (   defined(HAS_LOCALECONV)              \
1321                                     || defined(HAS_NL_LANGINFO))
1322
1323     const char * radix = (use_locale)
1324                          ? my_nl_langinfo(RADIXCHAR, FALSE)
1325                                         /* FALSE => already in dest locale */
1326                          : ".";
1327
1328         sv_setpv(PL_numeric_radix_sv, radix);
1329
1330     /* If this is valid UTF-8 that isn't totally ASCII, and we are in
1331         * a UTF-8 locale, then mark the radix as being in UTF-8 */
1332     if (is_utf8_non_invariant_string((U8 *) SvPVX(PL_numeric_radix_sv),
1333                                             SvCUR(PL_numeric_radix_sv))
1334         && _is_cur_LC_category_utf8(LC_NUMERIC))
1335     {
1336         SvUTF8_on(PL_numeric_radix_sv);
1337     }
1338
1339 #  ifdef DEBUGGING
1340
1341     if (DEBUG_L_TEST || debug_initialization) {
1342         PerlIO_printf(Perl_debug_log, "Locale radix is '%s', ?UTF-8=%d\n",
1343                                            SvPVX(PL_numeric_radix_sv),
1344                                            cBOOL(SvUTF8(PL_numeric_radix_sv)));
1345     }
1346
1347 #  endif
1348 #else
1349
1350     PERL_UNUSED_ARG(use_locale);
1351
1352 #endif /* USE_LOCALE_NUMERIC and can find the radix char */
1353
1354 }
1355
1356 STATIC void
1357 S_new_numeric(pTHX_ const char *newnum)
1358 {
1359
1360 #ifndef USE_LOCALE_NUMERIC
1361
1362     PERL_UNUSED_ARG(newnum);
1363
1364 #else
1365
1366     /* Called after each libc setlocale() call affecting LC_NUMERIC, to tell
1367      * core Perl this and that 'newnum' is the name of the new locale.
1368      * It installs this locale as the current underlying default.
1369      *
1370      * The default locale and the C locale can be toggled between by use of the
1371      * set_numeric_underlying() and set_numeric_standard() functions, which
1372      * should probably not be called directly, but only via macros like
1373      * SET_NUMERIC_STANDARD() in perl.h.
1374      *
1375      * The toggling is necessary mainly so that a non-dot radix decimal point
1376      * character can be output, while allowing internal calculations to use a
1377      * dot.
1378      *
1379      * This sets several interpreter-level variables:
1380      * PL_numeric_name  The underlying locale's name: a copy of 'newnum'
1381      * PL_numeric_underlying  A boolean indicating if the toggled state is such
1382      *                  that the current locale is the program's underlying
1383      *                  locale
1384      * PL_numeric_standard An int indicating if the toggled state is such
1385      *                  that the current locale is the C locale or
1386      *                  indistinguishable from the C locale.  If non-zero, it
1387      *                  is in C; if > 1, it means it may not be toggled away
1388      *                  from C.
1389      * PL_numeric_underlying_is_standard   A bool kept by this function
1390      *                  indicating that the underlying locale and the standard
1391      *                  C locale are indistinguishable for the purposes of
1392      *                  LC_NUMERIC.  This happens when both of the above two
1393      *                  variables are true at the same time.  (Toggling is a
1394      *                  no-op under these circumstances.)  This variable is
1395      *                  used to avoid having to recalculate.
1396      */
1397
1398     char *save_newnum;
1399
1400     if (! newnum) {
1401         Safefree(PL_numeric_name);
1402         PL_numeric_name = NULL;
1403         PL_numeric_standard = TRUE;
1404         PL_numeric_underlying = TRUE;
1405         PL_numeric_underlying_is_standard = TRUE;
1406         return;
1407     }
1408
1409     save_newnum = stdize_locale(savepv(newnum));
1410     PL_numeric_underlying = TRUE;
1411     PL_numeric_standard = isNAME_C_OR_POSIX(save_newnum);
1412
1413 #ifndef TS_W32_BROKEN_LOCALECONV
1414
1415     /* If its name isn't C nor POSIX, it could still be indistinguishable from
1416      * them.  But on broken Windows systems calling my_nl_langinfo() for
1417      * THOUSEP can currently (but rarely) cause a race, so avoid doing that,
1418      * and just always change the locale if not C nor POSIX on those systems */
1419     if (! PL_numeric_standard) {
1420         PL_numeric_standard = cBOOL(strEQ(".", my_nl_langinfo(RADIXCHAR,
1421                                             FALSE /* Don't toggle locale */  ))
1422                                  && strEQ("",  my_nl_langinfo(THOUSEP, FALSE)));
1423     }
1424
1425 #endif
1426
1427     /* Save the new name if it isn't the same as the previous one, if any */
1428     if (! PL_numeric_name || strNE(PL_numeric_name, save_newnum)) {
1429         Safefree(PL_numeric_name);
1430         PL_numeric_name = save_newnum;
1431     }
1432     else {
1433         Safefree(save_newnum);
1434     }
1435
1436     PL_numeric_underlying_is_standard = PL_numeric_standard;
1437
1438 #  ifdef HAS_POSIX_2008_LOCALE
1439
1440     PL_underlying_numeric_obj = newlocale(LC_NUMERIC_MASK,
1441                                           PL_numeric_name,
1442                                           PL_underlying_numeric_obj);
1443
1444 #endif
1445
1446     if (DEBUG_L_TEST || debug_initialization) {
1447         PerlIO_printf(Perl_debug_log, "Called new_numeric with %s, PL_numeric_name=%s\n", newnum, PL_numeric_name);
1448     }
1449
1450     /* Keep LC_NUMERIC in the C locale.  This is for XS modules, so they don't
1451      * have to worry about the radix being a non-dot.  (Core operations that
1452      * need the underlying locale change to it temporarily). */
1453     if (PL_numeric_standard) {
1454         set_numeric_radix(0);
1455     }
1456     else {
1457         set_numeric_standard();
1458     }
1459
1460 #endif /* USE_LOCALE_NUMERIC */
1461
1462 }
1463
1464 void
1465 Perl_set_numeric_standard(pTHX)
1466 {
1467
1468 #ifdef USE_LOCALE_NUMERIC
1469
1470     /* Toggle the LC_NUMERIC locale to C.  Most code should use the macros like
1471      * SET_NUMERIC_STANDARD() in perl.h instead of calling this directly.  The
1472      * macro avoids calling this routine if toggling isn't necessary according
1473      * to our records (which could be wrong if some XS code has changed the
1474      * locale behind our back) */
1475
1476 #  ifdef DEBUGGING
1477
1478     if (DEBUG_L_TEST || debug_initialization) {
1479         PerlIO_printf(Perl_debug_log,
1480                           "Setting LC_NUMERIC locale to standard C\n");
1481     }
1482
1483 #  endif
1484
1485     do_setlocale_c(LC_NUMERIC, "C");
1486     PL_numeric_standard = TRUE;
1487     PL_numeric_underlying = PL_numeric_underlying_is_standard;
1488     set_numeric_radix(0);
1489
1490 #endif /* USE_LOCALE_NUMERIC */
1491
1492 }
1493
1494 void
1495 Perl_set_numeric_underlying(pTHX)
1496 {
1497
1498 #ifdef USE_LOCALE_NUMERIC
1499
1500     /* Toggle the LC_NUMERIC locale to the current underlying default.  Most
1501      * code should use the macros like SET_NUMERIC_UNDERLYING() in perl.h
1502      * instead of calling this directly.  The macro avoids calling this routine
1503      * if toggling isn't necessary according to our records (which could be
1504      * wrong if some XS code has changed the locale behind our back) */
1505
1506 #  ifdef DEBUGGING
1507
1508     if (DEBUG_L_TEST || debug_initialization) {
1509         PerlIO_printf(Perl_debug_log,
1510                           "Setting LC_NUMERIC locale to %s\n",
1511                           PL_numeric_name);
1512     }
1513
1514 #  endif
1515
1516     do_setlocale_c(LC_NUMERIC, PL_numeric_name);
1517     PL_numeric_standard = PL_numeric_underlying_is_standard;
1518     PL_numeric_underlying = TRUE;
1519     set_numeric_radix(! PL_numeric_standard);
1520
1521 #endif /* USE_LOCALE_NUMERIC */
1522
1523 }
1524
1525 /*
1526  * Set up for a new ctype locale.
1527  */
1528 STATIC void
1529 S_new_ctype(pTHX_ const char *newctype)
1530 {
1531
1532 #ifndef USE_LOCALE_CTYPE
1533
1534     PERL_UNUSED_ARG(newctype);
1535     PERL_UNUSED_CONTEXT;
1536
1537 #else
1538
1539     /* Called after each libc setlocale() call affecting LC_CTYPE, to tell
1540      * core Perl this and that 'newctype' is the name of the new locale.
1541      *
1542      * This function sets up the folding arrays for all 256 bytes, assuming
1543      * that tofold() is tolc() since fold case is not a concept in POSIX,
1544      *
1545      * Any code changing the locale (outside this file) should use
1546      * Perl_setlocale or POSIX::setlocale, which call this function.  Therefore
1547      * this function should be called directly only from this file and from
1548      * POSIX::setlocale() */
1549
1550     dVAR;
1551     unsigned int i;
1552
1553     /* Don't check for problems if we are suppressing the warnings */
1554     bool check_for_problems = ckWARN_d(WARN_LOCALE) || UNLIKELY(DEBUG_L_TEST);
1555     bool maybe_utf8_turkic = FALSE;
1556
1557     PERL_ARGS_ASSERT_NEW_CTYPE;
1558
1559     /* We will replace any bad locale warning with 1) nothing if the new one is
1560      * ok; or 2) a new warning for the bad new locale */
1561     if (PL_warn_locale) {
1562         SvREFCNT_dec_NN(PL_warn_locale);
1563         PL_warn_locale = NULL;
1564     }
1565
1566     PL_in_utf8_CTYPE_locale = _is_cur_LC_category_utf8(LC_CTYPE);
1567
1568     /* A UTF-8 locale gets standard rules.  But note that code still has to
1569      * handle this specially because of the three problematic code points */
1570     if (PL_in_utf8_CTYPE_locale) {
1571         Copy(PL_fold_latin1, PL_fold_locale, 256, U8);
1572
1573         /* UTF-8 locales can have special handling for 'I' and 'i' if they are
1574          * Turkic.  Make sure these two are the only anomalies.  (We don't use
1575          * towupper and towlower because they aren't in C89.) */
1576
1577 #if defined(HAS_TOWUPPER) && defined (HAS_TOWLOWER)
1578
1579         if (towupper('i') == 0x130 && towlower('I') == 0x131) {
1580
1581 #else
1582
1583         if (toupper('i') == 'i' && tolower('I') == 'I') {
1584
1585 #endif
1586             check_for_problems = TRUE;
1587             maybe_utf8_turkic = TRUE;
1588         }
1589     }
1590
1591     /* We don't populate the other lists if a UTF-8 locale, but do check that
1592      * everything works as expected, unless checking turned off */
1593     if (check_for_problems || ! PL_in_utf8_CTYPE_locale) {
1594         /* Assume enough space for every character being bad.  4 spaces each
1595          * for the 94 printable characters that are output like "'x' "; and 5
1596          * spaces each for "'\\' ", "'\t' ", and "'\n' "; plus a terminating
1597          * NUL */
1598         char bad_chars_list[ (94 * 4) + (3 * 5) + 1 ] = { '\0' };
1599         bool multi_byte_locale = FALSE;     /* Assume is a single-byte locale
1600                                                to start */
1601         unsigned int bad_count = 0;         /* Count of bad characters */
1602
1603         for (i = 0; i < 256; i++) {
1604             if (! PL_in_utf8_CTYPE_locale) {
1605                 if (isupper(i))
1606                     PL_fold_locale[i] = (U8) tolower(i);
1607                 else if (islower(i))
1608                     PL_fold_locale[i] = (U8) toupper(i);
1609                 else
1610                     PL_fold_locale[i] = (U8) i;
1611             }
1612
1613             /* If checking for locale problems, see if the native ASCII-range
1614              * printables plus \n and \t are in their expected categories in
1615              * the new locale.  If not, this could mean big trouble, upending
1616              * Perl's and most programs' assumptions, like having a
1617              * metacharacter with special meaning become a \w.  Fortunately,
1618              * it's very rare to find locales that aren't supersets of ASCII
1619              * nowadays.  It isn't a problem for most controls to be changed
1620              * into something else; we check only \n and \t, though perhaps \r
1621              * could be an issue as well. */
1622             if (    check_for_problems
1623                 && (isGRAPH_A(i) || isBLANK_A(i) || i == '\n'))
1624             {
1625                 bool is_bad = FALSE;
1626                 char name[4] = { '\0' };
1627
1628                 /* Convert the name into a string */
1629                 if (isGRAPH_A(i)) {
1630                     name[0] = i;
1631                     name[1] = '\0';
1632                 }
1633                 else if (i == '\n') {
1634                     my_strlcpy(name, "\\n", sizeof(name));
1635                 }
1636                 else if (i == '\t') {
1637                     my_strlcpy(name, "\\t", sizeof(name));
1638                 }
1639                 else {
1640                     assert(i == ' ');
1641                     my_strlcpy(name, "' '", sizeof(name));
1642                 }
1643
1644                 /* Check each possibe class */
1645                 if (UNLIKELY(cBOOL(isalnum(i)) != cBOOL(isALPHANUMERIC_A(i))))  {
1646                     is_bad = TRUE;
1647                     DEBUG_L(PerlIO_printf(Perl_debug_log,
1648                                           "isalnum('%s') unexpectedly is %d\n",
1649                                           name, cBOOL(isalnum(i))));
1650                 }
1651                 if (UNLIKELY(cBOOL(isalpha(i)) != cBOOL(isALPHA_A(i))))  {
1652                     is_bad = TRUE;
1653                     DEBUG_L(PerlIO_printf(Perl_debug_log,
1654                                           "isalpha('%s') unexpectedly is %d\n",
1655                                           name, cBOOL(isalpha(i))));
1656                 }
1657                 if (UNLIKELY(cBOOL(isdigit(i)) != cBOOL(isDIGIT_A(i))))  {
1658                     is_bad = TRUE;
1659                     DEBUG_L(PerlIO_printf(Perl_debug_log,
1660                                           "isdigit('%s') unexpectedly is %d\n",
1661                                           name, cBOOL(isdigit(i))));
1662                 }
1663                 if (UNLIKELY(cBOOL(isgraph(i)) != cBOOL(isGRAPH_A(i))))  {
1664                     is_bad = TRUE;
1665                     DEBUG_L(PerlIO_printf(Perl_debug_log,
1666                                           "isgraph('%s') unexpectedly is %d\n",
1667                                           name, cBOOL(isgraph(i))));
1668                 }
1669                 if (UNLIKELY(cBOOL(islower(i)) != cBOOL(isLOWER_A(i))))  {
1670                     is_bad = TRUE;
1671                     DEBUG_L(PerlIO_printf(Perl_debug_log,
1672                                           "islower('%s') unexpectedly is %d\n",
1673                                           name, cBOOL(islower(i))));
1674                 }
1675                 if (UNLIKELY(cBOOL(isprint(i)) != cBOOL(isPRINT_A(i))))  {
1676                     is_bad = TRUE;
1677                     DEBUG_L(PerlIO_printf(Perl_debug_log,
1678                                           "isprint('%s') unexpectedly is %d\n",
1679                                           name, cBOOL(isprint(i))));
1680                 }
1681                 if (UNLIKELY(cBOOL(ispunct(i)) != cBOOL(isPUNCT_A(i))))  {
1682                     is_bad = TRUE;
1683                     DEBUG_L(PerlIO_printf(Perl_debug_log,
1684                                           "ispunct('%s') unexpectedly is %d\n",
1685                                           name, cBOOL(ispunct(i))));
1686                 }
1687                 if (UNLIKELY(cBOOL(isspace(i)) != cBOOL(isSPACE_A(i))))  {
1688                     is_bad = TRUE;
1689                     DEBUG_L(PerlIO_printf(Perl_debug_log,
1690                                           "isspace('%s') unexpectedly is %d\n",
1691                                           name, cBOOL(isspace(i))));
1692                 }
1693                 if (UNLIKELY(cBOOL(isupper(i)) != cBOOL(isUPPER_A(i))))  {
1694                     is_bad = TRUE;
1695                     DEBUG_L(PerlIO_printf(Perl_debug_log,
1696                                           "isupper('%s') unexpectedly is %d\n",
1697                                           name, cBOOL(isupper(i))));
1698                 }
1699                 if (UNLIKELY(cBOOL(isxdigit(i))!= cBOOL(isXDIGIT_A(i))))  {
1700                     is_bad = TRUE;
1701                     DEBUG_L(PerlIO_printf(Perl_debug_log,
1702                                           "isxdigit('%s') unexpectedly is %d\n",
1703                                           name, cBOOL(isxdigit(i))));
1704                 }
1705                 if (UNLIKELY(tolower(i) != (int) toLOWER_A(i)))  {
1706                     is_bad = TRUE;
1707                     DEBUG_L(PerlIO_printf(Perl_debug_log,
1708                             "tolower('%s')=0x%x instead of the expected 0x%x\n",
1709                             name, tolower(i), (int) toLOWER_A(i)));
1710                 }
1711                 if (UNLIKELY(toupper(i) != (int) toUPPER_A(i)))  {
1712                     is_bad = TRUE;
1713                     DEBUG_L(PerlIO_printf(Perl_debug_log,
1714                             "toupper('%s')=0x%x instead of the expected 0x%x\n",
1715                             name, toupper(i), (int) toUPPER_A(i)));
1716                 }
1717                 if (UNLIKELY((i == '\n' && ! isCNTRL_LC(i))))  {
1718                     is_bad = TRUE;
1719                     DEBUG_L(PerlIO_printf(Perl_debug_log,
1720                                 "'\\n' (=%02X) is not a control\n", (int) i));
1721                 }
1722
1723                 /* Add to the list;  Separate multiple entries with a blank */
1724                 if (is_bad) {
1725                     if (bad_count) {
1726                         my_strlcat(bad_chars_list, " ", sizeof(bad_chars_list));
1727                     }
1728                     my_strlcat(bad_chars_list, name, sizeof(bad_chars_list));
1729                     bad_count++;
1730                 }
1731             }
1732         }
1733
1734         if (bad_count == 2 && maybe_utf8_turkic) {
1735             bad_count = 0;
1736             *bad_chars_list = '\0';
1737             PL_fold_locale['I'] = 'I';
1738             PL_fold_locale['i'] = 'i';
1739             PL_in_utf8_turkic_locale = TRUE;
1740             DEBUG_L(PerlIO_printf(Perl_debug_log, "%s:%d: %s is turkic\n",
1741                                                  __FILE__, __LINE__, newctype));
1742         }
1743         else {
1744             PL_in_utf8_turkic_locale = FALSE;
1745         }
1746
1747 #  ifdef MB_CUR_MAX
1748
1749         /* We only handle single-byte locales (outside of UTF-8 ones; so if
1750          * this locale requires more than one byte, there are going to be
1751          * problems. */
1752         DEBUG_Lv(PerlIO_printf(Perl_debug_log,
1753                  "%s:%d: check_for_problems=%d, MB_CUR_MAX=%d\n",
1754                  __FILE__, __LINE__, check_for_problems, (int) MB_CUR_MAX));
1755
1756         if (   check_for_problems && MB_CUR_MAX > 1
1757             && ! PL_in_utf8_CTYPE_locale
1758
1759                /* Some platforms return MB_CUR_MAX > 1 for even the "C"
1760                 * locale.  Just assume that the implementation for them (plus
1761                 * for POSIX) is correct and the > 1 value is spurious.  (Since
1762                 * these are specially handled to never be considered UTF-8
1763                 * locales, as long as this is the only problem, everything
1764                 * should work fine */
1765             && strNE(newctype, "C") && strNE(newctype, "POSIX"))
1766         {
1767             multi_byte_locale = TRUE;
1768         }
1769
1770 #  endif
1771
1772         /* If we found problems and we want them output, do so */
1773         if (   (UNLIKELY(bad_count) || UNLIKELY(multi_byte_locale))
1774             && (LIKELY(ckWARN_d(WARN_LOCALE)) || UNLIKELY(DEBUG_L_TEST)))
1775         {
1776             if (UNLIKELY(bad_count) && PL_in_utf8_CTYPE_locale) {
1777                 PL_warn_locale = Perl_newSVpvf(aTHX_
1778                      "Locale '%s' contains (at least) the following characters"
1779                      " which have\nunexpected meanings: %s\nThe Perl program"
1780                      " will use the expected meanings",
1781                       newctype, bad_chars_list);
1782             }
1783             else {
1784                 PL_warn_locale = Perl_newSVpvf(aTHX_
1785                              "Locale '%s' may not work well.%s%s%s\n",
1786                              newctype,
1787                              (multi_byte_locale)
1788                               ? "  Some characters in it are not recognized by"
1789                                 " Perl."
1790                               : "",
1791                              (bad_count)
1792                               ? "\nThe following characters (and maybe others)"
1793                                 " may not have the same meaning as the Perl"
1794                                 " program expects:\n"
1795                               : "",
1796                              (bad_count)
1797                               ? bad_chars_list
1798                               : ""
1799                             );
1800             }
1801
1802 #  ifdef HAS_NL_LANGINFO
1803
1804             Perl_sv_catpvf(aTHX_ PL_warn_locale, "; codeset=%s",
1805                                     /* parameter FALSE is a don't care here */
1806                                     my_nl_langinfo(CODESET, FALSE));
1807
1808 #  endif
1809
1810             Perl_sv_catpvf(aTHX_ PL_warn_locale, "\n");
1811
1812             /* If we are actually in the scope of the locale or are debugging,
1813              * output the message now.  If not in that scope, we save the
1814              * message to be output at the first operation using this locale,
1815              * if that actually happens.  Most programs don't use locales, so
1816              * they are immune to bad ones.  */
1817             if (IN_LC(LC_CTYPE) || UNLIKELY(DEBUG_L_TEST)) {
1818
1819                 /* The '0' below suppresses a bogus gcc compiler warning */
1820                 Perl_warner(aTHX_ packWARN(WARN_LOCALE), SvPVX(PL_warn_locale), 0);
1821
1822                 if (IN_LC(LC_CTYPE)) {
1823                     SvREFCNT_dec_NN(PL_warn_locale);
1824                     PL_warn_locale = NULL;
1825                 }
1826             }
1827         }
1828     }
1829
1830 #endif /* USE_LOCALE_CTYPE */
1831
1832 }
1833
1834 void
1835 Perl__warn_problematic_locale()
1836 {
1837
1838 #ifdef USE_LOCALE_CTYPE
1839
1840     dTHX;
1841
1842     /* Internal-to-core function that outputs the message in PL_warn_locale,
1843      * and then NULLS it.  Should be called only through the macro
1844      * _CHECK_AND_WARN_PROBLEMATIC_LOCALE */
1845
1846     if (PL_warn_locale) {
1847         Perl_ck_warner(aTHX_ packWARN(WARN_LOCALE),
1848                              SvPVX(PL_warn_locale),
1849                              0 /* dummy to avoid compiler warning */ );
1850         SvREFCNT_dec_NN(PL_warn_locale);
1851         PL_warn_locale = NULL;
1852     }
1853
1854 #endif
1855
1856 }
1857
1858 STATIC void
1859 S_new_collate(pTHX_ const char *newcoll)
1860 {
1861
1862 #ifndef USE_LOCALE_COLLATE
1863
1864     PERL_UNUSED_ARG(newcoll);
1865     PERL_UNUSED_CONTEXT;
1866
1867 #else
1868
1869     /* Called after each libc setlocale() call affecting LC_COLLATE, to tell
1870      * core Perl this and that 'newcoll' is the name of the new locale.
1871      *
1872      * The design of locale collation is that every locale change is given an
1873      * index 'PL_collation_ix'.  The first time a string particpates in an
1874      * operation that requires collation while locale collation is active, it
1875      * is given PERL_MAGIC_collxfrm magic (via sv_collxfrm_flags()).  That
1876      * magic includes the collation index, and the transformation of the string
1877      * by strxfrm(), q.v.  That transformation is used when doing comparisons,
1878      * instead of the string itself.  If a string changes, the magic is
1879      * cleared.  The next time the locale changes, the index is incremented,
1880      * and so we know during a comparison that the transformation is not
1881      * necessarily still valid, and so is recomputed.  Note that if the locale
1882      * changes enough times, the index could wrap (a U32), and it is possible
1883      * that a transformation would improperly be considered valid, leading to
1884      * an unlikely bug */
1885
1886     if (! newcoll) {
1887         if (PL_collation_name) {
1888             ++PL_collation_ix;
1889             Safefree(PL_collation_name);
1890             PL_collation_name = NULL;
1891         }
1892         PL_collation_standard = TRUE;
1893       is_standard_collation:
1894         PL_collxfrm_base = 0;
1895         PL_collxfrm_mult = 2;
1896         PL_in_utf8_COLLATE_locale = FALSE;
1897         PL_strxfrm_NUL_replacement = '\0';
1898         PL_strxfrm_max_cp = 0;
1899         return;
1900     }
1901
1902     /* If this is not the same locale as currently, set the new one up */
1903     if (! PL_collation_name || strNE(PL_collation_name, newcoll)) {
1904         ++PL_collation_ix;
1905         Safefree(PL_collation_name);
1906         PL_collation_name = stdize_locale(savepv(newcoll));
1907         PL_collation_standard = isNAME_C_OR_POSIX(newcoll);
1908         if (PL_collation_standard) {
1909             goto is_standard_collation;
1910         }
1911
1912         PL_in_utf8_COLLATE_locale = _is_cur_LC_category_utf8(LC_COLLATE);
1913         PL_strxfrm_NUL_replacement = '\0';
1914         PL_strxfrm_max_cp = 0;
1915
1916         /* A locale collation definition includes primary, secondary, tertiary,
1917          * etc. weights for each character.  To sort, the primary weights are
1918          * used, and only if they compare equal, then the secondary weights are
1919          * used, and only if they compare equal, then the tertiary, etc.
1920          *
1921          * strxfrm() works by taking the input string, say ABC, and creating an
1922          * output transformed string consisting of first the primary weights,
1923          * A¹B¹C¹ followed by the secondary ones, A²B²C²; and then the
1924          * tertiary, etc, yielding A¹B¹C¹ A²B²C² A³B³C³ ....  Some characters
1925          * may not have weights at every level.  In our example, let's say B
1926          * doesn't have a tertiary weight, and A doesn't have a secondary
1927          * weight.  The constructed string is then going to be
1928          *  A¹B¹C¹ B²C² A³C³ ....
1929          * This has the desired effect that strcmp() will look at the secondary
1930          * or tertiary weights only if the strings compare equal at all higher
1931          * priority weights.  The spaces shown here, like in
1932          *  "A¹B¹C¹ A²B²C² "
1933          * are not just for readability.  In the general case, these must
1934          * actually be bytes, which we will call here 'separator weights'; and
1935          * they must be smaller than any other weight value, but since these
1936          * are C strings, only the terminating one can be a NUL (some
1937          * implementations may include a non-NUL separator weight just before
1938          * the NUL).  Implementations tend to reserve 01 for the separator
1939          * weights.  They are needed so that a shorter string's secondary
1940          * weights won't be misconstrued as primary weights of a longer string,
1941          * etc.  By making them smaller than any other weight, the shorter
1942          * string will sort first.  (Actually, if all secondary weights are
1943          * smaller than all primary ones, there is no need for a separator
1944          * weight between those two levels, etc.)
1945          *
1946          * The length of the transformed string is roughly a linear function of
1947          * the input string.  It's not exactly linear because some characters
1948          * don't have weights at all levels.  When we call strxfrm() we have to
1949          * allocate some memory to hold the transformed string.  The
1950          * calculations below try to find coefficients 'm' and 'b' for this
1951          * locale so that m*x + b equals how much space we need, given the size
1952          * of the input string in 'x'.  If we calculate too small, we increase
1953          * the size as needed, and call strxfrm() again, but it is better to
1954          * get it right the first time to avoid wasted expensive string
1955          * transformations. */
1956
1957         {
1958             /* We use the string below to find how long the tranformation of it
1959              * is.  Almost all locales are supersets of ASCII, or at least the
1960              * ASCII letters.  We use all of them, half upper half lower,
1961              * because if we used fewer, we might hit just the ones that are
1962              * outliers in a particular locale.  Most of the strings being
1963              * collated will contain a preponderance of letters, and even if
1964              * they are above-ASCII, they are likely to have the same number of
1965              * weight levels as the ASCII ones.  It turns out that digits tend
1966              * to have fewer levels, and some punctuation has more, but those
1967              * are relatively sparse in text, and khw believes this gives a
1968              * reasonable result, but it could be changed if experience so
1969              * dictates. */
1970             const char longer[] = "ABCDEFGHIJKLMnopqrstuvwxyz";
1971             char * x_longer;        /* Transformed 'longer' */
1972             Size_t x_len_longer;    /* Length of 'x_longer' */
1973
1974             char * x_shorter;   /* We also transform a substring of 'longer' */
1975             Size_t x_len_shorter;
1976
1977             /* _mem_collxfrm() is used get the transformation (though here we
1978              * are interested only in its length).  It is used because it has
1979              * the intelligence to handle all cases, but to work, it needs some
1980              * values of 'm' and 'b' to get it started.  For the purposes of
1981              * this calculation we use a very conservative estimate of 'm' and
1982              * 'b'.  This assumes a weight can be multiple bytes, enough to
1983              * hold any UV on the platform, and there are 5 levels, 4 weight
1984              * bytes, and a trailing NUL.  */
1985             PL_collxfrm_base = 5;
1986             PL_collxfrm_mult = 5 * sizeof(UV);
1987
1988             /* Find out how long the transformation really is */
1989             x_longer = _mem_collxfrm(longer,
1990                                      sizeof(longer) - 1,
1991                                      &x_len_longer,
1992
1993                                      /* We avoid converting to UTF-8 in the
1994                                       * called function by telling it the
1995                                       * string is in UTF-8 if the locale is a
1996                                       * UTF-8 one.  Since the string passed
1997                                       * here is invariant under UTF-8, we can
1998                                       * claim it's UTF-8 even though it isn't.
1999                                       * */
2000                                      PL_in_utf8_COLLATE_locale);
2001             Safefree(x_longer);
2002
2003             /* Find out how long the transformation of a substring of 'longer'
2004              * is.  Together the lengths of these transformations are
2005              * sufficient to calculate 'm' and 'b'.  The substring is all of
2006              * 'longer' except the first character.  This minimizes the chances
2007              * of being swayed by outliers */
2008             x_shorter = _mem_collxfrm(longer + 1,
2009                                       sizeof(longer) - 2,
2010                                       &x_len_shorter,
2011                                       PL_in_utf8_COLLATE_locale);
2012             Safefree(x_shorter);
2013
2014             /* If the results are nonsensical for this simple test, the whole
2015              * locale definition is suspect.  Mark it so that locale collation
2016              * is not active at all for it.  XXX Should we warn? */
2017             if (   x_len_shorter == 0
2018                 || x_len_longer == 0
2019                 || x_len_shorter >= x_len_longer)
2020             {
2021                 PL_collxfrm_mult = 0;
2022                 PL_collxfrm_base = 0;
2023             }
2024             else {
2025                 SSize_t base;       /* Temporary */
2026
2027                 /* We have both:    m * strlen(longer)  + b = x_len_longer
2028                  *                  m * strlen(shorter) + b = x_len_shorter;
2029                  * subtracting yields:
2030                  *          m * (strlen(longer) - strlen(shorter))
2031                  *                             = x_len_longer - x_len_shorter
2032                  * But we have set things up so that 'shorter' is 1 byte smaller
2033                  * than 'longer'.  Hence:
2034                  *          m = x_len_longer - x_len_shorter
2035                  *
2036                  * But if something went wrong, make sure the multiplier is at
2037                  * least 1.
2038                  */
2039                 if (x_len_longer > x_len_shorter) {
2040                     PL_collxfrm_mult = (STRLEN) x_len_longer - x_len_shorter;
2041                 }
2042                 else {
2043                     PL_collxfrm_mult = 1;
2044                 }
2045
2046                 /*     mx + b = len
2047                  * so:      b = len - mx
2048                  * but in case something has gone wrong, make sure it is
2049                  * non-negative */
2050                 base = x_len_longer - PL_collxfrm_mult * (sizeof(longer) - 1);
2051                 if (base < 0) {
2052                     base = 0;
2053                 }
2054
2055                 /* Add 1 for the trailing NUL */
2056                 PL_collxfrm_base = base + 1;
2057             }
2058
2059 #  ifdef DEBUGGING
2060
2061             if (DEBUG_L_TEST || debug_initialization) {
2062                 PerlIO_printf(Perl_debug_log,
2063                     "%s:%d: ?UTF-8 locale=%d; x_len_shorter=%zu, "
2064                     "x_len_longer=%zu,"
2065                     " collate multipler=%zu, collate base=%zu\n",
2066                     __FILE__, __LINE__,
2067                     PL_in_utf8_COLLATE_locale,
2068                     x_len_shorter, x_len_longer,
2069                     PL_collxfrm_mult, PL_collxfrm_base);
2070             }
2071 #  endif
2072
2073         }
2074     }
2075
2076 #endif /* USE_LOCALE_COLLATE */
2077
2078 }
2079
2080 #endif
2081
2082 #ifdef WIN32
2083
2084 STATIC char *
2085 S_win32_setlocale(pTHX_ int category, const char* locale)
2086 {
2087     /* This, for Windows, emulates POSIX setlocale() behavior.  There is no
2088      * difference between the two unless the input locale is "", which normally
2089      * means on Windows to get the machine default, which is set via the
2090      * computer's "Regional and Language Options" (or its current equivalent).
2091      * In POSIX, it instead means to find the locale from the user's
2092      * environment.  This routine changes the Windows behavior to first look in
2093      * the environment, and, if anything is found, use that instead of going to
2094      * the machine default.  If there is no environment override, the machine
2095      * default is used, by calling the real setlocale() with "".
2096      *
2097      * The POSIX behavior is to use the LC_ALL variable if set; otherwise to
2098      * use the particular category's variable if set; otherwise to use the LANG
2099      * variable. */
2100
2101     bool override_LC_ALL = FALSE;
2102     char * result;
2103     unsigned int i;
2104
2105     if (locale && strEQ(locale, "")) {
2106
2107 #  ifdef LC_ALL
2108
2109         locale = PerlEnv_getenv("LC_ALL");
2110         if (! locale) {
2111             if (category ==  LC_ALL) {
2112                 override_LC_ALL = TRUE;
2113             }
2114             else {
2115
2116 #  endif
2117
2118                 for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) {
2119                     if (category == categories[i]) {
2120                         locale = PerlEnv_getenv(category_names[i]);
2121                         goto found_locale;
2122                     }
2123                 }
2124
2125                 locale = PerlEnv_getenv("LANG");
2126                 if (! locale) {
2127                     locale = "";
2128                 }
2129
2130               found_locale: ;
2131
2132 #  ifdef LC_ALL
2133
2134             }
2135         }
2136
2137 #  endif
2138
2139     }
2140
2141     result = setlocale(category, locale);
2142     DEBUG_L(STMT_START {
2143                 dSAVE_ERRNO;
2144                 PerlIO_printf(Perl_debug_log, "%s:%d: %s\n", __FILE__, __LINE__,
2145                             setlocale_debug_string(category, locale, result));
2146                 RESTORE_ERRNO;
2147             } STMT_END);
2148
2149     if (! override_LC_ALL)  {
2150         return result;
2151     }
2152
2153     /* Here the input category was LC_ALL, and we have set it to what is in the
2154      * LANG variable or the system default if there is no LANG.  But these have
2155      * lower priority than the other LC_foo variables, so override it for each
2156      * one that is set.  (If they are set to "", it means to use the same thing
2157      * we just set LC_ALL to, so can skip) */
2158
2159     for (i = 0; i < LC_ALL_INDEX; i++) {
2160         result = PerlEnv_getenv(category_names[i]);
2161         if (result && strNE(result, "")) {
2162             setlocale(categories[i], result);
2163             DEBUG_Lv(PerlIO_printf(Perl_debug_log, "%s:%d: %s\n",
2164                 __FILE__, __LINE__,
2165                 setlocale_debug_string(categories[i], result, "not captured")));
2166         }
2167     }
2168
2169     result = setlocale(LC_ALL, NULL);
2170     DEBUG_L(STMT_START {
2171                 dSAVE_ERRNO;
2172                 PerlIO_printf(Perl_debug_log, "%s:%d: %s\n",
2173                                __FILE__, __LINE__,
2174                                setlocale_debug_string(LC_ALL, NULL, result));
2175                 RESTORE_ERRNO;
2176             } STMT_END);
2177
2178     return result;
2179 }
2180
2181 #endif
2182
2183 /*
2184
2185 =head1 Locale-related functions and macros
2186
2187 =for apidoc Perl_setlocale
2188
2189 This is an (almost) drop-in replacement for the system L<C<setlocale(3)>>,
2190 taking the same parameters, and returning the same information, except that it
2191 returns the correct underlying C<LC_NUMERIC> locale.  Regular C<setlocale> will
2192 instead return C<C> if the underlying locale has a non-dot decimal point
2193 character, or a non-empty thousands separator for displaying floating point
2194 numbers.  This is because perl keeps that locale category such that it has a
2195 dot and empty separator, changing the locale briefly during the operations
2196 where the underlying one is required. C<Perl_setlocale> knows about this, and
2197 compensates; regular C<setlocale> doesn't.
2198
2199 Another reason it isn't completely a drop-in replacement is that it is
2200 declared to return S<C<const char *>>, whereas the system setlocale omits the
2201 C<const> (presumably because its API was specified long ago, and can't be
2202 updated; it is illegal to change the information C<setlocale> returns; doing
2203 so leads to segfaults.)
2204
2205 Finally, C<Perl_setlocale> works under all circumstances, whereas plain
2206 C<setlocale> can be completely ineffective on some platforms under some
2207 configurations.
2208
2209 C<Perl_setlocale> should not be used to change the locale except on systems
2210 where the predefined variable C<${^SAFE_LOCALES}> is 1.  On some such systems,
2211 the system C<setlocale()> is ineffective, returning the wrong information, and
2212 failing to actually change the locale.  C<Perl_setlocale>, however works
2213 properly in all circumstances.
2214
2215 The return points to a per-thread static buffer, which is overwritten the next
2216 time C<Perl_setlocale> is called from the same thread.
2217
2218 =cut
2219
2220 */
2221
2222 const char *
2223 Perl_setlocale(const int category, const char * locale)
2224 {
2225     /* This wraps POSIX::setlocale() */
2226
2227 #ifdef NO_LOCALE
2228
2229     PERL_UNUSED_ARG(category);
2230     PERL_UNUSED_ARG(locale);
2231
2232     return "C";
2233
2234 #else
2235
2236     const char * retval;
2237     const char * newlocale;
2238     dSAVEDERRNO;
2239     dTHX;
2240     DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
2241
2242 #ifdef USE_LOCALE_NUMERIC
2243
2244     /* A NULL locale means only query what the current one is.  We have the
2245      * LC_NUMERIC name saved, because we are normally switched into the C
2246      * (or equivalent) locale for it.  For an LC_ALL query, switch back to get
2247      * the correct results.  All other categories don't require special
2248      * handling */
2249     if (locale == NULL) {
2250         if (category == LC_NUMERIC) {
2251
2252             /* We don't have to copy this return value, as it is a per-thread
2253              * variable, and won't change until a future setlocale */
2254             return PL_numeric_name;
2255         }
2256
2257 #  ifdef LC_ALL
2258
2259         else if (category == LC_ALL) {
2260             STORE_LC_NUMERIC_FORCE_TO_UNDERLYING();
2261         }
2262
2263 #  endif
2264
2265     }
2266
2267 #endif
2268
2269     retval = save_to_buffer(do_setlocale_r(category, locale),
2270                             &PL_setlocale_buf, &PL_setlocale_bufsize, 0);
2271     SAVE_ERRNO;
2272
2273 #if defined(USE_LOCALE_NUMERIC) && defined(LC_ALL)
2274
2275     if (locale == NULL && category == LC_ALL) {
2276         RESTORE_LC_NUMERIC();
2277     }
2278
2279 #endif
2280
2281     DEBUG_L(PerlIO_printf(Perl_debug_log,
2282         "%s:%d: %s\n", __FILE__, __LINE__,
2283             setlocale_debug_string(category, locale, retval)));
2284
2285     RESTORE_ERRNO;
2286
2287     if (! retval) {
2288         return NULL;
2289     }
2290
2291     /* If locale == NULL, we are just querying the state */
2292     if (locale == NULL) {
2293         return retval;
2294     }
2295
2296     /* Now that have switched locales, we have to update our records to
2297      * correspond. */
2298
2299     switch (category) {
2300
2301 #ifdef USE_LOCALE_CTYPE
2302
2303         case LC_CTYPE:
2304             new_ctype(retval);
2305             break;
2306
2307 #endif
2308 #ifdef USE_LOCALE_COLLATE
2309
2310         case LC_COLLATE:
2311             new_collate(retval);
2312             break;
2313
2314 #endif
2315 #ifdef USE_LOCALE_NUMERIC
2316
2317         case LC_NUMERIC:
2318             new_numeric(retval);
2319             break;
2320
2321 #endif
2322 #ifdef LC_ALL
2323
2324         case LC_ALL:
2325
2326             /* LC_ALL updates all the things we care about.  The values may not
2327              * be the same as 'retval', as the locale "" may have set things
2328              * individually */
2329
2330 #  ifdef USE_LOCALE_CTYPE
2331
2332             newlocale = savepv(do_setlocale_c(LC_CTYPE, NULL));
2333             new_ctype(newlocale);
2334             Safefree(newlocale);
2335
2336 #  endif /* USE_LOCALE_CTYPE */
2337 #  ifdef USE_LOCALE_COLLATE
2338
2339             newlocale = savepv(do_setlocale_c(LC_COLLATE, NULL));
2340             new_collate(newlocale);
2341             Safefree(newlocale);
2342
2343 #  endif
2344 #  ifdef USE_LOCALE_NUMERIC
2345
2346             newlocale = savepv(do_setlocale_c(LC_NUMERIC, NULL));
2347             new_numeric(newlocale);
2348             Safefree(newlocale);
2349
2350 #  endif /* USE_LOCALE_NUMERIC */
2351 #endif /* LC_ALL */
2352
2353         default:
2354             break;
2355     }
2356
2357     return retval;
2358
2359 #endif
2360
2361 }
2362
2363 PERL_STATIC_INLINE const char *
2364 S_save_to_buffer(const char * string, char **buf, Size_t *buf_size, const Size_t offset)
2365 {
2366     /* Copy the NUL-terminated 'string' to 'buf' + 'offset'.  'buf' has size 'buf_size',
2367      * growing it if necessary */
2368
2369     Size_t string_size;
2370
2371     PERL_ARGS_ASSERT_SAVE_TO_BUFFER;
2372
2373     if (! string) {
2374         return NULL;
2375     }
2376
2377     string_size = strlen(string) + offset + 1;
2378
2379     if (*buf_size == 0) {
2380         Newx(*buf, string_size, char);
2381         *buf_size = string_size;
2382     }
2383     else if (string_size > *buf_size) {
2384         Renew(*buf, string_size, char);
2385         *buf_size = string_size;
2386     }
2387
2388     Copy(string, *buf + offset, string_size - offset, char);
2389     return *buf;
2390 }
2391
2392 /*
2393
2394 =for apidoc Perl_langinfo
2395
2396 This is an (almost) drop-in replacement for the system C<L<nl_langinfo(3)>>,
2397 taking the same C<item> parameter values, and returning the same information.
2398 But it is more thread-safe than regular C<nl_langinfo()>, and hides the quirks
2399 of Perl's locale handling from your code, and can be used on systems that lack
2400 a native C<nl_langinfo>.
2401
2402 Expanding on these:
2403
2404 =over
2405
2406 =item *
2407
2408 The reason it isn't quite a drop-in replacement is actually an advantage.  The
2409 only difference is that it returns S<C<const char *>>, whereas plain
2410 C<nl_langinfo()> returns S<C<char *>>, but you are (only by documentation)
2411 forbidden to write into the buffer.  By declaring this C<const>, the compiler
2412 enforces this restriction, so if it is violated, you know at compilation time,
2413 rather than getting segfaults at runtime.
2414
2415 =item *
2416
2417 It delivers the correct results for the C<RADIXCHAR> and C<THOUSEP> items,
2418 without you having to write extra code.  The reason for the extra code would be
2419 because these are from the C<LC_NUMERIC> locale category, which is normally
2420 kept set by Perl so that the radix is a dot, and the separator is the empty
2421 string, no matter what the underlying locale is supposed to be, and so to get
2422 the expected results, you have to temporarily toggle into the underlying
2423 locale, and later toggle back.  (You could use plain C<nl_langinfo> and
2424 C<L</STORE_LC_NUMERIC_FORCE_TO_UNDERLYING>> for this but then you wouldn't get
2425 the other advantages of C<Perl_langinfo()>; not keeping C<LC_NUMERIC> in the C
2426 (or equivalent) locale would break a lot of CPAN, which is expecting the radix
2427 (decimal point) character to be a dot.)
2428
2429 =item *
2430
2431 The system function it replaces can have its static return buffer trashed,
2432 not only by a subesequent call to that function, but by a C<freelocale>,
2433 C<setlocale>, or other locale change.  The returned buffer of this function is
2434 not changed until the next call to it, so the buffer is never in a trashed
2435 state.
2436
2437 =item *
2438
2439 Its return buffer is per-thread, so it also is never overwritten by a call to
2440 this function from another thread;  unlike the function it replaces.
2441
2442 =item *
2443
2444 But most importantly, it works on systems that don't have C<nl_langinfo>, such
2445 as Windows, hence makes your code more portable.  Of the fifty-some possible
2446 items specified by the POSIX 2008 standard,
2447 L<http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/langinfo.h.html>,
2448 only one is completely unimplemented, though on non-Windows platforms, another
2449 significant one is also not implemented).  It uses various techniques to
2450 recover the other items, including calling C<L<localeconv(3)>>, and
2451 C<L<strftime(3)>>, both of which are specified in C89, so should be always be
2452 available.  Later C<strftime()> versions have additional capabilities; C<""> is
2453 returned for those not available on your system.
2454
2455 It is important to note that when called with an item that is recovered by
2456 using C<localeconv>, the buffer from any previous explicit call to
2457 C<localeconv> will be overwritten.  This means you must save that buffer's
2458 contents if you need to access them after a call to this function.  (But note
2459 that you might not want to be using C<localeconv()> directly anyway, because of
2460 issues like the ones listed in the second item of this list (above) for
2461 C<RADIXCHAR> and C<THOUSEP>.  You can use the methods given in L<perlcall> to
2462 call L<POSIX/localeconv> and avoid all the issues, but then you have a hash to
2463 unpack).
2464
2465 The details for those items which may deviate from what this emulation returns
2466 and what a native C<nl_langinfo()> would return are specified in
2467 L<I18N::Langinfo>.
2468
2469 =back
2470
2471 When using C<Perl_langinfo> on systems that don't have a native
2472 C<nl_langinfo()>, you must
2473
2474  #include "perl_langinfo.h"
2475
2476 before the C<perl.h> C<#include>.  You can replace your C<langinfo.h>
2477 C<#include> with this one.  (Doing it this way keeps out the symbols that plain
2478 C<langinfo.h> would try to import into the namespace for code that doesn't need
2479 it.)
2480
2481 The original impetus for C<Perl_langinfo()> was so that code that needs to
2482 find out the current currency symbol, floating point radix character, or digit
2483 grouping separator can use, on all systems, the simpler and more
2484 thread-friendly C<nl_langinfo> API instead of C<L<localeconv(3)>> which is a
2485 pain to make thread-friendly.  For other fields returned by C<localeconv>, it
2486 is better to use the methods given in L<perlcall> to call
2487 L<C<POSIX::localeconv()>|POSIX/localeconv>, which is thread-friendly.
2488
2489 =cut
2490
2491 */
2492
2493 const char *
2494 #ifdef HAS_NL_LANGINFO
2495 Perl_langinfo(const nl_item item)
2496 #else
2497 Perl_langinfo(const int item)
2498 #endif
2499 {
2500     return my_nl_langinfo(item, TRUE);
2501 }
2502
2503 STATIC const char *
2504 #ifdef HAS_NL_LANGINFO
2505 S_my_nl_langinfo(const nl_item item, bool toggle)
2506 #else
2507 S_my_nl_langinfo(const int item, bool toggle)
2508 #endif
2509 {
2510     dTHX;
2511     const char * retval;
2512
2513 #ifdef USE_LOCALE_NUMERIC
2514
2515     /* We only need to toggle into the underlying LC_NUMERIC locale for these
2516      * two items, and only if not already there */
2517     if (toggle && ((   item != RADIXCHAR && item != THOUSEP)
2518                     || PL_numeric_underlying))
2519
2520 #endif  /* No toggling needed if not using LC_NUMERIC */
2521
2522         toggle = FALSE;
2523
2524 #if defined(HAS_NL_LANGINFO) /* nl_langinfo() is available.  */
2525 #  if   ! defined(HAS_THREAD_SAFE_NL_LANGINFO_L)      \
2526      || ! defined(HAS_POSIX_2008_LOCALE)              \
2527      || ! defined(DUPLOCALE)
2528
2529     /* Here, use plain nl_langinfo(), switching to the underlying LC_NUMERIC
2530      * for those items dependent on it.  This must be copied to a buffer before
2531      * switching back, as some systems destroy the buffer when setlocale() is
2532      * called */
2533
2534     {
2535         DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
2536
2537         if (toggle) {
2538             STORE_LC_NUMERIC_FORCE_TO_UNDERLYING();
2539         }
2540
2541         LOCALE_LOCK;    /* Prevent interference from another thread executing
2542                            this code section (the only call to nl_langinfo in
2543                            the core) */
2544
2545
2546         /* Copy to a per-thread buffer, which is also one that won't be
2547          * destroyed by a subsequent setlocale(), such as the
2548          * RESTORE_LC_NUMERIC may do just below. */
2549         retval = save_to_buffer(nl_langinfo(item),
2550                                 &PL_langinfo_buf, &PL_langinfo_bufsize, 0);
2551
2552         LOCALE_UNLOCK;
2553
2554         if (toggle) {
2555             RESTORE_LC_NUMERIC();
2556         }
2557     }
2558
2559 #  else /* Use nl_langinfo_l(), avoiding both a mutex and changing the locale */
2560
2561     {
2562         bool do_free = FALSE;
2563         locale_t cur = uselocale((locale_t) 0);
2564
2565         if (cur == LC_GLOBAL_LOCALE) {
2566             cur = duplocale(LC_GLOBAL_LOCALE);
2567             do_free = TRUE;
2568         }
2569
2570 #    ifdef USE_LOCALE_NUMERIC
2571
2572         if (toggle) {
2573             if (PL_underlying_numeric_obj) {
2574                 cur = PL_underlying_numeric_obj;
2575             }
2576             else {
2577                 cur = newlocale(LC_NUMERIC_MASK, PL_numeric_name, cur);
2578                 do_free = TRUE;
2579             }
2580         }
2581
2582 #    endif
2583
2584         /* We have to save it to a buffer, because the freelocale() just below
2585          * can invalidate the internal one */
2586         retval = save_to_buffer(nl_langinfo_l(item, cur),
2587                                 &PL_langinfo_buf, &PL_langinfo_bufsize, 0);
2588
2589         if (do_free) {
2590             freelocale(cur);
2591         }
2592     }
2593
2594 #  endif
2595
2596     if (strEQ(retval, "")) {
2597         if (item == YESSTR) {
2598             return "yes";
2599         }
2600         if (item == NOSTR) {
2601             return "no";
2602         }
2603     }
2604
2605     return retval;
2606
2607 #else   /* Below, emulate nl_langinfo as best we can */
2608
2609     {
2610
2611 #  ifdef HAS_LOCALECONV
2612
2613         const struct lconv* lc;
2614         const char * temp;
2615         DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
2616
2617 #    ifdef TS_W32_BROKEN_LOCALECONV
2618
2619         const char * save_global;
2620         const char * save_thread;
2621         int needed_size;
2622         char * ptr;
2623         char * e;
2624         char * item_start;
2625
2626 #    endif
2627 #  endif
2628 #  ifdef HAS_STRFTIME
2629
2630         struct tm tm;
2631         bool return_format = FALSE; /* Return the %format, not the value */
2632         const char * format;
2633
2634 #  endif
2635
2636         /* We copy the results to a per-thread buffer, even if not
2637          * multi-threaded.  This is in part to simplify this code, and partly
2638          * because we need a buffer anyway for strftime(), and partly because a
2639          * call of localeconv() could otherwise wipe out the buffer, and the
2640          * programmer would not be expecting this, as this is a nl_langinfo()
2641          * substitute after all, so s/he might be thinking their localeconv()
2642          * is safe until another localeconv() call. */
2643
2644         switch (item) {
2645             Size_t len;
2646
2647             /* This is unimplemented */
2648             case ERA:      /* For use with strftime() %E modifier */
2649
2650             default:
2651                 return "";
2652
2653             /* We use only an English set, since we don't know any more */
2654             case YESEXPR:   return "^[+1yY]";
2655             case YESSTR:    return "yes";
2656             case NOEXPR:    return "^[-0nN]";
2657             case NOSTR:     return "no";
2658
2659             case CODESET:
2660
2661 #  ifndef WIN32
2662
2663                 /* On non-windows, this is unimplemented, in part because of
2664                  * inconsistencies between vendors.  The Darwin native
2665                  * nl_langinfo() implementation simply looks at everything past
2666                  * any dot in the name, but that doesn't work for other
2667                  * vendors.  Many Linux locales that don't have UTF-8 in their
2668                  * names really are UTF-8, for example; z/OS locales that do
2669                  * have UTF-8 in their names, aren't really UTF-8 */
2670                 return "";
2671
2672 #  else
2673
2674                 {   /* But on Windows, the name does seem to be consistent, so
2675                        use that. */
2676                     const char * p;
2677                     const char * first;
2678                     Size_t offset = 0;
2679                     const char * name = my_setlocale(LC_CTYPE, NULL);
2680
2681                     if (isNAME_C_OR_POSIX(name)) {
2682                         return "ANSI_X3.4-1968";
2683                     }
2684
2685                     /* Find the dot in the locale name */
2686                     first = (const char *) strchr(name, '.');
2687                     if (! first) {
2688                         first = name;
2689                         goto has_nondigit;
2690                     }
2691
2692                     /* Look at everything past the dot */
2693                     first++;
2694                     p = first;
2695
2696                     while (*p) {
2697                         if (! isDIGIT(*p)) {
2698                             goto has_nondigit;
2699                         }
2700
2701                         p++;
2702                     }
2703
2704                     /* Here everything past the dot is a digit.  Treat it as a
2705                      * code page */
2706                     retval = save_to_buffer("CP", &PL_langinfo_buf,
2707                                                 &PL_langinfo_bufsize, 0);
2708                     offset = STRLENs("CP");
2709
2710                   has_nondigit:
2711
2712                     retval = save_to_buffer(first, &PL_langinfo_buf,
2713                                             &PL_langinfo_bufsize, offset);
2714                 }
2715
2716                 break;
2717
2718 #  endif
2719 #  ifdef HAS_LOCALECONV
2720
2721             case CRNCYSTR:
2722
2723                 /* We don't bother with localeconv_l() because any system that
2724                  * has it is likely to also have nl_langinfo() */
2725
2726                 LOCALE_LOCK_V;    /* Prevent interference with other threads
2727                                      using localeconv() */
2728
2729 #    ifdef TS_W32_BROKEN_LOCALECONV
2730
2731                 /* This is a workaround for a Windows bug prior to VS 15.
2732                  * What we do here is, while locked, switch to the global
2733                  * locale so localeconv() works; then switch back just before
2734                  * the unlock.  This can screw things up if some thread is
2735                  * already using the global locale while assuming no other is.
2736                  * A different workaround would be to call GetCurrencyFormat on
2737                  * a known value, and parse it; patches welcome
2738                  *
2739                  * We have to use LC_ALL instead of LC_MONETARY because of
2740                  * another bug in Windows */
2741
2742                 save_thread = savepv(my_setlocale(LC_ALL, NULL));
2743                 _configthreadlocale(_DISABLE_PER_THREAD_LOCALE);
2744                 save_global= savepv(my_setlocale(LC_ALL, NULL));
2745                 my_setlocale(LC_ALL, save_thread);
2746
2747 #    endif
2748
2749                 lc = localeconv();
2750                 if (   ! lc
2751                     || ! lc->currency_symbol
2752                     || strEQ("", lc->currency_symbol))
2753                 {
2754                     LOCALE_UNLOCK_V;
2755                     return "";
2756                 }
2757
2758                 /* Leave the first spot empty to be filled in below */
2759                 retval = save_to_buffer(lc->currency_symbol, &PL_langinfo_buf,
2760                                         &PL_langinfo_bufsize, 1);
2761                 if (lc->mon_decimal_point && strEQ(lc->mon_decimal_point, ""))
2762                 { /*  khw couldn't figure out how the localedef specifications
2763                       would show that the $ should replace the radix; this is
2764                       just a guess as to how it might work.*/
2765                     PL_langinfo_buf[0] = '.';
2766                 }
2767                 else if (lc->p_cs_precedes) {
2768                     PL_langinfo_buf[0] = '-';
2769                 }
2770                 else {
2771                     PL_langinfo_buf[0] = '+';
2772                 }
2773
2774 #    ifdef TS_W32_BROKEN_LOCALECONV
2775
2776                 my_setlocale(LC_ALL, save_global);
2777                 _configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
2778                 my_setlocale(LC_ALL, save_thread);
2779                 Safefree(save_global);
2780                 Safefree(save_thread);
2781
2782 #    endif
2783
2784                 LOCALE_UNLOCK_V;
2785                 break;
2786
2787 #    ifdef TS_W32_BROKEN_LOCALECONV
2788
2789             case RADIXCHAR:
2790
2791                 /* For this, we output a known simple floating point number to
2792                  * a buffer, and parse it, looking for the radix */
2793
2794                 if (toggle) {
2795                     STORE_LC_NUMERIC_FORCE_TO_UNDERLYING();
2796                 }
2797
2798                 if (PL_langinfo_bufsize < 10) {
2799                     PL_langinfo_bufsize = 10;
2800                     Renew(PL_langinfo_buf, PL_langinfo_bufsize, char);
2801                 }
2802
2803                 needed_size = my_snprintf(PL_langinfo_buf, PL_langinfo_bufsize,
2804                                           "%.1f", 1.5);
2805                 if (needed_size >= (int) PL_langinfo_bufsize) {
2806                     PL_langinfo_bufsize = needed_size + 1;
2807                     Renew(PL_langinfo_buf, PL_langinfo_bufsize, char);
2808                     needed_size = my_snprintf(PL_langinfo_buf, PL_langinfo_bufsize,
2809                                              "%.1f", 1.5);
2810                     assert(needed_size < (int) PL_langinfo_bufsize);
2811                 }
2812
2813                 ptr = PL_langinfo_buf;
2814                 e = PL_langinfo_buf + PL_langinfo_bufsize;
2815
2816                 /* Find the '1' */
2817                 while (ptr < e && *ptr != '1') {
2818                     ptr++;
2819                 }
2820                 ptr++;
2821
2822                 /* Find the '5' */
2823                 item_start = ptr;
2824                 while (ptr < e && *ptr != '5') {
2825                     ptr++;
2826                 }
2827
2828                 /* Everything in between is the radix string */
2829                 if (ptr >= e) {
2830                     PL_langinfo_buf[0] = '?';
2831                     PL_langinfo_buf[1] = '\0';
2832                 }
2833                 else {
2834                     *ptr = '\0';
2835                     Move(item_start, PL_langinfo_buf, ptr - PL_langinfo_buf, char);
2836                 }
2837
2838                 if (toggle) {
2839                     RESTORE_LC_NUMERIC();
2840                 }
2841
2842                 retval = PL_langinfo_buf;
2843                 break;
2844
2845 #    else
2846
2847             case RADIXCHAR:     /* No special handling needed */
2848
2849 #    endif
2850
2851             case THOUSEP:
2852
2853                 if (toggle) {
2854                     STORE_LC_NUMERIC_FORCE_TO_UNDERLYING();
2855                 }
2856
2857                 LOCALE_LOCK_V;    /* Prevent interference with other threads
2858                                      using localeconv() */
2859
2860 #    ifdef TS_W32_BROKEN_LOCALECONV
2861
2862                 /* This should only be for the thousands separator.  A
2863                  * different work around would be to use GetNumberFormat on a
2864                  * known value and parse the result to find the separator */
2865                 save_thread = savepv(my_setlocale(LC_ALL, NULL));
2866                 _configthreadlocale(_DISABLE_PER_THREAD_LOCALE);
2867                 save_global = savepv(my_setlocale(LC_ALL, NULL));
2868                 my_setlocale(LC_ALL, save_thread);
2869 #      if 0
2870                 /* This is the start of code that for broken Windows replaces
2871                  * the above and below code, and instead calls
2872                  * GetNumberFormat() and then would parse that to find the
2873                  * thousands separator.  It needs to handle UTF-16 vs -8
2874                  * issues. */
2875
2876                 needed_size = GetNumberFormatEx(PL_numeric_name, 0, "1234.5", NULL, PL_langinfo_buf, PL_langinfo_bufsize);
2877                 DEBUG_L(PerlIO_printf(Perl_debug_log,
2878                     "%s: %d: return from GetNumber, count=%d, val=%s\n",
2879                     __FILE__, __LINE__, needed_size, PL_langinfo_buf));
2880
2881 #      endif
2882 #    endif
2883
2884                 lc = localeconv();
2885                 if (! lc) {
2886                     temp = "";
2887                 }
2888                 else {
2889                     temp = (item == RADIXCHAR)
2890                              ? lc->decimal_point
2891                              : lc->thousands_sep;
2892                     if (! temp) {
2893                         temp = "";
2894                     }
2895                 }
2896
2897                 retval = save_to_buffer(temp, &PL_langinfo_buf,
2898                                         &PL_langinfo_bufsize, 0);
2899
2900 #    ifdef TS_W32_BROKEN_LOCALECONV
2901
2902                 my_setlocale(LC_ALL, save_global);
2903                 _configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
2904                 my_setlocale(LC_ALL, save_thread);
2905                 Safefree(save_global);
2906                 Safefree(save_thread);
2907
2908 #    endif
2909
2910                 LOCALE_UNLOCK_V;
2911
2912                 if (toggle) {
2913                     RESTORE_LC_NUMERIC();
2914                 }
2915
2916                 break;
2917
2918 #  endif
2919 #  ifdef HAS_STRFTIME
2920
2921             /* These are defined by C89, so we assume that strftime supports
2922              * them, and so are returned unconditionally; they may not be what
2923              * the locale actually says, but should give good enough results
2924              * for someone using them as formats (as opposed to trying to parse
2925              * them to figure out what the locale says).  The other format
2926              * items are actually tested to verify they work on the platform */
2927             case D_FMT:         return "%x";
2928             case T_FMT:         return "%X";
2929             case D_T_FMT:       return "%c";
2930
2931             /* These formats are only available in later strfmtime's */
2932             case ERA_D_FMT: case ERA_T_FMT: case ERA_D_T_FMT: case T_FMT_AMPM:
2933
2934             /* The rest can be gotten from most versions of strftime(). */
2935             case ABDAY_1: case ABDAY_2: case ABDAY_3:
2936             case ABDAY_4: case ABDAY_5: case ABDAY_6: case ABDAY_7:
2937             case ALT_DIGITS:
2938             case AM_STR: case PM_STR:
2939             case ABMON_1: case ABMON_2: case ABMON_3: case ABMON_4:
2940             case ABMON_5: case ABMON_6: case ABMON_7: case ABMON_8:
2941             case ABMON_9: case ABMON_10: case ABMON_11: case ABMON_12:
2942             case DAY_1: case DAY_2: case DAY_3: case DAY_4:
2943             case DAY_5: case DAY_6: case DAY_7:
2944             case MON_1: case MON_2: case MON_3: case MON_4:
2945             case MON_5: case MON_6: case MON_7: case MON_8:
2946             case MON_9: case MON_10: case MON_11: case MON_12:
2947
2948                 LOCALE_LOCK;
2949
2950                 init_tm(&tm);   /* Precaution against core dumps */
2951                 tm.tm_sec = 30;
2952                 tm.tm_min = 30;
2953                 tm.tm_hour = 6;
2954                 tm.tm_year = 2017 - 1900;
2955                 tm.tm_wday = 0;
2956                 tm.tm_mon = 0;
2957                 switch (item) {
2958                     default:
2959                         LOCALE_UNLOCK;
2960                         Perl_croak(aTHX_
2961                                     "panic: %s: %d: switch case: %d problem",
2962                                        __FILE__, __LINE__, item);
2963                         NOT_REACHED; /* NOTREACHED */
2964
2965                     case PM_STR: tm.tm_hour = 18;
2966                     case AM_STR:
2967                         format = "%p";
2968                         break;
2969
2970                     case ABDAY_7: tm.tm_wday++;
2971                     case ABDAY_6: tm.tm_wday++;
2972                     case ABDAY_5: tm.tm_wday++;
2973                     case ABDAY_4: tm.tm_wday++;
2974                     case ABDAY_3: tm.tm_wday++;
2975                     case ABDAY_2: tm.tm_wday++;
2976                     case ABDAY_1:
2977                         format = "%a";
2978                         break;
2979
2980                     case DAY_7: tm.tm_wday++;
2981                     case DAY_6: tm.tm_wday++;
2982                     case DAY_5: tm.tm_wday++;
2983                     case DAY_4: tm.tm_wday++;
2984                     case DAY_3: tm.tm_wday++;
2985                     case DAY_2: tm.tm_wday++;
2986                     case DAY_1:
2987                         format = "%A";
2988                         break;
2989
2990                     case ABMON_12: tm.tm_mon++;
2991                     case ABMON_11: tm.tm_mon++;
2992                     case ABMON_10: tm.tm_mon++;
2993                     case ABMON_9: tm.tm_mon++;
2994                     case ABMON_8: tm.tm_mon++;
2995                     case ABMON_7: tm.tm_mon++;
2996                     case ABMON_6: tm.tm_mon++;
2997                     case ABMON_5: tm.tm_mon++;
2998                     case ABMON_4: tm.tm_mon++;
2999                     case ABMON_3: tm.tm_mon++;
3000                     case ABMON_2: tm.tm_mon++;
3001                     case ABMON_1:
3002                         format = "%b";
3003                         break;
3004
3005                     case MON_12: tm.tm_mon++;
3006                     case MON_11: tm.tm_mon++;
3007                     case MON_10: tm.tm_mon++;
3008                     case MON_9: tm.tm_mon++;
3009                     case MON_8: tm.tm_mon++;
3010                     case MON_7: tm.tm_mon++;
3011                     case MON_6: tm.tm_mon++;
3012                     case MON_5: tm.tm_mon++;
3013                     case MON_4: tm.tm_mon++;
3014                     case MON_3: tm.tm_mon++;
3015                     case MON_2: tm.tm_mon++;
3016                     case MON_1:
3017                         format = "%B";
3018                         break;
3019
3020                     case T_FMT_AMPM:
3021                         format = "%r";
3022                         return_format = TRUE;
3023                         break;
3024
3025                     case ERA_D_FMT:
3026                         format = "%Ex";
3027                         return_format = TRUE;
3028                         break;
3029
3030                     case ERA_T_FMT:
3031                         format = "%EX";
3032                         return_format = TRUE;
3033                         break;
3034
3035                     case ERA_D_T_FMT:
3036                         format = "%Ec";
3037                         return_format = TRUE;
3038                         break;
3039
3040                     case ALT_DIGITS:
3041                         tm.tm_wday = 0;
3042                         format = "%Ow"; /* Find the alternate digit for 0 */
3043                         break;
3044                 }
3045
3046                 /* We can't use my_strftime() because it doesn't look at
3047                  * tm_wday  */
3048                 while (0 == strftime(PL_langinfo_buf, PL_langinfo_bufsize,
3049                                      format, &tm))
3050                 {
3051                     /* A zero return means one of:
3052                      *  a)  there wasn't enough space in PL_langinfo_buf
3053                      *  b)  the format, like a plain %p, returns empty
3054                      *  c)  it was an illegal format, though some
3055                      *      implementations of strftime will just return the
3056                      *      illegal format as a plain character sequence.
3057                      *
3058                      *  To quickly test for case 'b)', try again but precede
3059                      *  the format with a plain character.  If that result is
3060                      *  still empty, the problem is either 'a)' or 'c)' */
3061
3062                     Size_t format_size = strlen(format) + 1;
3063                     Size_t mod_size = format_size + 1;
3064                     char * mod_format;
3065                     char * temp_result;
3066
3067                     Newx(mod_format, mod_size, char);
3068                     Newx(temp_result, PL_langinfo_bufsize, char);
3069                     *mod_format = ' ';
3070                     my_strlcpy(mod_format + 1, format, mod_size);
3071                     len = strftime(temp_result,
3072                                    PL_langinfo_bufsize,
3073                                    mod_format, &tm);
3074                     Safefree(mod_format);
3075                     Safefree(temp_result);
3076
3077                     /* If 'len' is non-zero, it means that we had a case like
3078                      * %p which means the current locale doesn't use a.m. or
3079                      * p.m., and that is valid */
3080                     if (len == 0) {
3081
3082                         /* Here, still didn't work.  If we get well beyond a
3083                          * reasonable size, bail out to prevent an infinite
3084                          * loop. */
3085
3086                         if (PL_langinfo_bufsize > 100 * format_size) {
3087                             *PL_langinfo_buf = '\0';
3088                         }
3089                         else {
3090                             /* Double the buffer size to retry;  Add 1 in case
3091                              * original was 0, so we aren't stuck at 0.  */
3092                             PL_langinfo_bufsize *= 2;
3093                             PL_langinfo_bufsize++;
3094                             Renew(PL_langinfo_buf, PL_langinfo_bufsize, char);
3095                             continue;
3096                         }
3097                     }
3098
3099                     break;
3100                 }
3101
3102                 /* Here, we got a result.
3103                  *
3104                  * If the item is 'ALT_DIGITS', PL_langinfo_buf contains the
3105                  * alternate format for wday 0.  If the value is the same as
3106                  * the normal 0, there isn't an alternate, so clear the buffer.
3107                  * */
3108                 if (   item == ALT_DIGITS
3109                     && strEQ(PL_langinfo_buf, "0"))
3110                 {
3111                     *PL_langinfo_buf = '\0';
3112                 }
3113
3114                 /* ALT_DIGITS is problematic.  Experiments on it showed that
3115                  * strftime() did not always work properly when going from
3116                  * alt-9 to alt-10.  Only a few locales have this item defined,
3117                  * and in all of them on Linux that khw was able to find,
3118                  * nl_langinfo() merely returned the alt-0 character, possibly
3119                  * doubled.  Most Unicode digits are in blocks of 10
3120                  * consecutive code points, so that is sufficient information
3121                  * for those scripts, as we can infer alt-1, alt-2, ....  But
3122                  * for a Japanese locale, a CJK ideographic 0 is returned, and
3123                  * the CJK digits are not in code point order, so you can't
3124                  * really infer anything.  The localedef for this locale did
3125                  * specify the succeeding digits, so that strftime() works
3126                  * properly on them, without needing to infer anything.  But
3127                  * the nl_langinfo() return did not give sufficient information
3128                  * for the caller to understand what's going on.  So until
3129                  * there is evidence that it should work differently, this
3130                  * returns the alt-0 string for ALT_DIGITS.
3131                  *
3132                  * wday was chosen because its range is all a single digit.
3133                  * Things like tm_sec have two digits as the minimum: '00' */
3134
3135                 LOCALE_UNLOCK;
3136
3137                 retval = PL_langinfo_buf;
3138
3139                 /* If to return the format, not the value, overwrite the buffer
3140                  * with it.  But some strftime()s will keep the original format
3141                  * if illegal, so change those to "" */
3142                 if (return_format) {
3143                     if (strEQ(PL_langinfo_buf, format)) {
3144                         *PL_langinfo_buf = '\0';
3145                     }
3146                     else {
3147                         retval = save_to_buffer(format, &PL_langinfo_buf,
3148                                                 &PL_langinfo_bufsize, 0);
3149                     }
3150                 }
3151
3152                 break;
3153
3154 #  endif
3155
3156         }
3157     }
3158
3159     return retval;
3160
3161 #endif
3162
3163 }
3164
3165 /*
3166  * Initialize locale awareness.
3167  */
3168 int
3169 Perl_init_i18nl10n(pTHX_ int printwarn)
3170 {
3171     /* printwarn is
3172      *
3173      *    0 if not to output warning when setup locale is bad
3174      *    1 if to output warning based on value of PERL_BADLANG
3175      *    >1 if to output regardless of PERL_BADLANG
3176      *
3177      * returns
3178      *    1 = set ok or not applicable,
3179      *    0 = fallback to a locale of lower priority
3180      *   -1 = fallback to all locales failed, not even to the C locale
3181      *
3182      * Under -DDEBUGGING, if the environment variable PERL_DEBUG_LOCALE_INIT is
3183      * set, debugging information is output.
3184      *
3185      * This looks more complicated than it is, mainly due to the #ifdefs.
3186      *
3187      * We try to set LC_ALL to the value determined by the environment.  If
3188      * there is no LC_ALL on this platform, we try the individual categories we
3189      * know about.  If this works, we are done.
3190      *
3191      * But if it doesn't work, we have to do something else.  We search the
3192      * environment variables ourselves instead of relying on the system to do
3193      * it.  We look at, in order, LC_ALL, LANG, a system default locale (if we
3194      * think there is one), and the ultimate fallback "C".  This is all done in
3195      * the same loop as above to avoid duplicating code, but it makes things
3196      * more complex.  The 'trial_locales' array is initialized with just one
3197      * element; it causes the behavior described in the paragraph above this to
3198      * happen.  If that fails, we add elements to 'trial_locales', and do extra
3199      * loop iterations to cause the behavior described in this paragraph.
3200      *
3201      * On Ultrix, the locale MUST come from the environment, so there is
3202      * preliminary code to set it.  I (khw) am not sure that it is necessary,
3203      * and that this couldn't be folded into the loop, but barring any real
3204      * platforms to test on, it's staying as-is
3205      *
3206      * A slight complication is that in embedded Perls, the locale may already
3207      * be set-up, and we don't want to get it from the normal environment
3208      * variables.  This is handled by having a special environment variable
3209      * indicate we're in this situation.  We simply set setlocale's 2nd
3210      * parameter to be a NULL instead of "".  That indicates to setlocale that
3211      * it is not to change anything, but to return the current value,
3212      * effectively initializing perl's db to what the locale already is.
3213      *
3214      * We play the same trick with NULL if a LC_ALL succeeds.  We call
3215      * setlocale() on the individual categores with NULL to get their existing
3216      * values for our db, instead of trying to change them.
3217      * */
3218
3219     dVAR;
3220
3221     int ok = 1;
3222
3223 #ifndef USE_LOCALE
3224
3225     PERL_UNUSED_ARG(printwarn);
3226
3227 #else  /* USE_LOCALE */
3228 #  ifdef __GLIBC__
3229
3230     const char * const language   = savepv(PerlEnv_getenv("LANGUAGE"));
3231
3232 #  endif
3233
3234     /* NULL uses the existing already set up locale */
3235     const char * const setlocale_init = (PerlEnv_getenv("PERL_SKIP_LOCALE_INIT"))
3236                                         ? NULL
3237                                         : "";
3238     const char* trial_locales[5];   /* 5 = 1 each for "", LC_ALL, LANG, "", C */
3239     unsigned int trial_locales_count;
3240     const char * const lc_all     = savepv(PerlEnv_getenv("LC_ALL"));
3241     const char * const lang       = savepv(PerlEnv_getenv("LANG"));
3242     bool setlocale_failure = FALSE;
3243     unsigned int i;
3244
3245     /* A later getenv() could zap this, so only use here */
3246     const char * const bad_lang_use_once = PerlEnv_getenv("PERL_BADLANG");
3247
3248     const bool locwarn = (printwarn > 1
3249                           || (          printwarn
3250                               && (    ! bad_lang_use_once
3251                                   || (
3252                                          /* disallow with "" or "0" */
3253                                          *bad_lang_use_once
3254                                        && strNE("0", bad_lang_use_once)))));
3255
3256     /* setlocale() return vals; not copied so must be looked at immediately */
3257     const char * sl_result[NOMINAL_LC_ALL_INDEX + 1];
3258
3259     /* current locale for given category; should have been copied so aren't
3260      * volatile */
3261     const char * curlocales[NOMINAL_LC_ALL_INDEX + 1];
3262
3263 #  ifdef WIN32
3264
3265     /* In some systems you can find out the system default locale
3266      * and use that as the fallback locale. */
3267 #    define SYSTEM_DEFAULT_LOCALE
3268 #  endif
3269 #  ifdef SYSTEM_DEFAULT_LOCALE
3270
3271     const char *system_default_locale = NULL;
3272
3273 #  endif
3274
3275 #  ifndef DEBUGGING
3276 #    define DEBUG_LOCALE_INIT(a,b,c)
3277 #  else
3278
3279     DEBUG_INITIALIZATION_set(cBOOL(PerlEnv_getenv("PERL_DEBUG_LOCALE_INIT")));
3280
3281 #    define DEBUG_LOCALE_INIT(category, locale, result)                     \
3282         STMT_START {                                                        \
3283                 if (debug_initialization) {                                 \
3284                     PerlIO_printf(Perl_debug_log,                           \
3285                                   "%s:%d: %s\n",                            \
3286                                   __FILE__, __LINE__,                       \
3287                                   setlocale_debug_string(category,          \
3288                                                           locale,           \
3289                                                           result));         \
3290                 }                                                           \
3291         } STMT_END
3292
3293 /* Make sure the parallel arrays are properly set up */
3294 #    ifdef USE_LOCALE_NUMERIC
3295     assert(categories[LC_NUMERIC_INDEX] == LC_NUMERIC);
3296     assert(strEQ(category_names[LC_NUMERIC_INDEX], "LC_NUMERIC"));
3297 #      ifdef USE_POSIX_2008_LOCALE
3298     assert(category_masks[LC_NUMERIC_INDEX] == LC_NUMERIC_MASK);
3299 #      endif
3300 #    endif
3301 #    ifdef USE_LOCALE_CTYPE
3302     assert(categories[LC_CTYPE_INDEX] == LC_CTYPE);
3303     assert(strEQ(category_names[LC_CTYPE_INDEX], "LC_CTYPE"));
3304 #      ifdef USE_POSIX_2008_LOCALE
3305     assert(category_masks[LC_CTYPE_INDEX] == LC_CTYPE_MASK);
3306 #      endif
3307 #    endif
3308 #    ifdef USE_LOCALE_COLLATE
3309     assert(categories[LC_COLLATE_INDEX] == LC_COLLATE);
3310     assert(strEQ(category_names[LC_COLLATE_INDEX], "LC_COLLATE"));
3311 #      ifdef USE_POSIX_2008_LOCALE
3312     assert(category_masks[LC_COLLATE_INDEX] == LC_COLLATE_MASK);
3313 #      endif
3314 #    endif
3315 #    ifdef USE_LOCALE_TIME
3316     assert(categories[LC_TIME_INDEX] == LC_TIME);
3317     assert(strEQ(category_names[LC_TIME_INDEX], "LC_TIME"));
3318 #      ifdef USE_POSIX_2008_LOCALE
3319     assert(category_masks[LC_TIME_INDEX] == LC_TIME_MASK);
3320 #      endif
3321 #    endif
3322 #    ifdef USE_LOCALE_MESSAGES
3323     assert(categories[LC_MESSAGES_INDEX] == LC_MESSAGES);
3324     assert(strEQ(category_names[LC_MESSAGES_INDEX], "LC_MESSAGES"));
3325 #      ifdef USE_POSIX_2008_LOCALE
3326     assert(category_masks[LC_MESSAGES_INDEX] == LC_MESSAGES_MASK);
3327 #      endif
3328 #    endif
3329 #    ifdef USE_LOCALE_MONETARY
3330     assert(categories[LC_MONETARY_INDEX] == LC_MONETARY);
3331     assert(strEQ(category_names[LC_MONETARY_INDEX], "LC_MONETARY"));
3332 #      ifdef USE_POSIX_2008_LOCALE
3333     assert(category_masks[LC_MONETARY_INDEX] == LC_MONETARY_MASK);
3334 #      endif
3335 #    endif
3336 #    ifdef USE_LOCALE_ADDRESS
3337     assert(categories[LC_ADDRESS_INDEX] == LC_ADDRESS);
3338     assert(strEQ(category_names[LC_ADDRESS_INDEX], "LC_ADDRESS"));
3339 #      ifdef USE_POSIX_2008_LOCALE
3340     assert(category_masks[LC_ADDRESS_INDEX] == LC_ADDRESS_MASK);
3341 #      endif
3342 #    endif
3343 #    ifdef USE_LOCALE_IDENTIFICATION
3344     assert(categories[LC_IDENTIFICATION_INDEX] == LC_IDENTIFICATION);
3345     assert(strEQ(category_names[LC_IDENTIFICATION_INDEX], "LC_IDENTIFICATION"));
3346 #      ifdef USE_POSIX_2008_LOCALE
3347     assert(category_masks[LC_IDENTIFICATION_INDEX] == LC_IDENTIFICATION_MASK);
3348 #      endif
3349 #    endif
3350 #    ifdef USE_LOCALE_MEASUREMENT
3351     assert(categories[LC_MEASUREMENT_INDEX] == LC_MEASUREMENT);
3352     assert(strEQ(category_names[LC_MEASUREMENT_INDEX], "LC_MEASUREMENT"));
3353 #      ifdef USE_POSIX_2008_LOCALE
3354     assert(category_masks[LC_MEASUREMENT_INDEX] == LC_MEASUREMENT_MASK);
3355 #      endif
3356 #    endif
3357 #    ifdef USE_LOCALE_PAPER
3358     assert(categories[LC_PAPER_INDEX] == LC_PAPER);
3359     assert(strEQ(category_names[LC_PAPER_INDEX], "LC_PAPER"));
3360 #      ifdef USE_POSIX_2008_LOCALE
3361     assert(category_masks[LC_PAPER_INDEX] == LC_PAPER_MASK);
3362 #      endif
3363 #    endif
3364 #    ifdef USE_LOCALE_TELEPHONE
3365     assert(categories[LC_TELEPHONE_INDEX] == LC_TELEPHONE);
3366     assert(strEQ(category_names[LC_TELEPHONE_INDEX], "LC_TELEPHONE"));
3367 #      ifdef USE_POSIX_2008_LOCALE
3368     assert(category_masks[LC_TELEPHONE_INDEX] == LC_TELEPHONE_MASK);
3369 #      endif
3370 #    endif
3371 #    ifdef LC_ALL
3372     assert(categories[LC_ALL_INDEX] == LC_ALL);
3373     assert(strEQ(category_names[LC_ALL_INDEX], "LC_ALL"));
3374     assert(NOMINAL_LC_ALL_INDEX == LC_ALL_INDEX);
3375 #      ifdef USE_POSIX_2008_LOCALE
3376     assert(category_masks[LC_ALL_INDEX] == LC_ALL_MASK);
3377 #      endif
3378 #    endif
3379 #  endif    /* DEBUGGING */
3380
3381     /* Initialize the cache of the program's UTF-8ness for the always known
3382      * locales C and POSIX */
3383     my_strlcpy(PL_locale_utf8ness, C_and_POSIX_utf8ness,
3384                sizeof(PL_locale_utf8ness));
3385
3386 #  ifdef USE_THREAD_SAFE_LOCALE
3387 #    ifdef WIN32
3388
3389     _configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
3390
3391 #    endif
3392 #  endif
3393 #  ifdef USE_POSIX_2008_LOCALE
3394
3395     PL_C_locale_obj = newlocale(LC_ALL_MASK, "C", (locale_t) 0);
3396     if (! PL_C_locale_obj) {
3397         Perl_croak_nocontext(
3398             "panic: Cannot create POSIX 2008 C locale object; errno=%d", errno);
3399     }
3400     if (DEBUG_Lv_TEST || debug_initialization) {
3401         PerlIO_printf(Perl_debug_log, "%s:%d: created C object %p\n", __FILE__, __LINE__, PL_C_locale_obj);
3402     }
3403
3404 #  endif
3405
3406 #  ifdef USE_LOCALE_NUMERIC
3407
3408     PL_numeric_radix_sv = newSVpvs(".");
3409
3410 #  endif
3411
3412 #  if defined(USE_POSIX_2008_LOCALE) && ! defined(HAS_QUERYLOCALE)
3413
3414     /* Initialize our records.  If we have POSIX 2008, we have LC_ALL */
3415     do_setlocale_c(LC_ALL, my_setlocale(LC_ALL, NULL));
3416
3417 #  endif
3418 #  ifdef LOCALE_ENVIRON_REQUIRED
3419
3420     /*
3421      * Ultrix setlocale(..., "") fails if there are no environment
3422      * variables from which to get a locale name.
3423      */
3424
3425 #    ifndef LC_ALL
3426 #      error Ultrix without LC_ALL not implemented
3427 #    else
3428
3429     {
3430         bool done = FALSE;
3431         if (lang) {
3432             sl_result[LC_ALL_INDEX] = do_setlocale_c(LC_ALL, setlocale_init);
3433             DEBUG_LOCALE_INIT(LC_ALL, setlocale_init, sl_result[LC_ALL_INDEX]);
3434             if (sl_result[LC_ALL_INDEX])
3435                 done = TRUE;
3436             else
3437                 setlocale_failure = TRUE;
3438         }
3439         if (! setlocale_failure) {
3440             const char * locale_param;
3441             for (i = 0; i < LC_ALL_INDEX; i++) {
3442                 locale_param = (! done && (lang || PerlEnv_getenv(category_names[i])))
3443                             ? setlocale_init
3444                             : NULL;
3445                 sl_result[i] = do_setlocale_r(categories[i], locale_param);
3446                 if (! sl_result[i]) {
3447                     setlocale_failure = TRUE;
3448                 }
3449                 DEBUG_LOCALE_INIT(categories[i], locale_param, sl_result[i]);
3450             }
3451         }
3452     }
3453
3454 #    endif /* LC_ALL */
3455 #  endif /* LOCALE_ENVIRON_REQUIRED */
3456
3457     /* We try each locale in the list until we get one that works, or exhaust
3458      * the list.  Normally the loop is executed just once.  But if setting the
3459      * locale fails, inside the loop we add fallback trials to the array and so
3460      * will execute the loop multiple times */
3461     trial_locales[0] = setlocale_init;
3462     trial_locales_count = 1;
3463
3464     for (i= 0; i < trial_locales_count; i++) {
3465         const char * trial_locale = trial_locales[i];
3466
3467         if (i > 0) {
3468
3469             /* XXX This is to preserve old behavior for LOCALE_ENVIRON_REQUIRED
3470              * when i==0, but I (khw) don't think that behavior makes much
3471              * sense */
3472             setlocale_failure = FALSE;
3473
3474 #  ifdef SYSTEM_DEFAULT_LOCALE
3475 #    ifdef WIN32    /* Note that assumes Win32 has LC_ALL */
3476
3477             /* On Windows machines, an entry of "" after the 0th means to use
3478              * the system default locale, which we now proceed to get. */
3479             if (strEQ(trial_locale, "")) {
3480                 unsigned int j;
3481
3482                 /* Note that this may change the locale, but we are going to do
3483                  * that anyway just below */
3484                 system_default_locale = do_setlocale_c(LC_ALL, "");
3485                 DEBUG_LOCALE_INIT(LC_ALL, "", system_default_locale);
3486
3487                 /* Skip if invalid or if it's already on the list of locales to
3488                  * try */
3489                 if (! system_default_locale) {
3490                     goto next_iteration;
3491                 }
3492                 for (j = 0; j < trial_locales_count; j++) {
3493                     if (strEQ(system_default_locale, trial_locales[j])) {
3494                         goto next_iteration;
3495                     }
3496                 }
3497
3498                 trial_locale = system_default_locale;
3499             }
3500 #    else
3501 #      error SYSTEM_DEFAULT_LOCALE only implemented for Win32
3502 #    endif
3503 #  endif /* SYSTEM_DEFAULT_LOCALE */
3504
3505         }   /* For i > 0 */
3506
3507 #  ifdef LC_ALL
3508
3509         sl_result[LC_ALL_INDEX] = do_setlocale_c(LC_ALL, trial_locale);
3510         DEBUG_LOCALE_INIT(LC_ALL, trial_locale, sl_result[LC_ALL_INDEX]);
3511         if (! sl_result[LC_ALL_INDEX]) {
3512             setlocale_failure = TRUE;
3513         }
3514         else {
3515             /* Since LC_ALL succeeded, it should have changed all the other
3516              * categories it can to its value; so we massage things so that the
3517              * setlocales below just return their category's current values.
3518              * This adequately handles the case in NetBSD where LC_COLLATE may
3519              * not be defined for a locale, and setting it individually will
3520              * fail, whereas setting LC_ALL succeeds, leaving LC_COLLATE set to
3521              * the POSIX locale. */
3522             trial_locale = NULL;
3523         }
3524
3525 #  endif /* LC_ALL */
3526
3527         if (! setlocale_failure) {
3528             unsigned int j;
3529             for (j = 0; j < NOMINAL_LC_ALL_INDEX; j++) {
3530                 curlocales[j]
3531                         = savepv(do_setlocale_r(categories[j], trial_locale));
3532                 if (! curlocales[j]) {
3533                     setlocale_failure = TRUE;
3534                 }
3535                 DEBUG_LOCALE_INIT(categories[j], trial_locale, curlocales[j]);
3536             }
3537
3538             if (! setlocale_failure) {  /* All succeeded */
3539                 break;  /* Exit trial_locales loop */
3540             }
3541         }
3542
3543         /* Here, something failed; will need to try a fallback. */
3544         ok = 0;
3545
3546         if (i == 0) {
3547             unsigned int j;
3548
3549             if (locwarn) { /* Output failure info only on the first one */
3550
3551 #  ifdef LC_ALL
3552
3553                 PerlIO_printf(Perl_error_log,
3554                 "perl: warning: Setting locale failed.\n");
3555
3556 #  else /* !LC_ALL */
3557
3558                 PerlIO_printf(Perl_error_log,
3559                 "perl: warning: Setting locale failed for the categories:\n\t");
3560
3561                 for (j = 0; j < NOMINAL_LC_ALL_INDEX; j++) {
3562                     if (! curlocales[j]) {
3563                         PerlIO_printf(Perl_error_log, category_names[j]);
3564                     }
3565                     else {
3566                         Safefree(curlocales[j]);
3567                     }
3568                 }
3569
3570 #  endif /* LC_ALL */
3571
3572                 PerlIO_printf(Perl_error_log,
3573                     "perl: warning: Please check that your locale settings:\n");
3574
3575 #  ifdef __GLIBC__
3576
3577                 PerlIO_printf(Perl_error_log,
3578                             "\tLANGUAGE = %c%s%c,\n",
3579                             language ? '"' : '(',
3580                             language ? language : "unset",
3581                             language ? '"' : ')');
3582 #  endif
3583
3584                 PerlIO_printf(Perl_error_log,
3585                             "\tLC_ALL = %c%s%c,\n",
3586                             lc_all ? '"' : '(',
3587                             lc_all ? lc_all : "unset",
3588                             lc_all ? '"' : ')');
3589
3590 #  if defined(USE_ENVIRON_ARRAY)
3591
3592                 {
3593                     char **e;
3594
3595                     /* Look through the environment for any variables of the
3596                      * form qr/ ^ LC_ [A-Z]+ = /x, except LC_ALL which was
3597                      * already handled above.  These are assumed to be locale
3598                      * settings.  Output them and their values. */
3599                     for (e = environ; *e; e++) {
3600                         const STRLEN prefix_len = sizeof("LC_") - 1;
3601                         STRLEN uppers_len;
3602
3603                         if (     strBEGINs(*e, "LC_")
3604                             && ! strBEGINs(*e, "LC_ALL=")
3605                             && (uppers_len = strspn(*e + prefix_len,
3606                                              "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
3607                             && ((*e)[prefix_len + uppers_len] == '='))
3608                         {
3609                             PerlIO_printf(Perl_error_log, "\t%.*s = \"%s\",\n",
3610                                 (int) (prefix_len + uppers_len), *e,
3611                                 *e + prefix_len + uppers_len + 1);
3612                         }
3613                     }
3614                 }
3615
3616 #  else
3617
3618                 PerlIO_printf(Perl_error_log,
3619                             "\t(possibly more locale environment variables)\n");
3620
3621 #  endif
3622
3623                 PerlIO_printf(Perl_error_log,
3624                             "\tLANG = %c%s%c\n",
3625                             lang ? '"' : '(',
3626                             lang ? lang : "unset",
3627                             lang ? '"' : ')');
3628
3629                 PerlIO_printf(Perl_error_log,
3630                             "    are supported and installed on your system.\n");
3631             }
3632
3633             /* Calculate what fallback locales to try.  We have avoided this
3634              * until we have to, because failure is quite unlikely.  This will
3635              * usually change the upper bound of the loop we are in.
3636              *
3637              * Since the system's default way of setting the locale has not
3638              * found one that works, We use Perl's defined ordering: LC_ALL,
3639              * LANG, and the C locale.  We don't try the same locale twice, so
3640              * don't add to the list if already there.  (On POSIX systems, the
3641              * LC_ALL element will likely be a repeat of the 0th element "",
3642              * but there's no harm done by doing it explicitly.
3643              *
3644              * Note that this tries the LC_ALL environment variable even on
3645              * systems which have no LC_ALL locale setting.  This may or may
3646              * not have been originally intentional, but there's no real need
3647              * to change the behavior. */
3648             if (lc_all) {
3649                 for (j = 0; j < trial_locales_count; j++) {
3650                     if (strEQ(lc_all, trial_locales[j])) {
3651                         goto done_lc_all;
3652                     }
3653                 }
3654                 trial_locales[trial_locales_count++] = lc_all;
3655             }
3656           done_lc_all:
3657
3658             if (lang) {
3659                 for (j = 0; j < trial_locales_count; j++) {
3660                     if (strEQ(lang, trial_locales[j])) {
3661                         goto done_lang;
3662                     }
3663                 }
3664                 trial_locales[trial_locales_count++] = lang;
3665             }
3666           done_lang:
3667
3668 #  if defined(WIN32) && defined(LC_ALL)
3669
3670             /* For Windows, we also try the system default locale before "C".
3671              * (If there exists a Windows without LC_ALL we skip this because
3672              * it gets too complicated.  For those, the "C" is the next
3673              * fallback possibility).  The "" is the same as the 0th element of
3674              * the array, but the code at the loop above knows to treat it
3675              * differently when not the 0th */
3676             trial_locales[trial_locales_count++] = "";
3677
3678 #  endif
3679
3680             for (j = 0; j < trial_locales_count; j++) {
3681                 if (strEQ("C", trial_locales[j])) {
3682                     goto done_C;
3683                 }
3684             }
3685             trial_locales[trial_locales_count++] = "C";
3686
3687           done_C: ;
3688         }   /* end of first time through the loop */
3689
3690 #  ifdef WIN32
3691
3692       next_iteration: ;
3693
3694 #  endif
3695
3696     }   /* end of looping through the trial locales */
3697
3698     if (ok < 1) {   /* If we tried to fallback */
3699         const char* msg;
3700         if (! setlocale_failure) {  /* fallback succeeded */
3701            msg = "Falling back to";
3702         }
3703         else {  /* fallback failed */
3704             unsigned int j;
3705
3706             /* We dropped off the end of the loop, so have to decrement i to
3707              * get back to the value the last time through */
3708             i--;
3709
3710             ok = -1;
3711             msg = "Failed to fall back to";
3712
3713             /* To continue, we should use whatever values we've got */
3714
3715             for (j = 0; j < NOMINAL_LC_ALL_INDEX; j++) {
3716                 Safefree(curlocales[j]);
3717                 curlocales[j] = savepv(do_setlocale_r(categories[j], NULL));
3718                 DEBUG_LOCALE_INIT(categories[j], NULL, curlocales[j]);
3719             }
3720         }
3721
3722         if (locwarn) {
3723             const char * description;
3724             const char * name = "";
3725             if (strEQ(trial_locales[i], "C")) {
3726                 description = "the standard locale";
3727                 name = "C";
3728             }
3729
3730 #  ifdef SYSTEM_DEFAULT_LOCALE
3731
3732             else if (strEQ(trial_locales[i], "")) {
3733                 description = "the system default locale";
3734                 if (system_default_locale) {
3735                     name = system_default_locale;
3736                 }
3737             }
3738
3739 #  endif /* SYSTEM_DEFAULT_LOCALE */
3740
3741             else {
3742                 description = "a fallback locale";
3743                 name = trial_locales[i];
3744             }
3745             if (name && strNE(name, "")) {
3746                 PerlIO_printf(Perl_error_log,
3747                     "perl: warning: %s %s (\"%s\").\n", msg, description, name);
3748             }
3749             else {
3750                 PerlIO_printf(Perl_error_log,
3751                                    "perl: warning: %s %s.\n", msg, description);
3752             }
3753         }
3754     } /* End of tried to fallback */
3755
3756     /* Done with finding the locales; update our records */
3757
3758 #  ifdef USE_LOCALE_CTYPE
3759
3760     new_ctype(curlocales[LC_CTYPE_INDEX]);
3761
3762 #  endif
3763 #  ifdef USE_LOCALE_COLLATE
3764
3765     new_collate(curlocales[LC_COLLATE_INDEX]);
3766
3767 #  endif
3768 #  ifdef USE_LOCALE_NUMERIC
3769
3770     new_numeric(curlocales[LC_NUMERIC_INDEX]);
3771
3772 #  endif
3773
3774     for (i = 0; i < NOMINAL_LC_ALL_INDEX; i++) {
3775
3776 #  if defined(USE_ITHREADS) && ! defined(USE_THREAD_SAFE_LOCALE)
3777
3778         /* This caches whether each category's locale is UTF-8 or not.  This
3779          * may involve changing the locale.  It is ok to do this at
3780          * initialization time before any threads have started, but not later
3781          * unless thread-safe operations are used.
3782          * Caching means that if the program heeds our dictate not to change
3783          * locales in threaded applications, this data will remain valid, and
3784          * it may get queried without having to change locales.  If the
3785          * environment is such that all categories have the same locale, this
3786          * isn't needed, as the code will not change the locale; but this
3787          * handles the uncommon case where the environment has disparate
3788          * locales for the categories */
3789         (void) _is_cur_LC_category_utf8(categories[i]);
3790
3791 #  endif
3792
3793         Safefree(curlocales[i]);
3794     }
3795
3796 #  if defined(USE_PERLIO) && defined(USE_LOCALE_CTYPE)
3797
3798     /* Set PL_utf8locale to TRUE if using PerlIO _and_ the current LC_CTYPE
3799      * locale is UTF-8.  The call to new_ctype() just above has already
3800      * calculated the latter value and saved it in PL_in_utf8_CTYPE_locale. If
3801      * both PL_utf8locale and PL_unicode (set by -C or by $ENV{PERL_UNICODE})
3802      * are true, perl.c:S_parse_body() will turn on the PerlIO :utf8 layer on
3803      * STDIN, STDOUT, STDERR, _and_ the default open discipline.  */
3804     PL_utf8locale = PL_in_utf8_CTYPE_locale;
3805
3806     /* Set PL_unicode to $ENV{PERL_UNICODE} if using PerlIO.
3807        This is an alternative to using the -C command line switch
3808        (the -C if present will override this). */
3809     {
3810          const char *p = PerlEnv_getenv("PERL_UNICODE");
3811          PL_unicode = p ? parse_unicode_opts(&p) : 0;
3812          if (PL_unicode & PERL_UNICODE_UTF8CACHEASSERT_FLAG)
3813              PL_utf8cache = -1;
3814     }
3815
3816 #  endif
3817 #  ifdef __GLIBC__
3818
3819     Safefree(language);
3820
3821 #  endif
3822
3823     Safefree(lc_all);
3824     Safefree(lang);
3825
3826 #endif /* USE_LOCALE */
3827 #ifdef DEBUGGING
3828
3829     /* So won't continue to output stuff */
3830     DEBUG_INITIALIZATION_set(FALSE);
3831
3832 #endif
3833
3834     return ok;
3835 }
3836
3837 #ifdef USE_LOCALE_COLLATE
3838
3839 char *
3840 Perl__mem_collxfrm(pTHX_ const char *input_string,
3841                          STRLEN len,    /* Length of 'input_string' */
3842                          STRLEN *xlen,  /* Set to length of returned string
3843                                            (not including the collation index
3844                                            prefix) */
3845                          bool utf8      /* Is the input in UTF-8? */
3846                    )
3847 {
3848
3849     /* _mem_collxfrm() is a bit like strxfrm() but with two important
3850      * differences. First, it handles embedded NULs. Second, it allocates a bit
3851      * more memory than needed for the transformed data itself.  The real
3852      * transformed data begins at offset COLLXFRM_HDR_LEN.  *xlen is set to
3853      * the length of that, and doesn't include the collation index size.
3854      * Please see sv_collxfrm() to see how this is used. */
3855
3856 #define COLLXFRM_HDR_LEN    sizeof(PL_collation_ix)
3857
3858     char * s = (char *) input_string;
3859     STRLEN s_strlen = strlen(input_string);
3860     char *xbuf = NULL;
3861     STRLEN xAlloc;          /* xalloc is a reserved word in VC */
3862     STRLEN length_in_chars;
3863     bool first_time = TRUE; /* Cleared after first loop iteration */
3864
3865     PERL_ARGS_ASSERT__MEM_COLLXFRM;
3866
3867     /* Must be NUL-terminated */
3868     assert(*(input_string + len) == '\0');
3869
3870     /* If this locale has defective collation, skip */
3871     if (PL_collxfrm_base == 0 && PL_collxfrm_mult == 0) {
3872         DEBUG_L(PerlIO_printf(Perl_debug_log,
3873                       "_mem_collxfrm: locale's collation is defective\n"));
3874         goto bad;
3875     }
3876
3877     /* Replace any embedded NULs with the control that sorts before any others.
3878      * This will give as good as possible results on strings that don't
3879      * otherwise contain that character, but otherwise there may be
3880      * less-than-perfect results with that character and NUL.  This is
3881      * unavoidable unless we replace strxfrm with our own implementation. */
3882     if (UNLIKELY(s_strlen < len)) {   /* Only execute if there is an embedded
3883                                          NUL */
3884         char * e = s + len;
3885         char * sans_nuls;
3886         STRLEN sans_nuls_len;
3887         int try_non_controls;
3888         char this_replacement_char[] = "?\0";   /* Room for a two-byte string,
3889                                                    making sure 2nd byte is NUL.
3890                                                  */
3891         STRLEN this_replacement_len;
3892
3893         /* If we don't know what non-NUL control character sorts lowest for
3894          * this locale, find it */
3895         if (PL_strxfrm_NUL_replacement == '\0') {
3896             int j;
3897             char * cur_min_x = NULL;    /* The min_char's xfrm, (except it also
3898                                            includes the collation index
3899                                            prefixed. */
3900
3901             DEBUG_Lv(PerlIO_printf(Perl_debug_log, "Looking to replace NUL\n"));
3902
3903             /* Unlikely, but it may be that no control will work to replace
3904              * NUL, in which case we instead look for any character.  Controls
3905              * are preferred because collation order is, in general, context
3906              * sensitive, with adjoining characters affecting the order, and
3907              * controls are less likely to have such interactions, allowing the
3908              * NUL-replacement to stand on its own.  (Another way to look at it
3909              * is to imagine what would happen if the NUL were replaced by a
3910              * combining character; it wouldn't work out all that well.) */
3911             for (try_non_controls = 0;
3912                  try_non_controls < 2;
3913                  try_non_controls++)
3914             {
3915                 /* Look through all legal code points (NUL isn't) */
3916                 for (j = 1; j < 256; j++) {
3917                     char * x;       /* j's xfrm plus collation index */
3918                     STRLEN x_len;   /* length of 'x' */
3919                     STRLEN trial_len = 1;
3920                     char cur_source[] = { '\0', '\0' };
3921
3922                     /* Skip non-controls the first time through the loop.  The
3923                      * controls in a UTF-8 locale are the L1 ones */
3924                     if (! try_non_controls && (PL_in_utf8_COLLATE_locale)
3925                                                ? ! isCNTRL_L1(j)
3926                                                : ! isCNTRL_LC(j))
3927                     {
3928                         continue;
3929                     }
3930
3931                     /* Create a 1-char string of the current code point */
3932                     cur_source[0] = (char) j;
3933
3934                     /* Then transform it */
3935                     x = _mem_collxfrm(cur_source, trial_len, &x_len,
3936                                       0 /* The string is not in UTF-8 */);
3937
3938                     /* Ignore any character that didn't successfully transform.
3939                      * */
3940                     if (! x) {
3941                         continue;
3942                     }
3943
3944                     /* If this character's transformation is lower than
3945                      * the current lowest, this one becomes the lowest */
3946                     if (   cur_min_x == NULL
3947                         || strLT(x         + COLLXFRM_HDR_LEN,
3948                                  cur_min_x + COLLXFRM_HDR_LEN))
3949                     {
3950                         PL_strxfrm_NUL_replacement = j;
3951                         Safefree(cur_min_x);
3952                         cur_min_x = x;
3953                     }
3954                     else {
3955                         Safefree(x);
3956                     }
3957                 } /* end of loop through all 255 characters */
3958
3959                 /* Stop looking if found */
3960                 if (cur_min_x) {
3961                     break;
3962                 }
3963
3964                 /* Unlikely, but possible, if there aren't any controls that
3965                  * work in the locale, repeat the loop, looking for any
3966                  * character that works */
3967                 DEBUG_L(PerlIO_printf(Perl_debug_log,
3968                 "_mem_collxfrm: No control worked.  Trying non-controls\n"));
3969             } /* End of loop to try first the controls, then any char */
3970
3971             if (! cur_min_x) {
3972                 DEBUG_L(PerlIO_printf(Perl_debug_log,
3973                     "_mem_collxfrm: Couldn't find any character to replace"
3974                     " embedded NULs in locale %s with", PL_collation_name));
3975                 goto bad;
3976             }
3977
3978             DEBUG_L(PerlIO_printf(Perl_debug_log,
3979                     "_mem_collxfrm: Replacing embedded NULs in locale %s with "
3980                     "0x%02X\n", PL_collation_name, PL_strxfrm_NUL_replacement));
3981
3982             Safefree(cur_min_x);
3983         } /* End of determining the character that is to replace NULs */
3984
3985         /* If the replacement is variant under UTF-8, it must match the
3986          * UTF8-ness of the original */
3987         if ( ! UVCHR_IS_INVARIANT(PL_strxfrm_NUL_replacement) && utf8) {
3988             this_replacement_char[0] =
3989                                 UTF8_EIGHT_BIT_HI(PL_strxfrm_NUL_replacement);
3990             this_replacement_char[1] =
3991                                 UTF8_EIGHT_BIT_LO(PL_strxfrm_NUL_replacement);
3992             this_replacement_len = 2;
3993         }
3994         else {
3995             this_replacement_char[0] = PL_strxfrm_NUL_replacement;
3996             /* this_replacement_char[1] = '\0' was done at initialization */
3997             this_replacement_len = 1;
3998         }
3999
4000         /* The worst case length for the replaced string would be if every
4001          * character in it is NUL.  Multiply that by the length of each
4002          * replacement, and allow for a trailing NUL */
4003         sans_nuls_len = (len * this_replacement_len) + 1;
4004         Newx(sans_nuls, sans_nuls_len, char);
4005         *sans_nuls = '\0';
4006
4007         /* Replace each NUL with the lowest collating control.  Loop until have
4008          * exhausted all the NULs */
4009         while (s + s_strlen < e) {
4010             my_strlcat(sans_nuls, s, sans_nuls_len);
4011
4012             /* Do the actual replacement */
4013             my_strlcat(sans_nuls, this_replacement_char, sans_nuls_len);
4014
4015             /* Move past the input NUL */
4016             s += s_strlen + 1;
4017             s_strlen = strlen(s);
4018         }
4019
4020         /* And add anything that trails the final NUL */
4021         my_strlcat(sans_nuls, s, sans_nuls_len);
4022
4023         /* Switch so below we transform this modified string */
4024         s = sans_nuls;
4025         len = strlen(s);
4026     } /* End of replacing NULs */
4027
4028     /* Make sure the UTF8ness of the string and locale match */
4029     if (utf8 != PL_in_utf8_COLLATE_locale) {
4030         /* XXX convert above Unicode to 10FFFF? */
4031         const char * const t = s;   /* Temporary so we can later find where the
4032                                        input was */
4033
4034         /* Here they don't match.  Change the string's to be what the locale is
4035          * expecting */
4036
4037         if (! utf8) { /* locale is UTF-8, but input isn't; upgrade the input */
4038             s = (char *) bytes_to_utf8((const U8 *) s, &len);
4039             utf8 = TRUE;
4040         }
4041         else {   /* locale is not UTF-8; but input is; downgrade the input */
4042
4043             s = (char *) bytes_from_utf8((const U8 *) s, &len, &utf8);
4044
4045             /* If the downgrade was successful we are done, but if the input
4046              * contains things that require UTF-8 to represent, have to do
4047              * damage control ... */
4048             if (UNLIKELY(utf8)) {
4049
4050                 /* What we do is construct a non-UTF-8 string with
4051                  *  1) the characters representable by a single byte converted
4052                  *     to be so (if necessary);
4053                  *  2) and the rest converted to collate the same as the
4054                  *     highest collating representable character.  That makes
4055                  *     them collate at the end.  This is similar to how we
4056                  *     handle embedded NULs, but we use the highest collating
4057                  *     code point instead of the smallest.  Like the NUL case,
4058                  *     this isn't perfect, but is the best we can reasonably
4059                  *     do.  Every above-255 code point will sort the same as
4060                  *     the highest-sorting 0-255 code point.  If that code
4061                  *     point can combine in a sequence with some other code
4062                  *     points for weight calculations, us changing something to
4063                  *     be it can adversely affect the results.  But in most
4064                  *     cases, it should work reasonably.  And note that this is
4065                  *     really an illegal situation: using code points above 255
4066                  *     on a locale where only 0-255 are valid.  If two strings
4067                  *     sort entirely equal, then the sort order for the
4068                  *     above-255 code points will be in code point order. */
4069
4070                 utf8 = FALSE;
4071
4072                 /* If we haven't calculated the code point with the maximum
4073                  * collating order for this locale, do so now */
4074                 if (! PL_strxfrm_max_cp) {
4075                     int j;
4076
4077                     /* The current transformed string that collates the
4078                      * highest (except it also includes the prefixed collation
4079                      * index. */
4080                     char * cur_max_x = NULL;
4081
4082                     /* Look through all legal code points (NUL isn't) */
4083                     for (j = 1; j < 256; j++) {
4084                         char * x;
4085                         STRLEN x_len;
4086                         char cur_source[] = { '\0', '\0' };
4087
4088                         /* Create a 1-char string of the current code point */
4089                         cur_source[0] = (char) j;
4090
4091                         /* Then transform it */
4092                         x = _mem_collxfrm(cur_source, 1, &x_len, FALSE);
4093
4094                         /* If something went wrong (which it shouldn't), just
4095                          * ignore this code point */
4096                         if (! x) {
4097                             continue;
4098                         }
4099
4100                         /* If this character's transformation is higher than
4101                          * the current highest, this one becomes the highest */
4102                         if (   cur_max_x == NULL
4103                             || strGT(x         + COLLXFRM_HDR_LEN,
4104                                      cur_max_x + COLLXFRM_HDR_LEN))
4105                         {
4106                             PL_strxfrm_max_cp = j;
4107                             Safefree(cur_max_x);
4108                             cur_max_x = x;
4109                         }
4110                         else {
4111                             Safefree(x);
4112                         }
4113                     }
4114
4115                     if (! cur_max_x) {
4116                         DEBUG_L(PerlIO_printf(Perl_debug_log,
4117                             "_mem_collxfrm: Couldn't find any character to"
4118                             " replace above-Latin1 chars in locale %s with",
4119                             PL_collation_name));
4120                         goto bad;
4121                     }
4122
4123                     DEBUG_L(PerlIO_printf(Perl_debug_log,
4124                             "_mem_collxfrm: highest 1-byte collating character"
4125                             " in locale %s is 0x%02X\n",
4126                             PL_collation_name,
4127                             PL_strxfrm_max_cp));
4128
4129                     Safefree(cur_max_x);
4130                 }
4131
4132                 /* Here we know which legal code point collates the highest.
4133                  * We are ready to construct the non-UTF-8 string.  The length
4134                  * will be at least 1 byte smaller than the input string
4135                  * (because we changed at least one 2-byte character into a
4136                  * single byte), but that is eaten up by the trailing NUL */
4137                 Newx(s, len, char);
4138
4139                 {
4140                     STRLEN i;
4141                     STRLEN d= 0;
4142                     char * e = (char *) t + len;
4143
4144                     for (i = 0; i < len; i+= UTF8SKIP(t + i)) {
4145                         U8 cur_char = t[i];
4146                         if (UTF8_IS_INVARIANT(cur_char)) {
4147                             s[d++] = cur_char;
4148                         }
4149                         else if (UTF8_IS_NEXT_CHAR_DOWNGRADEABLE(t + i, e)) {
4150                             s[d++] = EIGHT_BIT_UTF8_TO_NATIVE(cur_char, t[i+1]);
4151                         }
4152                         else {  /* Replace illegal cp with highest collating
4153                                    one */
4154                             s[d++] = PL_strxfrm_max_cp;
4155                         }
4156                     }
4157                     s[d++] = '\0';
4158                     Renew(s, d, char);   /* Free up unused space */
4159                 }
4160             }
4161         }
4162
4163         /* Here, we have constructed a modified version of the input.  It could
4164          * be that we already had a modified copy before we did this version.
4165          * If so, that copy is no longer needed */
4166         if (t != input_string) {
4167             Safefree(t);
4168         }
4169     }
4170
4171     length_in_chars = (utf8)
4172                       ? utf8_length((U8 *) s, (U8 *) s + len)
4173                       : len;
4174
4175     /* The first element in the output is the collation id, used by
4176      * sv_collxfrm(); then comes the space for the transformed string.  The
4177      * equation should give us a good estimate as to how much is needed */
4178     xAlloc = COLLXFRM_HDR_LEN
4179            + PL_collxfrm_base
4180            + (PL_collxfrm_mult * length_in_chars);
4181     Newx(xbuf, xAlloc, char);
4182     if (UNLIKELY(! xbuf)) {
4183         DEBUG_L(PerlIO_printf(Perl_debug_log,
4184                       "_mem_collxfrm: Couldn't malloc %zu bytes\n", xAlloc));
4185         goto bad;
4186     }
4187
4188     /* Store the collation id */
4189     *(U32*)xbuf = PL_collation_ix;
4190
4191     /* Then the transformation of the input.  We loop until successful, or we
4192      * give up */
4193     for (;;) {
4194
4195         *xlen = strxfrm(xbuf + COLLXFRM_HDR_LEN, s, xAlloc - COLLXFRM_HDR_LEN);
4196
4197         /* If the transformed string occupies less space than we told strxfrm()
4198          * was available, it means it successfully transformed the whole
4199          * string. */
4200         if (*xlen < xAlloc - COLLXFRM_HDR_LEN) {
4201
4202             /* Some systems include a trailing NUL in the returned length.
4203              * Ignore it, using a loop in case multiple trailing NULs are
4204              * returned. */
4205             while (   (*xlen) > 0
4206                    && *(xbuf + COLLXFRM_HDR_LEN + (*xlen) - 1) == '\0')
4207             {
4208                 (*xlen)--;
4209             }
4210
4211             /* If the first try didn't get it, it means our prediction was low.
4212              * Modify the coefficients so that we predict a larger value in any
4213              * future transformations */
4214             if (! first_time) {
4215                 STRLEN needed = *xlen + 1;   /* +1 For trailing NUL */
4216                 STRLEN computed_guess = PL_collxfrm_base
4217                                       + (PL_collxfrm_mult * length_in_chars);
4218
4219                 /* On zero-length input, just keep current slope instead of
4220                  * dividing by 0 */
4221                 const STRLEN new_m = (length_in_chars != 0)
4222                                      ? needed / length_in_chars
4223                                      : PL_collxfrm_mult;
4224
4225                 DEBUG_Lv(PerlIO_printf(Perl_debug_log,
4226                     "%s: %d: initial size of %zu bytes for a length "
4227                     "%zu string was insufficient, %zu needed\n",
4228                     __FILE__, __LINE__,
4229                     computed_guess, length_in_chars, needed));
4230
4231                 /* If slope increased, use it, but discard this result for
4232                  * length 1 strings, as we can't be sure that it's a real slope
4233                  * change */
4234                 if (length_in_chars > 1 && new_m  > PL_collxfrm_mult) {
4235
4236 #  ifdef DEBUGGING
4237
4238                     STRLEN old_m = PL_collxfrm_mult;
4239                     STRLEN old_b = PL_collxfrm_base;
4240
4241 #  endif
4242
4243                     PL_collxfrm_mult = new_m;
4244                     PL_collxfrm_base = 1;   /* +1 For trailing NUL */
4245                     computed_guess = PL_collxfrm_base
4246                                     + (PL_collxfrm_mult * length_in_chars);
4247                     if (computed_guess < needed) {
4248                         PL_collxfrm_base += needed - computed_guess;
4249                     }
4250
4251                     DEBUG_Lv(PerlIO_printf(Perl_debug_log,
4252                         "%s: %d: slope is now %zu; was %zu, base "
4253                         "is now %zu; was %zu\n",
4254                         __FILE__, __LINE__,
4255                         PL_collxfrm_mult, old_m,
4256                         PL_collxfrm_base, old_b));
4257                 }
4258                 else {  /* Slope didn't change, but 'b' did */
4259                     const STRLEN new_b = needed
4260                                         - computed_guess
4261                                         + PL_collxfrm_base;
4262                     DEBUG_Lv(PerlIO_printf(Perl_debug_log,
4263                         "%s: %d: base is now %zu; was %zu\n",
4264                         __FILE__, __LINE__,
4265                         new_b, PL_collxfrm_base));
4266                     PL_collxfrm_base = new_b;
4267                 }
4268             }
4269
4270             break;
4271         }
4272
4273         if (UNLIKELY(*xlen >= PERL_INT_MAX)) {
4274             DEBUG_L(PerlIO_printf(Perl_debug_log,
4275                   "_mem_collxfrm: Needed %zu bytes, max permissible is %u\n",
4276                   *xlen, PERL_INT_MAX));
4277             goto bad;
4278         }
4279
4280         /* A well-behaved strxfrm() returns exactly how much space it needs
4281          * (usually not including the trailing NUL) when it fails due to not
4282          * enough space being provided.  Assume that this is the case unless
4283          * it's been proven otherwise */
4284         if (LIKELY(PL_strxfrm_is_behaved) && first_time) {
4285             xAlloc = *xlen + COLLXFRM_HDR_LEN + 1;
4286         }
4287         else { /* Here, either:
4288                 *  1)  The strxfrm() has previously shown bad behavior; or
4289                 *  2)  It isn't the first time through the loop, which means
4290                 *      that the strxfrm() is now showing bad behavior, because
4291                 *      we gave it what it said was needed in the previous
4292                 *      iteration, and it came back saying it needed still more.
4293                 *      (Many versions of cygwin fit this.  When the buffer size
4294                 *      isn't sufficient, they return the input size instead of
4295                 *      how much is needed.)
4296                 * Increase the buffer size by a fixed percentage and try again.
4297                 * */
4298             xAlloc += (xAlloc / 4) + 1;
4299             PL_strxfrm_is_behaved = FALSE;
4300
4301 #  ifdef DEBUGGING
4302
4303             if (DEBUG_Lv_TEST || debug_initialization) {
4304                 PerlIO_printf(Perl_debug_log,
4305                 "_mem_collxfrm required more space than previously calculated"
4306                 " for locale %s, trying again with new guess=%d+%zu\n",
4307                 PL_collation_name, (int) COLLXFRM_HDR_LEN,
4308                 xAlloc - COLLXFRM_HDR_LEN);
4309             }
4310
4311 #  endif
4312
4313         }
4314
4315         Renew(xbuf, xAlloc, char);
4316         if (UNLIKELY(! xbuf)) {
4317             DEBUG_L(PerlIO_printf(Perl_debug_log,
4318                       "_mem_collxfrm: Couldn't realloc %zu bytes\n", xAlloc));
4319             goto bad;
4320         }
4321
4322         first_time = FALSE;
4323     }
4324
4325
4326 #  ifdef DEBUGGING
4327
4328     if (DEBUG_Lv_TEST || debug_initialization) {
4329
4330         print_collxfrm_input_and_return(s, s + len, xlen, utf8);
4331         PerlIO_printf(Perl_debug_log, "Its xfrm is:");
4332         PerlIO_printf(Perl_debug_log, "%s\n",
4333                       _byte_dump_string((U8 *) xbuf + COLLXFRM_HDR_LEN,
4334                        *xlen, 1));
4335     }
4336
4337 #  endif
4338
4339     /* Free up unneeded space; retain ehough for trailing NUL */
4340     Renew(xbuf, COLLXFRM_HDR_LEN + *xlen + 1, char);
4341
4342     if (s != input_string) {
4343         Safefree(s);
4344     }
4345
4346     return xbuf;
4347
4348   bad:
4349     Safefree(xbuf);
4350     if (s != input_string) {
4351         Safefree(s);
4352     }
4353     *xlen = 0;
4354
4355 #  ifdef DEBUGGING
4356
4357     if (DEBUG_Lv_TEST || debug_initialization) {
4358         print_collxfrm_input_and_return(s, s + len, NULL, utf8);
4359     }
4360
4361 #  endif
4362
4363     return NULL;
4364 }
4365
4366 #  ifdef DEBUGGING
4367
4368 STATIC void
4369 S_print_collxfrm_input_and_return(pTHX_
4370                                   const char * const s,
4371                                   const char * const e,
4372                                   const STRLEN * const xlen,
4373                                   const bool is_utf8)
4374 {
4375
4376     PERL_ARGS_ASSERT_PRINT_COLLXFRM_INPUT_AND_RETURN;
4377
4378     PerlIO_printf(Perl_debug_log, "_mem_collxfrm[%" UVuf "]: returning ",
4379                                                         (UV)PL_collation_ix);
4380     if (xlen) {
4381         PerlIO_printf(Perl_debug_log, "%zu", *xlen);
4382     }
4383     else {
4384         PerlIO_printf(Perl_debug_log, "NULL");
4385     }
4386     PerlIO_printf(Perl_debug_log, " for locale '%s', string='",
4387                                                             PL_collation_name);
4388     print_bytes_for_locale(s, e, is_utf8);
4389
4390     PerlIO_printf(Perl_debug_log, "'\n");
4391 }
4392
4393 #  endif    /* DEBUGGING */
4394 #endif /* USE_LOCALE_COLLATE */
4395 #ifdef USE_LOCALE
4396 #  ifdef DEBUGGING
4397
4398 STATIC void
4399 S_print_bytes_for_locale(pTHX_
4400                     const char * const s,
4401                     const char * const e,
4402                     const bool is_utf8)
4403 {
4404     const char * t = s;
4405     bool prev_was_printable = TRUE;
4406     bool first_time = TRUE;
4407
4408     PERL_ARGS_ASSERT_PRINT_BYTES_FOR_LOCALE;
4409
4410     while (t < e) {
4411         UV cp = (is_utf8)
4412                 ?  utf8_to_uvchr_buf((U8 *) t, e, NULL)
4413                 : * (U8 *) t;
4414         if (isPRINT(cp)) {
4415             if (! prev_was_printable) {
4416                 PerlIO_printf(Perl_debug_log, " ");
4417             }
4418             PerlIO_printf(Perl_debug_log, "%c", (U8) cp);
4419             prev_was_printable = TRUE;
4420         }
4421         else {
4422             if (! first_time) {
4423                 PerlIO_printf(Perl_debug_log, " ");
4424             }
4425             PerlIO_printf(Perl_debug_log, "%02" UVXf, cp);
4426             prev_was_printable = FALSE;
4427         }
4428         t += (is_utf8) ? UTF8SKIP(t) : 1;
4429         first_time = FALSE;
4430     }
4431 }
4432
4433 #  endif   /* #ifdef DEBUGGING */
4434
4435 STATIC const char *
4436 S_switch_category_locale_to_template(pTHX_ const int switch_category, const int template_category, const char * template_locale)
4437 {
4438     /* Changes the locale for LC_'switch_category" to that of
4439      * LC_'template_category', if they aren't already the same.  If not NULL,
4440      * 'template_locale' is the locale that 'template_category' is in.
4441      *
4442      * Returns a copy of the name of the original locale for 'switch_category'
4443      * so can be switched back to with the companion function
4444      * restore_switched_locale(),  (NULL if no restoral is necessary.) */
4445
4446     char * restore_to_locale = NULL;
4447
4448     if (switch_category == template_category) { /* No changes needed */
4449         return NULL;
4450     }
4451
4452     /* Find the original locale of the category we may need to change, so that
4453      * it can be restored to later */
4454     restore_to_locale = stdize_locale(savepv(do_setlocale_r(switch_category,
4455                                                             NULL)));
4456     if (! restore_to_locale) {
4457         Perl_croak(aTHX_
4458              "panic: %s: %d: Could not find current %s locale, errno=%d\n",
4459                 __FILE__, __LINE__, category_name(switch_category), errno);
4460     }
4461
4462     /* If the locale of the template category wasn't passed in, find it now */
4463     if (template_locale == NULL) {
4464         template_locale = do_setlocale_r(template_category, NULL);
4465         if (! template_locale) {
4466             Perl_croak(aTHX_
4467              "panic: %s: %d: Could not find current %s locale, errno=%d\n",
4468                    __FILE__, __LINE__, category_name(template_category), errno);
4469         }
4470     }
4471
4472     /* It the locales are the same, there's nothing to do */
4473     if (strEQ(restore_to_locale, template_locale)) {
4474         Safefree(restore_to_locale);
4475
4476         DEBUG_Lv(PerlIO_printf(Perl_debug_log, "%s locale unchanged as %s\n",
4477                             category_name(switch_category), restore_to_locale));
4478
4479         return NULL;
4480     }
4481
4482     /* Finally, change the locale to the template one */
4483     if (! do_setlocale_r(switch_category, template_locale)) {
4484         Perl_croak(aTHX_
4485          "panic: %s: %d: Could not change %s locale to %s, errno=%d\n",
4486                             __FILE__, __LINE__, category_name(switch_category),
4487                                                        template_locale, errno);
4488     }
4489
4490     DEBUG_Lv(PerlIO_printf(Perl_debug_log, "%s locale switched to %s\n",
4491                             category_name(switch_category), template_locale));
4492
4493     return restore_to_locale;
4494 }
4495
4496 STATIC void
4497 S_restore_switched_locale(pTHX_ const int category, const char * const original_locale)
4498 {
4499     /* Restores the locale for LC_'category' to 'original_locale' (which is a
4500      * copy that will be freed by this function), or do nothing if the latter
4501      * parameter is NULL */
4502
4503     if (original_locale == NULL) {
4504         return;
4505     }
4506
4507     if (! do_setlocale_r(category, original_locale)) {
4508         Perl_croak(aTHX_
4509              "panic: %s: %d: setlocale %s restore to %s failed, errno=%d\n",
4510                  __FILE__, __LINE__,
4511                              category_name(category), original_locale, errno);
4512     }
4513
4514     Safefree(original_locale);
4515 }
4516
4517 /* is_cur_LC_category_utf8 uses a small char buffer to avoid malloc/free */
4518 #define CUR_LC_BUFFER_SIZE  64
4519
4520 bool
4521 Perl__is_cur_LC_category_utf8(pTHX_ int category)
4522 {
4523     /* Returns TRUE if the current locale for 'category' is UTF-8; FALSE
4524      * otherwise. 'category' may not be LC_ALL.  If the platform doesn't have
4525      * nl_langinfo(), nor MB_CUR_MAX, this employs a heuristic, which hence
4526      * could give the wrong result.  The result will very likely be correct for
4527      * languages that have commonly used non-ASCII characters, but for notably
4528      * English, it comes down to if the locale's name ends in something like
4529      * "UTF-8".  It errs on the side of not being a UTF-8 locale.
4530      *
4531      * If the platform is early C89, not containing mbtowc(), or we are
4532      * compiled to not pay attention to LC_CTYPE, this employs heuristics.
4533      * These work very well for non-Latin locales or those whose currency
4534      * symbol isn't a '$' nor plain ASCII text.  But without LC_CTYPE and at
4535      * least MB_CUR_MAX, English locales with an ASCII currency symbol depend
4536      * on the name containing UTF-8 or not. */
4537
4538     /* Name of current locale corresponding to the input category */
4539     const char *save_input_locale = NULL;
4540
4541     bool is_utf8 = FALSE;                /* The return value */
4542
4543     /* The variables below are for the cache of previous lookups using this
4544      * function.  The cache is a C string, described at the definition for
4545      * 'C_and_POSIX_utf8ness'.
4546      *
4547      * The first part of the cache is fixed, for the C and POSIX locales.  The
4548      * varying part starts just after them. */
4549     char * utf8ness_cache = PL_locale_utf8ness + STRLENs(C_and_POSIX_utf8ness);
4550
4551     Size_t utf8ness_cache_size; /* Size of the varying portion */
4552     Size_t input_name_len;      /* Length in bytes of save_input_locale */
4553     Size_t input_name_len_with_overhead;    /* plus extra chars used to store
4554                                                the name in the cache */
4555     char * delimited;           /* The name plus the delimiters used to store
4556                                    it in the cache */
4557     char buffer[CUR_LC_BUFFER_SIZE];        /* small buffer */
4558     char * name_pos;            /* position of 'delimited' in the cache, or 0
4559                                    if not there */
4560
4561
4562 #  ifdef LC_ALL
4563
4564     assert(category != LC_ALL);
4565
4566 #  endif
4567
4568     /* Get the desired category's locale */
4569     save_input_locale = stdize_locale(savepv(do_setlocale_r(category, NULL)));
4570     if (! save_input_locale) {
4571         Perl_croak(aTHX_
4572              "panic: %s: %d: Could not find current %s locale, errno=%d\n",
4573                      __FILE__, __LINE__, category_name(category), errno);
4574     }
4575
4576     DEBUG_L(PerlIO_printf(Perl_debug_log,
4577                           "Current locale for %s is %s\n",
4578                           category_name(category), save_input_locale));
4579
4580     input_name_len = strlen(save_input_locale);
4581
4582     /* In our cache, each name is accompanied by two delimiters and a single
4583      * utf8ness digit */
4584     input_name_len_with_overhead = input_name_len + 3;
4585
4586     if ( input_name_len_with_overhead <= CUR_LC_BUFFER_SIZE ) {
4587         /* we can use the buffer, avoid a malloc */
4588         delimited = buffer;
4589     } else { /* need a malloc */
4590         /* Allocate and populate space for a copy of the name surrounded by the
4591          * delimiters */
4592         Newx(delimited, input_name_len_with_overhead, char);
4593     }
4594
4595     delimited[0] = UTF8NESS_SEP[0];
4596     Copy(save_input_locale, delimited + 1, input_name_len, char);
4597     delimited[input_name_len+1] = UTF8NESS_PREFIX[0];
4598     delimited[input_name_len+2] = '\0';
4599
4600     /* And see if that is in the cache */
4601     name_pos = instr(PL_locale_utf8ness, delimited);
4602     if (name_pos) {
4603         is_utf8 = *(name_pos + input_name_len_with_overhead - 1) - '0';
4604
4605 #  ifdef DEBUGGING
4606
4607         if (DEBUG_Lv_TEST || debug_initialization) {
4608             PerlIO_printf(Perl_debug_log, "UTF8ness for locale %s=%d, \n",
4609                                           save_input_locale, is_utf8);
4610         }
4611
4612 #  endif
4613
4614         /* And, if not already in that position, move it to the beginning of
4615          * the non-constant portion of the list, since it is the most recently
4616          * used.  (We don't have to worry about overflow, since just moving
4617          * existing names around) */
4618         if (name_pos > utf8ness_cache) {
4619             Move(utf8ness_cache,
4620                  utf8ness_cache + input_name_len_with_overhead,
4621                  name_pos - utf8ness_cache, char);
4622             Copy(delimited,
4623                  utf8ness_cache,
4624                  input_name_len_with_overhead - 1, char);
4625             utf8ness_cache[input_name_len_with_overhead - 1] = is_utf8 + '0';
4626         }
4627
4628         /* free only when not using the buffer */
4629         if ( delimited != buffer ) Safefree(delimited);
4630         Safefree(save_input_locale);
4631         return is_utf8;
4632     }
4633
4634     /* Here we don't have stored the utf8ness for the input locale.  We have to
4635      * calculate it */
4636
4637 #  if        defined(USE_LOCALE_CTYPE)                                  \
4638      && (    defined(HAS_NL_LANGINFO)                                   \
4639          || (defined(HAS_MBTOWC) || defined(HAS_MBRTOWC)))
4640
4641     {
4642         const char *original_ctype_locale
4643                         = switch_category_locale_to_template(LC_CTYPE,
4644                                                              category,
4645                                                              save_input_locale);
4646
4647         /* Here the current LC_CTYPE is set to the locale of the category whose
4648          * information is desired.  This means that nl_langinfo() and mbtowc()
4649          * should give the correct results */
4650
4651 #    ifdef MB_CUR_MAX  /* But we can potentially rule out UTF-8ness, avoiding
4652                           calling the functions if we have this */
4653
4654             /* Standard UTF-8 needs at least 4 bytes to represent the maximum
4655              * Unicode code point. */
4656
4657             DEBUG_L(PerlIO_printf(Perl_debug_log, "%s: %d: MB_CUR_MAX=%d\n",
4658                                        __FILE__, __LINE__, (int) MB_CUR_MAX));
4659             if ((unsigned) MB_CUR_MAX < STRLENs(MAX_UNICODE_UTF8)) {
4660                 is_utf8 = FALSE;
4661                 restore_switched_locale(LC_CTYPE, original_ctype_locale);
4662                 goto finish_and_return;
4663             }
4664
4665 #    endif
4666 #    if defined(HAS_NL_LANGINFO)
4667
4668         { /* The task is easiest if the platform has this POSIX 2001 function.
4669              Except on some platforms it can wrongly return "", so have to have
4670              a fallback.  And it can return that it's UTF-8, even if there are
4671              variances from that.  For example, Turkish locales may use the
4672              alternate dotted I rules, and sometimes it appears to be a
4673              defective locale definition.  XXX We should probably check for
4674              these in the Latin1 range and warn (but on glibc, requires
4675              iswalnum() etc. due to their not handling 80-FF correctly */
4676             const char *codeset = my_nl_langinfo(CODESET, FALSE);
4677                                           /* FALSE => already in dest locale */
4678
4679             DEBUG_Lv(PerlIO_printf(Perl_debug_log,
4680                             "\tnllanginfo returned CODESET '%s'\n", codeset));
4681
4682             if (codeset && strNE(codeset, "")) {
4683
4684                               /* If the implementation of foldEQ() somehow were
4685                                * to change to not go byte-by-byte, this could
4686                                * read past end of string, as only one length is
4687                                * checked.  But currently, a premature NUL will
4688                                * compare false, and it will stop there */
4689                 is_utf8 = cBOOL(   foldEQ(codeset, STR_WITH_LEN("UTF-8"))
4690                                 || foldEQ(codeset, STR_WITH_LEN("UTF8")));
4691
4692                 DEBUG_L(PerlIO_printf(Perl_debug_log,
4693                        "\tnllanginfo returned CODESET '%s'; ?UTF8 locale=%d\n",
4694                                                      codeset,         is_utf8));
4695                 restore_switched_locale(LC_CTYPE, original_ctype_locale);
4696                 goto finish_and_return;
4697             }
4698         }
4699
4700 #    endif
4701 #    if defined(HAS_MBTOWC) || defined(HAS_MBRTOWC)
4702      /* We can see if this is a UTF-8-like locale if have mbtowc().  It was a
4703       * late adder to C89, so very likely to have it.  However, testing has
4704       * shown that, like nl_langinfo() above, there are locales that are not
4705       * strictly UTF-8 that this will return that they are */
4706
4707         {
4708             wchar_t wc;
4709             int len;
4710             dSAVEDERRNO;
4711
4712 #      if defined(HAS_MBRTOWC) && defined(USE_ITHREADS)
4713
4714             mbstate_t ps;
4715
4716 #      endif
4717
4718             /* mbrtowc() and mbtowc() convert a byte string to a wide
4719              * character.  Feed a byte string to one of them and check that the
4720              * result is the expected Unicode code point */
4721
4722 #      if defined(HAS_MBRTOWC) && defined(USE_ITHREADS)
4723             /* Prefer this function if available, as it's reentrant */
4724
4725             memset(&ps, 0, sizeof(ps));;
4726             PERL_UNUSED_RESULT(mbrtowc(&wc, NULL, 0, &ps)); /* Reset any shift
4727                                                                state */
4728             SETERRNO(0, 0);
4729             len = mbrtowc(&wc, STR_WITH_LEN(REPLACEMENT_CHARACTER_UTF8), &ps);
4730             SAVE_ERRNO;
4731
4732 #      else
4733
4734             LOCALE_LOCK;
4735             PERL_UNUSED_RESULT(mbtowc(&wc, NULL, 0));/* Reset any shift state */
4736             SETERRNO(0, 0);
4737             len = mbtowc(&wc, STR_WITH_LEN(REPLACEMENT_CHARACTER_UTF8));
4738             SAVE_ERRNO;
4739             LOCALE_UNLOCK;
4740
4741 #      endif
4742
4743             RESTORE_ERRNO;
4744             DEBUG_Lv(PerlIO_printf(Perl_debug_log,
4745                     "\treturn from mbtowc; len=%d; code_point=%x; errno=%d\n",
4746                                    len,      (unsigned int) wc, GET_ERRNO));
4747
4748             is_utf8 = cBOOL(   len == STRLENs(REPLACEMENT_CHARACTER_UTF8)
4749                             && wc == (wchar_t) UNICODE_REPLACEMENT);
4750         }
4751
4752 #    endif
4753
4754         restore_switched_locale(LC_CTYPE, original_ctype_locale);
4755         goto finish_and_return;
4756     }
4757
4758 #  else
4759
4760         /* Here, we must have a C89 compiler that doesn't have mbtowc().  Next
4761          * try looking at the currency symbol to see if it disambiguates
4762          * things.  Often that will be in the native script, and if the symbol
4763          * isn't in UTF-8, we know that the locale isn't.  If it is non-ASCII
4764          * UTF-8, we infer that the locale is too, as the odds of a non-UTF8
4765          * string being valid UTF-8 are quite small */
4766
4767 #    ifdef USE_LOCALE_MONETARY
4768
4769         /* If have LC_MONETARY, we can look at the currency symbol.  Often that
4770          * will be in the native script.  We do this one first because there is
4771          * just one string to examine, so potentially avoids work */
4772
4773         {
4774             const char *original_monetary_locale
4775                         = switch_category_locale_to_template(LC_MONETARY,
4776                                                              category,
4777                                                              save_input_locale);
4778             bool only_ascii = FALSE;
4779             const U8 * currency_string
4780                             = (const U8 *) my_nl_langinfo(CRNCYSTR, FALSE);
4781                                       /* 2nd param not relevant for this item */
4782             const U8 * first_variant;
4783
4784             assert(   *currency_string == '-'
4785                    || *currency_string == '+'
4786                    || *currency_string == '.');
4787
4788             currency_string++;
4789
4790             if (is_utf8_invariant_string_loc(currency_string, 0, &first_variant))
4791             {
4792                 DEBUG_L(PerlIO_printf(Perl_debug_log, "Couldn't get currency symbol for %s, or contains only ASCII; can't use for determining if UTF-8 locale\n", save_input_locale));
4793                 only_ascii = TRUE;
4794             }
4795             else {
4796                 is_utf8 = is_strict_utf8_string(first_variant, 0);
4797             }
4798
4799             restore_switched_locale(LC_MONETARY, original_monetary_locale);
4800
4801             if (! only_ascii) {
4802
4803                 /* It isn't a UTF-8 locale if the symbol is not legal UTF-8;
4804                  * otherwise assume the locale is UTF-8 if and only if the symbol
4805                  * is non-ascii UTF-8. */
4806                 DEBUG_Lv(PerlIO_printf(Perl_debug_log, "\t?Currency symbol for %s is UTF-8=%d\n",
4807                                         save_input_locale, is_utf8));
4808                 goto finish_and_return;
4809             }
4810         }
4811
4812 #    endif /* USE_LOCALE_MONETARY */
4813 #    if defined(HAS_STRFTIME) && defined(USE_LOCALE_TIME)
4814
4815     /* Still haven't found a non-ASCII string to disambiguate UTF-8 or not.  Try
4816      * the names of the months and weekdays, timezone, and am/pm indicator */
4817         {
4818             const char *original_time_locale
4819                             = switch_category_locale_to_template(LC_TIME,
4820                                                                  category,
4821                                                                  save_input_locale);
4822             int hour = 10;
4823             bool is_dst = FALSE;
4824             int dom = 1;
4825             int month = 0;
4826             int i;
4827             char * formatted_time;
4828
4829             /* Here the current LC_TIME is set to the locale of the category
4830              * whose information is desired.  Look at all the days of the week and
4831              * month names, and the timezone and am/pm indicator for UTF-8 variant
4832              * characters.  The first such a one found will tell us if the locale
4833              * is UTF-8 or not */
4834
4835             for (i = 0; i < 7 + 12; i++) {  /* 7 days; 12 months */
4836                 formatted_time = my_strftime("%A %B %Z %p",
4837                                 0, 0, hour, dom, month, 2012 - 1900, 0, 0, is_dst);
4838                 if ( ! formatted_time
4839                     || is_utf8_invariant_string((U8 *) formatted_time, 0))
4840                 {
4841
4842                     /* Here, we didn't find a non-ASCII.  Try the next time through
4843                      * with the complemented dst and am/pm, and try with the next
4844                      * weekday.  After we have gotten all weekdays, try the next
4845                      * month */
4846                     is_dst = ! is_dst;
4847                     hour = (hour + 12) % 24;
4848                     dom++;
4849                     if (i > 6) {
4850                         month++;
4851                     }
4852                     continue;
4853                 }
4854
4855                 /* Here, we have a non-ASCII.  Return TRUE is it is valid UTF8;
4856                  * false otherwise.  But first, restore LC_TIME to its original
4857                  * locale if we changed it */
4858                 restore_switched_locale(LC_TIME, original_time_locale);
4859
4860                 DEBUG_Lv(PerlIO_printf(Perl_debug_log, "\t?time-related strings for %s are UTF-8=%d\n",
4861                                     save_input_locale,
4862                                     is_utf8_string((U8 *) formatted_time, 0)));
4863                 is_utf8 = is_utf8_string((U8 *) formatted_time, 0);
4864                 goto finish_and_return;
4865             }
4866
4867             /* Falling off the end of the loop indicates all the names were just
4868              * ASCII.  Go on to the next test.  If we changed it, restore LC_TIME
4869              * to its original locale */
4870             restore_switched_locale(LC_TIME, original_time_locale);
4871             DEBUG_Lv(PerlIO_printf(Perl_debug_log, "All time-related words for %s contain only ASCII; can't use for determining if UTF-8 locale\n", save_input_locale));
4872         }
4873
4874 #    endif
4875
4876 #    if 0 && defined(USE_LOCALE_MESSAGES) && defined(HAS_SYS_ERRLIST)
4877
4878     /* This code is ifdefd out because it was found to not be necessary in testing
4879      * on our dromedary test machine, which has over 700 locales.  There, this
4880      * added no value to looking at the currency symbol and the time strings.  I
4881      * left it in so as to avoid rewriting it if real-world experience indicates
4882      * that dromedary is an outlier.  Essentially, instead of returning abpve if we
4883      * haven't found illegal utf8, we continue on and examine all the strerror()
4884      * messages on the platform for utf8ness.  If all are ASCII, we still don't
4885      * know the answer; but otherwise we have a pretty good indication of the
4886      * utf8ness.  The reason this doesn't help much is that the messages may not
4887      * have been translated into the locale.  The currency symbol and time strings
4888      * are much more likely to have been translated.  */
4889         {
4890             int e;
4891             bool non_ascii = FALSE;
4892             const char *original_messages_locale
4893                             = switch_category_locale_to_template(LC_MESSAGES,
4894                                                                  category,
4895                                                                  save_input_locale);
4896             const char * errmsg = NULL;
4897
4898             /* Here the current LC_MESSAGES is set to the locale of the category
4899              * whose information is desired.  Look through all the messages.  We
4900              * can't use Strerror() here because it may expand to code that
4901              * segfaults in miniperl */
4902
4903             for (e = 0; e <= sys_nerr; e++) {
4904                 errno = 0;
4905                 errmsg = sys_errlist[e];
4906                 if (errno || !errmsg) {
4907                     break;
4908                 }
4909                 errmsg = savepv(errmsg);
4910                 if (! is_utf8_invariant_string((U8 *) errmsg, 0)) {
4911                     non_ascii = TRUE;
4912                     is_utf8 = is_utf8_string((U8 *) errmsg, 0);
4913                     break;
4914                 }
4915             }
4916             Safefree(errmsg);
4917
4918             restore_switched_locale(LC_MESSAGES, original_messages_locale);
4919
4920             if (non_ascii) {
4921
4922                 /* Any non-UTF-8 message means not a UTF-8 locale; if all are valid,
4923                  * any non-ascii means it is one; otherwise we assume it isn't */
4924                 DEBUG_Lv(PerlIO_printf(Perl_debug_log, "\t?error messages for %s are UTF-8=%d\n",
4925                                     save_input_locale,
4926                                     is_utf8));
4927                 goto finish_and_return;
4928             }
4929
4930             DEBUG_L(PerlIO_printf(Perl_debug_log, "All error messages for %s contain only ASCII; can't use for determining if UTF-8 locale\n", save_input_locale));
4931         }
4932
4933 #    endif
4934 #    ifndef EBCDIC  /* On os390, even if the name ends with "UTF-8', it isn't a
4935                    UTF-8 locale */
4936
4937     /* As a last resort, look at the locale name to see if it matches
4938      * qr/UTF -?  * 8 /ix, or some other common locale names.  This "name", the
4939      * return of setlocale(), is actually defined to be opaque, so we can't
4940      * really rely on the absence of various substrings in the name to indicate
4941      * its UTF-8ness, but if it has UTF8 in the name, it is extremely likely to
4942      * be a UTF-8 locale.  Similarly for the other common names */
4943
4944     {
4945         const Size_t final_pos = strlen(save_input_locale) - 1;
4946
4947         if (final_pos >= 3) {
4948             const char *name = save_input_locale;
4949
4950             /* Find next 'U' or 'u' and look from there */
4951             while ((name += strcspn(name, "Uu") + 1)
4952                                         <= save_input_locale + final_pos - 2)
4953             {
4954                 if (   isALPHA_FOLD_NE(*name, 't')
4955                     || isALPHA_FOLD_NE(*(name + 1), 'f'))
4956                 {
4957                     continue;
4958                 }
4959                 name += 2;
4960                 if (*(name) == '-') {
4961                     if ((name > save_input_locale + final_pos - 1)) {
4962                         break;
4963                     }
4964                     name++;
4965                 }
4966                 if (*(name) == '8') {
4967                     DEBUG_L(PerlIO_printf(Perl_debug_log,
4968                                         "Locale %s ends with UTF-8 in name\n",
4969                                         save_input_locale));
4970                     is_utf8 = TRUE;
4971                     goto finish_and_return;
4972                 }
4973             }
4974             DEBUG_L(PerlIO_printf(Perl_debug_log,
4975                                 "Locale %s doesn't end with UTF-8 in name\n",
4976                                     save_input_locale));
4977         }
4978
4979 #      ifdef WIN32
4980
4981         /* http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756.aspx */
4982         if (memENDs(save_input_locale, final_pos, "65001")) {
4983             DEBUG_L(PerlIO_printf(Perl_debug_log,
4984                         "Locale %s ends with 65001 in name, is UTF-8 locale\n",
4985                         save_input_locale));
4986             is_utf8 = TRUE;
4987             goto finish_and_return;
4988         }
4989
4990 #      endif
4991     }
4992 #    endif
4993
4994     /* Other common encodings are the ISO 8859 series, which aren't UTF-8.  But
4995      * since we are about to return FALSE anyway, there is no point in doing
4996      * this extra work */
4997
4998 #    if 0
4999     if (instr(save_input_locale, "8859")) {
5000         DEBUG_L(PerlIO_printf(Perl_debug_log,
5001                              "Locale %s has 8859 in name, not UTF-8 locale\n",
5002                              save_input_locale));
5003         is_utf8 = FALSE;
5004         goto finish_and_return;
5005     }
5006 #    endif
5007
5008     DEBUG_L(PerlIO_printf(Perl_debug_log,
5009                           "Assuming locale %s is not a UTF-8 locale\n",
5010                                     save_input_locale));
5011     is_utf8 = FALSE;
5012
5013 #  endif /* the code that is compiled when no modern LC_CTYPE */
5014
5015   finish_and_return:
5016
5017     /* Cache this result so we don't have to go through all this next time. */
5018     utf8ness_cache_size = sizeof(PL_locale_utf8ness)
5019                        - (utf8ness_cache - PL_locale_utf8ness);
5020
5021     /* But we can't save it if it is too large for the total space available */
5022     if (LIKELY(input_name_len_with_overhead < utf8ness_cache_size)) {
5023         Size_t utf8ness_cache_len = strlen(utf8ness_cache);
5024
5025         /* Here it can fit, but we may need to clear out the oldest cached
5026          * result(s) to do so.  Check */
5027         if (utf8ness_cache_len + input_name_len_with_overhead
5028                                                         >= utf8ness_cache_size)
5029         {
5030             /* Here we have to clear something out to make room for this.
5031              * Start looking at the rightmost place where it could fit and find
5032              * the beginning of the entry that extends past that. */
5033             char * cutoff = (char *) my_memrchr(utf8ness_cache,
5034                                                 UTF8NESS_SEP[0],
5035                                                 utf8ness_cache_size
5036                                               - input_name_len_with_overhead);
5037
5038             assert(cutoff);
5039             assert(cutoff >= utf8ness_cache);
5040
5041             /* This and all subsequent entries must be removed */
5042             *cutoff = '\0';
5043             utf8ness_cache_len = strlen(utf8ness_cache);
5044         }
5045
5046         /* Make space for the new entry */
5047         Move(utf8ness_cache,
5048              utf8ness_cache + input_name_len_with_overhead,
5049              utf8ness_cache_len + 1 /* Incl. trailing NUL */, char);
5050
5051         /* And insert it */
5052         Copy(delimited, utf8ness_cache, input_name_len_with_overhead - 1, char);
5053         utf8ness_cache[input_name_len_with_overhead - 1] = is_utf8 + '0';
5054
5055         if ((PL_locale_utf8ness[strlen(PL_locale_utf8ness)-1]
5056                                                 & (PERL_UINTMAX_T) ~1) != '0')
5057         {
5058             Perl_croak(aTHX_
5059              "panic: %s: %d: Corrupt utf8ness_cache=%s\nlen=%zu,"
5060              " inserted_name=%s, its_len=%zu\n",
5061                 __FILE__, __LINE__,
5062                 PL_locale_utf8ness, strlen(PL_locale_utf8ness),
5063                 delimited, input_name_len_with_overhead);
5064         }
5065     }
5066
5067 #  ifdef DEBUGGING
5068
5069     if (DEBUG_Lv_TEST) {
5070         const char * s = PL_locale_utf8ness;
5071
5072         /* Audit the structure */
5073         while (s < PL_locale_utf8ness + strlen(PL_locale_utf8ness)) {
5074             const char *e;
5075
5076             if (*s != UTF8NESS_SEP[0]) {
5077                 Perl_croak(aTHX_
5078                            "panic: %s: %d: Corrupt utf8ness_cache: missing"
5079                            " separator %.*s<-- HERE %s\n",
5080                            __FILE__, __LINE__,
5081                            (int) (s - PL_locale_utf8ness), PL_locale_utf8ness,
5082                            s);
5083             }
5084             s++;
5085             e = strchr(s, UTF8NESS_PREFIX[0]);
5086             if (! e) {
5087                 Perl_croak(aTHX_
5088                            "panic: %s: %d: Corrupt utf8ness_cache: missing"
5089                            " separator %.*s<-- HERE %s\n",
5090                            __FILE__, __LINE__,
5091                            (int) (e - PL_locale_utf8ness), PL_locale_utf8ness,
5092                            e);
5093             }
5094             e++;
5095             if (*e != '0' && *e != '1') {
5096                 Perl_croak(aTHX_
5097                            "panic: %s: %d: Corrupt utf8ness_cache: utf8ness"
5098                            " must be [01] %.*s<-- HERE %s\n",
5099                            __FILE__, __LINE__,
5100                            (int) (e + 1 - PL_locale_utf8ness),
5101                            PL_locale_utf8ness, e + 1);
5102             }
5103             if (ninstr(PL_locale_utf8ness, s, s-1, e)) {
5104                 Perl_croak(aTHX_
5105                            "panic: %s: %d: Corrupt utf8ness_cache: entry"
5106                            " has duplicate %.*s<-- HERE %s\n",
5107                            __FILE__, __LINE__,
5108                            (int) (e - PL_locale_utf8ness), PL_locale_utf8ness,
5109                            e);
5110             }
5111             s = e + 1;
5112         }
5113     }
5114
5115     if (DEBUG_Lv_TEST || debug_initialization) {
5116
5117         PerlIO_printf(Perl_debug_log,
5118                 "PL_locale_utf8ness is now %s; returning %d\n",
5119                                      PL_locale_utf8ness, is_utf8);
5120     }
5121
5122 #  endif
5123
5124     /* free only when not using the buffer */
5125     if ( delimited != buffer ) Safefree(delimited);
5126     Safefree(save_input_locale);
5127     return is_utf8;
5128 }
5129
5130 #endif
5131
5132 bool
5133 Perl__is_in_locale_category(pTHX_ const bool compiling, const int category)
5134 {
5135     dVAR;
5136     /* Internal function which returns if we are in the scope of a pragma that
5137      * enables the locale category 'category'.  'compiling' should indicate if
5138      * this is during the compilation phase (TRUE) or not (FALSE). */
5139
5140     const COP * const cop = (compiling) ? &PL_compiling : PL_curcop;
5141
5142     SV *these_categories = cop_hints_fetch_pvs(cop, "locale", 0);
5143     if (! these_categories || these_categories == &PL_sv_placeholder) {
5144         return FALSE;
5145     }
5146
5147     /* The pseudo-category 'not_characters' is -1, so just add 1 to each to get
5148      * a valid unsigned */
5149     assert(category >= -1);
5150     return cBOOL(SvUV(these_categories) & (1U << (category + 1)));
5151 }
5152
5153 char *
5154 Perl_my_strerror(pTHX_ const int errnum)
5155 {
5156     /* Returns a mortalized copy of the text of the error message associated
5157      * with 'errnum'.  It uses the current locale's text unless the platform
5158      * doesn't have the LC_MESSAGES category or we are not being called from
5159      * within the scope of 'use locale'.  In the former case, it uses whatever
5160      * strerror returns; in the latter case it uses the text from the C locale.
5161      *
5162      * The function just calls strerror(), but temporarily switches, if needed,
5163      * to the C locale */
5164
5165     char *errstr;
5166     dVAR;
5167
5168 #ifndef USE_LOCALE_MESSAGES
5169
5170     /* If platform doesn't have messages category, we don't do any switching to
5171      * the C locale; we just use whatever strerror() returns */
5172
5173     errstr = savepv(Strerror(errnum));
5174
5175 #else   /* Has locale messages */
5176
5177     const bool within_locale_scope = IN_LC(LC_MESSAGES);
5178
5179 #  ifndef USE_ITHREADS
5180
5181     /* This function is trivial without threads. */
5182     if (within_locale_scope) {
5183         errstr = savepv(strerror(errnum));
5184     }
5185     else {
5186         const char * save_locale = savepv(do_setlocale_c(LC_MESSAGES, NULL));
5187
5188         do_setlocale_c(LC_MESSAGES, "C");
5189         errstr = savepv(strerror(errnum));
5190         do_setlocale_c(LC_MESSAGES, save_locale);
5191         Safefree(save_locale);
5192     }
5193
5194 #  elif defined(HAS_POSIX_2008_LOCALE)                      \
5195      && defined(HAS_STRERROR_L)                             \
5196      && defined(HAS_DUPLOCALE)
5197
5198     /* This function is also trivial if we don't have to worry about thread
5199      * safety and have strerror_l(), as it handles the switch of locales so we
5200      * don't have to deal with that.  We don't have to worry about thread
5201      * safety if strerror_r() is also available.  Both it and strerror_l() are
5202      * thread-safe.  Plain strerror() isn't thread safe.  But on threaded
5203      * builds when strerror_r() is available, the apparent call to strerror()
5204      * below is actually a macro that behind-the-scenes calls strerror_r(). */
5205
5206 #    ifdef HAS_STRERROR_R
5207
5208     if (within_locale_scope) {
5209         errstr = savepv(strerror(errnum));
5210     }
5211     else {
5212         errstr = savepv(strerror_l(errnum, PL_C_locale_obj));
5213     }
5214
5215 #    else
5216
5217     /* Here we have strerror_l(), but not strerror_r() and we are on a
5218      * threaded-build.  We use strerror_l() for everything, constructing a
5219      * locale to pass to it if necessary */
5220
5221     bool do_free = FALSE;
5222     locale_t locale_to_use;
5223
5224     if (within_locale_scope) {
5225         locale_to_use = uselocale((locale_t) 0);
5226         if (locale_to_use == LC_GLOBAL_LOCALE) {
5227             locale_to_use = duplocale(LC_GLOBAL_LOCALE);
5228             do_free = TRUE;
5229         }
5230     }
5231     else {  /* Use C locale if not within 'use locale' scope */
5232         locale_to_use = PL_C_locale_obj;
5233     }
5234
5235     errstr = savepv(strerror_l(errnum, locale_to_use));
5236
5237     if (do_free) {
5238         freelocale(locale_to_use);
5239     }
5240
5241 #    endif
5242 #  else /* Doesn't have strerror_l() */
5243
5244     const char * save_locale = NULL;
5245     bool locale_is_C = FALSE;
5246
5247     /* We have a critical section to prevent another thread from executing this
5248      * same code at the same time.  (On thread-safe perls, the LOCK is a
5249      * no-op.)  Since this is the only place in core that changes LC_MESSAGES
5250      * (unless the user has called setlocale(), this works to prevent races. */
5251     LOCALE_LOCK;
5252
5253     DEBUG_Lv(PerlIO_printf(Perl_debug_log,
5254                             "my_strerror called with errnum %d\n", errnum));
5255     if (! within_locale_scope) {
5256         save_locale = do_setlocale_c(LC_MESSAGES, NULL);
5257         if (! save_locale) {
5258             Perl_croak(aTHX_
5259                  "panic: %s: %d: Could not find current LC_MESSAGES locale,"
5260                  " errno=%d\n", __FILE__, __LINE__, errno);
5261         }
5262         else {
5263             locale_is_C = isNAME_C_OR_POSIX(save_locale);
5264
5265             /* Switch to the C locale if not already in it */
5266             if (! locale_is_C) {
5267
5268                 /* The setlocale() just below likely will zap 'save_locale', so
5269                  * create a copy.  */
5270                 save_locale = savepv(save_locale);
5271                 do_setlocale_c(LC_MESSAGES, "C");
5272             }
5273         }
5274     }   /* end of ! within_locale_scope */
5275     else {
5276         DEBUG_Lv(PerlIO_printf(Perl_debug_log, "%s: %d: WITHIN locale scope\n",
5277                                                __FILE__, __LINE__));
5278     }
5279
5280     DEBUG_Lv(PerlIO_printf(Perl_debug_log,
5281              "Any locale change has been done; about to call Strerror\n"));
5282     errstr = savepv(Strerror(errnum));
5283
5284     if (! within_locale_scope) {
5285         if (save_locale && ! locale_is_C) {
5286             if (! do_setlocale_c(LC_MESSAGES, save_locale)) {
5287                 Perl_croak(aTHX_
5288                      "panic: %s: %d: setlocale restore failed, errno=%d\n",
5289                              __FILE__, __LINE__, errno);
5290             }
5291             Safefree(save_locale);
5292         }
5293     }
5294
5295     LOCALE_UNLOCK;
5296
5297 #  endif /* End of doesn't have strerror_l */
5298 #  ifdef DEBUGGING
5299
5300     if (DEBUG_Lv_TEST) {
5301         PerlIO_printf(Perl_debug_log, "Strerror returned; saving a copy: '");
5302         print_bytes_for_locale(errstr, errstr + strlen(errstr), 0);
5303         PerlIO_printf(Perl_debug_log, "'\n");
5304     }
5305
5306 #  endif
5307 #endif   /* End of does have locale messages */
5308
5309     SAVEFREEPV(errstr);
5310     return errstr;
5311 }
5312
5313 /*
5314
5315 =for apidoc switch_to_global_locale
5316
5317 On systems without locale support, or on typical single-threaded builds, or on
5318 platforms that do not support per-thread locale operations, this function does
5319 nothing.  On such systems that do have locale support, only a locale global to
5320 the whole program is available.
5321
5322 On multi-threaded builds on systems that do have per-thread locale operations,
5323 this function converts the thread it is running in to use the global locale.
5324 This is for code that has not yet or cannot be updated to handle multi-threaded
5325 locale operation.  As long as only a single thread is so-converted, everything
5326 works fine, as all the other threads continue to ignore the global one, so only
5327 this thread looks at it.
5328
5329 However, on Windows systems this isn't quite true prior to Visual Studio 15,
5330 at which point Microsoft fixed a bug.  A race can occur if you use the
5331 following operations on earlier Windows platforms:
5332
5333 =over
5334
5335 =item L<POSIX::localeconv|POSIX/localeconv>
5336
5337 =item L<I18N::Langinfo>, items C<CRNCYSTR> and C<THOUSEP>
5338
5339 =item L<perlapi/Perl_langinfo>, items C<CRNCYSTR> and C<THOUSEP>
5340
5341 =back
5342
5343 The first item is not fixable (except by upgrading to a later Visual Studio
5344 release), but it would be possible to work around the latter two items by using
5345 the Windows API functions C<GetNumberFormat> and C<GetCurrencyFormat>; patches
5346 welcome.
5347
5348 Without this function call, threads that use the L<C<setlocale(3)>> system
5349 function will not work properly, as all the locale-sensitive functions will
5350 look at the per-thread locale, and C<setlocale> will have no effect on this
5351 thread.
5352
5353 Perl code should convert to either call
5354 L<C<Perl_setlocale>|perlapi/Perl_setlocale> (which is a drop-in for the system
5355 C<setlocale>) or use the methods given in L<perlcall> to call
5356 L<C<POSIX::setlocale>|POSIX/setlocale>.  Either one will transparently properly
5357 handle all cases of single- vs multi-thread, POSIX 2008-supported or not.
5358
5359 Non-Perl libraries, such as C<gtk>, that call the system C<setlocale> can
5360 continue to work if this function is called before transferring control to the
5361 library.
5362
5363 Upon return from the code that needs to use the global locale,
5364 L<C<sync_locale()>|perlapi/sync_locale> should be called to restore the safe
5365 multi-thread operation.
5366
5367 =cut
5368 */
5369
5370 void
5371 Perl_switch_to_global_locale()
5372 {
5373
5374 #ifdef USE_THREAD_SAFE_LOCALE
5375 #  ifdef WIN32
5376
5377     _configthreadlocale(_DISABLE_PER_THREAD_LOCALE);
5378
5379 #  else
5380 #    ifdef HAS_QUERYLOCALE
5381
5382     setlocale(LC_ALL, querylocale(LC_ALL_MASK, uselocale((locale_t) 0)));
5383
5384 #    else
5385
5386     {
5387         unsigned int i;
5388
5389         for (i = 0; i < LC_ALL_INDEX; i++) {
5390             setlocale(categories[i], do_setlocale_r(categories[i], NULL));
5391         }
5392     }
5393
5394 #    endif
5395
5396     uselocale(LC_GLOBAL_LOCALE);
5397
5398 #  endif
5399 #endif
5400
5401 }
5402
5403 /*
5404
5405 =for apidoc sync_locale
5406
5407 L<C<Perl_setlocale>|perlapi/Perl_setlocale> can be used at any time to query or
5408 change the locale (though changing the locale is antisocial and dangerous on
5409 multi-threaded systems that don't have multi-thread safe locale operations.
5410 (See L<perllocale/Multi-threaded operation>).  Using the system
5411 L<C<setlocale(3)>> should be avoided.  Nevertheless, certain non-Perl libraries
5412 called from XS, such as C<Gtk> do so, and this can't be changed.  When the
5413 locale is changed by XS code that didn't use
5414 L<C<Perl_setlocale>|perlapi/Perl_setlocale>, Perl needs to be told that the
5415 locale has changed.  Use this function to do so, before returning to Perl.
5416
5417 The return value is a boolean: TRUE if the global locale at the time of call
5418 was in effect; and FALSE if a per-thread locale was in effect.  This can be
5419 used by the caller that needs to restore things as-they-were to decide whether
5420 or not to call
5421 L<C<Perl_switch_to_global_locale>|perlapi/switch_to_global_locale>.
5422
5423 =cut
5424 */
5425
5426 bool
5427 Perl_sync_locale()
5428 {
5429
5430 #ifndef USE_LOCALE
5431
5432     return TRUE;
5433
5434 #else
5435
5436     const char * newlocale;
5437     dTHX;
5438
5439 #  ifdef USE_POSIX_2008_LOCALE
5440
5441     bool was_in_global_locale = FALSE;
5442     locale_t cur_obj = uselocale((locale_t) 0);
5443
5444     /* On Windows, unless the foreign code has turned off the thread-safe
5445      * locale setting, any plain setlocale() will have affected what we see, so
5446      * no need to worry.  Otherwise, If the foreign code has done a plain
5447      * setlocale(), it will only affect the global locale on POSIX systems, but
5448      * will affect the */
5449     if (cur_obj == LC_GLOBAL_LOCALE) {
5450
5451 #    ifdef HAS_QUERY_LOCALE
5452
5453         do_setlocale_c(LC_ALL, setlocale(LC_ALL, NULL));
5454
5455 #    else
5456
5457         unsigned int i;
5458
5459         /* We can't trust that we can read the LC_ALL format on the
5460          * platform, so do them individually */
5461         for (i = 0; i < LC_ALL_INDEX; i++) {
5462             do_setlocale_r(categories[i], setlocale(categories[i], NULL));
5463         }
5464
5465 #    endif
5466
5467         was_in_global_locale = TRUE;
5468     }
5469
5470 #  else
5471
5472     bool was_in_global_locale = TRUE;
5473
5474 #  endif
5475 #  ifdef USE_LOCALE_CTYPE
5476
5477     newlocale = savepv(do_setlocale_c(LC_CTYPE, NULL));
5478     DEBUG_Lv(PerlIO_printf(Perl_debug_log,
5479         "%s:%d: %s\n", __FILE__, __LINE__,
5480         setlocale_debug_string(LC_CTYPE, NULL, newlocale)));
5481     new_ctype(newlocale);
5482     Safefree(newlocale);
5483
5484 #  endif /* USE_LOCALE_CTYPE */
5485 #  ifdef USE_LOCALE_COLLATE
5486
5487     newlocale = savepv(do_setlocale_c(LC_COLLATE, NULL));
5488     DEBUG_Lv(PerlIO_printf(Perl_debug_log,
5489         "%s:%d: %s\n", __FILE__, __LINE__,
5490         setlocale_debug_string(LC_COLLATE, NULL, newlocale)));
5491     new_collate(newlocale);
5492     Safefree(newlocale);
5493
5494 #  endif
5495 #  ifdef USE_LOCALE_NUMERIC
5496
5497     newlocale = savepv(do_setlocale_c(LC_NUMERIC, NULL));
5498     DEBUG_Lv(PerlIO_printf(Perl_debug_log,
5499         "%s:%d: %s\n", __FILE__, __LINE__,
5500         setlocale_debug_string(LC_NUMERIC, NULL, newlocale)));
5501     new_numeric(newlocale);
5502     Safefree(newlocale);
5503
5504 #  endif /* USE_LOCALE_NUMERIC */
5505
5506     return was_in_global_locale;
5507
5508 #endif
5509
5510 }
5511
5512 #if defined(DEBUGGING) && defined(USE_LOCALE)
5513
5514 STATIC char *
5515 S_setlocale_debug_string(const int category,        /* category number,
5516                                                            like LC_ALL */
5517                             const char* const locale,   /* locale name */
5518
5519                             /* return value from setlocale() when attempting to
5520                              * set 'category' to 'locale' */
5521                             const char* const retval)
5522 {
5523     /* Returns a pointer to a NUL-terminated string in static storage with
5524      * added text about the info passed in.  This is not thread safe and will
5525      * be overwritten by the next call, so this should be used just to
5526      * formulate a string to immediately print or savepv() on. */
5527
5528     /* initialise to a non-null value to keep it out of BSS and so keep
5529      * -DPERL_GLOBAL_STRUCT_PRIVATE happy */
5530     static char ret[256] = "If you can read this, thank your buggy C"
5531                            " library strlcpy(), and change your hints file"
5532                            " to undef it";
5533
5534     my_strlcpy(ret, "setlocale(", sizeof(ret));
5535     my_strlcat(ret, category_name(category), sizeof(ret));
5536     my_strlcat(ret, ", ", sizeof(ret));
5537
5538     if (locale) {
5539         my_strlcat(ret, "\"", sizeof(ret));
5540         my_strlcat(ret, locale, sizeof(ret));
5541         my_strlcat(ret, "\"", sizeof(ret));
5542     }
5543     else {
5544         my_strlcat(ret, "NULL", sizeof(ret));
5545     }
5546
5547     my_strlcat(ret, ") returned ", sizeof(ret));
5548
5549     if (retval) {
5550         my_strlcat(ret, "\"", sizeof(ret));
5551         my_strlcat(ret, retval, sizeof(ret));
5552         my_strlcat(ret, "\"", sizeof(ret));
5553     }
5554     else {
5555         my_strlcat(ret, "NULL", sizeof(ret));
5556     }
5557
5558     assert(strlen(ret) < sizeof(ret));
5559
5560     return ret;
5561 }
5562
5563 #endif
5564
5565 void
5566 Perl_thread_locale_init()
5567 {
5568     /* Called from a thread on startup*/
5569
5570 #ifdef USE_THREAD_SAFE_LOCALE
5571
5572     dTHX_DEBUGGING;
5573
5574     /* C starts the new thread in the global C locale.  If we are thread-safe,
5575      * we want to not be in the global locale */
5576
5577      DEBUG_L(PerlIO_printf(Perl_debug_log,
5578             "%s:%d: new thread, initial locale is %s; calling setlocale\n",
5579             __FILE__, __LINE__, setlocale(LC_ALL, NULL)));
5580
5581 #  ifdef WIN32
5582
5583     _configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
5584
5585 #  else
5586
5587     Perl_setlocale(LC_ALL, "C");
5588
5589 #  endif
5590 #endif
5591
5592 }
5593
5594 void
5595 Perl_thread_locale_term()
5596 {
5597     /* Called from a thread as it gets ready to terminate */
5598
5599 #ifdef USE_THREAD_SAFE_LOCALE
5600
5601     /* C starts the new thread in the global C locale.  If we are thread-safe,
5602      * we want to not be in the global locale */
5603
5604 #  ifndef WIN32
5605
5606     {   /* Free up */
5607         dVAR;
5608         locale_t cur_obj = uselocale(LC_GLOBAL_LOCALE);
5609         if (cur_obj != LC_GLOBAL_LOCALE && cur_obj != PL_C_locale_obj) {
5610             freelocale(cur_obj);
5611         }
5612     }
5613
5614 #  endif
5615 #endif
5616
5617 }
5618
5619 /*
5620  * ex: set ts=8 sts=4 sw=4 et:
5621  */