From 3c3d0c4242d834c49d77da321425819c175df61c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Scharfe?= Date: Sat, 17 Jun 2023 22:40:57 +0200 Subject: pretty: factor out expand_separator() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Deduplicate the code for setting the options "separator" and "key_value_separator" by moving it into a new helper function, expand_separator(). Signed-off-by: René Scharfe Signed-off-by: Junio C Hamano --- pretty.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) (limited to 'pretty.c') diff --git a/pretty.c b/pretty.c index 0bb938021b..d2df561a05 100644 --- a/pretty.c +++ b/pretty.c @@ -1250,6 +1250,17 @@ static int format_trailer_match_cb(const struct strbuf *key, void *ud) return 0; } +static struct strbuf *expand_separator(struct strbuf *sb, + const char *argval, size_t arglen) +{ + char *fmt = xstrndup(argval, arglen); + + strbuf_reset(sb); + strbuf_expand(sb, fmt, strbuf_expand_literal_cb, NULL); + free(fmt); + return sb; +} + int format_set_trailers_options(struct process_trailer_options *opts, struct string_list *filter_list, struct strbuf *sepbuf, @@ -1278,21 +1289,9 @@ int format_set_trailers_options(struct process_trailer_options *opts, opts->filter_data = filter_list; opts->only_trailers = 1; } else if (match_placeholder_arg_value(*arg, "separator", arg, &argval, &arglen)) { - char *fmt; - - strbuf_reset(sepbuf); - fmt = xstrndup(argval, arglen); - strbuf_expand(sepbuf, fmt, strbuf_expand_literal_cb, NULL); - free(fmt); - opts->separator = sepbuf; + opts->separator = expand_separator(sepbuf, argval, arglen); } else if (match_placeholder_arg_value(*arg, "key_value_separator", arg, &argval, &arglen)) { - char *fmt; - - strbuf_reset(kvsepbuf); - fmt = xstrndup(argval, arglen); - strbuf_expand(kvsepbuf, fmt, strbuf_expand_literal_cb, NULL); - free(fmt); - opts->key_value_separator = kvsepbuf; + opts->key_value_separator = expand_separator(kvsepbuf, argval, arglen); } else if (!match_placeholder_bool_arg(*arg, "only", arg, &opts->only_trailers) && !match_placeholder_bool_arg(*arg, "unfold", arg, &opts->unfold) && !match_placeholder_bool_arg(*arg, "keyonly", arg, &opts->key_only) && -- cgit v1.2.3 From 6f1e2d52797161c7effe4d1388765de3dbd80bbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Scharfe?= Date: Sat, 17 Jun 2023 22:43:17 +0200 Subject: replace strbuf_expand() with strbuf_expand_step() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Avoid the overhead of passing context to a callback function of strbuf_expand() by using strbuf_expand_step() in a loop instead. It requires explicit handling of %% and unrecognized placeholders, but is simpler, more direct and avoids void pointers. Signed-off-by: René Scharfe Signed-off-by: Junio C Hamano --- pretty.c | 72 ++++++++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 43 insertions(+), 29 deletions(-) (limited to 'pretty.c') diff --git a/pretty.c b/pretty.c index d2df561a05..cffbf32987 100644 --- a/pretty.c +++ b/pretty.c @@ -1254,9 +1254,19 @@ static struct strbuf *expand_separator(struct strbuf *sb, const char *argval, size_t arglen) { char *fmt = xstrndup(argval, arglen); + const char *format = fmt; strbuf_reset(sb); - strbuf_expand(sb, fmt, strbuf_expand_literal_cb, NULL); + while (strbuf_expand_step(sb, &format)) { + size_t len; + + if (skip_prefix(format, "%", &format)) + strbuf_addch(sb, '%'); + else if ((len = strbuf_expand_literal_cb(sb, format, NULL))) + format += len; + else + strbuf_addch(sb, '%'); + } free(fmt); return sb; } @@ -1803,7 +1813,7 @@ static size_t format_and_pad_commit(struct strbuf *sb, /* in UTF-8 */ static size_t format_commit_item(struct strbuf *sb, /* in UTF-8 */ const char *placeholder, - void *context) + struct format_commit_context *context) { size_t consumed, orig_len; enum { @@ -1842,7 +1852,7 @@ static size_t format_commit_item(struct strbuf *sb, /* in UTF-8 */ } orig_len = sb->len; - if (((struct format_commit_context *)context)->flush_type != no_flush) + if ((context)->flush_type != no_flush) consumed = format_and_pad_commit(sb, placeholder, context); else consumed = format_commit_one(sb, placeholder, context); @@ -1861,30 +1871,6 @@ static size_t format_commit_item(struct strbuf *sb, /* in UTF-8 */ return consumed + 1; } -static size_t userformat_want_item(struct strbuf *sb UNUSED, - const char *placeholder, - void *context) -{ - struct userformat_want *w = context; - - if (*placeholder == '+' || *placeholder == '-' || *placeholder == ' ') - placeholder++; - - switch (*placeholder) { - case 'N': - w->notes = 1; - break; - case 'S': - w->source = 1; - break; - case 'd': - case 'D': - w->decorate = 1; - break; - } - return 0; -} - void userformat_find_requirements(const char *fmt, struct userformat_want *w) { struct strbuf dummy = STRBUF_INIT; @@ -1894,7 +1880,26 @@ void userformat_find_requirements(const char *fmt, struct userformat_want *w) return; fmt = user_format; } - strbuf_expand(&dummy, fmt, userformat_want_item, w); + while (strbuf_expand_step(&dummy, &fmt)) { + if (skip_prefix(fmt, "%", &fmt)) + continue; + + if (*fmt == '+' || *fmt == '-' || *fmt == ' ') + fmt++; + + switch (*fmt) { + case 'N': + w->notes = 1; + break; + case 'S': + w->source = 1; + break; + case 'd': + case 'D': + w->decorate = 1; + break; + } + } strbuf_release(&dummy); } @@ -1912,7 +1917,16 @@ void repo_format_commit_message(struct repository *r, const char *output_enc = pretty_ctx->output_encoding; const char *utf8 = "UTF-8"; - strbuf_expand(sb, format, format_commit_item, &context); + while (strbuf_expand_step(sb, &format)) { + size_t len; + + if (skip_prefix(format, "%", &format)) + strbuf_addch(sb, '%'); + else if ((len = format_commit_item(sb, format, &context))) + format += len; + else + strbuf_addch(sb, '%'); + } rewrap_message_tail(sb, &context, 0, 0, 0); /* -- cgit v1.2.3 From 4416b86c6b34dad64b556bb1eb6711d5e6595a48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Scharfe?= Date: Sat, 17 Jun 2023 22:44:00 +0200 Subject: strbuf: simplify strbuf_expand_literal_cb() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Now that strbuf_expand_literal_cb() is no longer used as a callback, drop its "_cb" name suffix and unused context parameter. Signed-off-by: René Scharfe Signed-off-by: Junio C Hamano --- pretty.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'pretty.c') diff --git a/pretty.c b/pretty.c index cffbf32987..4c08f9856b 100644 --- a/pretty.c +++ b/pretty.c @@ -1262,7 +1262,7 @@ static struct strbuf *expand_separator(struct strbuf *sb, if (skip_prefix(format, "%", &format)) strbuf_addch(sb, '%'); - else if ((len = strbuf_expand_literal_cb(sb, format, NULL))) + else if ((len = strbuf_expand_literal(sb, format))) format += len; else strbuf_addch(sb, '%'); @@ -1395,7 +1395,7 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */ char **slot; /* these are independent of the commit */ - res = strbuf_expand_literal_cb(sb, placeholder, NULL); + res = strbuf_expand_literal(sb, placeholder); if (res) return res; -- cgit v1.2.3