From b7b97d32cbb6fbc928078ebe3a00714cbbebea86 Mon Sep 17 00:00:00 2001 From: EmulatedSeasons <89668582+EmulatedSeasons@users.noreply.github.com> Date: Fri, 29 Dec 2023 01:38:34 -0500 Subject: got grub memory map and added to kernel printf --- kernel/std/printf.c | 124 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 118 insertions(+), 6 deletions(-) (limited to 'kernel/std/printf.c') diff --git a/kernel/std/printf.c b/kernel/std/printf.c index c383cad..fe45892 100644 --- a/kernel/std/printf.c +++ b/kernel/std/printf.c @@ -3,7 +3,8 @@ #include #include #include - +#include + static bool print(const char* data, size_t length) { const unsigned char* bytes = (const unsigned char*) data; for (size_t i = 0; i < length; i++) @@ -11,13 +12,82 @@ static bool print(const char* data, size_t length) { return false; return true; } - + +// for %d and %x. +static const char* itoa(unsigned int num, char* str, unsigned int base) { + asm("xchgw %bx, %bx"); + int cou = 0; // nt + + if (num == 0) { // 0 + str[cou] = '0'; + str[++cou] = '\0'; + return str; + } + + while (num) + { + unsigned int rem = (num % base); + // brings the number up to ascii 0 + the digit + if (rem > 9) { + str[cou] = rem + '7'; // 7 = 55 + 10(A) = 65 + } else { + str[cou] = rem + '0'; + } + num /= base; + ++cou; + } + + // reverse the string + for (int i = 0; i < cou; i++) { + char temp = str[i]; + str[i] = str[cou - i - 1]; + str[cou - 1] = temp; + } + + str[cou] = '\0'; + return str; +} + +// have no idea if there's a better way to do this. for %lx +static const char* itoa_u64(unsigned long long num, char* str, int base) { + int cou = 0; // nt + + if (num == 0) { // 0 + str[cou] = '0'; + str[++cou] = '\0'; + return str; + } + + while (num) + { + unsigned long long rem = num % base; + // brings the number up to ascii 0 + the digit + if (rem > 9) { + str[cou] = rem + '7'; // 7 = 55 + 10(A) = 65 + } else { + str[cou] = rem + '0'; + } + num /= base; + ++cou; + } + + // reverse the string + for (int i = 0; i < cou; i++) { + char temp = str[i]; + str[i] = str[cou - i - 1]; + str[cou - 1] = temp; + } + + str[cou] = '\0'; + return str; +} + int printf(const char* restrict format, ...) { va_list parameters; va_start(parameters, format); int written = 0; - + while (*format != '\0') { size_t maxrem = INT_MAX - written; @@ -37,9 +107,9 @@ int printf(const char* restrict format, ...) { written += amount; continue; } - + const char* format_begun_at = format++; - + if (*format == 'c') { format++; char c = (char) va_arg(parameters, int /* char promotes to int */); @@ -50,6 +120,48 @@ int printf(const char* restrict format, ...) { if (!print(&c, sizeof(c))) return -1; written++; + } else if (*format == 'd') { + format++; + char str[20]; // probably a long enough buffer + unsigned int d = va_arg(parameters, unsigned int); + itoa(d, str, 10); + size_t len = strlen(str); + if (maxrem < len) { + // TODO: Set errno to EOVERFLOW. + return -1; + } + if (!print(str, len)) + return -1; + written += len; + } else if (*format == 'x') { + format++; + char str[20]; // probably a long enough buffer + unsigned int d = va_arg(parameters, unsigned int); + itoa(d, str, 16); + size_t len = strlen(str); + if (maxrem < len) { + // TODO: Set errno to EOVERFLOW. + return -1; + } + if (!print(str, len)) + return -1; + written += len; + } else if (*format == 'l') { // for %lx and others that start with l + format++; + if (*format == 'x') { + format++; + char str[20]; // probably a long enough buffer + unsigned long long d = va_arg(parameters, unsigned long long); + itoa_u64(d, str, 16); + size_t len = strlen(str); + if (maxrem < len) { + // TODO: Set errno to EOVERFLOW. + return -1; + } + if (!print(str, len)) + return -1; + written += len; + } } else if (*format == 's') { format++; const char* str = va_arg(parameters, const char*); @@ -74,7 +186,7 @@ int printf(const char* restrict format, ...) { format += len; } } - + va_end(parameters); return written; } \ No newline at end of file -- cgit v1.2.3-70-g09d2