Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- builtin/for-each-ref.c | 48 +++++++++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c index 14151b4..08d4eb1 100644 --- a/builtin/for-each-ref.c +++ b/builtin/for-each-ref.c @@ -864,15 +864,14 @@ 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_buf = STRBUF_INIT; - struct strbuf *sb = &sb_buf; 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); @@ -887,10 +886,6 @@ static void print_value(struct refinfo *ref, int atom, int quote_style) tcl_quote_buf(sb, v->s); break; } - if (quote_style != QUOTE_NONE) { - fputs(sb->buf, stdout); - strbuf_release(sb); - } } static int hex1(char ch) @@ -911,7 +906,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 == '%') { @@ -920,32 +915,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); + } + 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); } - putchar('\n'); + strbuf_release(&sb); } static struct ref_sort *default_sort(void) @@ -988,7 +998,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; @@ -1042,7 +1052,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.2.83.gc99314b -- 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