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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 ();
|
---|
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 (str, ptr)
|
---|
51 | char *str;
|
---|
52 | char **ptr;
|
---|
53 | {
|
---|
54 | char *p;
|
---|
55 |
|
---|
56 | if (ptr == (char **)0)
|
---|
57 | return atof (str);
|
---|
58 |
|
---|
59 | p = str;
|
---|
60 |
|
---|
61 | while (ISSPACE (*p))
|
---|
62 | ++p;
|
---|
63 |
|
---|
64 | if (*p == '+' || *p == '-')
|
---|
65 | ++p;
|
---|
66 |
|
---|
67 | /* INF or INFINITY. */
|
---|
68 | if ((p[0] == 'i' || p[0] == 'I')
|
---|
69 | && (p[1] == 'n' || p[1] == 'N')
|
---|
70 | && (p[2] == 'f' || p[2] == 'F'))
|
---|
71 | {
|
---|
72 | if ((p[3] == 'i' || p[3] == 'I')
|
---|
73 | && (p[4] == 'n' || p[4] == 'N')
|
---|
74 | && (p[5] == 'i' || p[5] == 'I')
|
---|
75 | && (p[6] == 't' || p[6] == 'T')
|
---|
76 | && (p[7] == 'y' || p[7] == 'Y'))
|
---|
77 | {
|
---|
78 | *ptr = p + 8;
|
---|
79 | return atof (str);
|
---|
80 | }
|
---|
81 | else
|
---|
82 | {
|
---|
83 | *ptr = p + 3;
|
---|
84 | return atof (str);
|
---|
85 | }
|
---|
86 | }
|
---|
87 |
|
---|
88 | /* NAN or NAN(foo). */
|
---|
89 | if ((p[0] == 'n' || p[0] == 'N')
|
---|
90 | && (p[1] == 'a' || p[1] == 'A')
|
---|
91 | && (p[2] == 'n' || p[2] == 'N'))
|
---|
92 | {
|
---|
93 | p += 3;
|
---|
94 | if (*p == '(')
|
---|
95 | {
|
---|
96 | ++p;
|
---|
97 | while (*p != '\0' && *p != ')')
|
---|
98 | ++p;
|
---|
99 | if (*p == ')')
|
---|
100 | ++p;
|
---|
101 | }
|
---|
102 | *ptr = p;
|
---|
103 | return atof (str);
|
---|
104 | }
|
---|
105 |
|
---|
106 | /* digits, with 0 or 1 periods in it. */
|
---|
107 | if (ISDIGIT (*p) || *p == '.')
|
---|
108 | {
|
---|
109 | int got_dot = 0;
|
---|
110 | while (ISDIGIT (*p) || (!got_dot && *p == '.'))
|
---|
111 | {
|
---|
112 | if (*p == '.')
|
---|
113 | got_dot = 1;
|
---|
114 | ++p;
|
---|
115 | }
|
---|
116 |
|
---|
117 | /* Exponent. */
|
---|
118 | if (*p == 'e' || *p == 'E')
|
---|
119 | {
|
---|
120 | int i;
|
---|
121 | i = 1;
|
---|
122 | if (p[i] == '+' || p[i] == '-')
|
---|
123 | ++i;
|
---|
124 | if (ISDIGIT (p[i]))
|
---|
125 | {
|
---|
126 | while (ISDIGIT (p[i]))
|
---|
127 | ++i;
|
---|
128 | *ptr = p + i;
|
---|
129 | return atof (str);
|
---|
130 | }
|
---|
131 | }
|
---|
132 | *ptr = p;
|
---|
133 | return atof (str);
|
---|
134 | }
|
---|
135 | /* Didn't find any digits. Doesn't look like a number. */
|
---|
136 | *ptr = str;
|
---|
137 | return 0.0;
|
---|
138 | }
|
---|