From 28492e7bb40a04daacfb45419109e1100056bfa0 Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Sat, 2 Nov 2013 21:41:45 +0100 Subject: [PATCH] Implement min digits specification in printf --- kernel/src/console.cpp | 47 ++++++++++++++++++++++++++++++++++++++++++ kernel/src/shell.cpp | 5 +++-- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/kernel/src/console.cpp b/kernel/src/console.cpp index a0302c9f..7e0a805f 100644 --- a/kernel/src/console.cpp +++ b/kernel/src/console.cpp @@ -68,6 +68,21 @@ void k_print_line(const char* string){ ++current_line; } +std::size_t digits(std::size_t number){ + if(number < 10){ + return 1; + } + + int i = 0; + + while(number != 0){ + number /= 10; + ++i; + } + + return i; +} + void k_print(std::size_t number){ if(number == 0){ k_print('0'); @@ -142,10 +157,34 @@ void k_printf(const char* fmt, ...){ ch = *(fmt++); } + std::size_t min_digits = 0; + if(ch == '.'){ + ch = *(fmt++); + + while(ch >= '0' && ch <= '9'){ + min_digits = 10 * min_digits + (ch - '0'); + ch = *(fmt++); + } + } + auto prev = current_column; if(ch == 'd'){ auto arg = va_arg(va, std::size_t); + + if(min_digits > 0){ + auto d = digits(arg); + if(min_digits > d){ + min_digits -= d; + while(min_digits > 0){ + while(min_digits > 0){ + k_print('0'); + --min_digits; + } + } + } + } + k_print(arg); } else if(ch == 'h'){ k_print("0x"); @@ -162,6 +201,14 @@ void k_printf(const char* fmt, ...){ buffer[i] = arg; + if(min_digits > 0 && min_digits > i){ + min_digits -= i + 1; + while(min_digits > 0){ + k_print('0'); + --min_digits; + } + } + while(i >= 0){ uint8_t digit = buffer[i]; diff --git a/kernel/src/shell.cpp b/kernel/src/shell.cpp index 1dc4534a..1b7f3796 100644 --- a/kernel/src/shell.cpp +++ b/kernel/src/shell.cpp @@ -241,11 +241,12 @@ void mmap_command(const char*){ } else { k_printf("There are %d mmap entry\n", mmap_entry_count()); + k_print_line("Base End Size Type"); for(std::size_t i = 0; i < mmap_entry_count(); ++i){ auto& entry = mmap_entry(i); - k_printf("%h\t%h\t%d\t%s\n", - entry.base, entry.base + entry.size, entry.size, str_e820_type(entry.type)); + k_printf("%.10h %.10h %.10h %.10d %s\n", + entry.base, entry.base + entry.size, entry.size, entry.size, str_e820_type(entry.type)); } } }