diff options
Diffstat (limited to 'kernel/src/libk')
| -rw-r--r-- | kernel/src/libk/stdio.c | 8 | ||||
| -rw-r--r-- | kernel/src/libk/string.c | 29 |
2 files changed, 35 insertions, 2 deletions
diff --git a/kernel/src/libk/stdio.c b/kernel/src/libk/stdio.c index b8ddb67..be75b73 100644 --- a/kernel/src/libk/stdio.c +++ b/kernel/src/libk/stdio.c @@ -47,6 +47,13 @@ inline void print_int(uint64_t num) print_string(a); } +inline void print_hex(uint64_t num) +{ + char a[100]; + itoh(num, a); + print_string(a); +} + void printf(const char *s, ...) { size_t count = 0; @@ -63,6 +70,7 @@ void printf(const char *s, ...) if(s[i] == 'c') print_char((char)va_arg(list, uint32_t)); else if(s[i] == 's') print_string(va_arg(list, char*)); else if(s[i] == 'd') print_int((uint64_t)va_arg(list, uint64_t)); + else if(s[i] == 'x') print_hex((uint64_t)va_arg(list, uint64_t)); else { print_string("Wrong format using printf\n"); diff --git a/kernel/src/libk/string.c b/kernel/src/libk/string.c index fde9645..6d7ab69 100644 --- a/kernel/src/libk/string.c +++ b/kernel/src/libk/string.c @@ -35,9 +35,34 @@ void strrev(char *s) void itos(uint64_t num, char* s) { + if (num == 0) { + s[0] = '0'; + s[1] = '\0'; + return; + } + + size_t i; + for (i = 0; num; num /= 10, i++) { + s[i] = (char)('0' + num % 10); + } + s[i] = '\0'; + strrev(s); +} + +void itoh(uint64_t num, char* s) +{ + if (num == 0) { + s[0] = '0'; + s[1] = '\0'; + return; + } + size_t i; - for (i = 0; num; num/=10, i++) { - s[i] = (char)('0' + num%10); + for (i = 0; num; num /= 16, i++) { + if (num % 16 < 10) + s[i] = (char)('0' + num % 16); + else + s[i] = (char)('A' + num % 16 - 10); } s[i] = '\0'; strrev(s); |
