/* -*-c-*-
*
- * $Id: dputf.c,v 1.4 2001/06/22 19:35:29 mdw Exp $
+ * $Id: dputf.c,v 1.5 2002/01/13 13:30:48 mdw Exp $
*
* `printf'-style formatting for dynamic strings
*
/*----- Revision history --------------------------------------------------*
*
* $Log: dputf.c,v $
+ * Revision 1.5 2002/01/13 13:30:48 mdw
+ * Change interface for @dstr_vputf@.
+ *
* Revision 1.4 2001/06/22 19:35:29 mdw
* Find out whether @<float.h>@ exists (hack for uC-Linux).
*
*
* Arguments: @dstr *d@ = pointer to a dynamic string block
* @const char *p@ = pointer to @printf@-style format string
- * @va_list ap@ = argument handle
+ * @va_list *ap@ = argument handle
*
* Returns: The number of characters written to the string.
*
* supplied functions with @printf@-style interfaces.
*/
-int dstr_vputf(dstr *d, const char *p, va_list ap)
+int dstr_vputf(dstr *d, const char *p, va_list *ap)
{
const char *q = p;
size_t n = d->len;
getnum:
*ip = 0;
if (*p == '*') {
- *ip = va_arg(ap, int);
+ *ip = va_arg(*ap, int);
DENSURE(&dd, DSTR_PUTFSTEP);
dd.len += sprintf(dd.buf + dd.len, "%i", *ip);
} else {
DENSURE(d, sz);
if (f & f_long)
d->len += sprintf(d->buf + d->len, dd.buf,
- va_arg(ap, unsigned long));
+ va_arg(*ap, unsigned long));
else
d->len += sprintf(d->buf + d->len, dd.buf,
- va_arg(ap, unsigned int));
+ va_arg(*ap, unsigned int));
goto formatted;
case 'e': case 'E': case 'f': case 'F': case 'g': case 'G':
DENSURE(d, sz);
if (f & f_Long)
d->len += sprintf(d->buf + d->len, dd.buf,
- va_arg(ap, long double));
+ va_arg(*ap, long double));
else
d->len += sprintf(d->buf + d->len, dd.buf,
- va_arg(ap, double));
+ va_arg(*ap, double));
goto formatted;
#else
DPUTS(d, "<no float support>");
sz = wd + 1;
DENSURE(d, sz);
d->len += sprintf(d->buf + d->len, dd.buf,
- va_arg(ap, unsigned));
+ va_arg(*ap, unsigned));
goto formatted;
case 's': {
- const char *s = va_arg(ap, const char *);
+ const char *s = va_arg(*ap, const char *);
sz = strlen(s);
DPUTC(&dd, *p);
DPUTZ(&dd);
sz = wd + 1;
DENSURE(d, sz);
d->len += sprintf(d->buf + d->len, dd.buf,
- va_arg(ap, const void *));
+ va_arg(*ap, const void *));
goto formatted;
case 'n':
if (f & f_long)
- *va_arg(ap, long *) = (long)(d->len - n);
+ *va_arg(*ap, long *) = (long)(d->len - n);
else if (f & f_short)
- *va_arg(ap, short *) = (short)(d->len - n);
+ *va_arg(*ap, short *) = (short)(d->len - n);
else
- *va_arg(ap, int *) = (int)(d->len - n);
+ *va_arg(*ap, int *) = (int)(d->len - n);
goto formatted;
/* --- Other random stuff --- */
int n;
va_list ap;
va_start(ap, p);
- n = dstr_vputf(d, p, ap);
+ n = dstr_vputf(d, p, &ap);
va_end(ap);
return (n);
}
/* -*-c-*-
*
- * $Id: dstr.h,v 1.11 2000/06/17 10:37:39 mdw Exp $
+ * $Id: dstr.h,v 1.12 2002/01/13 13:30:48 mdw Exp $
*
* Handle dynamically growing strings
*
/*----- Revision history --------------------------------------------------*
*
* $Log: dstr.h,v $
+ * Revision 1.12 2002/01/13 13:30:48 mdw
+ * Change interface for @dstr_vputf@.
+ *
* Revision 1.11 2000/06/17 10:37:39 mdw
* Add support for arena management.
*
*
* Arguments: @dstr *d@ = pointer to a dynamic string block
* @const char *p@ = pointer to @printf@-style format string
- * @va_list ap@ = argument handle
+ * @va_list *ap@ = argument handle
*
* Returns: The number of characters written to the string.
*
* supplied functions with @printf@-style interfaces.
*/
-extern int dstr_vputf(dstr */*d*/, const char */*p*/, va_list /*ap*/);
+extern int dstr_vputf(dstr */*d*/, const char */*p*/, va_list */*ap*/);
/* --- @dstr_putf@ --- *
*
.BI "void dstr_putc(dstr *" d ", char " ch );
.BI "void dstr_putz(dstr *" d );
.BI "void dstr_puts(dstr *" d ", const char *" s );
-.BI "int dstr_vputf(dstr *" d ", va_list " ap );
+.BI "int dstr_vputf(dstr *" d ", va_list *" ap );
.BI "int dstr_putf(dstr *" d ", ...);"
.BI "void dstr_putd(dstr *" d ", const dstr *" p );
.BI "void dstr_putm(dstr *" d ", const void *" p ", size_t " sz );
.B dstr_vputf
provides access to the `guts' of
.BR dstr_putf :
-given a format string and a
-.B va_list
-pointer, it will format the arguments according to the format string,
-just as
+given a format string and a pointer to a
+.BR va_list
+it will format the arguments according to the format string, just as
.B dstr_putf
-does.
+does. (Note: that's a
+.BR "va_list *" ,
+not a plain
+.BR va_list ,
+so that it gets updated properly on exit.)
.PP
The function
.B dstr_putd