From: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> 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: Ramkumar Ramachandra <artagnon@xxxxxxxxx> --- 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.GIT -- 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