diff options
| author | Ada Christine <adachristine18@gmail.com> | 2022-02-06 18:20:18 +0000 |
|---|---|---|
| committer | Ada Christine <adachristine18@gmail.com> | 2022-02-06 18:20:18 +0000 |
| commit | be6fcf20994cfcf72649f84b42b980544c904a8a (patch) | |
| tree | beccee8d5fa908177da6d3c28a07c729387fcf96 /kc | |
| parent | 2067ca185220348b70b35c96e175dfb87cc05592 (diff) | |
collapse the repeated stuff into one function
Diffstat (limited to 'kc')
| -rw-r--r-- | kc/core/kprint.c | 70 |
1 files changed, 23 insertions, 47 deletions
diff --git a/kc/core/kprint.c b/kc/core/kprint.c index 596d110..ee2c39b 100644 --- a/kc/core/kprint.c +++ b/kc/core/kprint.c @@ -5,13 +5,13 @@ #include <stdint.h> -__attribute__((optimize("O3"))) + __attribute__((optimize("O3"))) int kputchar(int c) { return serial_putchar(c); } -__attribute__((optimize("O3"))) + __attribute__((optimize("O3"))) int kputs(const char *s) { while (*s) @@ -42,7 +42,7 @@ static char *convert_scalar( char *result = buffer + bufsz - 1; // result >= buffer condition ensures we don't overflow - + while (value > 0 && result >= buffer) { *--result = stringdigits[value % base]; @@ -52,6 +52,18 @@ static char *convert_scalar( return result; } +static inline int print_scalar(uint64_t value, int base) +{ + char buffer[65]; + char *s = convert_scalar( + value, + base, + buffer, + sizeof(buffer)); + kputs(s); + return strlen(s); +} + int kvprintf(const char *restrict format, va_list arguments) { int count = 0; @@ -82,53 +94,17 @@ int kvprintf(const char *restrict format, va_list arguments) } case 'x': - { - char buffer[65]; - char *s = convert_scalar( - va_arg(arguments, uint64_t), - 16, - buffer, - sizeof(buffer)); - count += strlen(s); - kputs(s); - break; - } + print_scalar(va_arg(arguments, uint64_t), 16); + break; case 'd': - { - char buffer[65]; - char *s = convert_scalar( - va_arg(arguments, uint64_t), - 10, - buffer, - sizeof(buffer)); - count += strlen(s); - kputs(s); - break; - } + print_scalar(va_arg(arguments, uint64_t), 10); + break; case 'o': - { - char buffer[65]; - char *s = convert_scalar( - va_arg(arguments, uint64_t), - 8, - buffer, - sizeof(buffer)); - count += strlen(s); - kputs(s); - break; - } + print_scalar(va_arg(arguments, uint64_t), 8); + break; case 'b': - { - char buffer[65]; - char *s = convert_scalar( - va_arg(arguments, uint64_t), - 2, - buffer, - sizeof(buffer)); - count += strlen(s); - kputs(s); - break; - } + print_scalar(va_arg(arguments, uint64_t), 2); + break; default: break; |
