diff options
Diffstat (limited to 'object.c')
-rw-r--r-- | object.c | 17 |
1 files changed, 12 insertions, 5 deletions
@@ -966,7 +966,6 @@ rb_Float(val) q = p = StringValuePtr(val); while (*p && ISSPACE(*p)) p++; - again: d = strtod(p, &end); if (p == end) { bad: @@ -975,12 +974,19 @@ rb_Float(val) if (*end) { if (*end == '_') { char *buf = ALLOCA_N(char, strlen(p)); - char *n = buf, *last; + char *n = buf, *last = p; + while (p < end) *n++ = *p++; while (*p) { - if (*p == '_') { + if (*p == '_' && (n > buf && ISDIGIT(n[-1]))) { + /* remove underscores between digits */ last = ++p; - continue; + while (*p == '_') ++p; + if (!ISDIGIT(*p)) { + while (last < p) *n++ = *last++; + continue; + } + last = p; } *n++ = *p++; } @@ -989,7 +995,8 @@ rb_Float(val) if (!*last) goto bad; *n = '\0'; p = buf; - goto again; + d = strtod(p, &end); + if (p == end) goto bad; } while (*end && ISSPACE(*end)) end++; if (*end) goto bad; |