diff --git a/src/kernel/console.cpp b/src/kernel/console.cpp index b8767a6..eb05df5 100644 --- a/src/kernel/console.cpp +++ b/src/kernel/console.cpp @@ -1,3 +1,4 @@ +#include #include "console.h" #include "io.h" @@ -247,3 +248,63 @@ console::puts(const char *message) if (c == '\n') serial_write('\r'); } } + +void console::printf(const char *fmt, ...) +{ + static const unsigned buf_size = 256; + char buffer[256]; + + const char *r = fmt; + char *w = buffer; + char *wend = buffer + buf_size; + + va_list args; + va_start(args, fmt); + +#define flush() do { *w = 0; puts(buffer); w = buffer; } while(0) + + while (r && *r) { + if (w == wend) flush(); + + if (*r != '%') { + *w++ = *r++; + continue; + } + + flush(); + + r++; // chomp the % + switch (*r++) { + case '%': *w = '%'; break; + + case 'x': put_hex(va_arg(args, uint32_t)); break; + + case 'd': + case 'u': put_dec(va_arg(args, uint32_t)); break; + + case 's': { + const char *s = va_arg(args, const char*); + if (s) puts(s); + } + break; + + case 'l': + switch (*r++) { + case 'x': put_hex(va_arg(args, uint64_t)); break; + + case 'd': + case 'u': put_dec(va_arg(args, uint64_t)); break; + + default: + break; + } + break; + + default: + break; + } + } + + flush(); + va_end(args); +}