:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[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 double
8 strtod(const char *s, char **sret)
9 {
10   long double r;                /* result */
11   int e;                        /* exponent */
12   long double d;                /* scale */
13   int sign;                     /* +- 1.0 */
14   int esign;
15   int i;
16   int flags=0;
17
18   r = 0.0;
19   sign = 1;
20   e = 0;
21   esign = 1;
22
23   while ((*s == ' ') || (*s == '\t'))
24     s++;
25
26   if (*s == '+')
27     s++;
28   else if (*s == '-')
29   {
30     sign = -1;
31     s++;
32   }
33
34   while ((*s >= '0') && (*s <= '9'))
35   {
36     flags |= 1;
37     r *= 10.0;
38     r += *s - '0';
39     s++;
40   }
41
42   if (*s == '.')
43   {
44     d = 0.1L;
45     s++;
46     while ((*s >= '0') && (*s <= '9'))
47     {
48       flags |= 2;
49       r += d * (*s - '0');
50       s++;
51       d *= 0.1L;
52     }
53   }
54
55   if (flags == 0)
56   {
57     if (sret)
58       *sret = (char *)s;
59     return 0;
60   }
61
62   if ((*s == 'e') || (*s == 'E'))
63   {
64     s++;
65     if (*s == '+')
66       s++;
67     else if (*s == '-')
68     {
69       s++;
70       esign = -1;
71     }
72     if ((*s < '0') || (*s > '9'))
73     {
74       if (sret)
75         *sret = (char *)s;
76       return r;
77     }
78
79     while ((*s >= '0') && (*s <= '9'))
80     {
81       e *= 10;
82       e += *s - '0';
83       s++;
84     }
85   }
86
87   if (esign < 0)
88     for (i = 1; i <= e; i++)
89       r *= 0.1L;
90   else
91     for (i = 1; i <= e; i++)
92       r *= 10.0;
93
94   if (sret)
95     *sret = (char *)s;
96   return r * sign;
97 }