Skip to content

Commit c905cbc

Browse files
pcloudsgitster
authored andcommitted
diff.c: refactor pprint_rename() to use strbuf
Instead of passing char* around, let function handle strbuf directly. All callers already use strbuf internally. This helps kill the "not free" exception in free_diffstat_info(). I don't think this code is so critical that we need to avoid some free() calls. The other benefit comes in the next patch, where we append something in pname before returning from fill_print_name(). With strbuf, it's very simple. With "char *" we may have to resort to explicit reallocation and stuff. Signed-off-by: Nguyễn Thái Ngọc Duy <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 2512f15 commit c905cbc

File tree

1 file changed

+26
-33
lines changed

1 file changed

+26
-33
lines changed

diff.c

Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2045,11 +2045,10 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
20452045
}
20462046
}
20472047

2048-
static char *pprint_rename(const char *a, const char *b)
2048+
static void pprint_rename(struct strbuf *name, const char *a, const char *b)
20492049
{
20502050
const char *old = a;
20512051
const char *new = b;
2052-
struct strbuf name = STRBUF_INIT;
20532052
int pfx_length, sfx_length;
20542053
int pfx_adjust_for_slash;
20552054
int len_a = strlen(a);
@@ -2059,10 +2058,10 @@ static char *pprint_rename(const char *a, const char *b)
20592058
int qlen_b = quote_c_style(b, NULL, NULL, 0);
20602059

20612060
if (qlen_a || qlen_b) {
2062-
quote_c_style(a, &name, NULL, 0);
2063-
strbuf_addstr(&name, " => ");
2064-
quote_c_style(b, &name, NULL, 0);
2065-
return strbuf_detach(&name, NULL);
2061+
quote_c_style(a, name, NULL, 0);
2062+
strbuf_addstr(name, " => ");
2063+
quote_c_style(b, name, NULL, 0);
2064+
return;
20662065
}
20672066

20682067
/* Find common prefix */
@@ -2109,19 +2108,18 @@ static char *pprint_rename(const char *a, const char *b)
21092108
if (b_midlen < 0)
21102109
b_midlen = 0;
21112110

2112-
strbuf_grow(&name, pfx_length + a_midlen + b_midlen + sfx_length + 7);
2111+
strbuf_grow(name, pfx_length + a_midlen + b_midlen + sfx_length + 7);
21132112
if (pfx_length + sfx_length) {
2114-
strbuf_add(&name, a, pfx_length);
2115-
strbuf_addch(&name, '{');
2113+
strbuf_add(name, a, pfx_length);
2114+
strbuf_addch(name, '{');
21162115
}
2117-
strbuf_add(&name, a + pfx_length, a_midlen);
2118-
strbuf_addstr(&name, " => ");
2119-
strbuf_add(&name, b + pfx_length, b_midlen);
2116+
strbuf_add(name, a + pfx_length, a_midlen);
2117+
strbuf_addstr(name, " => ");
2118+
strbuf_add(name, b + pfx_length, b_midlen);
21202119
if (pfx_length + sfx_length) {
2121-
strbuf_addch(&name, '}');
2122-
strbuf_add(&name, a + len_a - sfx_length, sfx_length);
2120+
strbuf_addch(name, '}');
2121+
strbuf_add(name, a + len_a - sfx_length, sfx_length);
21232122
}
2124-
return strbuf_detach(&name, NULL);
21252123
}
21262124

21272125
struct diffstat_t {
@@ -2197,23 +2195,17 @@ static void show_graph(struct strbuf *out, char ch, int cnt,
21972195

21982196
static void fill_print_name(struct diffstat_file *file)
21992197
{
2200-
char *pname;
2198+
struct strbuf pname = STRBUF_INIT;
22012199

22022200
if (file->print_name)
22032201
return;
22042202

2205-
if (!file->is_renamed) {
2206-
struct strbuf buf = STRBUF_INIT;
2207-
if (quote_c_style(file->name, &buf, NULL, 0)) {
2208-
pname = strbuf_detach(&buf, NULL);
2209-
} else {
2210-
pname = file->name;
2211-
strbuf_release(&buf);
2212-
}
2213-
} else {
2214-
pname = pprint_rename(file->from_name, file->name);
2215-
}
2216-
file->print_name = pname;
2203+
if (file->is_renamed)
2204+
pprint_rename(&pname, file->from_name, file->name);
2205+
else
2206+
quote_c_style(file->name, &pname, NULL, 0);
2207+
2208+
file->print_name = strbuf_detach(&pname, NULL);
22172209
}
22182210

22192211
static void print_stat_summary_inserts_deletes(struct diff_options *options,
@@ -2797,8 +2789,7 @@ static void free_diffstat_info(struct diffstat_t *diffstat)
27972789
int i;
27982790
for (i = 0; i < diffstat->nr; i++) {
27992791
struct diffstat_file *f = diffstat->files[i];
2800-
if (f->name != f->print_name)
2801-
free(f->print_name);
2792+
free(f->print_name);
28022793
free(f->name);
28032794
free(f->from_name);
28042795
free(f);
@@ -5224,10 +5215,12 @@ static void show_rename_copy(struct diff_options *opt, const char *renamecopy,
52245215
struct diff_filepair *p)
52255216
{
52265217
struct strbuf sb = STRBUF_INIT;
5227-
char *names = pprint_rename(p->one->path, p->two->path);
5218+
struct strbuf names = STRBUF_INIT;
5219+
5220+
pprint_rename(&names, p->one->path, p->two->path);
52285221
strbuf_addf(&sb, " %s %s (%d%%)\n",
5229-
renamecopy, names, similarity_index(p));
5230-
free(names);
5222+
renamecopy, names.buf, similarity_index(p));
5223+
strbuf_release(&names);
52315224
emit_diff_symbol(opt, DIFF_SYMBOL_SUMMARY,
52325225
sb.buf, sb.len, 0);
52335226
show_mode_change(opt, p, 0);

0 commit comments

Comments
 (0)