From e33f09b11b87ca127d413e6e3ea852a666222180 Mon Sep 17 00:00:00 2001 From: Aaron Alef Date: Mon, 8 Nov 2021 12:21:59 +0100 Subject: [PATCH 1/4] feat(printf): add %b flag for printing in binary format --- thorn/src/common/printf.c | 42 ++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/thorn/src/common/printf.c b/thorn/src/common/printf.c index 059ee24..2efaed4 100644 --- a/thorn/src/common/printf.c +++ b/thorn/src/common/printf.c @@ -158,8 +158,9 @@ void tfp_format (void * putp, putcf putf, char * fmt, va_list va) { uli2a (va_arg (va, unsigned long int), 10, 0, bf); else #endif - ui2a (va_arg (va, - unsigned int), 10, 0, bf); + ui2a (va_arg (va, + unsigned int), + 10, 0, bf); putchw (putp, putf, w, lz, bf); break; } @@ -169,8 +170,9 @@ void tfp_format (void * putp, putcf putf, char * fmt, va_list va) { li2a (va_arg (va, unsigned long int), bf); else #endif - i2a (va_arg (va, - int), bf); + i2a (va_arg (va, + int), + bf); putchw (putp, putf, w, lz, bf); break; } @@ -181,29 +183,38 @@ void tfp_format (void * putp, putcf putf, char * fmt, va_list va) { uli2a (va_arg (va, unsigned long int), 16, (ch == 'X'), bf); else #endif - ui2a (va_arg (va, - unsigned int), 16, (ch == 'X'), bf); + ui2a (va_arg (va, + unsigned int), + 16, (ch == 'X'), bf); putchw (putp, putf, w, lz, bf); break; - case 'c' : + case 'c': putf (putp, (char) (va_arg (va, int))); break; - case 's' : - putchw (putp, putf, w, 0, va_arg (va, - char*)); + case 's': + putchw (putp, putf, w, 0, va_arg (va, char *)); break; case 'p': case 'P': putf (putp, '0'); putf (putp, 'x'); #ifdef PRINTF_LONG_SUPPORT - if (lng) - uli2a (va_arg (va, unsigned long int), 16, (ch == 'P'), bf); - else + uli2a (va_arg (va, unsigned long int), 16, (ch == 'P'), bf); +#else + ui2a (va_arg (va, unsigned int), 16, (ch == 'P'), bf); +#endif + putchw (putp, putf, w, lz, bf); + break; + case 'b': + case 'B': + putf (putp, '0'); + putf (putp, 'b'); +#ifdef PRINTF_LONG_SUPPORT + uli2a (va_arg (va, unsigned long int), 2, (ch == 'B'), bf); +#else + ui2a (va_arg (va, unsigned int), 2, (ch == 'B'), bf); #endif - ui2a (va_arg (va, - unsigned int), 16, (ch == 'P'), bf); putchw (putp, putf, w, lz, bf); break; case '%': @@ -233,7 +244,6 @@ static void putcp (void * p, char c) { *(*((char **) p))++ = c; } - void tfp_sprintf (char * s, char * fmt, ...) { va_list va; va_start (va, fmt); From 5fa6add5453092d298ec6402a2454f8db215b3ac Mon Sep 17 00:00:00 2001 From: Aaron Alef Date: Mon, 8 Nov 2021 12:28:22 +0100 Subject: [PATCH 2/4] feat(printf): distinguish between %lb and %b It isn't always necessary to print 64 binary digits, i.e., when printing the value of 32bit registers --- thorn/src/common/printf.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/thorn/src/common/printf.c b/thorn/src/common/printf.c index 2efaed4..2139e00 100644 --- a/thorn/src/common/printf.c +++ b/thorn/src/common/printf.c @@ -211,10 +211,11 @@ void tfp_format (void * putp, putcf putf, char * fmt, va_list va) { putf (putp, '0'); putf (putp, 'b'); #ifdef PRINTF_LONG_SUPPORT - uli2a (va_arg (va, unsigned long int), 2, (ch == 'B'), bf); -#else - ui2a (va_arg (va, unsigned int), 2, (ch == 'B'), bf); + if (lng) + uli2a (va_arg (va, unsigned long int), 2, (ch == 'B'), bf); + else #endif + ui2a (va_arg (va, unsigned int), 2, (ch == 'B'), bf); putchw (putp, putf, w, lz, bf); break; case '%': From b7bcd5497683fe6f38e18a2985c99c60821f96a0 Mon Sep 17 00:00:00 2001 From: Aaron Alef Date: Mon, 8 Nov 2021 13:13:06 +0100 Subject: [PATCH 3/4] fix(printf): fix buffer overflow issue --- thorn/src/common/printf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/thorn/src/common/printf.c b/thorn/src/common/printf.c index 2139e00..b97cb4f 100644 --- a/thorn/src/common/printf.c +++ b/thorn/src/common/printf.c @@ -121,7 +121,7 @@ static void putchw (void * putp, putcf putf, int n, char z, char * bf) { } void tfp_format (void * putp, putcf putf, char * fmt, va_list va) { - char bf[12]; + char bf[80]; char ch; From e22ca133c6211a7bba6c9d224e1733128603071f Mon Sep 17 00:00:00 2001 From: Aaron Alef Date: Mon, 8 Nov 2021 13:29:06 +0100 Subject: [PATCH 4/4] fix(printf): explicitly enable long support --- thorn/include/common/printf.h | 2 ++ thorn/src/common/printf.c | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/thorn/include/common/printf.h b/thorn/include/common/printf.h index 382087b..d973dc4 100644 --- a/thorn/include/common/printf.h +++ b/thorn/include/common/printf.h @@ -93,6 +93,8 @@ regs Kusti, 23.10.2004 #include +#define PRINTF_LONG_SUPPORT + void init_printf (void * putp, void (*putf) (void *, char)); void tfp_printf (char * fmt, ...); diff --git a/thorn/src/common/printf.c b/thorn/src/common/printf.c index b97cb4f..52155ab 100644 --- a/thorn/src/common/printf.c +++ b/thorn/src/common/printf.c @@ -30,6 +30,7 @@ static void * stdout_putp; #ifdef PRINTF_LONG_SUPPORT static void uli2a (unsigned long int num, unsigned int base, int uc, char * bf) { + printf ("(%u)", num); int n = 0; unsigned int d = 1; while (num / d >= base) @@ -212,10 +213,10 @@ void tfp_format (void * putp, putcf putf, char * fmt, va_list va) { putf (putp, 'b'); #ifdef PRINTF_LONG_SUPPORT if (lng) - uli2a (va_arg (va, unsigned long int), 2, (ch == 'B'), bf); + uli2a (va_arg (va, unsigned long int), 2, 0, bf); else #endif - ui2a (va_arg (va, unsigned int), 2, (ch == 'B'), bf); + ui2a (va_arg (va, unsigned int), 2, 0, bf); putchw (putp, putf, w, lz, bf); break; case '%':