Thread overview
va_list / rolling your own printf / OutBuffer
May 28, 2002
Sean L. Palmer
May 28, 2002
Sean L. Palmer
May 28, 2002
Pavel Minayev
May 28, 2002
I'm trying to make my own variant of printf (one that prints into a dynamic array of char) and am having problems with the OutBuffer class.

char[] Fmt(char[] fmtp, ...)
{
  va_list ap;
  ap = cast(va_list)&fmtp;
  ap += fmtp.size;
  printf(fmtp,*(int*)ap); // this works fine
  OutBuffer buf;
  buf.vprintf(fmtp, ap);  // this doesn't work, causes program termination
errorlevel 128
  return buf.toString();  // but if I don't put something into buf, this
crashes!
}

...

printf(Fmt("This is %dth test\n",45)); // should print This is 45th test,
but it just bombs

Am I using OutBuffer wrongly?  Misunderstanding D's va_list?  or what?

If I leave out buf.vprintf(fmtp, ap), I get a crash.  If I leave it in, I
get the exit(128).

Sean


May 28, 2002
I got this to work but I think it's a sucky kludge as I can't predict how many characters I'll need:

import c.stdio;

char[] Fmt(char[] fmtp, ...)
{
  va_list ap;
  ap = cast(va_list)&fmtp;
  ap += fmtp.size;
  char[] buf;
  buf.length = 1024;
  vsprintf(buf, fmtp, ap);
  buf.length = strlen(buf);
  return buf;
}

"Sean L. Palmer" <seanpalmer@earthlink.net> wrote in message news:acus8q$gna$1@digitaldaemon.com...
> I'm trying to make my own variant of printf (one that prints into a
dynamic
> array of char) and am having problems with the OutBuffer class.
>
> char[] Fmt(char[] fmtp, ...)
> {
>   va_list ap;
>   ap = cast(va_list)&fmtp;
>   ap += fmtp.size;
>   printf(fmtp,*(int*)ap); // this works fine
>   OutBuffer buf;
>   buf.vprintf(fmtp, ap);  // this doesn't work, causes program termination
> errorlevel 128
>   return buf.toString();  // but if I don't put something into buf, this
> crashes!
> }
>
> ...
>
> printf(Fmt("This is %dth test\n",45)); // should print This is 45th test,
> but it just bombs
>
> Am I using OutBuffer wrongly?  Misunderstanding D's va_list?  or what?
>
> If I leave out buf.vprintf(fmtp, ap), I get a crash.  If I leave it in, I
> get the exit(128).
>
> Sean
>
>


May 28, 2002
"Sean L. Palmer" <seanpalmer@earthlink.net> wrote in message news:acus8q$gna$1@digitaldaemon.com...

> printf(Fmt("This is %dth test\n",45)); // should print This is 45th test,
> but it just bombs
>
> Am I using OutBuffer wrongly?  Misunderstanding D's va_list?  or what?

OutBuffer's buggy. You've got to wait till Walter fixes it... or write your own.