diff options
Diffstat (limited to 'stdlib')
-rw-r--r-- | stdlib/longlong.h | 30 | ||||
-rw-r--r-- | stdlib/strtod.c | 71 |
2 files changed, 49 insertions, 52 deletions
diff --git a/stdlib/longlong.h b/stdlib/longlong.h index 6d4f237405..8bb6995cd0 100644 --- a/stdlib/longlong.h +++ b/stdlib/longlong.h @@ -1,21 +1,21 @@ /* longlong.h -- definitions for mixed size 32/64 bit arithmetic. + Copyright (C) 1991, 92, 93, 94, 96, 97 Free Software Foundation, Inc. + This file is part of the GNU C Library. -Copyright (C) 1991, 1992, 1993, 1994, 1996 Free Software Foundation, Inc. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -This file is free software; you can redistribute it and/or modify -it under the terms of the GNU Library General Public License as published by -the Free Software Foundation; either version 2 of the License, or (at your -option) any later version. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -This file is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public -License for more details. - -You should have received a copy of the GNU Library General Public License -along with this file; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ /* You have to define the following before including this file: @@ -585,7 +585,7 @@ extern USItype __udiv_qrnnd (); addx%.l %2,%0 | End inlined umul_ppmm" \ : "=&d" ((USItype)(xh)), "=&d" ((USItype)(xl)), \ - "=d" (__umul_tmp1), "=&d" (__umul_tmp2) \ + "=d" (__umul_tmp1), "=&d" (__umul_tmp2) \ : "%2" ((USItype)(a)), "d" ((USItype)(b))); \ } while (0) #define UMUL_TIME 100 diff --git a/stdlib/strtod.c b/stdlib/strtod.c index 5ddb956081..1c13af721a 100644 --- a/stdlib/strtod.c +++ b/stdlib/strtod.c @@ -46,6 +46,7 @@ mant = 0x8000000000000ULL; \ u.ieee.mantissa0 = ((mant) >> 32) & 0xfffff; \ u.ieee.mantissa1 = (mant) & 0xffffffff; \ + (flt) = u.d; \ } while (0) #endif /* End of configuration part. */ @@ -504,11 +505,9 @@ INTERNAL (STRTOF) (nptr, endptr, group LOCALE_PARAM) { int matched = 0; /* Check for `INF' or `INFINITY'. */ - if (TOLOWER (c) == L_('i') && ((STRNCASECMP (cp, L_("nf"), 2) == 0 - && (matched = 2)) - || (STRNCASECMP (cp, L_("nfinity"), 7) - == 0 - && (matched = 7)))) + if (TOLOWER (c) == L_('i') + && ((STRNCASECMP (cp, L_("inf"), 3) == 0 && (matched = 3)) + || (STRNCASECMP (cp, L_("infinity"), 8) == 0 && (matched = 8)))) { /* Return +/- inifity. */ if (endptr != NULL) @@ -517,47 +516,45 @@ INTERNAL (STRTOF) (nptr, endptr, group LOCALE_PARAM) return negative ? -FLOAT_HUGE_VAL : FLOAT_HUGE_VAL; } - if (TOLOWER (c) == L_('n') && STRNCASECMP (cp, L_("an"), 2) == 0) + if (TOLOWER (c) == L_('n') && STRNCASECMP (cp, L_("nan"), 3) == 0) { + /* Return NaN. */ FLOAT retval = NAN; - /* Return NaN. */ - if (endptr != NULL) - { - cp += 2; + cp += 3; - /* Match `(n-char-sequence-digit)'. */ - if (*cp == L_('(')) - { - const STRING_TYPE *startp = cp; - do - ++cp; - while ((*cp >= '0' && *cp <= '9') - || (TOLOWER (*cp) >= 'a' && TOLOWER (*cp) <= 'z') + /* Match `(n-char-sequence-digit)'. */ + if (*cp == L_('(')) + { + const STRING_TYPE *startp = cp; + do + ++cp; + while ((*cp >= L_('0') && *cp <= L_('9')) + || (TOLOWER (*cp) >= L_('a') && TOLOWER (*cp) <= L_('z')) || *cp == L_('_')); - if (*cp != L_(')')) - /* The closing brace is missing. Only match the NAN - part. */ - cp = startp; - else - { - /* This is a system-dependent way to specify the - bitmask used for the NaN. We expect it to be - a number which is put in the mantissa of the - number. */ - STRING_TYPE *endp; - unsigned long long int mant; - - mant = STRTOULL (startp, &endp, 0); - if (endp == cp) - SET_MANTISSA (retval, mant); - } + if (*cp != L_(')')) + /* The closing brace is missing. Only match the NAN + part. */ + cp = startp; + else + { + /* This is a system-dependent way to specify the + bitmask used for the NaN. We expect it to be + a number which is put in the mantissa of the + number. */ + STRING_TYPE *endp; + unsigned long long int mant; + + mant = STRTOULL (startp + 1, &endp, 0); + if (endp == cp) + SET_MANTISSA (retval, mant); } - - *endptr = (STRING_TYPE *) cp; } + if (endptr != NULL) + *endptr = (STRING_TYPE *) cp; + return retval; } |