update for HEAD-2003091401
[reactos.git] / lib / msvcrt / stdlib / itow.c
1 /* $Id$
2  *
3  * COPYRIGHT:   See COPYING in the top level directory
4  * PROJECT:     ReactOS system libraries
5  * FILE:        lib/msvcrt/stdlib/itow.c
6  * PURPOSE:     converts a integer to wchar_t
7  * PROGRAMER:   
8  * UPDATE HISTORY:
9  *              1995: Created
10  *              1998: Added ltoa Boudewijn Dekker
11  *              2000: derived from ./itoa.c by ea
12  */
13 /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
14
15 #include <msvcrt/errno.h>
16 #include <msvcrt/stdlib.h>
17 #include <msvcrt/internal/file.h>
18
19
20 /*
21  * @implemented
22  */
23 wchar_t* _itow(int value, wchar_t* string, int radix)
24 {
25     wchar_t     tmp [33];
26     wchar_t     * tp = tmp;
27     int     i;
28     unsigned int    v;
29     int     sign;
30     wchar_t     * sp;
31
32     if (radix > 36 || radix <= 1)
33     {
34         __set_errno(EDOM);
35         return 0;
36     }
37
38     sign = ((radix == 10) && (value < 0));
39     if (sign) {
40         v = -value;
41     } else {
42         v = (unsigned) value;
43     }
44     while (v || tp == tmp) {
45         i = v % radix;
46         v = v / radix;
47         if (i < 10) {
48             *tp++ = i+ (wchar_t) '0';
49         } else {
50             *tp++ = i + (wchar_t) 'a' - 10;
51         }
52     }
53
54     if (string == 0) {
55         string = (wchar_t*) malloc((tp-tmp) + (sign + 1) * sizeof(wchar_t));
56     }
57     sp = string;
58
59     if (sign) {
60         *sp++ = (wchar_t) '-';
61     }
62     while (tp > tmp) {
63         *sp++ = *--tp;
64     }
65     *sp = (wchar_t) 0;
66     return string;
67 }
68
69 /*
70  * @implemented
71  */
72 wchar_t* _ltow(long value, wchar_t* string, int radix)
73 {
74     wchar_t tmp [33];
75     wchar_t* tp = tmp;
76     long int i;
77     unsigned long int v;
78     int sign;
79     wchar_t* sp;
80
81     if (radix > 36 || radix <= 1) {
82         __set_errno(EDOM);
83         return 0;
84     }
85
86     sign = ((radix == 10) && (value < 0));
87     if (sign) {
88         v = -value;
89     } else {
90         v = (unsigned long) value;
91     }
92     while (v || tp == tmp) {
93         i = v % radix;
94         v = v / radix;
95         if (i < 10) {
96             *tp++ = i + (wchar_t) '0';
97         } else {
98             *tp++ = i + (wchar_t) 'a' - 10;
99         }
100     }
101
102     if (string == 0) {
103         string = (wchar_t*) malloc((tp - tmp) + (sign + 1) * sizeof(wchar_t));
104     }
105     sp = string;
106
107     if (sign) {
108         *sp++ = (wchar_t) '-';
109     }
110     while (tp > tmp) {
111         *sp++ = *--tp;
112     }
113     *sp = (wchar_t) 0;
114     return string;
115 }
116
117 /*
118  * @unimplemented
119  */
120 wchar_t* _ultow(unsigned long value, wchar_t* string, int radix)
121 {
122     wchar_t tmp [33];
123     wchar_t* tp = tmp;
124     long int i;
125     unsigned long int v = value;
126     wchar_t* sp;
127
128     if (radix > 36 || radix <= 1) {
129         __set_errno(EDOM);
130         return 0;
131     }
132     while (v || tp == tmp) {
133         i = v % radix;
134         v = v / radix;
135         if (i < 10) {
136             *tp++ = i + (wchar_t) '0';
137         } else {
138             *tp++ = i + (wchar_t) 'a' - 10;
139         }
140     }
141
142     if (string == 0) {
143 #ifdef _MSVCRT_LIB_    // TODO: check on difference?
144         string = (wchar_t*)malloc(((tp-tmp)+1)*sizeof(wchar_t));
145 #else // TODO: FIXME: review which is correct
146         string = (wchar_t*)malloc((tp - tmp) + sizeof(wchar_t));
147 #endif /*_MSVCRT_LIB_*/
148     }
149     sp = string;
150  
151     while (tp > tmp) {
152         *sp++ = *--tp;
153     }
154     *sp = (wchar_t) 0;
155     return string;
156 }