Re: [PATCH 1/2] Add strbuf_initf()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On Thu, 6 Mar 2008, Reece Dunn wrote:

> On 06/03/2008, Johannes Schindelin <Johannes.Schindelin@xxxxxx> wrote:
>
> >  On Thu, 6 Mar 2008, Reece Dunn wrote:
> >
> >  > On 06/03/2008, Mike Hommey <mh@xxxxxxxxxxxx> wrote:
> >  > > On Thu, Mar 06, 2008 at 02:14:43AM +0100, Johannes Schindelin wrote:
> >  > >  >
> >  > >  > The most common use of addf() was to init a strbuf and addf() 
> >  > >  > right away. Since it is so common, it makes sense to have a 
> >  > >  > function strbuf_initf() to wrap both calls into one.
> >  > >  >
> >  > >  > Unfortunately, C (and cpp) has no way to make this easy 
> >  > >  > without code duplication, as we need to va_init() in 
> >  > >  > strbuf_addf() possibly a few times.  So the code for addf() is 
> >  > >  > copied.  Fortunately, the code is pretty short, so not too 
> >  > >  > much had to be copied as-is.
> >  >
> >  > Why not have a strbuf_vaddf and strbuf_vinitf that take a va_arg as 
> >  > a parameter. This would mean that you don't have code duplication, 
> >  > and it is flexible enough if you want to add more customisations in 
> >  > the future. No macro needed. This is what the printf/scanf family 
> >  > of functions do.
> 
> Is it possible to pass a void * to a strbuf_vaddf function that you can 
> pass to va_start, so you can then restart the va_list?

AFAIU va_list() works on the stack (on less register-challenged systems 
than x86, the first parameters are possibly passed as registers, too, but 
it has to resort to the stack at a certain number of parameters).

Since the stack is also used (at least on register-challenged yadda yadda) 
to store the return address, va_list() would most likely pick that up, 
too.

Now, that just _might_ still work, since the printf() family determines 
the number of arguments from the format string.

But then there are machines which are _not_ completely stack-based, for 
example SPARC.  IIRC the first 8 parameters are passed by a so-called 
register window, which changes with each function call.

So no, I think there is no portable way to pass them around.

Of course, having a simple implementation for addf() _not_ using 
vsnprintf() could help, too (and make the process more efficient, 
probably).

I thought.

The formats we'd have to support are:

$ git grep strbuf_addf |
	sed -e 's/^[^"]*"\([^"]*\)".*$/\1/' -e 's/%%//g' -e 's/%/\
&/g' | sed -n -e 's/\(%[^a-zA-Z]*[a-zA-Z]\).*/\1/p' | sort | uniq

%02X
%06o
%c
%d
%l
%o
%s
%.*s
%u

So it does not look too bad.  'X', 'o', 'd', 'l' and 'u', possibly with a 
size specifier (left 0-padded), 'c' and 's' (possibly with a length 
parameter).

The implementation wouldn't be _too_ short, I'd say, but doable.

Ciao,
Dscho

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux