This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
locale.c: Do common task in one place
authorKarl Williamson <khw@cpan.org>
Wed, 17 Jan 2018 05:09:27 +0000 (22:09 -0700)
committerKarl Williamson <khw@cpan.org>
Wed, 31 Jan 2018 05:49:03 +0000 (22:49 -0700)
This function in some cases may need to temporarily switch the
LC_NUMERIC code.  Instead of repeating the logic to determine if this is
needed, do it once.

locale.c

index 8a3e461..d4f90e7 100644 (file)
--- a/locale.c
+++ b/locale.c
@@ -1434,6 +1434,14 @@ S_my_nl_langinfo(const int item, bool toggle)
 {
     dTHX;
 
+    /* We only need to toggle into the underlying LC_NUMERIC locale for these
+     * two items, and only if not already there */
+    if (toggle && ((   item != PERL_RADIXCHAR && item != PERL_THOUSEP)
+                    || PL_numeric_underlying))
+    {
+        toggle = FALSE;
+    }
+
 #if defined(HAS_NL_LANGINFO) /* nl_langinfo() is available.  */
 #if   ! defined(HAS_POSIX_2008_LOCALE)
 
@@ -1445,14 +1453,7 @@ S_my_nl_langinfo(const int item, bool toggle)
     LOCALE_LOCK;
 
     if (toggle) {
-        if (  ! PL_numeric_underlying
-            && (item == PERL_RADIXCHAR || item == PERL_THOUSEP))
-        {
             do_setlocale_c(LC_NUMERIC, PL_numeric_name);
-        }
-        else {
-            toggle = FALSE;
-        }
     }
 
     save_to_buffer(nl_langinfo(item), &PL_langinfo_buf, &PL_langinfo_bufsize, 0);
@@ -1465,6 +1466,7 @@ S_my_nl_langinfo(const int item, bool toggle)
 
 #  else /* Use nl_langinfo_l(), avoiding both a mutex and changing the locale */
 
+    {
     bool do_free = FALSE;
     locale_t cur = uselocale((locale_t) 0);
 
@@ -1483,6 +1485,7 @@ S_my_nl_langinfo(const int item, bool toggle)
     if (do_free) {
         freelocale(cur);
     }
+    }
 
 #  endif
 
@@ -1582,12 +1585,7 @@ S_my_nl_langinfo(const int item, bool toggle)
                 LOCALE_LOCK;
 
                 if (toggle) {
-                    if (! PL_numeric_underlying) {
                         do_setlocale_c(LC_NUMERIC, PL_numeric_name);
-                    }
-                    else {
-                        toggle = FALSE;
-                    }
                 }
 
                 lc = localeconv();