:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / lib / msvcrt / stdlib / itoa.c
1 /*
2  * COPYRIGHT:   See COPYING in the top level directory
3  * PROJECT:     ReactOS system libraries
4  * FILE:        lib/msvcrt/stdlib/itoa.c
5  * PURPOSE:     converts a integer to ascii
6  * PROGRAMER:   
7  * UPDATE HISTORY:
8  *              1995: Created
9  *              1998: Added ltoa Boudewijn Dekker
10  */
11 /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
12 #include <msvcrt/errno.h>
13 #include <msvcrt/stdlib.h>
14
15 char *
16 _itoa(int value, char *string, int radix)
17 {
18   char tmp[33];
19   char *tp = tmp;
20   int i;
21   unsigned v;
22   int sign;
23   char *sp;
24
25   if (radix > 36 || radix <= 1)
26   {
27     __set_errno(EDOM);
28     return 0;
29   }
30
31   sign = (radix == 10 && value < 0);
32   if (sign)
33     v = -value;
34   else
35     v = (unsigned)value;
36   while (v || tp == tmp)
37   {
38     i = v % radix;
39     v = v / radix;
40     if (i < 10)
41       *tp++ = i+'0';
42     else
43       *tp++ = i + 'a' - 10;
44   }
45
46   if (string == 0)
47     string = (char *)malloc((tp-tmp)+sign+1);
48   sp = string;
49
50   if (sign)
51     *sp++ = '-';
52   while (tp > tmp)
53     *sp++ = *--tp;
54   *sp = 0;
55   return string;
56 }
57
58 char *
59 _ltoa(long value, char *string, int radix)
60 {
61   char tmp[33];
62   char *tp = tmp;
63   long i;
64   unsigned long v;
65   int sign;
66   char *sp;
67
68   if (radix > 36 || radix <= 1)
69   {
70      __set_errno(EDOM);
71     return 0;
72   }
73
74   sign = (radix == 10 && value < 0);
75   if (sign)
76     v = -value;
77   else
78     v = (unsigned long)value;
79   while (v || tp == tmp)
80   {
81     i = v % radix;
82     v = v / radix;
83     if (i < 10)
84       *tp++ = i+'0';
85     else
86       *tp++ = i + 'a' - 10;
87   }
88
89   if (string == 0)
90     string = (char *)malloc((tp-tmp)+sign+1);
91   sp = string;
92
93   if (sign)
94     *sp++ = '-';
95   while (tp > tmp)
96     *sp++ = *--tp;
97   *sp = 0;
98   return string;
99 }
100
101 char *
102 _ultoa(unsigned long value, char *string, int radix)
103 {
104   char tmp[33];
105   char *tp = tmp;
106   long i;
107   unsigned long v = value;
108   char *sp;
109
110   if (radix > 36 || radix <= 1)
111   {
112     __set_errno(EDOM);
113     return 0;
114   }
115
116   while (v || tp == tmp)
117   {
118     i = v % radix;
119     v = v / radix;
120     if (i < 10)
121       *tp++ = i+'0';
122     else
123       *tp++ = i + 'a' - 10;
124   }
125
126   if (string == 0)
127     string = (char *)malloc((tp-tmp)+1);
128   sp = string;
129
130   while (tp > tmp)
131     *sp++ = *--tp;
132   *sp = 0;
133   return string;
134 }
135
136 char *
137 _i64toa(__int64 value, char *string, int radix)
138 {
139   char tmp[65];
140   char *tp = tmp;
141   int i;
142   unsigned v;
143   int sign;
144   char *sp;
145
146   if (radix > 36 || radix <= 1)
147   {
148     __set_errno(EDOM);
149     return 0;
150   }
151
152   sign = (radix == 10 && value < 0);
153   if (sign)
154     v = -value;
155   else
156     v = (unsigned)value;
157   while (v || tp == tmp)
158   {
159     i = v % radix;
160     v = v / radix;
161     if (i < 10)
162       *tp++ = i+'0';
163     else
164       *tp++ = i + 'a' - 10;
165   }
166
167   if (string == 0)
168     string = (char *)malloc((tp-tmp)+sign+1);
169   sp = string;
170
171   if (sign)
172     *sp++ = '-';
173   while (tp > tmp)
174     *sp++ = *--tp;
175   *sp = 0;
176   return string;
177 }
178
179 char *
180 _ui64toa(unsigned __int64 value, char *string, int radix)
181 {
182   char tmp[65];
183   char *tp = tmp;
184   long i;
185   unsigned long v = value;
186   char *sp;
187
188   if (radix > 36 || radix <= 1)
189   {
190     __set_errno(EDOM);
191     return 0;
192   }
193
194   while (v || tp == tmp)
195   {
196     i = v % radix;
197     v = v / radix;
198     if (i < 10)
199       *tp++ = i+'0';
200     else
201       *tp++ = i + 'a' - 10;
202   }
203
204   if (string == 0)
205     string = (char *)malloc((tp-tmp)+1);
206   sp = string;
207
208   while (tp > tmp)
209     *sp++ = *--tp;
210   *sp = 0;
211   return string;
212 }