diff options
author | Karl Williamson <public@khwilliamson.com> | 2014-02-19 15:31:07 -0700 |
---|---|---|
committer | Karl Williamson <public@khwilliamson.com> | 2014-02-19 15:44:31 -0700 |
commit | 481465ea22afd2442b2dd335f19832773b0663e2 (patch) | |
tree | c4e2f74284c5765fa27f12c18f53abea026a1208 | |
parent | 89f7b9aac23a02ff8140b277b76eb7a70b0b04cc (diff) | |
download | perl-481465ea22afd2442b2dd335f19832773b0663e2.tar.gz |
locale.c: Another POSIX emulation fix on Windows
Right after I pushed the previous commit, I realized that the system
default locale on Windows should also have lower priority (besides LANG)
than the LC_foo environment variables. This should do that.
-rw-r--r-- | locale.c | 19 | ||||
-rw-r--r-- | t/run/locale.t | 16 |
2 files changed, 23 insertions, 12 deletions
@@ -348,7 +348,7 @@ Perl_my_setlocale(pTHX_ int category, const char* locale) * otherwise to use the particular category's variable if set; otherwise to * use the LANG variable. */ - unsigned override_LANG = 0; + bool override_LC_ALL = 0; char * result; if (locale && strEQ(locale, "")) { @@ -359,7 +359,7 @@ Perl_my_setlocale(pTHX_ int category, const char* locale) switch (category) { # ifdef LC_ALL case LC_ALL: - override_LANG++; + override_LC_ALL = TRUE; break; /* We already know its variable isn't set */ # endif # ifdef USE_LOCALE_TIME @@ -399,10 +399,7 @@ Perl_my_setlocale(pTHX_ int category, const char* locale) } if (! locale) { locale = PerlEnv_getenv("LANG"); - if (locale) { - override_LANG++; - } - else { + if (! locale) { locale = ""; } } @@ -413,15 +410,15 @@ Perl_my_setlocale(pTHX_ int category, const char* locale) result = setlocale(category, locale); - if (override_LANG < 2) { + if (! override_LC_ALL) { return result; } /* Here the input locale was LC_ALL, and we have set it to what is in the - * LANG variable. But LANG has lower priority than the other LC_foo - * variables, so override it for each one that is set. (If they are set to - * "", it means to use the same thing we just set LC_ALL to, so can skip) - * */ + * LANG variable or the system default if there is no LANG. But these have + * lower priority than the other LC_foo variables, so override it for each + * one that is set. (If they are set to "", it means to use the same thing + * we just set LC_ALL to, so can skip) */ # ifdef USE_LOCALE_TIME result = PerlEnv_getenv("LC_TIME"); if (result and strNE(result, "")) { diff --git a/t/run/locale.t b/t/run/locale.t index e326f784c0..c1b9317832 100644 --- a/t/run/locale.t +++ b/t/run/locale.t @@ -187,6 +187,20 @@ EOF } for ($different) { + local $ENV{LC_NUMERIC} = $_; + local $ENV{LC_ALL}; # so it never overrides LC_NUMERIC + local $ENV{LANG}; # so on Windows gets sys default locale + fresh_perl_is(<<'EOF', "$difference "x4, {}, + use locale; + use POSIX qw(locale_h); + setlocale(LC_NUMERIC, ""); + my $in = 4.2; + printf("%g %g %s %s ", $in, 4.2, sprintf("%g", $in), sprintf("%g", 4.2)); +EOF + "Uses the above test to verify that on Windows the system default locale has lower priority than LC_NUMERIC"); + } + + for ($different) { local $ENV{LC_ALL} = "invalid"; local $ENV{LC_NUMERIC} = "invalid"; local $ENV{LANG} = $_; @@ -308,4 +322,4 @@ EOF } -sub last { 18 } +sub last { 19 } |