Implement min digits specification in printf

This commit is contained in:
Baptiste Wicht 2013-11-02 21:41:45 +01:00
parent aa71717c4c
commit 28492e7bb4
2 changed files with 50 additions and 2 deletions

View File

@ -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];

View File

@ -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));
}
}
}