This is cleaner and keeps the rather large function
that performs the move detection smaller.

Signed-off-by: Stefan Beller <sbel...@google.com>
---
 diff.c | 50 +++++++++++++++++++++++++++++---------------------
 1 file changed, 29 insertions(+), 21 deletions(-)

diff --git a/diff.c b/diff.c
index 82ace48c38..5311dcf133 100644
--- a/diff.c
+++ b/diff.c
@@ -808,6 +808,33 @@ static void add_lines_to_move_detection(struct 
diff_options *o,
        }
 }
 
+static int shrink_potential_moved_blocks(struct moved_entry **pmb,
+                                        int pmb_nr)
+{
+       int lp, rp;
+
+       /* Shrink the set of potential block to the remaining running */
+       for (lp = 0, rp = pmb_nr - 1; lp <= rp;) {
+               while (lp < pmb_nr && pmb[lp])
+                       lp++;
+               /* lp points at the first NULL now */
+
+               while (rp > -1 && !pmb[rp])
+                       rp--;
+               /* rp points at the last non-NULL */
+
+               if (lp < pmb_nr && rp > -1 && lp < rp) {
+                       pmb[lp] = pmb[rp];
+                       pmb[rp] = NULL;
+                       rp--;
+                       lp++;
+               }
+       }
+
+       /* Remember the number of running sets */
+       return rp + 1;
+}
+
 /* Find blocks of moved code, delegate actual coloring decision to helper */
 static void mark_color_as_moved(struct diff_options *o,
                                struct hashmap *add_lines,
@@ -822,7 +849,7 @@ 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, lp, rp;
+               int i;
 
                switch (l->s) {
                case DIFF_SYMBOL_PLUS:
@@ -864,26 +891,7 @@ static void mark_color_as_moved(struct diff_options *o,
                        }
                }
 
-               /* Shrink the set of potential block to the remaining running */
-               for (lp = 0, rp = pmb_nr - 1; lp <= rp;) {
-                       while (lp < pmb_nr && pmb[lp])
-                               lp++;
-                       /* lp points at the first NULL now */
-
-                       while (rp > -1 && !pmb[rp])
-                               rp--;
-                       /* rp points at the last non-NULL */
-
-                       if (lp < pmb_nr && rp > -1 && lp < rp) {
-                               pmb[lp] = pmb[rp];
-                               pmb[rp] = NULL;
-                               rp--;
-                               lp++;
-                       }
-               }
-
-               /* Remember the number of running sets */
-               pmb_nr = rp + 1;
+               pmb_nr = shrink_potential_moved_blocks(pmb, pmb_nr);
 
                if (pmb_nr == 0) {
                        /*
-- 
2.13.0.31.g9b732c453e

Reply via email to