fix wide printf forms ignoring width for %lc format specifier
authorRich Felker <dalias@aerifal.cx>
Mon, 20 Mar 2023 17:48:50 +0000 (13:48 -0400)
committerRich Felker <dalias@aerifal.cx>
Mon, 20 Mar 2023 17:48:50 +0000 (13:48 -0400)
since the code path for %c was already doing it right, and the logic
is identical, condense them into a single case.

src/stdio/vfwprintf.c

index 85b036c..e69a2d5 100644 (file)
@@ -258,16 +258,13 @@ static int wprintf_core(FILE *f, const wchar_t *fmt, va_list *ap, union arg *nl_
                        }
                        continue;
                case 'c':
+               case 'C':
                        if (w<1) w=1;
                        if (w>1 && !(fl&LEFT_ADJ)) fprintf(f, "%*s", w-1, "");
-                       fputwc(btowc(arg.i), f);
+                       fputwc(t=='C' ? arg.i : btowc(arg.i), f);
                        if (w>1 && (fl&LEFT_ADJ)) fprintf(f, "%*s", w-1, "");
                        l = w;
                        continue;
-               case 'C':
-                       fputwc(arg.i, f);
-                       l = 1;
-                       continue;
                case 'S':
                        a = arg.p;
                        z = a + wcsnlen(a, p<0 ? INT_MAX : p);