update for HEAD-2003091401
[reactos.git] / lib / msvcrt / stdlib / witoa.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
13 #include <msvcrt/errno.h>
14 #include <msvcrt/stdlib.h>
15 #include <msvcrt/internal/file.h>
16
17
18 /*
19  * @implemented
20  */
21 char* _i64toa(__int64 value, char* string, int radix)
22 {
23   char tmp[65];
24   char *tp = tmp;
25   int i;
26   unsigned v;
27   int sign;
28   char *sp;
29
30   if (radix > 36 || radix <= 1)
31   {
32     __set_errno(EDOM);
33     return 0;
34   }
35
36   sign = (radix == 10 && value < 0);
37   if (sign)
38     v = -value;
39   else
40     v = (unsigned)value;
41   while (v || tp == tmp)
42   {
43     i = v % radix;
44     v = v / radix;
45     if (i < 10)
46       *tp++ = i+'0';
47     else
48       *tp++ = i + 'a' - 10;
49   }
50
51   if (string == 0)
52     string = (char *)malloc((tp-tmp)+sign+1);
53   sp = string;
54
55   if (sign)
56     *sp++ = '-';
57   while (tp > tmp)
58     *sp++ = *--tp;
59   *sp = 0;
60   return string;
61 }
62
63 /*
64  * @implemented
65  */
66 char* _ui64toa(unsigned __int64 value, char* string, int radix)
67 {
68   char tmp[65];
69   char *tp = tmp;
70   long i;
71   unsigned long v = value;
72   char *sp;
73
74   if (radix > 36 || radix <= 1)
75   {
76     __set_errno(EDOM);
77     return 0;
78   }
79
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)+1);
92   sp = string;
93
94   while (tp > tmp)
95     *sp++ = *--tp;
96   *sp = 0;
97   return string;
98 }