summaryrefslogtreecommitdiffstats
path: root/object.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-07-18 01:55:15 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-07-18 01:55:15 +0000
commite96513a759d196e680d79d11e0beacf78cc1bcae (patch)
tree48d8436380c4f99d5301e0104745e411ae4c25b9 /object.c
parentf71920416e57b58a4e95b840a3d3ae8b5d284d16 (diff)
downloadruby-e96513a759d196e680d79d11e0beacf78cc1bcae.tar.gz
ruby-e96513a759d196e680d79d11e0beacf78cc1bcae.tar.xz
ruby-e96513a759d196e680d79d11e0beacf78cc1bcae.zip
* 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
Diffstat (limited to 'object.c')
-rw-r--r--object.c14
1 files changed, 10 insertions, 4 deletions
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;
}