From e8cef8bd59a8b746e9c48611ac2e5836d72b32c1 Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 5 Sep 2023 23:12:06 +0200 Subject: [PATCH] Add iota and atoi functions --- src/kernel/include/stdlib.h | 7 ++++ src/kernel/lib/stdlib.c | 66 +++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 src/kernel/include/stdlib.h create mode 100644 src/kernel/lib/stdlib.c diff --git a/src/kernel/include/stdlib.h b/src/kernel/include/stdlib.h new file mode 100644 index 0000000..e97d284 --- /dev/null +++ b/src/kernel/include/stdlib.h @@ -0,0 +1,7 @@ +#ifndef _CLIPPER_STDLIB_H_ +#define _CLIPPER_STDLIB_H_ + +char* itoa(int value, char* buffer, int base); +char* utoa(unsigned int value, char* buffer, int base); + +#endif // _CLIPPER_STDLIB_H_ diff --git a/src/kernel/lib/stdlib.c b/src/kernel/lib/stdlib.c new file mode 100644 index 0000000..9b5c1d4 --- /dev/null +++ b/src/kernel/lib/stdlib.c @@ -0,0 +1,66 @@ +#include "stdlib.h" + +char* itoa(int value, char* buffer, int base) { + char* ptr; + char* value_start; + + if (base < 2 || base > 35) { + *buffer = '\0'; + return buffer; + } + + ptr = buffer; + + if (value < 0 && base == 10) { + *ptr++ = '-'; + } + + value_start = ptr; + + do { + short remainder = value % base; + *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + remainder]; + + value /= base; + } while(value); + + *ptr-- = '\0'; + + while (value_start < ptr) { + char tmp = *ptr; + *ptr-- = *value_start; + *value_start++ = tmp; + } + + return buffer; +} + +char* utoa(unsigned int value, char* buffer, int base) { + char* ptr; + char* value_start; + + if (base < 2 || base > 35) { + *buffer = '\0'; + return buffer; + } + + ptr = value_start = buffer; + + do { + short remainder = value % base; + *ptr++ = "0123456789abcdefghijklmnopqrstuvwxyz"[remainder]; + + value /= base; + } while(value != 0); + + *ptr-- = '\0'; + + while (value_start < ptr) { + char tmp = *ptr; + *ptr-- = *value_start; + *value_start++ = tmp; + } + + return buffer; +} +