Share more duplicated functions
[reactos.git] / reactos / lib / string / itoa.c
1 #include <string.h>
2 #include <stdlib.h>
3
4 /*
5 * @implemented
6 */
7 char *
8 _i64toa(__int64 value, char *string, int radix)
9 {
10 char tmp[65];
11 char *tp = tmp;
12 __int64 i;
13 unsigned __int64 v;
14 __int64 sign;
15 char *sp;
16
17 if (radix > 36 || radix <= 1)
18 {
19 return 0;
20 }
21
22 sign = (radix == 10 && value < 0);
23 if (sign)
24 v = -value;
25 else
26 v = (unsigned __int64)value;
27 while (v || tp == tmp)
28 {
29 i = v % radix;
30 v = v / radix;
31 if (i < 10)
32 *tp++ = i+'0';
33 else
34 *tp++ = i + 'a' - 10;
35 }
36
37 sp = string;
38 if (sign)
39 *sp++ = '-';
40 while (tp > tmp)
41 *sp++ = *--tp;
42 *sp = 0;
43 return string;
44 }
45
46
47 /*
48 * @implemented
49 */
50 char *
51 _ui64toa(unsigned __int64 value, char *string, int radix)
52 {
53 char tmp[65];
54 char *tp = tmp;
55 __int64 i;
56 unsigned __int64 v;
57 char *sp;
58
59 if (radix > 36 || radix <= 1)
60 {
61 return 0;
62 }
63
64 v = (unsigned __int64)value;
65 while (v || tp == tmp)
66 {
67 i = v % radix;
68 v = v / radix;
69 if (i < 10)
70 *tp++ = i+'0';
71 else
72 *tp++ = i + 'a' - 10;
73 }
74
75 sp = string;
76 while (tp > tmp)
77 *sp++ = *--tp;
78 *sp = 0;
79 return string;
80 }
81
82
83 /*
84 * @implemented
85 */
86 char *
87 _itoa(int value, char *string, int radix)
88 {
89 return _ltoa(value, string, radix);
90 }
91
92
93 /*
94 * @implemented
95 */
96 char *
97 _ltoa(long value, char *string, int radix)
98 {
99 unsigned long val;
100 int negative;
101 char buffer[33];
102 char *pos;
103 int digit;
104
105 if (value < 0 && radix == 10) {
106 negative = 1;
107 val = -value;
108 } else {
109 negative = 0;
110 val = value;
111 } /* if */
112
113 pos = &buffer[32];
114 *pos = '\0';
115
116 do {
117 digit = val % radix;
118 val = val / radix;
119 if (digit < 10) {
120 *--pos = '0' + digit;
121 } else {
122 *--pos = 'a' + digit - 10;
123 } /* if */
124 } while (val != 0L);
125
126 if (negative) {
127 *--pos = '-';
128 } /* if */
129
130 memcpy(string, pos, &buffer[32] - pos + 1);
131 return string;
132 }
133
134
135 /*
136 * @implemented
137 */
138 char *
139 _ultoa(unsigned long value, char *string, int radix)
140 {
141 char tmp[33];
142 char *tp = tmp;
143 long i;
144 unsigned long v = value;
145 char *sp;
146
147 if (radix > 36 || radix <= 1)
148 {
149 return 0;
150 }
151
152 while (v || tp == tmp)
153 {
154 i = v % radix;
155 v = v / radix;
156 if (i < 10)
157 *tp++ = i+'0';
158 else
159 *tp++ = i + 'a' - 10;
160 }
161
162 sp = string;
163 while (tp > tmp)
164 *sp++ = *--tp;
165 *sp = 0;
166 return string;
167 }