make dmm.c portable
[lunaix-os.git] / lunaix-os / libs / libc / stdlib / itoa.c
index 3d0699ef9f51b8ed1187d0e8099a942de7b75234..affc2f5fe6f3d4f969485feb3184a08427f3c73d 100644 (file)
@@ -1,4 +1,5 @@
 #define __LUNAIX_LIBC
+#include <stddef.h>
 #include <libc/stdlib.h>
 
 char base_char[] = "0123456789abcdefghijklmnopqrstuvwxyz";
@@ -7,22 +8,16 @@ char*
 __uitoa_internal(unsigned int value, char* str, int base, unsigned int* size)
 {
     unsigned int ptr = 0;
-    if (value == 0) {
-        str[0] = '0';
+    do {
+        str[ptr] = base_char[value % base];
+        value = value / base;
         ptr++;
-    } else {
-        while (value) {
-            str[ptr] = base_char[value % base];
-            value = value / base;
-            ptr++;
-        }
-
-        for (unsigned int i = 0; i < (ptr >> 1); i++) {
-            char c = str[i];
-            str[i] = str[ptr - i - 1];
-            str[ptr - i - 1] = c;
-        }
+    } 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) {
@@ -35,10 +30,8 @@ char*
 __itoa_internal(int value, char* str, int base, unsigned int* size)
 {
     if (value < 0 && base == 10) {
-        unsigned int msk = value >> 31;
-        // evil bit level hack for abs()
-        unsigned int _v = (unsigned int)((value + msk) ^ msk);
         str[0] = '-';
+        unsigned int _v = (unsigned int)(-value);
         __uitoa_internal(_v, str + 1, base, size);
     } else {
         __uitoa_internal(value, str, base, size);
@@ -50,5 +43,5 @@ __itoa_internal(int value, char* str, int base, unsigned int* size)
 char*
 itoa(int value, char* str, int base)
 {
-    return __itoa_internal(value, str, base, (void*)0);
+    return __itoa_internal(value, str, base, NULL);
 }
\ No newline at end of file