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