The most common use of addf() was to init a strbuf and addf() right away. Since it is so common, it makes sense to have a function strbuf_initf() to wrap both calls into one. Unfortunately, C (and cpp) has no way to make this easy without code duplication, as we need to va_init() in strbuf_addf() possibly a few times. So the code for addf() is copied. Fortunately, the code is pretty short, so not too much had to be copied as-is. Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> --- On Wed, 5 Mar 2008, Johannes Schindelin wrote: > On Wed, 5 Mar 2008, Junio C Hamano wrote: > > > Johannes Schindelin <Johannes.Schindelin@xxxxxx> writes: > > > > > [... I'd submit my ] a Reviewed-by:, but I think that this > > > would only be a burden on our maintainer. > > > > I think Reviewed-by: would indeed be a very good addition to > > our patch flow convention, borrowing from the kernel folks. > > You mean you have more people to blame, then? ;-) Well, it was meant as a joke... Anyway, here is a start of a patch series that should help the King Penguin... strbuf_initf() is something I long planned to do; Kristian just pushed me over the edge. strbuf.c | 23 +++++++++++++++++++++++ strbuf.h | 2 ++ 2 files changed, 25 insertions(+), 0 deletions(-) diff --git a/strbuf.c b/strbuf.c index 5afa8f3..067d55a 100644 --- a/strbuf.c +++ b/strbuf.c @@ -147,6 +147,29 @@ void strbuf_addf(struct strbuf *sb, const char *fmt, ...) strbuf_setlen(sb, sb->len + len); } +void strbuf_initf(struct strbuf *sb, const char *fmt, ...) +{ + int len; + va_list ap; + + strbuf_init(sb, strlen(fmt) + 64); + va_start(ap, fmt); + len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap); + va_end(ap); + if (len < 0) + die("your vsnprintf is broken"); + if (len > strbuf_avail(sb)) { + strbuf_grow(sb, len); + va_start(ap, fmt); + len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap); + va_end(ap); + if (len > strbuf_avail(sb)) { + die("this should not happen, your snprintf is broken"); + } + } + strbuf_setlen(sb, sb->len + len); +} + void strbuf_expand(struct strbuf *sb, const char *format, expand_fn_t fn, void *context) { diff --git a/strbuf.h b/strbuf.h index faec229..eaf2409 100644 --- a/strbuf.h +++ b/strbuf.h @@ -108,6 +108,8 @@ extern void strbuf_expand(struct strbuf *sb, const char *format, expand_fn_t fn, __attribute__((format(printf,2,3))) extern void strbuf_addf(struct strbuf *sb, const char *fmt, ...); +__attribute__((format(printf,2,3))) +extern void strbuf_initf(struct strbuf *sb, const char *fmt, ...); extern size_t strbuf_fread(struct strbuf *, size_t, FILE *); /* XXX: if read fails, any partial read is undone */ -- 1.5.4.3.571.g9aec3 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html