ep7
[lunaix-os.git] / lunaix-os / libs / libc / stdlib / itoa.c
1 #define __LUNAIX_LIBC
2 #include <stddef.h>
3 #include <libc/stdlib.h>
4
5 char base_char[] = "0123456789abcdefghijklmnopqrstuvwxyz";
6
7 char*
8 __uitoa_internal(unsigned int value, char* str, int base, unsigned int* size)
9 {
10     unsigned int ptr = 0;
11     if (value == 0) {
12         str[0] = '0';
13         ptr++;
14     } else {
15         while (value) {
16             str[ptr] = base_char[value % base];
17             value = value / base;
18             ptr++;
19         }
20
21         for (unsigned int i = 0; i < (ptr >> 1); i++) {
22             char c = str[i];
23             str[i] = str[ptr - i - 1];
24             str[ptr - i - 1] = c;
25         }
26
27     }
28     str[ptr] = '\0';
29     if (size) {
30         *size = ptr;
31     }
32     return str;
33 }
34
35 char*
36 __itoa_internal(int value, char* str, int base, unsigned int* size)
37 {
38     if (value < 0 && base == 10) {
39         str[0] = '-';
40         unsigned int _v = (unsigned int)(-value);
41         __uitoa_internal(_v, str + 1, base, size);
42     } else {
43         __uitoa_internal(value, str, base, size);
44     }
45
46     return str;
47 }
48
49 char*
50 itoa(int value, char* str, int base)
51 {
52     return __itoa_internal(value, str, base, NULL);
53 }