summaryrefslogtreecommitdiff
path: root/src/print.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/print.c')
-rw-r--r--src/print.c35
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(