X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/mLib/blobdiff_plain/00c7638bc6791b810069381b8aaebfeac67cdfee..0d4e268a25ff7c416d2229057a77c451407a5db0:/dstr.c?ds=sidebyside diff --git a/dstr.c b/dstr.c index 8a80920..86cde6e 100644 --- a/dstr.c +++ b/dstr.c @@ -1,34 +1,53 @@ /* -*-c-*- * - * $Id: dstr.c,v 1.2 1998/12/15 23:53:22 mdw Exp $ + * $Id: dstr.c,v 1.8 1999/06/01 09:47:52 mdw Exp $ * * Handle dynamically growing strings * * (c) 1998 Straylight/Edgeware */ -/*----- Licensing notice --------------------------------------------------* +/*----- Licensing notice --------------------------------------------------* * * This file is part of the mLib utilities library. * * mLib is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * + * 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 General Public License for more details. - * - * You should have received a copy of the GNU 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. + * 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: dstr.c,v $ + * Revision 1.8 1999/06/01 09:47:52 mdw + * Fix nasty bugs in `dstr_vputf'. + * + * Revision 1.7 1999/05/21 22:14:30 mdw + * Take advantage of the new dynamic string macros. + * + * Revision 1.6 1999/05/21 08:38:33 mdw + * Implement some more functions in terms of macros. + * + * Revision 1.5 1999/05/13 22:47:57 mdw + * Misc documentation fixes. Change `-ise' to `-ize' throughout. + * + * Revision 1.4 1999/05/06 19:51:35 mdw + * Reformatted the LGPL notice a little bit. + * + * Revision 1.3 1999/05/05 18:50:31 mdw + * Change licensing conditions to LGPL. + * * Revision 1.2 1998/12/15 23:53:22 mdw * New functions `dstr_putf' and `dstr_vputf' which do `printf'-style * formatting in a safe way. @@ -65,15 +84,10 @@ * * Returns: --- * - * Use: Initialises a dynamic string. + * Use: Initializes a dynamic string. */ -void dstr_create(dstr *d) -{ - d->sz = 0; - d->len = 0; - d->buf = 0; -} +void dstr_create(dstr *d) { DCREATE(d); } /* --- @dstr_destroy@ --- * * @@ -84,14 +98,7 @@ void dstr_create(dstr *d) * Use: Reclaims the space used by a dynamic string. */ -void dstr_destroy(dstr *d) -{ - if (d->buf) - free(d->buf); - d->buf = 0; - d->len = 0; - d->sz = 0; -} +void dstr_destroy(dstr *d) { DDESTROY(d); } /* --- @dstr_reset@ --- * * @@ -102,10 +109,7 @@ void dstr_destroy(dstr *d) * Use: Resets a string so that new data gets put at the beginning. */ -void dstr_reset(dstr *d) -{ - d->len = 0; -} +void dstr_reset(dstr *d) { DRESET(d); } /* --- @dstr_ensure@ --- * * @@ -162,10 +166,7 @@ void dstr_ensure(dstr *d, size_t sz) * Use: Appends a character to a string. */ -void dstr_putc(dstr *d, char ch) -{ - DPUTC(d, ch); -} +void dstr_putc(dstr *d, char ch) { DPUTC(d, ch); } /* --- @dstr_putz@ --- * * @@ -178,10 +179,7 @@ void dstr_putc(dstr *d, char ch) * by subsequent `put' operations. */ -void dstr_putz(dstr *d) -{ - DPUTZ(d); -} +void dstr_putz(dstr *d) { DPUTZ(d); } /* --- @dstr_puts@ --- * * @@ -194,10 +192,7 @@ void dstr_putz(dstr *d) * byte is added, as for @dstr_putz@. */ -void dstr_puts(dstr *d, const char *s) -{ - DPUTS(d, s); -} +void dstr_puts(dstr *d, const char *s) { DPUTS(d, s); } /* --- @dstr_vputf@ --- * * @@ -205,7 +200,7 @@ void dstr_puts(dstr *d, const char *s) * @const char *p@ = pointer to @printf@-style format string * @va_list ap@ = argument handle * - * Returns: --- + * Returns: The number of characters written to the string. * * Use: As for @dstr_putf@, but may be used as a back-end to user- * supplied functions with @printf@-style interfaces. @@ -216,11 +211,11 @@ int dstr_vputf(dstr *d, const char *p, va_list ap) const char *q = p; size_t n = d->len; size_t sz; + dstr dd = DSTR_INIT; while (*p) { unsigned f; int wd, prec; - dstr dd; enum { f_short = 1, @@ -244,7 +239,6 @@ int dstr_vputf(dstr *d, const char *p, va_list ap) /* --- Sort out the various silly flags and things --- */ - dstr_create(&dd); DPUTC(&dd, '%'); f = 0; sz = DSTR_PUTFSTEP; @@ -287,7 +281,7 @@ int dstr_vputf(dstr *d, const char *p, va_list ap) goto getnum; default: if (isdigit((unsigned char)*p)) { - f |= f_prec; + f |= f_wd; ip = &wd; goto getnum; } @@ -300,12 +294,12 @@ int dstr_vputf(dstr *d, const char *p, va_list ap) DENSURE(&dd, DSTR_PUTFSTEP); dd.len += sprintf(dd.buf + dd.len, "%i", *ip); } else { - *ip = *p + '0'; + *ip = *p - '0'; DPUTC(&dd, *p); p++; while (isdigit((unsigned char)*p)) { DPUTC(&dd, *p); - *ip = 10 * *ip + *p++ + '0'; + *ip = 10 * *ip + *p++ - '0'; } } break; @@ -407,13 +401,14 @@ int dstr_vputf(dstr *d, const char *p, va_list ap) } formatted: - dstr_destroy(&dd); + DRESET(&dd); q = ++p; } DPUTM(d, q, p - q); finished: DPUTZ(d); + DDESTROY(&dd); return (d->len - n); } @@ -423,7 +418,7 @@ finished: * @const char *p@ = pointer to @printf@-style format string * @...@ = argument handle * - * Returns: --- + * Returns: The number of characters written to the string. * * Use: Writes a piece of text to a dynamic string, doing @printf@- * style substitutions as it goes. Intended to be robust if @@ -452,10 +447,7 @@ int dstr_putf(dstr *d, const char *p, ...) * byte is added, as for @dstr_putz@. */ -void dstr_putd(dstr *d, const dstr *s) -{ - DPUTD(d, s); -} +void dstr_putd(dstr *d, const dstr *s) { DPUTD(d, s); } /* --- @dstr_putm@ --- * * @@ -467,10 +459,7 @@ void dstr_putd(dstr *d, const dstr *s) * null is appended. */ -void dstr_putm(dstr *d, const void *p, size_t sz) -{ - DPUTM(d, p, sz); -} +void dstr_putm(dstr *d, const void *p, size_t sz) { DPUTM(d, p, sz); } /* --- @dstr_tidy@ --- * * @@ -552,9 +541,6 @@ int dstr_putline(dstr *d, FILE *fp) * Use: Writes a dynamic string to a file. */ -size_t dstr_write(dstr *d, FILE *fp) -{ - return (fwrite(d->buf, 1, d->len, fp)); -} +size_t dstr_write(const dstr *d, FILE *fp) { return (DWRITE(d, fp)); } /*----- That's all, folks -------------------------------------------------*/