diff.c: factor advance_or_nullify out of mark_color_as_moved

This moves the part of code that checks if we're still in a block
into its own function.  We'll need a different approach on advancing
the blocks in a later patch, so having it as a separate function will
prove useful.

While at it rename the variable `p` to `prev` to indicate that it refers
to the previous line. This is as pmb[i] was assigned in the last iteration
of the outmost for loop.

Further rename `pnext` to `cur` to indicate that this should match up with
the current line of the outmost for loop.

Also replace the advancement of pmb[i] to reuse `cur` instead of
using `p->next` (which is how the name for pnext could be explained.

Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Stefan Beller 2018-07-16 16:05:41 -07:00 committed by Junio C Hamano
parent b3095712f9
commit e2fe6abc3b

32
diff.c
View file

@ -801,6 +801,25 @@ static void add_lines_to_move_detection(struct diff_options *o,
}
}
static void pmb_advance_or_null(struct diff_options *o,
struct moved_entry *match,
struct hashmap *hm,
struct moved_entry **pmb,
int pmb_nr)
{
int i;
for (i = 0; i < pmb_nr; i++) {
struct moved_entry *prev = pmb[i];
struct moved_entry *cur = (prev && prev->next_line) ?
prev->next_line : NULL;
if (cur && !hm->cmpfn(o, cur, match, NULL)) {
pmb[i] = cur;
} else {
pmb[i] = NULL;
}
}
}
static int shrink_potential_moved_blocks(struct moved_entry **pmb,
int pmb_nr)
{
@ -875,7 +894,6 @@ static void mark_color_as_moved(struct diff_options *o,
struct moved_entry *key;
struct moved_entry *match = NULL;
struct emitted_diff_symbol *l = &o->emitted_symbols->buf[n];
int i;
switch (l->s) {
case DIFF_SYMBOL_PLUS:
@ -906,17 +924,7 @@ static void mark_color_as_moved(struct diff_options *o,
if (o->color_moved == COLOR_MOVED_PLAIN)
continue;
/* Check any potential block runs, advance each or nullify */
for (i = 0; i < pmb_nr; i++) {
struct moved_entry *p = pmb[i];
struct moved_entry *pnext = (p && p->next_line) ?
p->next_line : NULL;
if (pnext && !hm->cmpfn(o, pnext, match, NULL)) {
pmb[i] = p->next_line;
} else {
pmb[i] = NULL;
}
}
pmb_advance_or_null(o, match, hm, pmb, pmb_nr);
pmb_nr = shrink_potential_moved_blocks(pmb, pmb_nr);