branch update for HEAD-2003021201
[reactos.git] / lib / crtdll / stdlib / itoa.c
1 /*
2  * COPYRIGHT:   See COPYING in the top level directory
3  * PROJECT:     ReactOS system libraries
4  * FILE:        lib/crtdll/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
13 #include <msvcrt/errno.h>
14 #include <msvcrt/stdlib.h>
15 #include <msvcrt/internal/file.h>
16
17
18 char* _itoa(int value, char* string, int radix)
19 {
20   char tmp[33];
21   char *tp = tmp;
22   int i;
23   unsigned v;
24   int sign;
25   char *sp;
26
27   if (radix > 36 || radix <= 1)
28   {
29     __set_errno(EDOM);
30     return 0;
31   }
32
33   sign = (radix == 10 && value < 0);
34   if (sign)
35     v = -value;
36   else
37     v = (unsigned)value;
38   while (v || tp == tmp)
39   {
40     i = v % radix;
41     v = v / radix;
42     if (i < 10)
43       *tp++ = i+'0';
44     else
45       *tp++ = i + 'a' - 10;
46   }
47
48   if (string == 0)
49     string = (char *)malloc((tp-tmp)+sign+1);
50   sp = string;
51
52   if (sign)
53     *sp++ = '-';
54   while (tp > tmp)
55     *sp++ = *--tp;
56   *sp = 0;
57   return string;
58 }
59
60 char* _ltoa(long value, char* string, int radix)
61 {
62   char tmp[33];
63   char *tp = tmp;
64   long i;
65   unsigned long v;
66   int sign;
67   char *sp;
68
69   if (radix > 36 || radix <= 1)
70   {
71      __set_errno(EDOM);
72     return 0;
73   }
74
75   sign = (radix == 10 && value < 0);
76   if (sign)
77     v = -value;
78   else
79     v = (unsigned long)value;
80   while (v || tp == tmp)
81   {
82     i = v % radix;
83     v = v / radix;
84     if (i < 10)
85       *tp++ = i+'0';
86     else
87       *tp++ = i + 'a' - 10;
88   }
89
90   if (string == 0)
91     string = (char *)malloc((tp-tmp)+sign+1);
92   sp = string;
93
94   if (sign)
95     *sp++ = '-';
96   while (tp > tmp)
97     *sp++ = *--tp;
98   *sp = 0;
99   return string;
100 }
101
102 char* _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 }