mirror of
https://github.com/wichtounet/thor-os.git
synced 2025-09-18 09:04:49 -04:00
Implement min digits specification in printf
This commit is contained in:
parent
aa71717c4c
commit
28492e7bb4
@ -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];
|
||||
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user