]> git.ipfire.org Git - thirdparty/git.git/commitdiff
strbuf: separate callback for strbuf_expand:ing literals
authorAnders Waldenborg <anders@0x63.nu>
Mon, 28 Jan 2019 21:33:36 +0000 (22:33 +0100)
committerJunio C Hamano <gitster@pobox.com>
Tue, 29 Jan 2019 18:03:32 +0000 (10:03 -0800)
Expanding '%n' and '%xNN' is generic functionality, so extract that from
the pretty.c formatter into a callback that can be reused.

No functional change intended

Signed-off-by: Anders Waldenborg <anders@0x63.nu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
pretty.c
strbuf.c
strbuf.h

index fe73916adc88880dd75d2323fb36fca8fa52d4f3..2c66698b8969f489dfb992e865f2fff2de3e5d57 100644 (file)
--- a/pretty.c
+++ b/pretty.c
@@ -1137,9 +1137,13 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
        const char *msg = c->message;
        struct commit_list *p;
        const char *arg;
-       int ch;
+       size_t res;
 
        /* these are independent of the commit */
+       res = strbuf_expand_literal_cb(sb, placeholder, NULL);
+       if (res)
+               return res;
+
        switch (placeholder[0]) {
        case 'C':
                if (starts_with(placeholder + 1, "(auto)")) {
@@ -1158,16 +1162,6 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
                         */
                        return ret;
                }
-       case 'n':               /* newline */
-               strbuf_addch(sb, '\n');
-               return 1;
-       case 'x':
-               /* %x00 == NUL, %x0a == LF, etc. */
-               ch = hex2chr(placeholder + 1);
-               if (ch < 0)
-                       return 0;
-               strbuf_addch(sb, ch);
-               return 3;
        case 'w':
                if (placeholder[1] == '(') {
                        unsigned long width = 0, indent1 = 0, indent2 = 0;
index f6a6cf78b9426abfa73a2053c17326fd645645e7..78eecd29f7e64109203af17cd6e7c2f7e95e3dfc 100644 (file)
--- a/strbuf.c
+++ b/strbuf.c
@@ -380,6 +380,27 @@ void strbuf_expand(struct strbuf *sb, const char *format, expand_fn_t fn,
        }
 }
 
+size_t strbuf_expand_literal_cb(struct strbuf *sb,
+                               const char *placeholder,
+                               void *context)
+{
+       int ch;
+
+       switch (placeholder[0]) {
+       case 'n':               /* newline */
+               strbuf_addch(sb, '\n');
+               return 1;
+       case 'x':
+               /* %x00 == NUL, %x0a == LF, etc. */
+               ch = hex2chr(placeholder + 1);
+               if (ch < 0)
+                       return 0;
+               strbuf_addch(sb, ch);
+               return 3;
+       }
+       return 0;
+}
+
 size_t strbuf_expand_dict_cb(struct strbuf *sb, const char *placeholder,
                void *context)
 {
index fc40873b65124fc98a2e06150b7c8043f05ed4ab..52e44c9ab83b3409f4f861db41a138123ba433b1 100644 (file)
--- a/strbuf.h
+++ b/strbuf.h
@@ -320,6 +320,14 @@ void strbuf_expand(struct strbuf *sb,
                   expand_fn_t fn,
                   void *context);
 
+/**
+ * Used as callback for `strbuf_expand` to only expand literals
+ * (i.e. %n and %xNN). The context argument is ignored.
+ */
+size_t strbuf_expand_literal_cb(struct strbuf *sb,
+                               const char *placeholder,
+                               void *context);
+
 /**
  * Used as callback for `strbuf_expand()`, expects an array of
  * struct strbuf_expand_dict_entry as context, i.e. pairs of