diff options
| author | David Laight <david.laight.linux@gmail.com> | 2026-03-08 11:37:35 +0000 |
|---|---|---|
| committer | Thomas Weißschuh <linux@weissschuh.net> | 2026-03-20 17:55:50 +0100 |
| commit | b43be424343407661d5e7c79a3584a37b91a88bb (patch) | |
| tree | 7d20633b3c3a01fde76b2fdd65d862655185f31c /tools/include/nolibc | |
| parent | 125632871929e9bf5b0bc907c8fef2d326e4623a (diff) | |
tools/nolibc/printf: Handle "%s" with the numeric formats
Avoids the extra va_arg() call with is non-trivial on a lot of
modern ABI.
Signed-off-by: David Laight <david.laight.linux@gmail.com>
Acked-by: Willy Tarreau <w@1wt.eu>
Link: https://patch.msgid.link/20260308113742.12649-11-david.laight.linux@gmail.com
Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
Diffstat (limited to 'tools/include/nolibc')
| -rw-r--r-- | tools/include/nolibc/stdio.h | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/tools/include/nolibc/stdio.h b/tools/include/nolibc/stdio.h index 7382b00707fb..a377f164c70d 100644 --- a/tools/include/nolibc/stdio.h +++ b/tools/include/nolibc/stdio.h @@ -412,13 +412,13 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state, const char *fmt, va_list */ ch_flag = _NOLIBC_PF_FLAG(ch); if (((ch >= 'a' && ch <= 'z') || ch == 'X') && - _NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'c', 'd', 'i', 'u', 'x', 'p')) { - /* 'long' is needed for pointer conversions and ltz lengths. + _NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'c', 'd', 'i', 'u', 'x', 'p', 's')) { + /* 'long' is needed for pointer/string conversions and ltz lengths. * A single test can be used provided 'p' (the same bit as '0') * is masked from flags. */ if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag | (flags & ~_NOLIBC_PF_FLAG('p')), - 'p', 'l', 't', 'z')) { + 'p', 's', 'l', 't', 'z')) { v = va_arg(args, unsigned long); signed_v = (long)v; } else if (_NOLIBC_PF_FLAGS_CONTAIN(flags, 'j', 'q')) { @@ -437,6 +437,14 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state, const char *fmt, va_list goto do_output; } + if (ch == 's') { + /* "%s" - character string. */ + outstr = (const char *)(uintptr_t)v; + if (!outstr) + outstr = "(null)"; + goto do_strlen_output; + } + out = outbuf; if (_NOLIBC_PF_FLAGS_CONTAIN(ch_flag, 'd', 'i')) { @@ -465,13 +473,6 @@ int __nolibc_printf(__nolibc_printf_cb cb, void *state, const char *fmt, va_list goto do_strlen_output; } - if (ch == 's') { - outstr = va_arg(args, char *); - if (!outstr) - outstr = "(null)"; - goto do_strlen_output; - } - if (ch == 'm') { #ifdef NOLIBC_IGNORE_ERRNO outstr = "unknown error"; |
