printf Re: Extending sbufs with a drain

Bakul Shah bakul at bitblocks.com
Wed Sep 8 20:30:19 UTC 2010


On Wed, 08 Sep 2010 19:18:33 -0000 "Poul-Henning Kamp" <phk at phk.freebsd.dk>  wrote:
> In message <20100908185848.96D5D5B81 at mail.bitblocks.com>, Bakul Shah writes:
> >On Wed, 08 Sep 2010 17:38:42 -0000 "Poul-Henning Kamp" <phk at phk.freebsd.dk> 
>  wrote:
> 
> >If it was just printf/scanf family, one can perhaps hack
> >gcc/clang to generate a default fmt string for each type,
> >available with a `formatof' compile time function. Then one
> >can do, for example,
> >
> >    struct {int x, y;} z;	
> >    printf("z=" formatof(z) "\n", z);
> >    printf("z->" formatof(&z) "\n", &z);
> >
> >But even for such a simple case most of us would disagree on
> >just what formatof(z) should be. 
> 
> Indeed, not to mention that we still want to retain the padding/
> width specifcation so things can be aligned nicely over multiple
> lines.
> 
> There are conflicting issues here, but they all boil down
> to the look of the source-code.
> 
> It is instructive to notice that the C++ "<<" stuff never really
> hit the mark except as a convenient debugging facility:  Most people
> still fall back to *printf() for the actual formatting.
> 
> If you survey other programming languages, the best they do is
> provide a default string representation, but seldom with any
> bells and whistles.

See Common Lisp's format function. Even its bells and whistles
have bells and whistles -- it may even be turing complete:-)
http://www.gigamonkeys.com/book/a-few-format-recipes.html
http://www.lispworks.com/documentation/HyperSpec/Body/22_c.htm

But then most things are easier in Lisp/Scheme & a wrong
format won't make your program crash.

> And at least my attempts at a sensible advanced printf syntax
> has been anything but, making the lines sufficiently unreadable
> that I couldn't be bothered.

Exactly. But some of us can't help attempting to do so!

> I think the strength of the printf model is that the format spec
> is very compact, as soon as you embellish it, the model falls apart,
> and you suddenly need really strong compile-time checks to not make
> silly mistakes.  (in the absense of typesafe varargs).
> 
> If we can get over the disappointment of not being able to write
> the entire formatting statement in a single transparant source line,
> sbufs are an eminently workable solution, in that you can define 
> your own formatting functions, like:
> 	sbuf_sockaddr(struct sbuf *, struct sockaddr *)
> and call that as much as you want, without getting bogged down in
> error checking.
> 
> But:
> 	sbuf_cat(sb, "Client address: ");
> 	sbuf_sockaddr(sb, &sa);
> 	sbuf_cat(sb, "\n");
> 
> Does not compete with:
> 
> 	printf("Client address: %{DWIM}\n", &sa);
>
> In any other way than by being feasible and available.
> 
> >This is why I like the plan9 idea of allowing users to
> >associate their own function with a given format char.
> >[you don't get type safety but you get flexibility]
> 
> We have that, see /usr/include/printf.h for userland.
> 
> Problem is that the benefit from using it is quickly lost to not
> having any printf format-checking from the compiler anywhere.

How about somehow combining formatof with this?

Hmm.... how about a new specifier that means the next
argument is formatted with a function? For example, if
we use & as a fmt function specifier,

 	printf("Client address: %16&p\n", sa_fmt, &sa);
or more generally
 	printf("Client address: %16&" fmtof(&p) "\n", sa_fmt, &sa);

Now fmtof is used for typechecking and advancing over the
given argument but it is upto sa_fmt to convert sa to a
string.

Or how about visually embedding the function in the string?

 	printf("Client address: %16" @sa_fmt "\n", &sa);

The compiler would map this to the previous form.

[Throwing this out just in case it triggers some new ideas]


More information about the freebsd-arch mailing list