trailer: change strbuf in-place in unfold_value()

Avoid an allocation by doing s/\n\s*/ /g (replacing NL and any following
whitespace with a SP) right in the strbuf instead of copying the result
to a temporary one and swapping them in the end.  We can safely do that
because the replacement is never longer than the original string.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
main
René Scharfe 2026-05-15 09:33:53 +02:00 committed by Junio C Hamano
parent 94f057755b
commit 34a891a2d3
1 changed files with 5 additions and 10 deletions

View File

@ -988,10 +988,9 @@ static int ends_with_blank_line(const char *buf, size_t len)

static void unfold_value(struct strbuf *val)
{
struct strbuf out = STRBUF_INIT;
size_t i;
size_t pos = 0;

strbuf_grow(&out, val->len);
i = 0;
while (i < val->len) {
char c = val->buf[i++];
@ -999,18 +998,14 @@ static void unfold_value(struct strbuf *val)
/* Collapse continuation down to a single space. */
while (i < val->len && isspace(val->buf[i]))
i++;
strbuf_addch(&out, ' ');
} else {
strbuf_addch(&out, c);
c = ' ';
}
val->buf[pos++] = c;
}
strbuf_setlen(val, pos);

/* Empty lines may have left us with whitespace cruft at the edges */
strbuf_trim(&out);

/* output goes back to val as if we modified it in-place */
strbuf_swap(&out, val);
strbuf_release(&out);
strbuf_trim(val);
}

static struct trailer_block *trailer_block_new(void)