diff options
author | Danny Holman <dholman@gymli.org> | 2025-05-03 13:01:25 -0500 |
---|---|---|
committer | Danny Holman <dholman@gymli.org> | 2025-05-03 13:01:25 -0500 |
commit | 1cfbd25dc9eb39467406686c8ae1efbfd5517865 (patch) | |
tree | e676e0f7aa3768806d195ac762c2c9a3bbb835bd /kernel/core/kprintf.c | |
parent | dda63dff71408a45b07ccac9183bb5a216e9ba66 (diff) |
kernel: x86_64: rename x86
Rename the x86 arch-specific directory to x86_64, reflecting clang's
architecture selector flags.
Signed-off-by: Danny Holman <dholman@gymli.org>
Diffstat (limited to 'kernel/core/kprintf.c')
-rw-r--r-- | kernel/core/kprintf.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/kernel/core/kprintf.c b/kernel/core/kprintf.c new file mode 100644 index 0000000..c12a01f --- /dev/null +++ b/kernel/core/kprintf.c @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2025 Danny Holman <dholman@gymli.org> + * + * This file is part of BoxOS, a free and open-source Unix-like operating + * system. + * + * BoxOS is free software; you can redistribute it and/or modify under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * BoxOS is distributed in the hope it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * BoxOS; if not, see <https://www.gnu.org/licenses/>. + */ + +#include <sys/kprintf.h> +#include <sys/serial.h> +#include <string.h> + +char* convert(unsigned int num, int base) { + static char rep[] = "0123456789ABCDEF"; + static char buffer[50]; + char *ptr; + + ptr = &buffer[49]; + *ptr = '\0'; + + do { + *--ptr = rep[num%base]; + num /= base; + } while (num != 0); + + return ptr; +} + +int vkprintf(const char *fmt, va_list args) { + char *s; + int i; + + char buffer[4096]; + memset(buffer, 0, 4096); + for (size_t n = 0; n < strlen(fmt); n++) { + if (fmt[n] != '%') { + buffer[strlen(buffer)] = fmt[n]; + continue; + } else { + n++; + } + + switch (fmt[n]) { + case 'c': + i = va_arg(args, int); + buffer[strlen(buffer)] = i; + break; + case 's': + s = va_arg(args, char*); + strcat(buffer, s); + break; + case 'd': + i = va_arg(args, int); + if (i < 0) { + i = -i; + strcat(buffer, "-"); + } + strcat(buffer, convert(i, 10)); + break; + case 'o': + i = va_arg(args, unsigned int); + strcat(buffer, convert(i, 10)); + break; + case 'x': + i = va_arg(args, unsigned int); + strcat(buffer, convert(i, 16)); + break; + } + } + //tty_write(buffer, strlen(buffer)); + memset(buffer, 0, 4096); + return 0; +} + +int kprintf(const char *fmt, ...) { + va_list args; + int done; + + va_start(args, fmt); + done = vkprintf(fmt, args); + va_end(args); + + return done; +} |