From fd02ee26e1038b0f4761430e164d53bb1b5908dc Mon Sep 17 00:00:00 2001 From: josh Date: Wed, 15 Jul 2009 14:53:58 +0000 Subject: [PATCH] added kputs_pad(); implemented padding in kprintf(); put some padding tests in k_main() git-svn-id: svn://anubis/hos/trunk@57 5b3e749e-e535-0410-8002-a9bb6afbdfca --- kernel/boot/k_main.cc | 4 +++ kernel/lang/kio.cc | 58 +++++++++++++++++++++++++++++++++---------- kernel/lang/kio.h | 2 ++ 3 files changed, 51 insertions(+), 13 deletions(-) diff --git a/kernel/boot/k_main.cc b/kernel/boot/k_main.cc index 2dd9f10..7c1ac64 100644 --- a/kernel/boot/k_main.cc +++ b/kernel/boot/k_main.cc @@ -6,6 +6,10 @@ extern "C" { void k_main() { kprintf("Hi from k_main()!\n"); + kprintf("padded 8 hex: 0x%08x|\n", 0x42); + kprintf("padded -4 hex: 0x%-4x|\n", 0x42); + kprintf("padded 20 str: %20s|\n", "hi there"); + kprintf("padded -20 str: %-20s|\n", "hi there"); } } /* extern "C" */ diff --git a/kernel/lang/kio.cc b/kernel/lang/kio.cc index f4edce3..257904a 100644 --- a/kernel/lang/kio.cc +++ b/kernel/lang/kio.cc @@ -57,16 +57,29 @@ void kvprintf(const char * fmt, va_list args) if (*fmt) { int width = 0; - char pad = ' '; + char pad_char = ' '; + bool pad_right = false; if (*fmt == '0') { - pad = '0'; + pad_char = '0'; fmt++; } - if ('1' <= *fmt && *fmt <= '9') + else if (*fmt == '-') { - width = *fmt - '0'; - /* TODO: finish */ + pad_right = true; + fmt++; + } + for ( ; '0' <= *fmt && *fmt <= '9'; fmt++) + { + if (width == 0) + { + width = *fmt - '0'; + } + else + { + width *= 10; + width += *fmt - '0'; + } } switch (*fmt) { @@ -75,34 +88,35 @@ void kvprintf(const char * fmt, va_list args) break; case 'd': fmt_d2a(tmpbuf, va_arg(args, int)); - kputs(tmpbuf); + kputs_pad(tmpbuf, width, pad_char, pad_right); break; case 'l': fmt_ll2a(tmpbuf, va_arg(args, long long)); - kputs(tmpbuf); + kputs_pad(tmpbuf, width, pad_char, pad_right); break; case 'L': fmt_ull2a(tmpbuf, va_arg(args, unsigned long long)); - kputs(tmpbuf); + kputs_pad(tmpbuf, width, pad_char, pad_right); break; case 'o': fmt_o2a(tmpbuf, va_arg(args, unsigned int)); - kputs(tmpbuf); + kputs_pad(tmpbuf, width, pad_char, pad_right); break; case 's': - kputs(va_arg(args, char *)); + kputs_pad(va_arg(args, char *), + width, pad_char, pad_right); break; case 'u': fmt_u2a(tmpbuf, va_arg(args, unsigned int)); - kputs(tmpbuf); + kputs_pad(tmpbuf, width, pad_char, pad_right); break; case 'x': fmt_x2a(tmpbuf, va_arg(args, unsigned int)); - kputs(tmpbuf); + kputs_pad(tmpbuf, width, pad_char, pad_right); break; case 'X': fmt_xl2a(tmpbuf, va_arg(args, unsigned long long)); - kputs(tmpbuf); + kputs_pad(tmpbuf, width, pad_char, pad_right); break; case '%': kputc('%'); @@ -170,6 +184,24 @@ void kputs(const char * s) } } +void kputs_pad(const char * s, int width, char pad_char, bool pad_right) +{ + int len = strlen(s); + if (pad_right) + { + kputs(s); + } + int num_pad_chars = width - len; + for (int i = 0; i < num_pad_chars; i++) + { + kputc(pad_char); + } + if (!pad_right) + { + kputs(s); + } +} + } /* extern "C" */ static void fmt_d2a(char * buf, int val) diff --git a/kernel/lang/kio.h b/kernel/lang/kio.h index 925b407..5e577a6 100644 --- a/kernel/lang/kio.h +++ b/kernel/lang/kio.h @@ -18,6 +18,8 @@ void kputc(char c); void kputs(const char * s); +void kputs_pad(const char * s, int width, char pad_char, bool pad_right); + #ifdef __cplusplus } /* extern "C" */ #endif