migrate substitution keywords to SVN
[reactos.git] / reactos / 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 }