Hi Doug, Steffen Nurpmeso wrote on Fri, Dec 27, 2019 at 06:45:23PM +0100:
> Should be handled by [...] I believe the first patch that got sent to the list is incorrect. The parser in src/pre-pic/pic.y already parses '%%' correctly, so there is no need to change the parsing. Only the assignment to one_format needs to be corrected. Besides, the "continue;" that was inserted feels premature; i think appending to "result" at the end of the while loop is still needed. The existing text in doc/pic.ms uses the term "format string" incorrectly. That's the complete first argument to sprintf(3). Saying that the format string must be "%e" would mean that the argument cannot contain any additional characters. The correct term for something like "%e" according to the C standard is "conversion specification". Note that according to the C standard, "%%" is also a conversion specification, so there is no need to describe it using more words. With respect to src/preproc/pic/pic.1.man, "0123456789." are not flags, so let's use a better wording. Doug, thank you for your report. Could you please test and confirm that this patch fixes all the issues you found? Yours, Ingo commit 78667baa4e207359b071ccfe884c4783c721d3e6 Author: Ingo Schwarze <schwa...@openbsd.org> Date: Fri Dec 27 21:09:24 2019 +0100 Fix code and documentation in pic(1) regarding printf. * src/preproc/pic/pic.ypp: Let the "%%" conversion specification print "%" rather than "%%". * src/preproc/pic/pic.1.man: Document which conversion specifications are supported. * doc/pic.ms: Correct the list of supported conversion specifications. All three bugs were reported by Doug McIlroy <doug at cs dot dartmouth dot edu>. diff --git a/ChangeLog b/ChangeLog index 727c3673..6fcb45e3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2019-12-27 Ingo Schwarze <schwa...@openbsd.org> + + Fix code and documentation in pic(1) regarding printf. + + * src/preproc/pic/pic.ypp: + Let the "%%" conversion specification print "%" rather than "%%". + * src/preproc/pic/pic.1.man: + Document which conversion specifications are supported. + * doc/pic.ms: + Correct the list of supported conversion specifications. + + All three bugs were reported by + Doug McIlroy <doug at cs dot dartmouth dot edu>. + 2019-12-21 Ingo Schwarze <schwa...@openbsd.org> Update NetBSD, OpenBSD, FreeBSD, Darwin, and DragonFly version strings. diff --git a/doc/pic.ms b/doc/pic.ms index 6d581ba3..b7dfe32f 100644 --- a/doc/pic.ms +++ b/doc/pic.ms @@ -1722,7 +1722,8 @@ GNU \fBgpic\fP also documents a one-argument form or rand, version. .PP The function \fBsprintf()\fP behaves like a C \fIsprintf\/\fP(3) -function that only takes %, %e, %f, and %g format strings. +function that only takes %%, %e, %E, %f, %g, and %G conversion +specifications. . . .NH 1 diff --git a/src/preproc/pic/pic.1.man b/src/preproc/pic/pic.1.man index ae4c205c..281a69e3 100644 --- a/src/preproc/pic/pic.1.man +++ b/src/preproc/pic/pic.1.man @@ -906,6 +906,20 @@ this will produce the arguments formatted according to which should be a string as described in .BR printf (3) appropriate for the number of arguments supplied. +Only the flags +.RB ' # ', +.RB ' \- ', +.RB ' + ', +and '\ ' (space), a minimum field width, an optional precision, +and the conversion specifications +.BR %e , +.BR %E , +.BR %f , +.BR %g , +.BR %G , +and +.B %% +are supported. . . .LP diff --git a/src/preproc/pic/pic.ypp b/src/preproc/pic/pic.ypp index 6afa2ab3..b6a6b241 100644 --- a/src/preproc/pic/pic.ypp +++ b/src/preproc/pic/pic.ypp @@ -1905,7 +1905,7 @@ char *do_sprintf(const char *form, const double *v, int nv) break; } if (*form == '%') { - one_format += *form++; + form++; one_format += '\0'; snprintf(sprintf_buf, sizeof(sprintf_buf), "%s", one_format.contents());