print(9) says it only documents differences and points at printf(3) for
identical/shared bits:

   DESCRIPTION
     [...]

     Since each of these kernel functions is a variant of its user space
     counterpart, this page describes only the differences between the user
     space and kernel versions. Refer to printf(3) for functional details.

   FORMAT OPTIONS
     The kernel functions don't support as many formatting specifiers as their
     user space counterparts.  In addition to the floating point formatting
     specifiers, the following integer type specifiers are not supported:

     %hh    Argument of char type.  This format specifier is accepted by the
            kernel but will be handled as %h.

     %j     Argument of intmax_t or uintmax_t type.

     %t     Argument of ptrdiff_t type.

     The kernel functions support some additional formatting specifiers:

     %b     Bit field expansion.  [...]


So reading this, I get the impression that print(3)'s entire conversion
specifications syntax is supported (merely with a few less `conversion'
specifiers):

        %[argno$][flags][width][.precision][size]conversion

but printf(9) supports much fewer specifiers, afaict amounting to

        %[width][size]conversion

That's fine, but code using printf(3) syntax might actually compile
without warnings (like this example did for me) and be useless afterall:

+               printf("%1$s: node %2$x:\n"
+                   "  mclk_rate is %3$u (0x%3$x)\n",
+                   __func__, sc->sc_node, mclk_rate);

Apr  4 00:32:29 pine64 /bsd:   mclk_rate is   $u (0x  $x)


I don't fancy expanding syntax or adding checks to the kernel's printf.c
but documenting it seems needed.

Feedback? Objections? OK?

diff 5b147494c5d594d5ec97ca57686c9e3527b87e29 /usr/src
blob - c31fb0cb42e9af426c42306a54339ec7f7f375a7
file + share/man/man9/printf.9
--- share/man/man9/printf.9
+++ share/man/man9/printf.9
@@ -119,6 +119,17 @@ send formatted strings to the ddb console, and are onl
 Since each of these kernel functions is a variant of its user space
 counterpart, this page describes only the differences between the user
 space and kernel versions.
+.Pp
+The limited syntax of a conversion specification is:
+.Bd -filled -offset indent
+.Sm off
+.Cm %
+.Op Ar width
+.Op Ar size
+.Ar conversion
+.Sm on
+.Ed
+.Pp
 Refer to
 .Xr printf 3
 for functional details.

Reply via email to