:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[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 #include <crtdll/errno.h>
13 #include <crtdll/stdlib.h>
14 #include <crtdll/internal/file.h>
15
16 char *
17 itoa(int value, char *string, int radix)
18 {
19   char tmp[33];
20   char *tp = tmp;
21   int i;
22   unsigned v;
23   int sign;
24   char *sp;
25
26   if (radix > 36 || radix <= 1)
27   {
28     __set_errno(EDOM);
29     return 0;
30   }
31
32   sign = (radix == 10 && value < 0);
33   if (sign)
34     v = -value;
35   else
36     v = (unsigned)value;
37   while (v || tp == tmp)
38   {
39     i = v % radix;
40     v = v / radix;
41     if (i < 10)
42       *tp++ = i+'0';
43     else
44       *tp++ = i + 'a' - 10;
45   }
46
47   if (string == 0)
48     string = (char *)malloc((tp-tmp)+sign+1);
49   sp = string;
50
51   if (sign)
52     *sp++ = '-';
53   while (tp > tmp)
54     *sp++ = *--tp;
55   *sp = 0;
56   return string;
57 }
58
59
60 char *
61 ltoa(long value, char *string, int radix)
62 {
63   char tmp[33];
64   char *tp = tmp;
65   long i;
66   unsigned long v;
67   int sign;
68   char *sp;
69
70   if (radix > 36 || radix <= 1)
71   {
72      __set_errno(EDOM);
73     return 0;
74   }
75
76   sign = (radix == 10 && value < 0);
77   if (sign)
78     v = -value;
79   else
80     v = (unsigned long)value;
81   while (v || tp == tmp)
82   {
83     i = v % radix;
84     v = v / radix;
85     if (i < 10)
86       *tp++ = i+'0';
87     else
88       *tp++ = i + 'a' - 10;
89   }
90
91   if (string == 0)
92     string = (char *)malloc((tp-tmp)+sign+1);
93   sp = string;
94
95   if (sign)
96     *sp++ = '-';
97   while (tp > tmp)
98     *sp++ = *--tp;
99   *sp = 0;
100   return string;
101 }
102
103 char *
104 _ultoa(unsigned long value, char *string, int radix)
105 {
106   char tmp[33];
107   char *tp = tmp;
108   long i;
109   unsigned long v = value;
110   char *sp;
111
112   if (radix > 36 || radix <= 1)
113   {
114     __set_errno(EDOM);
115     return 0;
116   }
117
118  
119   while (v || tp == tmp)
120   {
121     i = v % radix;
122     v = v / radix;
123     if (i < 10)
124       *tp++ = i+'0';
125     else
126       *tp++ = i + 'a' - 10;
127   }
128
129   if (string == 0)
130     string = (char *)malloc((tp-tmp)+1);
131   sp = string;
132
133  
134   while (tp > tmp)
135     *sp++ = *--tp;
136   *sp = 0;
137   return string;
138 }