From 8fa6cb9a5d5c6e380985cb12b1a799ed3acc8f25 Mon Sep 17 00:00:00 2001 From: Jeff Johnston <jjohnstn@redhat.com> Date: Thu, 6 Jan 2005 23:31:56 +0000 Subject: 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. --- newlib/libc/stdlib/strtod.c | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) (limited to 'newlib/libc/stdlib/strtod.c') diff --git a/newlib/libc/stdlib/strtod.c b/newlib/libc/stdlib/strtod.c index 19467f4..455389d 100644 --- a/newlib/libc/stdlib/strtod.c +++ b/newlib/libc/stdlib/strtod.c @@ -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 -- cgit v1.1