X-Git-Url: https://git.distorted.org.uk/~mdw/mLib/blobdiff_plain/393cf1d9803c3dfda0fbb8add9bc5cb9b1f6f07b..b3a0ac5ea5b0f341ab0c1fe0a68a7855fe5c36c1:/dputf.c diff --git a/dputf.c b/dputf.c index 5df210c..2c29aad 100644 --- a/dputf.c +++ b/dputf.c @@ -1,13 +1,13 @@ /* -*-c-*- * - * $Id: dputf.c,v 1.3 2001/01/20 12:06:01 mdw Exp $ + * $Id$ * * `printf'-style formatting for dynamic strings * * (c) 1999 Straylight/Edgeware */ -/*----- Licensing notice --------------------------------------------------* +/*----- Licensing notice --------------------------------------------------* * * This file is part of the mLib utilities library. * @@ -15,42 +15,33 @@ * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. - * + * * mLib is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. - * + * * You should have received a copy of the GNU Library General Public * License along with mLib; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. */ -/*----- Revision history --------------------------------------------------* - * - * $Log: dputf.c,v $ - * Revision 1.3 2001/01/20 12:06:01 mdw - * Define flags with macros, to ensure unsignedness. - * - * Revision 1.2 2000/08/15 21:26:45 mdw - * (dstr_vputf): Don't try calling @va_arg@ on things @char@-sized. - * - * Revision 1.1 1999/10/04 21:44:47 mdw - * Move `dstr_putf' and `dstr_vputf' into a separate source file. - * - */ - /*----- Header files ------------------------------------------------------*/ +#include "config.h" + #include -#include #include #include #include #include #include +#ifdef HAVE_FLOAT_H +# include +#endif + #include "dstr.h" /*----- Tunable constants -------------------------------------------------*/ @@ -68,7 +59,7 @@ * * 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. * @@ -76,7 +67,7 @@ * 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; @@ -142,6 +133,7 @@ int dstr_vputf(dstr *d, const char *p, va_list ap) DPUTC(&dd, '.'); ip = ≺ f |= f_prec; + p++; goto getnum; case '*': ip = &wd; @@ -155,10 +147,10 @@ int dstr_vputf(dstr *d, const char *p, va_list ap) } DPUTC(d, *p); goto formatted; - getnum: + 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 { @@ -185,13 +177,14 @@ int dstr_vputf(dstr *d, const char *p, va_list ap) 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': +#ifdef HAVE_FLOAT_H DPUTC(&dd, *p); DPUTZ(&dd); if (*p == 'f') { @@ -202,17 +195,20 @@ int dstr_vputf(dstr *d, const char *p, va_list ap) if (!(f & f_prec)) prec = 6; else - sz += prec + 16; + sz += prec + 16; if ((f & f_wd) && wd + 1 > sz) sz = wd + 1; 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, ""); +#endif case 'c': DPUTC(&dd, *p); @@ -221,11 +217,11 @@ int dstr_vputf(dstr *d, const char *p, va_list ap) 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); @@ -247,16 +243,16 @@ int dstr_vputf(dstr *d, const char *p, va_list ap) 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 --- */ @@ -305,7 +301,7 @@ int dstr_putf(dstr *d, const char *p, ...) 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); }