From: Junio C Hamano Date: Wed, 14 Nov 2007 22:03:50 +0000 (-0800) Subject: Merge branch 'rs/pretty' X-Git-Tag: v1.5.4-rc0~213 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/37ec2b4c26901d5f1ca19948189dc2b6f21523d5?ds=inline;hp=-c Merge branch 'rs/pretty' * rs/pretty: Fix preprocessor logic that determines the availablity of strchrnul(). Simplify strchrnul() compat code --format=pretty: avoid calculating expensive expansions twice add strbuf_adddup() --pretty=format: parse commit message only once --pretty=format: on-demand format expansion Add strchrnul() --- 37ec2b4c26901d5f1ca19948189dc2b6f21523d5 diff --combined strbuf.c index cbada946c4,dbd8c4bcfb..b9b194b320 --- a/strbuf.c +++ b/strbuf.c @@@ -106,18 -106,24 +106,25 @@@ void strbuf_add(struct strbuf *sb, cons strbuf_setlen(sb, sb->len + len); } + void strbuf_adddup(struct strbuf *sb, size_t pos, size_t len) + { + strbuf_grow(sb, len); + memcpy(sb->buf + sb->len, sb->buf + pos, len); + strbuf_setlen(sb, sb->len + len); + } + void strbuf_addf(struct strbuf *sb, const char *fmt, ...) { int len; va_list ap; + if (!strbuf_avail(sb)) + strbuf_grow(sb, 64); va_start(ap, fmt); len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap); va_end(ap); - if (len < 0) { - len = 0; - } + if (len < 0) + die("your vsnprintf is broken"); if (len > strbuf_avail(sb)) { strbuf_grow(sb, len); va_start(ap, fmt); @@@ -130,6 -136,30 +137,30 @@@ strbuf_setlen(sb, sb->len + len); } + void strbuf_expand(struct strbuf *sb, const char *format, + const char **placeholders, expand_fn_t fn, void *context) + { + for (;;) { + const char *percent, **p; + + percent = strchrnul(format, '%'); + strbuf_add(sb, format, percent - format); + if (!*percent) + break; + format = percent + 1; + + for (p = placeholders; *p; p++) { + if (!prefixcmp(format, *p)) + break; + } + if (*p) { + fn(sb, *p, context); + format += strlen(*p); + } else + strbuf_addch(sb, '%'); + } + } + size_t strbuf_fread(struct strbuf *sb, size_t size, FILE *f) { size_t res;