2005-01-06 Jeff Johnston <jjohnstn@redhat.com>
* libc/stdlib/strtod.c (_strtod_r): Add NaN support. * (strtof): Ditto. * libc/stdio/vfscanf.c (__svfscanf_r): Ditto. * Makefile.am (MATHOBJS_IN_LIBC): Add s_nan and sf_nan functions for use by strtod and strtof. * Makefile.in: Regenerated.
This commit is contained in:
@@ -117,9 +117,10 @@ _DEFUN (_strtod_r, (ptr, s00, se),
|
||||
unsigned long z;
|
||||
__ULong y;
|
||||
union double_union rv, rv0;
|
||||
int nanflag;
|
||||
|
||||
_Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
|
||||
sign = nz0 = nz = 0;
|
||||
sign = nz0 = nz = nanflag = 0;
|
||||
rv.d = 0.;
|
||||
for (s = s00;; s++)
|
||||
switch (*s)
|
||||
@@ -145,7 +146,23 @@ _DEFUN (_strtod_r, (ptr, s00, se),
|
||||
goto break2;
|
||||
}
|
||||
break2:
|
||||
if (*s == '0')
|
||||
if (*s == 'n' || *s == 'N')
|
||||
{
|
||||
++s;
|
||||
if (*s == 'a' || *s == 'A')
|
||||
{
|
||||
++s;
|
||||
if (*s == 'n' || *s == 'N')
|
||||
{
|
||||
nanflag = 1;
|
||||
++s;
|
||||
goto ret;
|
||||
}
|
||||
}
|
||||
s = s00;
|
||||
goto ret;
|
||||
}
|
||||
else if (*s == '0')
|
||||
{
|
||||
nz0 = 1;
|
||||
while (*++s == '0');
|
||||
@@ -708,7 +725,10 @@ retfree:
|
||||
ret:
|
||||
if (se)
|
||||
*se = (char *) s;
|
||||
return sign ? -rv.d : rv.d;
|
||||
|
||||
if (nanflag)
|
||||
return nan (NULL);
|
||||
return (sign && (s != s00)) ? -rv.d : rv.d;
|
||||
}
|
||||
|
||||
#ifndef NO_REENT
|
||||
@@ -725,7 +745,10 @@ _DEFUN (strtof, (s00, se),
|
||||
_CONST char *s00 _AND
|
||||
char **se)
|
||||
{
|
||||
return (float)_strtod_r (_REENT, s00, se);
|
||||
double retval = _strtod_r (_REENT, s00, se);
|
||||
if (isnan (retval))
|
||||
return nanf (NULL);
|
||||
return (float)retval;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user