some finishing touches to printf

This commit is contained in:
2025-05-30 15:20:02 -04:00
parent 47056f7d9a
commit f8c38d22b0
4 changed files with 316 additions and 110 deletions

275
libc/stdlib/itoa.c Normal file
View File

@ -0,0 +1,275 @@
#include <stdbool.h>
#include <stdint.h>
static void reverse(char* buf, int len)
{
int start = 0;
int end = len - 1;
while (start < end) {
char tmp = buf[start];
buf[start] = buf[end];
buf[end] = tmp;
end--;
start++;
}
}
char* s64toa(int64_t num, char* buf, int base)
{
int i = 0;
bool neg = false;
if (num == 0) { // Handle zero explicitly
buf[i++] = '0';
buf[i] = '\0';
return buf;
}
if (num < 0 && base == 10) { // only handle negative on base10
neg = true;
num = -num;
}
while (num != 0) {
int rem = num % base;
buf[i++] = (rem > 9) ? (rem - 10) + 'a' : rem + '0';
num = num / base;
}
if (neg) // lets reapply the negative sign
buf[i++] = '-';
buf[i] = '\0';
reverse(buf, i); // reverse, since we did it backwards!
return buf;
}
char* u64toa(uint64_t num, char* buf, int base)
{
int i = 0;
if (num == 0) { // Handle zero explicitly
buf[i++] = '0';
buf[i] = '\0';
return buf;
}
while (num != 0) {
int rem = num % base;
buf[i++] = (rem > 9) ? (rem - 10) + 'a' : rem + '0';
num = num / base;
}
buf[i] = '\0';
reverse(buf, i); // reverse, since we did it backwards!
return buf;
}
char* s32toa(int32_t num, char* buf, int base)
{
int i = 0;
bool neg = false;
if (num == 0) { // Handle zero explicitly
buf[i++] = '0';
buf[i] = '\0';
return buf;
}
if (num < 0 && base == 10) { // only handle negative on base10
neg = true;
num = -num;
}
while (num != 0) {
int rem = num % base;
buf[i++] = (rem > 9) ? (rem - 10) + 'a' : rem + '0';
num = num / base;
}
if (neg) // lets reapply the negative sign
buf[i++] = '-';
buf[i] = '\0';
reverse(buf, i); // reverse, since we did it backwards!
return buf;
}
char* u32toa(uint32_t num, char* buf, int base)
{
int i = 0;
if (num == 0) { // Handle zero explicitly
buf[i++] = '0';
buf[i] = '\0';
return buf;
}
while (num != 0) {
int rem = num % base;
buf[i++] = (rem > 9) ? (rem - 10) + 'a' : rem + '0';
num = num / base;
}
buf[i] = '\0';
reverse(buf, i); // reverse, since we did it backwards!
return buf;
}
char* s16toa(int16_t num, char* buf, int base)
{
int i = 0;
bool neg = false;
if (num == 0) { // Handle zero explicitly
buf[i++] = '0';
buf[i] = '\0';
return buf;
}
if (num < 0 && base == 10) { // only handle negative on base10
neg = true;
num = -num;
}
while (num != 0) {
int rem = num % base;
buf[i++] = (rem > 9) ? (rem - 10) + 'a' : rem + '0';
num = num / base;
}
if (neg) // lets reapply the negative sign
buf[i++] = '-';
buf[i] = '\0';
reverse(buf, i); // reverse, since we did it backwards!
return buf;
}
char* u16toa(uint16_t num, char* buf, int base)
{
int i = 0;
if (num == 0) { // Handle zero explicitly
buf[i++] = '0';
buf[i] = '\0';
return buf;
}
while (num != 0) {
int rem = num % base;
buf[i++] = (rem > 9) ? (rem - 10) + 'a' : rem + '0';
num = num / base;
}
buf[i] = '\0';
reverse(buf, i); // reverse, since we did it backwards!
return buf;
}
char* s8toa(int8_t num, char* buf, int base)
{
int i = 0;
bool neg = false;
if (num == 0) { // Handle zero explicitly
buf[i++] = '0';
buf[i] = '\0';
return buf;
}
if (num < 0 && base == 10) { // only handle negative on base10
neg = true;
num = -num;
}
while (num != 0) {
int rem = num % base;
buf[i++] = (rem > 9) ? (rem - 10) + 'a' : rem + '0';
num = num / base;
}
if (neg) // lets reapply the negative sign
buf[i++] = '-';
buf[i] = '\0';
reverse(buf, i); // reverse, since we did it backwards!
return buf;
}
char* u8toa(uint8_t num, char* buf, int base)
{
int i = 0;
if (num == 0) { // Handle zero explicitly
buf[i++] = '0';
buf[i] = '\0';
return buf;
}
while (num != 0) {
int rem = num % base;
buf[i++] = (rem > 9) ? (rem - 10) + 'a' : rem + '0';
num = num / base;
}
buf[i] = '\0';
reverse(buf, i); // reverse, since we did it backwards!
return buf;
}
char* itoa(int num, char* buf, int base)
{
int i = 0;
bool neg = false;
if (num == 0) { // Handle zero explicitly
buf[i++] = '0';
buf[i] = '\0';
return buf;
}
if (num < 0 && base == 10) { // only handle negative on base10
neg = true;
num = -num;
}
while (num != 0) {
int rem = num % base;
buf[i++] = (rem > 9) ? (rem - 10) + 'a' : rem + '0';
num = num / base;
}
if (neg) // lets reapply the negative sign
buf[i++] = '-';
buf[i] = '\0';
reverse(buf, i); // reverse, since we did it backwards!
return buf;
}
char* utoa(unsigned int num, char* buf, int base)
{
int i = 0;
if (num == 0) { // Handle zero explicitly
buf[i++] = '0';
buf[i] = '\0';
return buf;
}
while (num != 0) {
int rem = num % base;
buf[i++] = (rem > 9) ? (rem - 10) + 'a' : rem + '0';
num = num / base;
}
buf[i] = '\0';
reverse(buf, i); // reverse, since we did it backwards!
return buf;
}