123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- --- perl-5.20.0/vutil.c 2014-05-26 09:34:21.000000000 -0400
- +++ perl-5.20.0-patched/vutil.c 2014-06-19 09:25:19.024409700 -0400
- @@ -585,11 +585,29 @@
- {
- STRLEN len;
-
- +#ifdef USE_LOCALE_NUMERIC
- + char *loc = setlocale(LC_NUMERIC, NULL);
- + if (loc) {
- + /* setlocale returns NULL on error */
- + if (loc[0] == 'C' && loc[1] == '\0') {
- + /* LC_NUMERIC is already C, nothing to do */
- + loc = NULL;
- + }
- + else {
- + loc = savepv(loc);
- + if (!setlocale(LC_NUMERIC, "C")) {
- + /* error! do not restore locale later */
- + Safefree(loc);
- + loc = NULL;
- + }
- + }
- + }
- +#endif
- +
- /* may get too much accuracy */
- char tbuf[64];
- SV *sv = SvNVX(ver) > 10e50 ? newSV(64) : 0;
- char *buf;
- - STORE_NUMERIC_LOCAL_SET_STANDARD();
- if (sv) {
- Perl_sv_catpvf(aTHX_ sv, "%.9"NVff, SvNVX(ver));
- len = SvCUR(sv);
- @@ -599,7 +617,15 @@
- len = my_snprintf(tbuf, sizeof(tbuf), "%.9"NVff, SvNVX(ver));
- buf = tbuf;
- }
- - RESTORE_NUMERIC_LOCAL();
- +
- +#ifdef USE_LOCALE_NUMERIC
- + if (loc) {
- + /* restore locale */
- + setlocale(LC_NUMERIC, loc);
- + Safefree(loc);
- + }
- +#endif
- +
- while (buf[len-1] == '0' && len > 0) len--;
- if ( buf[len-1] == '.' ) len--; /* eat the trailing decimal */
- version = savepvn(buf, len);
|