123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- /* Implementation of strtod for systems with atof.
- Copyright (C) 1991, 1995, 2002, 2011 Free Software Foundation, Inc.
- This file is part of the libiberty library. This library is free
- software; you can redistribute it and/or modify it under the
- terms of the GNU General Public License as published by the
- Free Software Foundation; either version 2, or (at your option)
- any later version.
- This 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 General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with GNU CC; see the file COPYING. If not, write to
- the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
- As a special exception, if you link this library with files
- compiled with a GNU compiler to produce an executable, this does not cause
- the resulting executable to be covered by the GNU General Public License.
- This exception does not however invalidate any other reasons why
- the executable file might be covered by the GNU General Public License. */
- /*
- @deftypefn Supplemental double strtod (const char *@var{string}, @
- char **@var{endptr})
- This ISO C function converts the initial portion of @var{string} to a
- @code{double}. If @var{endptr} is not @code{NULL}, a pointer to the
- character after the last character used in the conversion is stored in
- the location referenced by @var{endptr}. If no conversion is
- performed, zero is returned and the value of @var{string} is stored in
- the location referenced by @var{endptr}.
- @end deftypefn
- */
- #include "ansidecl.h"
- #include "safe-ctype.h"
- extern double atof (const char *);
- /* Disclaimer: this is currently just used by CHILL in GDB and therefore
- has not been tested well. It may have been tested for nothing except
- that it compiles. */
- double
- strtod (char *str, char **ptr)
- {
- char *p;
- if (ptr == (char **)0)
- return atof (str);
-
- p = str;
-
- while (ISSPACE (*p))
- ++p;
-
- if (*p == '+' || *p == '-')
- ++p;
- /* INF or INFINITY. */
- if ((p[0] == 'i' || p[0] == 'I')
- && (p[1] == 'n' || p[1] == 'N')
- && (p[2] == 'f' || p[2] == 'F'))
- {
- if ((p[3] == 'i' || p[3] == 'I')
- && (p[4] == 'n' || p[4] == 'N')
- && (p[5] == 'i' || p[5] == 'I')
- && (p[6] == 't' || p[6] == 'T')
- && (p[7] == 'y' || p[7] == 'Y'))
- {
- *ptr = p + 8;
- return atof (str);
- }
- else
- {
- *ptr = p + 3;
- return atof (str);
- }
- }
- /* NAN or NAN(foo). */
- if ((p[0] == 'n' || p[0] == 'N')
- && (p[1] == 'a' || p[1] == 'A')
- && (p[2] == 'n' || p[2] == 'N'))
- {
- p += 3;
- if (*p == '(')
- {
- ++p;
- while (*p != '\0' && *p != ')')
- ++p;
- if (*p == ')')
- ++p;
- }
- *ptr = p;
- return atof (str);
- }
- /* digits, with 0 or 1 periods in it. */
- if (ISDIGIT (*p) || *p == '.')
- {
- int got_dot = 0;
- while (ISDIGIT (*p) || (!got_dot && *p == '.'))
- {
- if (*p == '.')
- got_dot = 1;
- ++p;
- }
- /* Exponent. */
- if (*p == 'e' || *p == 'E')
- {
- int i;
- i = 1;
- if (p[i] == '+' || p[i] == '-')
- ++i;
- if (ISDIGIT (p[i]))
- {
- while (ISDIGIT (p[i]))
- ++i;
- *ptr = p + i;
- return atof (str);
- }
- }
- *ptr = p;
- return atof (str);
- }
- /* Didn't find any digits. Doesn't look like a number. */
- *ptr = str;
- return 0.0;
- }
|