Merge branch 'rs/pretty'
authorJunio C Hamano <gitster@pobox.com>
Wed, 14 Nov 2007 22:03:50 +0000 (14:03 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 14 Nov 2007 22:03:50 +0000 (14:03 -0800)
* 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()

1  2 
strbuf.c
diff --combined strbuf.c
index cbada946c4e73a403cb2d237f8aebfcda5c88ac4,dbd8c4bcfb2f8549b8713a8d9fbbfd8adcd0088c..b9b194b3200e950cfdb3c696d92ece0657e9d344
+++ 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);
        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;