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>
Sat, 15 Nov 2014 17:16:19 +0000 (12:16 -0500)
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.

src/stdio/vfprintf.c

index ea257720bf8088fb2e1106590fbe7f7df609eaba..39c1e86771899dfbcb0805f5c1ee520c402a116f 100644 (file)
@@ -570,7 +570,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;