summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Williamson <public@khwilliamson.com>2014-02-19 15:31:07 -0700
committerKarl Williamson <public@khwilliamson.com>2014-02-19 15:44:31 -0700
commit481465ea22afd2442b2dd335f19832773b0663e2 (patch)
treec4e2f74284c5765fa27f12c18f53abea026a1208
parent89f7b9aac23a02ff8140b277b76eb7a70b0b04cc (diff)
downloadperl-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.c19
-rw-r--r--t/run/locale.t16
2 files changed, 23 insertions, 12 deletions
diff --git a/locale.c b/locale.c
index b8bfe4ab96..d52559be59 100644
--- a/locale.c
+++ b/locale.c
@@ -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 }