diff --git a/libc/fmt/fmt.c b/libc/fmt/fmt.c index d21133f53..99b8e8afd 100644 --- a/libc/fmt/fmt.c +++ b/libc/fmt/fmt.c @@ -359,10 +359,15 @@ _Hide int __fmt(void *fn, void *arg, const char *format, va_list va) { p = "\r\e[K"; goto FormatString; } + case 'S': + // Specified by POSIX to be equivalent to %ls + signbit = 63; + goto FormatStringPNotFetchedYet; case 'q': flags |= FLAGS_QUOTE; // fallthrough case 's': + FormatStringPNotFetchedYet: p = va_arg(va, void *); FormatString: if (__fmt_stoa(out, arg, p, flags, prec, width, signbit, qchar) == -1) { diff --git a/test/libc/fmt/fmt_test.c b/test/libc/fmt/fmt_test.c index 68fc3f545..0b8ee2989 100644 --- a/test/libc/fmt/fmt_test.c +++ b/test/libc/fmt/fmt_test.c @@ -64,6 +64,10 @@ TEST(fmt, d) { EXPECT_STREQ("-2147483648", _gc(xasprintf("% d", INT_MIN))); } +TEST(fmt, s) { + EXPECT_STREQ("Wide character output test", _gc(xasprintf("%S", L"Wide character output test"))); +} + TEST(fmt, g) { EXPECT_STREQ("1", _gc(xasprintf("%g", 1.))); EXPECT_STREQ(" 1", _gc(xasprintf("% g", 1.)));