0
|
1 /* Implementation of strtod for systems with atof.
|
|
2 Copyright (C) 1991, 1995, 2002 Free Software Foundation, Inc.
|
|
3
|
|
4 This file is part of the libiberty library. This library is free
|
|
5 software; you can redistribute it and/or modify it under the
|
|
6 terms of the GNU General Public License as published by the
|
|
7 Free Software Foundation; either version 2, or (at your option)
|
|
8 any later version.
|
|
9
|
|
10 This library is distributed in the hope that it will be useful,
|
|
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13 GNU General Public License for more details.
|
|
14
|
|
15 You should have received a copy of the GNU General Public License
|
|
16 along with GNU CC; see the file COPYING. If not, write to
|
|
17 the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
|
|
18
|
|
19 As a special exception, if you link this library with files
|
|
20 compiled with a GNU compiler to produce an executable, this does not cause
|
|
21 the resulting executable to be covered by the GNU General Public License.
|
|
22 This exception does not however invalidate any other reasons why
|
|
23 the executable file might be covered by the GNU General Public License. */
|
|
24
|
|
25 /*
|
|
26
|
|
27 @deftypefn Supplemental double strtod (const char *@var{string}, char **@var{endptr})
|
|
28
|
|
29 This ISO C function converts the initial portion of @var{string} to a
|
|
30 @code{double}. If @var{endptr} is not @code{NULL}, a pointer to the
|
|
31 character after the last character used in the conversion is stored in
|
|
32 the location referenced by @var{endptr}. If no conversion is
|
|
33 performed, zero is returned and the value of @var{string} is stored in
|
|
34 the location referenced by @var{endptr}.
|
|
35
|
|
36 @end deftypefn
|
|
37
|
|
38 */
|
|
39
|
|
40 #include "ansidecl.h"
|
|
41 #include "safe-ctype.h"
|
|
42
|
|
43 extern double atof (const char *);
|
|
44
|
|
45 /* Disclaimer: this is currently just used by CHILL in GDB and therefore
|
|
46 has not been tested well. It may have been tested for nothing except
|
|
47 that it compiles. */
|
|
48
|
|
49 double
|
|
50 strtod (char *str, char **ptr)
|
|
51 {
|
|
52 char *p;
|
|
53
|
|
54 if (ptr == (char **)0)
|
|
55 return atof (str);
|
|
56
|
|
57 p = str;
|
|
58
|
|
59 while (ISSPACE (*p))
|
|
60 ++p;
|
|
61
|
|
62 if (*p == '+' || *p == '-')
|
|
63 ++p;
|
|
64
|
|
65 /* INF or INFINITY. */
|
|
66 if ((p[0] == 'i' || p[0] == 'I')
|
|
67 && (p[1] == 'n' || p[1] == 'N')
|
|
68 && (p[2] == 'f' || p[2] == 'F'))
|
|
69 {
|
|
70 if ((p[3] == 'i' || p[3] == 'I')
|
|
71 && (p[4] == 'n' || p[4] == 'N')
|
|
72 && (p[5] == 'i' || p[5] == 'I')
|
|
73 && (p[6] == 't' || p[6] == 'T')
|
|
74 && (p[7] == 'y' || p[7] == 'Y'))
|
|
75 {
|
|
76 *ptr = p + 8;
|
|
77 return atof (str);
|
|
78 }
|
|
79 else
|
|
80 {
|
|
81 *ptr = p + 3;
|
|
82 return atof (str);
|
|
83 }
|
|
84 }
|
|
85
|
|
86 /* NAN or NAN(foo). */
|
|
87 if ((p[0] == 'n' || p[0] == 'N')
|
|
88 && (p[1] == 'a' || p[1] == 'A')
|
|
89 && (p[2] == 'n' || p[2] == 'N'))
|
|
90 {
|
|
91 p += 3;
|
|
92 if (*p == '(')
|
|
93 {
|
|
94 ++p;
|
|
95 while (*p != '\0' && *p != ')')
|
|
96 ++p;
|
|
97 if (*p == ')')
|
|
98 ++p;
|
|
99 }
|
|
100 *ptr = p;
|
|
101 return atof (str);
|
|
102 }
|
|
103
|
|
104 /* digits, with 0 or 1 periods in it. */
|
|
105 if (ISDIGIT (*p) || *p == '.')
|
|
106 {
|
|
107 int got_dot = 0;
|
|
108 while (ISDIGIT (*p) || (!got_dot && *p == '.'))
|
|
109 {
|
|
110 if (*p == '.')
|
|
111 got_dot = 1;
|
|
112 ++p;
|
|
113 }
|
|
114
|
|
115 /* Exponent. */
|
|
116 if (*p == 'e' || *p == 'E')
|
|
117 {
|
|
118 int i;
|
|
119 i = 1;
|
|
120 if (p[i] == '+' || p[i] == '-')
|
|
121 ++i;
|
|
122 if (ISDIGIT (p[i]))
|
|
123 {
|
|
124 while (ISDIGIT (p[i]))
|
|
125 ++i;
|
|
126 *ptr = p + i;
|
|
127 return atof (str);
|
|
128 }
|
|
129 }
|
|
130 *ptr = p;
|
|
131 return atof (str);
|
|
132 }
|
|
133 /* Didn't find any digits. Doesn't look like a number. */
|
|
134 *ptr = str;
|
|
135 return 0.0;
|
|
136 }
|