feat: provide some libc routines only for testing
[lunaix-os.git] / lunaix-os / usr / libc / itoa.c
diff --git a/lunaix-os/usr/libc/itoa.c b/lunaix-os/usr/libc/itoa.c
new file mode 100644 (file)
index 0000000..d60599f
--- /dev/null
@@ -0,0 +1,46 @@
+#include <stddef.h>
+#include <stdlib.h>
+
+char base_char[] = "0123456789abcdefghijklmnopqrstuvwxyz";
+
+char*
+__uitoa_internal(unsigned int value, char* str, int base, unsigned int* size)
+{
+    unsigned int ptr = 0;
+    do {
+        str[ptr] = base_char[value % base];
+        value = value / base;
+        ptr++;
+    } while (value);
+
+    for (unsigned int i = 0; i < (ptr >> 1); i++) {
+        char c = str[i];
+        str[i] = str[ptr - i - 1];
+        str[ptr - i - 1] = c;
+    }
+    str[ptr] = '\0';
+    if (size) {
+        *size = ptr;
+    }
+    return str;
+}
+
+char*
+__itoa_internal(int value, char* str, int base, unsigned int* size)
+{
+    if (value < 0 && base == 10) {
+        str[0] = '-';
+        unsigned int _v = (unsigned int)(-value);
+        __uitoa_internal(_v, str + 1, base, size);
+    } else {
+        __uitoa_internal(value, str, base, size);
+    }
+
+    return str;
+}
+
+char*
+itoa(int value, char* str, int base)
+{
+    return __itoa_internal(value, str, base, NULL);
+}
\ No newline at end of file