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