From: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>

Currently, the entire callchain starting from show_ref() parses and
prints immediately.  This inflexibility limits our ability to extend the
parser.  So, convert the entire callchain to accept a strbuf argument to
write to.  Also introduce a show_refs() helper that calls show_ref() in
a loop to avoid cluttering up cmd_for_each_ref() with the task of
initializing/freeing the strbuf.

[rr: commit message]

Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>
Signed-off-by: Ramkumar Ramachandra <artag...@gmail.com>
---
 builtin/for-each-ref.c | 55 ++++++++++++++++++++++++++++++++------------------
 1 file changed, 35 insertions(+), 20 deletions(-)

diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
index 1d4083c..e2d6c5a 100644
--- a/builtin/for-each-ref.c
+++ b/builtin/for-each-ref.c
@@ -864,31 +864,31 @@ static void sort_refs(struct ref_sort *sort, struct 
refinfo **refs, int num_refs
        qsort(refs, num_refs, sizeof(struct refinfo *), compare_refs);
 }
 
-static void print_value(struct refinfo *ref, int atom, int quote_style)
+static void print_value(struct strbuf *sb, struct refinfo *ref,
+                       int atom, int quote_style)
 {
        struct atom_value *v;
-       struct strbuf sb = STRBUF_INIT;
        get_value(ref, atom, &v);
        switch (quote_style) {
        case QUOTE_NONE:
-               fputs(v->s, stdout);
+               strbuf_addstr(sb, v->s);
                break;
        case QUOTE_SHELL:
-               sq_quote_buf(&sb, v->s);
+               sq_quote_buf(sb, v->s);
                break;
        case QUOTE_PERL:
-               perl_quote_buf(&sb, v->s);
+               perl_quote_buf(sb, v->s);
                break;
        case QUOTE_PYTHON:
-               python_quote_buf(&sb, v->s);
+               python_quote_buf(sb, v->s);
                break;
        case QUOTE_TCL:
-               tcl_quote_buf(&sb, v->s);
+               tcl_quote_buf(sb, v->s);
                break;
        }
        if (quote_style != QUOTE_NONE) {
-               fputs(sb.buf, stdout);
-               strbuf_release(&sb);
+               fputs(sb->buf, stdout);
+               strbuf_release(sb);
        }
 }
 
@@ -910,7 +910,7 @@ static int hex2(const char *cp)
                return -1;
 }
 
-static void emit(const char *cp, const char *ep)
+static void emit(struct strbuf *sb, const char *cp, const char *ep)
 {
        while (*cp && (!ep || cp < ep)) {
                if (*cp == '%') {
@@ -919,32 +919,47 @@ static void emit(const char *cp, const char *ep)
                        else {
                                int ch = hex2(cp + 1);
                                if (0 <= ch) {
-                                       putchar(ch);
+                                       strbuf_addch(sb, ch);
                                        cp += 3;
                                        continue;
                                }
                        }
                }
-               putchar(*cp);
+               strbuf_addch(sb, *cp);
                cp++;
        }
 }
 
-static void show_ref(struct refinfo *info, const char *format, int quote_style)
+static void show_ref(struct strbuf *sb, struct refinfo *info,
+                    const char *format, int quote_style)
 {
        const char *cp, *sp, *ep;
 
        for (cp = format; *cp && (sp = find_next(cp)); cp = ep + 1) {
                ep = strchr(sp, ')');
                if (cp < sp)
-                       emit(cp, sp);
-               print_value(info, parse_atom(sp + 2, ep), quote_style);
+                       emit(sb, cp, sp);
+               print_value(sb, info, parse_atom(sp + 2, ep), quote_style);
        }
        if (*cp) {
                sp = cp + strlen(cp);
-               emit(cp, sp);
+               emit(sb, cp, sp);
        }
-       putchar('\n');
+       strbuf_addch(sb, '\n');
+}
+
+static void show_refs(struct refinfo **refs, int maxcount,
+                     const char *format, int quote_style)
+{
+       struct strbuf sb = STRBUF_INIT;
+       int i;
+
+       for (i = 0; i < maxcount; i++) {
+               strbuf_reset(&sb);
+               show_ref(&sb, refs[i], format, quote_style);
+               fputs(sb.buf, stdout);
+       }
+       strbuf_release(&sb);
 }
 
 static struct ref_sort *default_sort(void)
@@ -987,7 +1002,7 @@ static char const * const for_each_ref_usage[] = {
 
 int cmd_for_each_ref(int argc, const char **argv, const char *prefix)
 {
-       int i, num_refs;
+       int num_refs;
        const char *format = "%(objectname) %(objecttype)\t%(refname)";
        struct ref_sort *sort = NULL, **sort_tail = &sort;
        int maxcount = 0, quote_style = 0;
@@ -1041,7 +1056,7 @@ int cmd_for_each_ref(int argc, const char **argv, const 
char *prefix)
 
        if (!maxcount || num_refs < maxcount)
                maxcount = num_refs;
-       for (i = 0; i < maxcount; i++)
-               show_ref(refs[i], format, quote_style);
+
+       show_refs(refs, maxcount, format, quote_style);
        return 0;
 }
-- 
1.8.3.2.736.g869de25

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to