Skip to content

Instantly share code, notes, and snippets.

@juster
Created June 19, 2014 14:56
Show Gist options
  • Save juster/bfb1f50ab0c624c4e4fd to your computer and use it in GitHub Desktop.
Save juster/bfb1f50ab0c624c4e4fd to your computer and use it in GitHub Desktop.
--- 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);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment