From e96513a759d196e680d79d11e0beacf78cc1bcae Mon Sep 17 00:00:00 2001 From: nobu Date: Tue, 18 Jul 2006 01:55:15 +0000 Subject: * object.c (rb_cstr_to_dbl): limit out-of-range message. * util.c (ruby_strtod): return end pointer even if ERANGE occurred. fixed: [ruby-dev:29041] git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8@10553 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++++ object.c | 14 ++++++++++---- util.c | 7 +++++-- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index ac4cf9508..5e84b8c43 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Tue Jul 18 10:53:37 2006 Nobuyoshi Nakada + + * object.c (rb_cstr_to_dbl): limit out-of-range message. + + * util.c (ruby_strtod): return end pointer even if ERANGE occurred. + fixed: [ruby-dev:29041] + Mon Jul 18 00:43:05 2006 Nobuyoshi Nakada * util.c (ruby_strtod): stop at dot not followed by digits. diff --git a/object.c b/object.c index 61492ef67..1c0a03b19 100644 --- a/object.c +++ b/object.c @@ -2213,6 +2213,9 @@ rb_cstr_to_dbl(p, badcheck) const char *q; char *end; double d; + const char *ellipsis = ""; + int w; +#define OutOfRange() (((w = end - p) > 20) ? (w = 20, ellipsis = "...") : (ellipsis = "")) if (!p) return 0.0; q = p; @@ -2224,7 +2227,8 @@ rb_cstr_to_dbl(p, badcheck) } d = strtod(p, &end); if (errno == ERANGE) { - rb_warn("Float %*s out of range", end-p, p); + OutOfRange(); + rb_warn("Float %.*s%s out of range", w, p, ellipsis); errno = 0; } if (p == end) { @@ -2258,18 +2262,20 @@ rb_cstr_to_dbl(p, badcheck) p = buf; d = strtod(p, &end); if (errno == ERANGE) { - rb_warn("Float %*s out of range", end-p, p); + OutOfRange(); + rb_warn("Float %.*s%s out of range", w, p, ellipsis); errno = 0; } if (badcheck) { - if (p == end) goto bad; + if (!end || p == end) goto bad; while (*end && ISSPACE(*end)) end++; if (*end) goto bad; } } if (errno == ERANGE) { errno = 0; - rb_raise(rb_eArgError, "Float %s out of range", q); + OutOfRange(); + rb_raise(rb_eArgError, "Float %.*s%s out of range", w, q, ellipsis); } return d; } diff --git a/util.c b/util.c index 6c1854334..76902d9a6 100644 --- a/util.c +++ b/util.c @@ -890,11 +890,13 @@ ruby_strtod(string, endPtr) if (exp >= MDMAXEXPT) { errno = ERANGE; - return HUGE_VAL * (sign ? -1.0 : 1.0); + fraction = HUGE_VAL; + goto ret; } else if (exp < MDMINEXPT) { errno = ERANGE; - return 0.0 * (sign ? -1.0 : 1.0); + fraction = 0.0; + goto ret; } fracExp = exp; exp += 9; @@ -940,6 +942,7 @@ ruby_strtod(string, endPtr) fraction = frac1 + frac2; } + ret: if (endPtr != NULL) { *endPtr = (char *)p; } -- cgit