toke.c, util.c: setlocale returns new locale, not old
authorKarl Williamson <public@khwilliamson.com>
Tue, 26 Apr 2011 03:01:47 +0000 (21:01 -0600)
committerRicardo Signes <rjbs@cpan.org>
Mon, 19 Dec 2011 02:52:02 +0000 (21:52 -0500)
This means we have to call setlocale with a NULL second parameter
to get the correct old value; then call it with the new value

toke.c
util.c

diff --git a/toke.c b/toke.c
index c642e7f..7f8faf4 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -2193,11 +2193,13 @@ S_force_version(pTHX_ char *s, int guessing)
         if (*d == ';' || isSPACE(*d) || *d == '{' || *d == '}' || !*d) {
            SV *ver;
 #ifdef USE_LOCALE_NUMERIC
-           char *loc = setlocale(LC_NUMERIC, "C");
+           char *loc = savepv(setlocale(LC_NUMERIC, NULL));
+           setlocale(LC_NUMERIC, "C");
 #endif
             s = scan_num(s, &pl_yylval);
 #ifdef USE_LOCALE_NUMERIC
            setlocale(LC_NUMERIC, loc);
+           Safefree(loc);
 #endif
             version = pl_yylval.opval;
            ver = cSVOPx(version)->op_sv;
diff --git a/util.c b/util.c
index 316b1cc..3915286 100644 (file)
--- a/util.c
+++ b/util.c
@@ -4950,14 +4950,18 @@ Perl_upg_version(pTHX_ SV *ver, bool qv)
 
     if ( SvNOK(ver) && !( SvPOK(ver) && sv_len(ver) == 3 ) )
     {
+       STRLEN len;
+
        /* may get too much accuracy */ 
        char tbuf[64];
 #ifdef USE_LOCALE_NUMERIC
-       char *loc = setlocale(LC_NUMERIC, "C");
+       char *loc = savepv(setlocale(LC_NUMERIC, NULL));
+       setlocale(LC_NUMERIC, "C");
 #endif
-       STRLEN len = my_snprintf(tbuf, sizeof(tbuf), "%.9"NVff, SvNVX(ver));
+       len = my_snprintf(tbuf, sizeof(tbuf), "%.9"NVff, SvNVX(ver));
 #ifdef USE_LOCALE_NUMERIC
        setlocale(LC_NUMERIC, loc);
+       Safefree(loc);
 #endif
        while (tbuf[len-1] == '0' && len > 0) len--;
        if ( tbuf[len-1] == '.' ) len--; /* eat the trailing decimal */