diff --git a/inc/stdlib.h b/inc/stdlib.h index 90cdb70..cdb20ff 100644 --- a/inc/stdlib.h +++ b/inc/stdlib.h @@ -36,6 +36,13 @@ int32_t atoi(const char* str); int64_t atol(const char* str); + +char* utoa(uint32_t n, char* buffer, uint32_t radix); +char* ultoa(uint64_t n, char* buffer, uint32_t radix); +char* itoa(int32_t n, char* buffer, uint32_t radix); +char* ltoa(int64_t n, char* buffer, uint32_t radix); + + float strtof(const char *str, char **endptr); void abort(void); diff --git a/src/stdlib.c b/src/stdlib.c index 4a373f6..37d6163 100644 --- a/src/stdlib.c +++ b/src/stdlib.c @@ -13,6 +13,9 @@ #include +static const char l_digits[] = "0123456789abcdef"; + + __attribute__((weak)) void rtlibc_abort_handler(void) { @@ -306,6 +309,118 @@ } +char* utoa(uint32_t n, char* buffer, uint32_t radix) +{ + if ((radix < 2) || (radix > 16)) + return buffer; + + char str[36]; + char* dptr = str + sizeof(str) - 1; + *dptr = 0; + + while(n) + { + *--dptr = l_digits[n % radix]; + n /= radix; + } + + if (*dptr == 0) + *--dptr = l_digits[0]; + + strcpy(buffer, dptr); + + return buffer; +} + + +char* ultoa(uint64_t n, char* buffer, uint32_t radix) +{ + if ((radix < 2) || (radix > 16)) + return buffer; + + char str[72]; + char* dptr = str + sizeof(str) - 1; + *dptr = 0; + + while(n) + { + *--dptr = l_digits[n % radix]; + n /= radix; + } + + if (*dptr == 0) + *--dptr = l_digits[0]; + + strcpy(buffer, dptr); + + return buffer; +} + + + +char* itoa(int32_t n, char* buffer, uint32_t radix) +{ + if ((radix < 2) || (radix > 16)) + return buffer; + + char str[36]; + char* dptr = str + sizeof(str) - 1; + *dptr = 0; + + const bool negative = (radix == 10) && (n < 0); + + uint32_t x = negative ? -n : n; + + while(x) + { + *--dptr = l_digits[x % radix]; + x /= radix; + } + + if (*dptr == 0) + *--dptr = l_digits[0]; + + if (negative) + *--dptr = '-'; + + strcpy(buffer, dptr); + + return buffer; +} + + +char* ltoa(int64_t n, char* buffer, uint32_t radix) +{ + if ((radix < 2) || (radix > 16)) + return buffer; + + char str[72]; + char* dptr = str + sizeof(str) - 1; + *dptr = 0; + + const bool negative = (radix == 10) && (n < 0); + + uint64_t x = negative ? -n : n; + + while(x) + { + *--dptr = l_digits[x % radix]; + x /= radix; + } + + if (*dptr == 0) + *--dptr = l_digits[0]; + + if (negative) + *--dptr = '-'; + + strcpy(buffer, dptr); + + return buffer; +} + + + void abort(void) {