3f9be6041e6c46faddc66fd5a00bfe7a3ba34c29
[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 wchar_t* _itow(int value, wchar_t* string, int radix)
21 {
22     wchar_t     tmp [33];
23     wchar_t     * tp = tmp;
24     int     i;
25     unsigned int    v;
26     int     sign;
27     wchar_t     * sp;
28
29     if (radix > 36 || radix <= 1)
30     {
31         __set_errno(EDOM);
32         return 0;
33     }
34
35     sign = ((radix == 10) && (value < 0));
36     if (sign) {
37         v = -value;
38     } else {
39         v = (unsigned) value;
40     }
41     while (v || tp == tmp) {
42         i = v % radix;
43         v = v / radix;
44         if (i < 10) {
45             *tp++ = i+ (wchar_t) '0';
46         } else {
47             *tp++ = i + (wchar_t) 'a' - 10;
48         }
49     }
50
51     if (string == 0) {
52         string = (wchar_t*) malloc((tp-tmp) + (sign + 1) * sizeof(wchar_t));
53     }
54     sp = string;
55
56     if (sign) {
57         *sp++ = (wchar_t) '-';
58     }
59     while (tp > tmp) {
60         *sp++ = *--tp;
61     }
62     *sp = (wchar_t) 0;
63     return string;
64 }
65
66 wchar_t* _ltow(long value, wchar_t* string, int radix)
67 {
68     wchar_t tmp [33];
69     wchar_t* tp = tmp;
70     long int i;
71     unsigned long int v;
72     int sign;
73     wchar_t* sp;
74
75     if (radix > 36 || radix <= 1) {
76         __set_errno(EDOM);
77         return 0;
78     }
79
80     sign = ((radix == 10) && (value < 0));
81     if (sign) {
82         v = -value;
83     } else {
84         v = (unsigned long) value;
85     }
86     while (v || tp == tmp) {
87         i = v % radix;
88         v = v / radix;
89         if (i < 10) {
90             *tp++ = i + (wchar_t) '0';
91         } else {
92             *tp++ = i + (wchar_t) 'a' - 10;
93         }
94     }
95
96     if (string == 0) {
97         string = (wchar_t*) malloc((tp - tmp) + (sign + 1) * sizeof(wchar_t));
98     }
99     sp = string;
100
101     if (sign) {
102         *sp++ = (wchar_t) '-';
103     }
104     while (tp > tmp) {
105         *sp++ = *--tp;
106     }
107     *sp = (wchar_t) 0;
108     return string;
109 }
110
111 wchar_t* _ultow(unsigned long value, wchar_t* string, int radix)
112 {
113     wchar_t tmp [33];
114     wchar_t* tp = tmp;
115     long int i;
116     unsigned long int v = value;
117     wchar_t* sp;
118
119     if (radix > 36 || radix <= 1) {
120         __set_errno(EDOM);
121         return 0;
122     }
123     while (v || tp == tmp) {
124         i = v % radix;
125         v = v / radix;
126         if (i < 10) {
127             *tp++ = i + (wchar_t) '0';
128         } else {
129             *tp++ = i + (wchar_t) 'a' - 10;
130         }
131     }
132
133     if (string == 0) {
134 #ifdef _MSVCRT_LIB_    // TODO: check on difference?
135         string = (wchar_t*)malloc(((tp-tmp)+1)*sizeof(wchar_t));
136 #else // TODO: FIXME: review which is correct
137         string = (wchar_t*)malloc((tp - tmp) + sizeof(wchar_t));
138 #endif /*_MSVCRT_LIB_*/
139     }
140     sp = string;
141  
142     while (tp > tmp) {
143         *sp++ = *--tp;
144     }
145     *sp = (wchar_t) 0;
146     return string;
147 }