Second Extended Filesystem (ext2) and other improvements (#33)
[lunaix-os.git] / lunaix-os / usr / libc / src / itoa.c
1 #include <stddef.h>
2 #include <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     do {
11         str[ptr] = base_char[value % base];
12         value = value / base;
13         ptr++;
14     } while (value);
15
16     for (unsigned int i = 0; i < (ptr >> 1); i++) {
17         char c = str[i];
18         str[i] = str[ptr - i - 1];
19         str[ptr - i - 1] = c;
20     }
21     str[ptr] = '\0';
22     if (size) {
23         *size = ptr;
24     }
25     return str;
26 }
27
28 char*
29 __itoa_internal(int value, char* str, int base, unsigned int* size)
30 {
31     if (value < 0 && base == 10) {
32         str[0] = '-';
33         unsigned int _v = (unsigned int)(-value);
34         __uitoa_internal(_v, str + 1, base, size);
35     } else {
36         __uitoa_internal(value, str, base, size);
37     }
38
39     return str;
40 }
41
42 char*
43 itoa(int value, char* str, int base)
44 {
45     return __itoa_internal(value, str, base, NULL);
46 }