Move more common locale finding code into t/loc_tools.pl
authorKarl Williamson <public@khwilliamson.com>
Mon, 20 Jan 2014 19:58:46 +0000 (12:58 -0700)
committerKarl Williamson <public@khwilliamson.com>
Wed, 22 Jan 2014 18:45:59 +0000 (11:45 -0700)
As a result of some code meant to do the same thing being in two
different places, one got updated, and one didn't.  So t/run/locale.t
was being skipped for Win32, even though the bug there it was avoiding
has been fixed in XP.

lib/locale.t
t/loc_tools.pl
t/run/locale.t

index 57c9d06..43e660f 100644 (file)
@@ -67,25 +67,6 @@ sub debugf {
     printf @_ if $debug;
 }
 
-my $have_setlocale = 0;
-eval {
-    require POSIX;
-    import POSIX ':locale_h';
-    $have_setlocale++;
-};
-
-# Visual C's CRT goes silly on strings of the form "en_US.ISO8859-1"
-# and mingw32 uses said silly CRT
-# This doesn't seem to be an issue any more, at least on Windows XP,
-# so re-enable the tests for Windows XP onwards.
-my $winxp = ($^O eq 'MSWin32' && defined &Win32::GetOSVersion &&
-               join('.', (Win32::GetOSVersion())[1..2]) >= 5.1);
-$have_setlocale = 0 if ((($^O eq 'MSWin32' && !$winxp) || $^O eq 'NetWare') &&
-               $Config{cc} =~ /^(cl|gcc)/i);
-
-# UWIN seems to loop after taint tests, just skip for now
-$have_setlocale = 0 if ($^O =~ /^uwin/);
-
 $a = 'abc %';
 
 my $test_num = 0;
@@ -468,11 +449,6 @@ check_taint_not $1, '"foo.bar_baz" =~ /^(.*)[._](.*?)$/';
 # Let us do some *real* locale work now,
 # unless setlocale() is missing (i.e. minitest).
 
-unless ($have_setlocale) {
-    print "1..$test_num\n";
-    exit;
-}
-
 # The test number before our first setlocale()
 my $final_without_setlocale = $test_num;
 
@@ -480,8 +456,6 @@ my $final_without_setlocale = $test_num;
 
 debug "# Scanning for locales...\n";
 
-setlocale(&POSIX::LC_ALL, "C");
-
 my @Locale = find_locales();
 
 debug "# Locales =\n";
@@ -489,6 +463,17 @@ for ( @Locale ) {
     debug "# $_\n";
 }
 
+unless (@Locale) {
+    print "1..$test_num\n";
+    exit;
+}
+
+# We shouldn't get this far unless we know this will succeed
+require POSIX;
+import POSIX ':locale_h';
+
+setlocale(&POSIX::LC_ALL, "C");
+
 my %posixes;
 
 my %Problem;
index 70f93ff..98af329 100644 (file)
@@ -53,6 +53,28 @@ sub _decode_encodings {
 sub find_locales {  # Returns an array of all the locales we found on the
                     # system
 
+
+    my $have_setlocale = 0;
+    eval {
+        require POSIX;
+        import POSIX ':locale_h';
+        $have_setlocale++;
+    };
+
+    # Visual C's CRT goes silly on strings of the form "en_US.ISO8859-1"
+    # and mingw32 uses said silly CRT
+    # This doesn't seem to be an issue any more, at least on Windows XP,
+    # so re-enable the tests for Windows XP onwards.
+    my $winxp = ($^O eq 'MSWin32' && defined &Win32::GetOSVersion &&
+                    join('.', (Win32::GetOSVersion())[1..2]) >= 5.1);
+    $have_setlocale = 0 if ((($^O eq 'MSWin32' && !$winxp) || $^O eq 'NetWare') &&
+                    $Config{cc} =~ /^(cl|gcc|g\+\+|ici)/i);
+
+    # UWIN seems to loop after taint tests, just skip for now
+    $have_setlocale = 0 if ($^O =~ /^uwin/);
+
+    return unless $have_setlocale;
+
     _trylocale("C", \@Locale);
     _trylocale("POSIX", \@Locale);
     foreach (0..15) {
index 1287028..fadb5d4 100644 (file)
@@ -20,13 +20,7 @@ BEGIN {
     }
 }
 use Config;
-my $have_setlocale = $Config{d_setlocale} eq 'define';
 my $have_strtod = $Config{d_strtod} eq 'define';
-$have_setlocale = 0 if $@;
-# Visual C's CRT goes silly on strings of the form "en_US.ISO8859-1"
-# and mingw32 uses said silly CRT
-$have_setlocale = 0 if (($^O eq 'MSWin32' || $^O eq 'NetWare') && $Config{cc} =~ /^(cl|gcc)/i);
-skip_all("no setlocale available") unless $have_setlocale;
 my @locales = find_locales();
 skip_all("no locales available") unless @locales;