summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--object.c14
-rw-r--r--util.c7
3 files changed, 22 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index ac4cf9508f..5e84b8c433 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Tue Jul 18 10:53:37 2006 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * 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 <nobu@ruby-lang.org>
* util.c (ruby_strtod): stop at dot not followed by digits.
diff --git a/object.c b/object.c
index 61492ef674..1c0a03b19a 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 6c18543347..76902d9a6d 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;
}