From 35d98182c5b86c25eb4e7fd18fc68f240683960b Mon Sep 17 00:00:00 2001 From: Franklin Wei Date: Sun, 1 Mar 2015 14:40:30 -0500 Subject: vprintf and panic formatting --- include/kernel/panic.h | 2 +- include/stdio.h | 5 ++++- kernel/panic.c | 7 ++++++- libc/stdio.c | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 48 insertions(+), 3 deletions(-) diff --git a/include/kernel/panic.h b/include/kernel/panic.h index db53e8e..7baeaa9 100644 --- a/include/kernel/panic.h +++ b/include/kernel/panic.h @@ -1 +1 @@ -void panic(const char*, ...); +void panic(const char*, ...) __attribute__ ((format (printf, 1, 2))); diff --git a/include/stdio.h b/include/stdio.h index 49966cf..9bed898 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -1,4 +1,7 @@ -int printf(const char* fmt, ...) __attribute__ ((format (printf, 1, 2)));; +#include + +int vprintf(const char* fmt, va_list); +int printf(const char* fmt, ...) __attribute__ ((format (printf, 1, 2))); int puts(const char*); int putchar(int); diff --git a/kernel/panic.c b/kernel/panic.c index 3a2ddf1..42b54d7 100644 --- a/kernel/panic.c +++ b/kernel/panic.c @@ -1,10 +1,15 @@ #include "panic.h" +#include #include __attribute__((noreturn)) void panic(const char *str, ...) { /* no printf formatting for now */ - printf("KERNEL PANIC: %s", str); + printf("KERNEL PANIC: "); + va_list ap; + va_start(ap, str); + vprintf(str, ap); + va_end(ap); for(;;) { asm("cli"); diff --git a/libc/stdio.c b/libc/stdio.c index 8219d11..6359c47 100644 --- a/libc/stdio.c +++ b/libc/stdio.c @@ -82,3 +82,40 @@ int printf(const char *fmt, ...) va_end(ap); return 0; } + +int vprintf(const char *fmt, va_list ap) +{ + while(*fmt) + { + char ch = *fmt++; + switch(ch) + { + case '%': + { + switch(*fmt++) + { + case 'c': + putchar(va_arg(ap, int)); + break; + case 's': + puts(va_arg(ap, const char*)); + break; + case 'x': + print_hex(va_arg(ap, unsigned)); + break; + case 'd': + puts(itoa(va_arg(ap, unsigned), 10)); + break; + default: + puts("printf: unknown format\n"); + break; + } + break; + } + default: + putchar(ch); + break; + } + } + return 0; +} -- cgit v1.1