Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <b3bd20b161442150ed0e72f98858c5e2cb83625a.1685129854.git.Jens.Gustedt@inria.fr>
Date: Fri, 26 May 2023 21:41:04 +0200
From: Jens Gustedt <Jens.Gustedt@...ia.fr>
To: musl@...ts.openwall.com
Subject: [C23 printf 3/3] C23: implement the wfN length modifiers for printf

Musl only has a difference between fixed-width and fastest-width
integer types for N == 16. And even here all architectures have made
the same choice, namely mapping to 32 bit types.
---
 src/stdio/vfprintf.c  | 9 ++++++++-
 src/stdio/vfwprintf.c | 9 ++++++++-
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/src/stdio/vfprintf.c b/src/stdio/vfprintf.c
index 1a516663..9f02a594 100644
--- a/src/stdio/vfprintf.c
+++ b/src/stdio/vfprintf.c
@@ -529,9 +529,16 @@ static int printf_core(FILE *f, const char *fmt, va_list *ap, union arg *nl_arg,
 			ps=st;
 			st=states[st]S(*s++);
 			if (st == WPRE) {
+				// See if "fast" is requested. Difference is only
+				// relevant for a fast type of minimum width 16.
+				int fast16 = HPRE;
+				if (*s == 'f') {
+					fast16 = BARE;
+					++s;
+				}
 				switch (getint(&s)) {
 				case 8:  st = HHPRE; goto wpre;
-				case 16: st = HPRE; goto wpre;
+				case 16: st = fast16; goto wpre;
 				case 32: st = BARE; goto wpre;
 #if UINTPTR_MAX >= UINT64_MAX
 				case 64: st = LPRE; goto wpre;
diff --git a/src/stdio/vfwprintf.c b/src/stdio/vfwprintf.c
index 4320761a..4e9ce63a 100644
--- a/src/stdio/vfwprintf.c
+++ b/src/stdio/vfwprintf.c
@@ -244,9 +244,16 @@ static int wprintf_core(FILE *f, const wchar_t *fmt, va_list *ap, union arg *nl_
 			ps=st;
 			st=states[st]S(*s++);
 			if (st == WPRE) {
+				// See if "fast" is requested. Difference is only
+				// relevant for a fast type of minimum width 16.
+				int fast16 = HPRE;
+				if (*s == 'f') {
+					fast16 = BARE;
+					++s;
+				}
 				switch (getint(&s)) {
 				case 8:  st = HHPRE; goto wpre;
-				case 16: st = HPRE; goto wpre;
+				case 16: st = fast16; goto wpre;
 				case 32: st = BARE; goto wpre;
 #if UINTPTR_MAX >= UINT64_MAX
 				case 64: st = LPRE; goto wpre;
-- 
2.34.1

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.