fix padding string formats to width in wide printf variants
authorRich Felker <dalias@aerifal.cx>
Wed, 16 Mar 2016 20:35:22 +0000 (16:35 -0400)
committerRich Felker <dalias@aerifal.cx>
Wed, 16 Mar 2016 20:35:22 +0000 (16:35 -0400)
the idiom fprintf(f, "%.*s", n, "") was wrongly used in vfwprintf as a
means of producing n spaces; instead it produces no output. the
correct form is fprintf(f, "%*s", n, ""), using width instead of
precision, since for %s the later is a maximum rather than a minimum.

src/stdio/vfwprintf.c

index f06d5ae..f9f1ecf 100644 (file)
@@ -288,9 +288,9 @@ static int wprintf_core(FILE *f, const wchar_t *fmt, va_list *ap, union arg *nl_
                        z = wmemchr(a, 0, p);
                        if (z) p=z-a;
                        if (w<p) w=p;
-                       if (!(fl&LEFT_ADJ)) fprintf(f, "%.*s", w-p, "");
+                       if (!(fl&LEFT_ADJ)) fprintf(f, "%*s", w-p, "");
                        out(f, a, p);
-                       if ((fl&LEFT_ADJ)) fprintf(f, "%.*s", w-p, "");
+                       if ((fl&LEFT_ADJ)) fprintf(f, "%*s", w-p, "");
                        l=w;
                        continue;
                case 'm':
@@ -303,14 +303,14 @@ static int wprintf_core(FILE *f, const wchar_t *fmt, va_list *ap, union arg *nl_
                        if (i<0) return -1;
                        p=l;
                        if (w<p) w=p;
-                       if (!(fl&LEFT_ADJ)) fprintf(f, "%.*s", w-p, "");
+                       if (!(fl&LEFT_ADJ)) fprintf(f, "%*s", w-p, "");
                        bs = arg.p;
                        while (l--) {
                                i=mbtowc(&wc, bs, MB_LEN_MAX);
                                bs+=i;
                                fputwc(wc, f);
                        }
-                       if ((fl&LEFT_ADJ)) fprintf(f, "%.*s", w-p, "");
+                       if ((fl&LEFT_ADJ)) fprintf(f, "%*s", w-p, "");
                        l=w;
                        continue;
                }