This commit is contained in:
nub31
2025-12-30 01:36:52 +01:00
parent dae0f9e852
commit 532d3e7b48
11 changed files with 309 additions and 238 deletions

View File

@@ -104,19 +104,7 @@ void console_clear() {
// - `x`: u32 (hex)
// - `c`: char (ascii)
// - `s`: char* (ascii string)
//
// ```c
// printf(
// "The answer is %d is located at offset %x in file %s",
// 42,
// 0x2000
// "hitchhiker.txt"
// );
// ```
void kprintf(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
void kvprintf(const char *fmt, va_list args) {
bool should_format = false;
for (size_t i = 0; fmt[i] != '\0'; i++) {
@@ -135,25 +123,46 @@ void kprintf(const char *fmt, ...) {
console_putchar(character, VGA_DEFAULT_COLOR);
} else if (fmt[i] == 'd') {
u32 val = va_arg(args, u32);
char buf[21];
itoa(val, buf);
char buf[ITOA32_BUFSIZE];
itoa32(val, buf);
for (size_t j = 0; buf[j] != '\0'; j++) {
console_putchar(buf[j], VGA_DEFAULT_COLOR);
}
} else if (fmt[i] == 'u') {
u32 val = va_arg(args, u32);
char buf[21];
uitoa(val, buf);
char buf[UITOA32_BUFSIZE];
uitoa32(val, buf);
for (size_t j = 0; buf[j] != '\0'; j++) {
console_putchar(buf[j], VGA_DEFAULT_COLOR);
}
} else if (fmt[i] == 'x') {
u32 val = va_arg(args, u32);
char buf[17];
uitoa_hex(val, buf);
char buf[UITOA32_HEX_BUFSIZE];
uitoa32_hex(val, buf);
for (size_t j = 0; buf[j] != '\0'; j++) {
console_putchar(buf[j], VGA_DEFAULT_COLOR);
}
} else if (fmt[i] == 'D') {
i64 val = va_arg(args, i64);
char buf[ITOA64_BUFSIZE];
itoa64(val, buf);
for (size_t j = 0; buf[j] != '\0'; j++) {
console_putchar(buf[j], VGA_DEFAULT_COLOR);
}
} else if (fmt[i] == 'U') {
u64 val = va_arg(args, u64);
char buf[UITOA64_BUFSIZE];
uitoa64(val, buf);
for (size_t j = 0; buf[j] != '\0'; j++)
console_putchar(buf[j], VGA_DEFAULT_COLOR);
} else if (fmt[i] == 'X') {
u64 val = va_arg(args, u64);
char buf[UITOA64_HEX_BUFSIZE];
uitoa64_hex(val, buf);
for (size_t j = 0; buf[j] != '\0'; j++)
console_putchar(buf[j], VGA_DEFAULT_COLOR);
} else {
console_putchar(fmt[i], VGA_DEFAULT_COLOR);
}
@@ -163,6 +172,26 @@ void kprintf(const char *fmt, ...) {
console_putchar(fmt[i], VGA_DEFAULT_COLOR);
}
}
}
// Supported formats:
// - `d`: i32 (decimal)
// - `u`: u32 (decimal)
// - `x`: u32 (hex)
// - `c`: char (ascii)
// - `s`: char* (ascii string)
//
// ```c
// printf(
// "The answer is %d is located at offset %x in file %s",
// 42,
// 0x2000
// "hitchhiker.txt"
// );
// ```
void kprintf(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
kvprintf(fmt, args);
va_end(args);
}