3 * `printf'-style formatting for dynamic strings
5 * (c) 1999 Straylight/Edgeware
8 /*----- Licensing notice --------------------------------------------------*
10 * This file is part of the mLib utilities library.
12 * mLib is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU Library General Public License as
14 * published by the Free Software Foundation; either version 2 of the
15 * License, or (at your option) any later version.
17 * mLib is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU Library General Public License for more details.
22 * You should have received a copy of the GNU Library General Public
23 * License along with mLib; if not, write to the Free
24 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
28 /*----- Header files ------------------------------------------------------*/
37 /*----- Main code ---------------------------------------------------------*/
39 /* --- @dstr_vputf@ --- *
41 * Arguments: @dstr *d@ = pointer to a dynamic string block
42 * @const char *p@ = pointer to @printf@-style format string
43 * @va_list *ap@ = argument handle
45 * Returns: The number of characters written to the string.
47 * Use: As for @dstr_putf@, but may be used as a back-end to user-
48 * supplied functions with @printf@-style interfaces.
51 static int putch(void *out, int ch)
52 { dstr *d = out; DPUTC(d, ch); return (0); }
53 static int putm(void *out, const char *p, size_t sz)
54 { dstr *d = out; DPUTM(d, p, sz); return (0); }
56 static int nputf(void *out, size_t maxsz, const char *p, ...)
63 DENSURE(d, maxsz + 1);
65 n = vsnprintf(d->buf + d->len, maxsz + 1, p, ap);
67 n = vsprintf(d->buf + d->len, p, ap);
69 assert(0 <= n && n <= maxsz);
70 va_end(ap); d->len += n; return (n);
73 const struct gprintf_ops dstr_printops =
74 { putch, putm, nputf };
76 int dstr_vputf(dstr *d, const char *p, va_list *ap)
77 { int n = vgprintf(&dstr_printops, d, p, ap); DPUTZ(d); return (n); }
79 /* --- @dstr_putf@ --- *
81 * Arguments: @dstr *d@ = pointer to a dynamic string block
82 * @const char *p@ = pointer to @printf@-style format string
83 * @...@ = argument handle
85 * Returns: The number of characters written to the string.
87 * Use: Writes a piece of text to a dynamic string, doing @printf@-
88 * style substitutions as it goes. Intended to be robust if
89 * faced with malicious arguments, but not if the format string
90 * itself is malicious.
93 int dstr_putf(dstr *d, const char *p, ...)
98 n = dstr_vputf(d, p, &ap);
103 /*----- That's all, folks -------------------------------------------------*/