From b9bfdbb13eebe43e9610092ab0de6117e745d85e Mon Sep 17 00:00:00 2001 From: ocean Date: Wed, 14 Jul 2004 03:32:20 +0000 Subject: * util.c (ruby_strtod): should not convert string in the form of "-I.FE-X" which both "I" and "F" are ommitted. [ruby-dev:23883] * test/ruby/test_float.rb (test_strtod): add test for bug fix. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6625 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- util.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'util.c') diff --git a/util.c b/util.c index 783b2c00a8..3fe94074e8 100644 --- a/util.c +++ b/util.c @@ -722,7 +722,8 @@ ruby_strtod(string, endPtr) * fractional part of the mantissa, and X * is the exponent. Either of the signs * may be "+", "-", or omitted. Either I - * or F may be omitted, or both. The decimal + * or F may be omitted, but both cannot be + * ommitted at once. The decimal * point isn't necessary unless F is present. * The "E" may actually be an "e". E and X * may both be omitted (but not just one). @@ -745,7 +746,8 @@ ruby_strtod(string, endPtr) * case, fracExp is incremented one for each * dropped digit. */ int mantSize = 0; /* Number of digits in mantissa. */ - int decPt = FALSE; /* mantissa has decimal point. */ + int hasPoint = FALSE; /* Decimal point exists. */ + int hasDigit = FALSE; /* I or F exists. */ const char *pMant; /* Temporarily holds location of mantissa * in string. */ const char *pExp; /* Temporarily holds location of exponent @@ -778,13 +780,13 @@ ruby_strtod(string, endPtr) for ( ; c = *p; p += 1) { if (!ISDIGIT(c)) { - if (c != '.' || decPt) { + if (c != '.' || hasPoint) { break; } - decPt = TRUE; + hasPoint = TRUE; } else { - if (decPt) { /* already in fractional part */ + if (hasPoint) { /* already in fractional part */ fracExp -= 1; } if (mantSize) { /* already in mantissa */ @@ -794,6 +796,7 @@ ruby_strtod(string, endPtr) mantSize += 1; pMant = p; } + hasDigit = TRUE; } } @@ -812,7 +815,11 @@ ruby_strtod(string, endPtr) fracExp += (mantSize - 18); mantSize = 18; } - { + if (!hasDigit) { + fraction = 0.0; + p = string; + } + else { int frac1, frac2; frac1 = 0; for ( ; mantSize > 9; mantSize -= 1) { -- cgit v1.2.3