From 2404b22c1ff08168cf5c2f0f83c3d4378ae58f55 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Wed, 25 Apr 2018 19:52:27 -0700 Subject: [PATCH] support widths in printf --- src/kernel/console.cpp | 68 ++++++++++++++++++++++++++++-------------- src/kernel/console.h | 18 ++++++++--- 2 files changed, 60 insertions(+), 26 deletions(-) diff --git a/src/kernel/console.cpp b/src/kernel/console.cpp index eb05df5..e2622df 100644 --- a/src/kernel/console.cpp +++ b/src/kernel/console.cpp @@ -244,6 +244,7 @@ console::puts(const char *message) while (message && *message) { char c = *message++; if (m_screen) m_screen->putc(c); + serial_write(c); if (c == '\n') serial_write('\r'); } @@ -271,37 +272,60 @@ void console::printf(const char *fmt, ...) continue; } + r++; // chomp the % flush(); - r++; // chomp the % - switch (*r++) { - case '%': *w = '%'; break; + bool done = false; + bool right = true; + int width = 0; - case 'x': put_hex(va_arg(args, uint32_t)); break; + while (!done) { + char c = *r++; + switch (c) { + case '%': *w = '%'; done = true; break; - case 'd': - case 'u': put_dec(va_arg(args, uint32_t)); break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': width = width * 10 + (c - '0'); break; - case 's': { - const char *s = va_arg(args, const char*); - if (s) puts(s); - } - break; + case '-': right = !right; break; - case 'l': - switch (*r++) { - case 'x': put_hex(va_arg(args, uint64_t)); break; + case 'x': put_hex(va_arg(args, uint32_t), right ? width : -width); done = true; break; - case 'd': - case 'u': put_dec(va_arg(args, uint64_t)); break; + case 'd': + case 'u': put_dec(va_arg(args, uint32_t), right ? width : -width); done = true; break; - default: - break; - } - break; + case 's': { + const char *s = va_arg(args, const char*); + if (s) puts(s); + } + done = true; + break; - default: - break; + case 'l': + switch (*r++) { + case 'x': put_hex(va_arg(args, uint64_t), right ? width : -width); done = true; break; + + case 'd': + case 'u': put_dec(va_arg(args, uint64_t), right ? width : -width); done = true; break; + + default: + done = true; + break; + } + break; + + default: + done = true; + break; + } } } diff --git a/src/kernel/console.h b/src/kernel/console.h index ced19ff..4dccd57 100644 --- a/src/kernel/console.h +++ b/src/kernel/console.h @@ -17,10 +17,12 @@ public: void printf(const char *fmt, ...); template - void put_hex(T x); + void put_hex(T x, int width = 0); template - void put_dec(T x); + void put_dec(T x, int width = 0); + + void set_screen(console_out_screen *out) { m_screen = out; } static console * get(); @@ -39,7 +41,7 @@ console_out_screen * console_get_screen_out( extern const char digits[]; template -void console::put_hex(T x) +void console::put_hex(T x, int width) { static const int chars = sizeof(x) * 2; char message[chars + 1]; @@ -47,19 +49,27 @@ void console::put_hex(T x) message[chars - i - 1] = digits[(x >> (i*4)) & 0xf]; } message[chars] = 0; + + if (width > chars) for(int i=0; i<(width-chars); ++i) puts(" "); puts(message); + if (-width > chars) for(int i=0; i<(-width-chars); ++i) puts(" "); } template -void console::put_dec(T x) +void console::put_dec(T x, int width) { static const int chars = sizeof(x) * 3; char message[chars + 1]; char *p = message + chars; + int length = 0; *p-- = 0; do { *p-- = digits[x % 10]; x /= 10; + length += 1; } while (x != 0); + + if (width > length) for(int i=0; i<(width-length); ++i) puts(" "); puts(++p); + if (-width > length) for(int i=0; i<(-width-length); ++i) puts(" "); }