Further reduced differences and include all identical msvcrt targets in crtdll makefile.
[reactos.git] / reactos / lib / crtdll / stdlib / itow.c
1 /* $Id: itow.c,v 1.3 2002/11/29 15:59:01 robd Exp $
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/crtdll/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 }