From fe1264d55de7cf3ba903d1e95864832310e36500 Mon Sep 17 00:00:00 2001 From: Ruslan Isaev Date: Sat, 15 Mar 2025 13:06:30 +0300 Subject: [PATCH] stdio: add intToString and make use of it in printf --- src/gdt.c | 2 +- src/stdio.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/src/gdt.c b/src/gdt.c index 47da49a..010eaea 100644 --- a/src/gdt.c +++ b/src/gdt.c @@ -68,7 +68,7 @@ void create_descriptor(uint32_t base, uint32_t limit, uint16_t flag) descriptor |= base << 16; // set base bits 15:0 descriptor |= limit & 0x0000FFFF; // set limit bits 15:0 - printf("0x%.16llX\n", descriptor); + printf("GDT descriptor 0x%X flag: 0x%X\n", descriptor, flag); } void gdt_install() diff --git a/src/stdio.c b/src/stdio.c index 35ec51f..e609211 100644 --- a/src/stdio.c +++ b/src/stdio.c @@ -22,6 +22,52 @@ int putchar(int ic) { return ic; } +void intToString(int value, char *buffer, char format) { + int i = 0; + int isNegative = 0; + unsigned int uValue; + + if (format == 'd') { + if (value < 0) { + isNegative = 1; + uValue = -value; + } else { + uValue = value; + } + + do { + buffer[i++] = '0' + (uValue % 10); + uValue /= 10; + } while (uValue > 0); + + if (isNegative) { + buffer[i++] = '-'; + } + } else if (format == 'x' || format == 'X') { + uValue = (unsigned int)value; + + do { + int digit = uValue % 16; + if (digit < 10) { + buffer[i++] = '0' + digit; + } else { + buffer[i++] = (format == 'x') ? ('a' + digit - 10) : ('A' + digit - 10); + } + uValue /= 16; + } while (uValue > 0); + } else { + buffer[0] = '\0'; + return; + } + + for (int j = 0; j < i / 2; j++) { + char temp = buffer[j]; + buffer[j] = buffer[i - j - 1]; + buffer[i - j - 1] = temp; + } + + buffer[i] = '\0'; +} static bool print(const char* data, size_t length) { const unsigned char* bytes = (const unsigned char*) data; @@ -80,6 +126,21 @@ int printf(const char* restrict format, ...) { if (!print(str, len)) return -1; written += len; + } else if(*format == 'x' || *format == 'X') { + format++; + int number = va_arg(parameters, int); + char str[256]; + + if(*format == 'x') + intToString(number, str, 'x'); + else + intToString(number, str, 'X'); + + size_t len = strlen(str); + if(!print(str, len)) + return -1; + written += strlen(str); + } else { format = format_begun_at; size_t len = strlen(format);