Implement C23 printf 'wf' length modifiers
wfN: Specifies that a following b, d, i, o, u, x, or X conversion specifier applies to a fastest minimum-width integer argument with a specific width where N is a positive decimal integer with no leading zeros (the argument will have been promoted according to the integer promotions, but its value shall be converted to the unpromoted type); or that a following n conversion specifier applies to a pointer to a fastest minimum-width integer type argument with a width of N bits. All fastest minimum-width integer types (7.22.1.3) defined in the header <stdint.h> shall be supported. Other supported values of N are implementation-defined.
Bug: b/271903607
Test: adb shell
Change-Id: Ida36d5a50af2a46fd04cb5fe039793d8872f9f3b
diff --git a/libc/stdio/vfprintf.cpp b/libc/stdio/vfprintf.cpp
index b7c68dd..994269b 100644
--- a/libc/stdio/vfprintf.cpp
+++ b/libc/stdio/vfprintf.cpp
@@ -521,34 +521,21 @@
_umax = UARG();
base = DEC;
goto nosign;
- case 'w':
+ case 'w': {
n = 0;
+ bool fast = false;
ch = *fmt++;
+ if (ch == 'f') {
+ fast = true;
+ ch = *fmt++;
+ }
while (is_digit(ch)) {
APPEND_DIGIT(n, ch);
ch = *fmt++;
}
- switch (n) {
- case 8: {
- flags |= CHARINT;
- goto reswitch;
- }
- case 16: {
- flags |= SHORTINT;
- goto reswitch;
- }
- case 32: {
- goto reswitch;
- }
- case 64: {
- flags |= LLONGINT;
- goto reswitch;
- }
- default: {
- __fortify_fatal("%%w%d is unsupported", n);
- break;
- }
- }
+ flags |= helpers::w_to_flag(n, fast);
+ goto reswitch;
+ }
case 'X':
xdigs = xdigs_upper;
goto hex;