51 lines
1.2 KiB
Diff
51 lines
1.2 KiB
Diff
--- 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);
|