提交 b64539ae 编写于 作者: R Rich Felker

fix printf alt-form octal with value 0 and no explicit precision

commit 78897b0d wrongly simplified
Dmitry Levin's original submitted patch fixing alt-form octal with the
zero flag and field width present, omitting the special case where the
value is zero. as a result, printf("%#o",0) wrongly prints "00" rather
than "0".

the logic prior to this commit was actually better, in that it was
aligned with how the alt-form flag (#) for printf is specified ("it
shall increase the precision"). at the time there was no good way to
avoid the zero flag issue with the old logic, but commit
167dfe96 added tracking of whether an
explicit precision was provided.

revert commit 78897b0d and switch to
using the explicit precision indicator for suppressing the zero flag.
上级 32482f61
......@@ -559,7 +559,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) && p<z-a+1) prefix+=5, pl=1;
if ((fl&ALT_FORM) && p<z-a+1) p=z-a+1;
} if (0) {
case 'd': case 'i':
pl=1;
......@@ -574,7 +574,7 @@ static int printf_core(FILE *f, const char *fmt, va_list *ap, union arg *nl_arg,
a = fmt_u(arg.i, z);
}
if (xp && p<0) goto overflow;
if (p>=0) fl &= ~ZERO_PAD;
if (xp) fl &= ~ZERO_PAD;
if (!arg.i && !p) {
a=z;
break;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册