fix behavior of printf with alt-form octal, zero precision, zero value
authorRich Felker <dalias@aerifal.cx>
Sat, 15 Nov 2014 17:16:19 +0000 (12:16 -0500)
committerRich Felker <dalias@aerifal.cx>
Mon, 30 Mar 2015 05:41:32 +0000 (01:41 -0400)
in this case there are two conflicting rules in play: that an explicit
precision of zero with the value zero produces no output, and that the
'#' modifier for octal increases the precision sufficiently to yield a
leading zero. ISO C (7.19.6.1 paragraph 6 in C99+TC3) includes a
parenthetical remark to clarify that the precision-increasing behavior
takes precedence, but the corresponding text in POSIX off of which I
based the implementation is missing this remark.

this issue was covered in WG14 DR#151.

(cherry picked from commit b91cdbe2bc8b626aa04dc6e3e84345accf34e4b1)

src/stdio/vfprintf.c

index f6e7f38d21cd06c03985edb5471b59b748f8eaae..9f02f7438ffdd693bcf2808a453404c2bc0f6300 100644 (file)
@@ -572,7 +572,7 @@ static int printf_core(FILE *f, const char *fmt, va_list *ap, union arg *nl_arg,
                        if (0) {
                case 'o':
                        a = fmt_o(arg.i, z);
-                       if ((fl&ALT_FORM) && arg.i) prefix+=5, pl=1;
+                       if ((fl&ALT_FORM) && p<z-a+1) p=z-a+1;
                        } if (0) {
                case 'd': case 'i':
                        pl=1;