diff options
Diffstat (limited to 'src/print.c')
-rw-r--r-- | src/print.c | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/src/print.c b/src/print.c index 4adfcf7..fa16bab 100644 --- a/src/print.c +++ b/src/print.c @@ -138,6 +138,7 @@ static struct format_precision read_precision(const char *format, const char **e if (c == '*' && precision.defined == false) { precision.defined = true; precision.varys = true; + format++; break; } @@ -336,7 +337,7 @@ static void print_unum( char buf[1024]; char *str = get_decimal( num, - buf, + buf + 1023, sign, radix, base @@ -457,11 +458,21 @@ void kvprintf(const char *format, va_list args) { char c; const char *str; void *ptr; - } data; + } data = {0}; int radix = 0; char base = 0; + if (width.varys) { + int len = va_arg(args, int); + width.value = len; + } + + if (precision.varys) { + int len = va_arg(args, int); + precision.value = len; + } + switch (conversion) { case FMT_INT: if (modifier == MOD_NONE) @@ -475,7 +486,15 @@ void kvprintf(const char *format, va_list args) { else if (modifier == MOD_LONG_LONG) data.l = va_arg(args, long long); radix = 10; - goto printnum; + print_num( + data.l, + flag, + width, + precision, + radix, + base + ); + break; case FMT_UINT: case FMT_OCT: case FMT_HEX_UPPER: @@ -503,6 +522,7 @@ void kvprintf(const char *format, va_list args) { base = 'A'; } goto printunum; + break; case FMT_PTR: case FMT_PTR_UPPER: flag |= FLG_ZERO; @@ -513,15 +533,6 @@ void kvprintf(const char *format, va_list args) { else base = 'A'; goto printunum; - printnum: - print_num( - data.l, - flag, - width, - precision, - radix, - base - ); break; printunum: print_unum( |