update for HEAD-2003091401
[reactos.git] / lib / msvcrt / stdlib / strtod.c
1 /* Copyright (C) 1996 DJ Delorie, see COPYING.DJ for details */
2 /* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
3
4 #include <msvcrt/stdlib.h>
5
6
7 /*
8  * @implemented
9  */
10 double
11 strtod(const char *s, char **sret)
12 {
13   long double r;                /* result */
14   int e;                        /* exponent */
15   long double d;                /* scale */
16   int sign;                     /* +- 1.0 */
17   int esign;
18   int i;
19   int flags=0;
20
21   r = 0.0;
22   sign = 1;
23   e = 0;
24   esign = 1;
25
26   while ((*s == ' ') || (*s == '\t'))
27     s++;
28
29   if (*s == '+')
30     s++;
31   else if (*s == '-')
32   {
33     sign = -1;
34     s++;
35   }
36
37   while ((*s >= '0') && (*s <= '9'))
38   {
39     flags |= 1;
40     r *= 10.0;
41     r += *s - '0';
42     s++;
43   }
44
45   if (*s == '.')
46   {
47     d = 0.1L;
48     s++;
49     while ((*s >= '0') && (*s <= '9'))
50     {
51       flags |= 2;
52       r += d * (*s - '0');
53       s++;
54       d *= 0.1L;
55     }
56   }
57
58   if (flags == 0)
59   {
60     if (sret)
61       *sret = (char *)s;
62     return 0;
63   }
64
65   if ((*s == 'e') || (*s == 'E'))
66   {
67     s++;
68     if (*s == '+')
69       s++;
70     else if (*s == '-')
71     {
72       s++;
73       esign = -1;
74     }
75     if ((*s < '0') || (*s > '9'))
76     {
77       if (sret)
78         *sret = (char *)s;
79       return r;
80     }
81
82     while ((*s >= '0') && (*s <= '9'))
83     {
84       e *= 10;
85       e += *s - '0';
86       s++;
87     }
88   }
89
90   if (esign < 0)
91     for (i = 1; i <= e; i++)
92       r *= 0.1L;
93   else
94     for (i = 1; i <= e; i++)
95       r *= 10.0;
96
97   if (sret)
98     *sret = (char *)s;
99   return r * sign;
100 }