Write things out a bit longer but less cryptically. Add more comments.

Signed-off-by: Michael Haggerty <mhag...@alum.mit.edu>
---
I find the loops in the old code, with unfamiliar patterns of embedded
increment/decrement operators, confusing, and I think that writing
things out a little bit more verbosely (and with more comments) makes
it much easier to read the code and be sure that it is correct.
The compiled code and performance shouldn't be affected materially.

 xdiff/xdiffi.c | 106 +++++++++++++++++++++++++++++++++++++++------------------
 1 file changed, 73 insertions(+), 33 deletions(-)

diff --git a/xdiff/xdiffi.c b/xdiff/xdiffi.c
index ff7fc42..a0a485c 100644
--- a/xdiff/xdiffi.c
+++ b/xdiff/xdiffi.c
@@ -434,8 +434,14 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long 
flags) {
                 * not need index bounding since the array is prepared with
                 * a zero at position -1 and N.
                 */
-               for (; i < nrec && !rchg[i]; i++)
-                       while (rchgo[io++]);
+               for (; i < nrec && !rchg[i]; i++) {
+                       /* skip over any changed lines in the other file... */
+                       while (rchgo[io])
+                               io++;
+
+                       /* ...plus one non-changed line. */
+                       io++;
+               }
                if (i == nrec)
                        break;
 
@@ -444,45 +450,70 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, 
long flags) {
                 * and find the end of it, on both to-be-compacted and other 
file
                 * indexes (i and io).
                 */
-               start = i;
-               for (i++; rchg[i]; i++);
-               for (; rchgo[io]; io++);
+               start = i++;
+
+               while (rchg[i])
+                       i++;
+
+               while (rchgo[io])
+                      io++;
 
                do {
                        groupsize = i - start;
+
+                       /*
+                        * Are there any blank lines that could appear as the 
last
+                        * line of this group?
+                        */
                        blank_lines = 0;
 
                        /*
-                        * If the line before the current change group, is 
equal to
-                        * the last line of the current change group, shift 
backward
-                        * the group.
+                        * While the line before the current change group is 
equal
+                        * to the last line of the current change group, shift 
the
+                        * group backward.
                         */
                        while (start > 0 && recs_match(recs, start - 1, i - 1, 
flags)) {
                                rchg[--start] = 1;
                                rchg[--i] = 0;
 
                                /*
-                                * This change might have joined two change 
groups,
-                                * so we try to take this scenario in account 
by moving
-                                * the start index accordingly (and so the 
other-file
-                                * end-of-group index).
+                                * This change might have joined two change 
groups.
+                                * If so, move the start index to the beginning 
of
+                                * the combined group:
                                 */
-                               for (; rchg[start - 1]; start--);
-                               while (rchgo[--io]);
+                               while (rchg[start - 1])
+                                       start--;
+
+                               /*
+                                * Move the other file index past a non-changed
+                                * line...
+                                */
+                               io--;
+
+                               /* ...and also past any changed lines: */
+                               while (rchgo[io])
+                                       io--;
                        }
 
-                       /*
-                        * Record the end-of-group position in case we are 
matched
-                        * with a group of changes in the other file (that is, 
the
-                        * change record before the end-of-group index in the 
other
-                        * file is set).
-                        */
-                       ixref = rchgo[io - 1] ? i : nrec;
+                       if (rchgo[io - 1]) {
+                               /*
+                                * This change is matched to a group of changes 
in
+                                * the other file. Record the end-of-group
+                                * position:
+                                */
+                               ixref = i;
+                       } else {
+                               /*
+                                * Otherwise, set a value to signify that there
+                                * are no matched changes in the other file:
+                                */
+                               ixref = nrec;
+                       }
 
                        /*
-                        * If the first line of the current change group, is 
equal to
-                        * the line next of the current change group, shift 
forward
-                        * the group.
+                        * Now shift the group forward as long as the first line
+                        * of the current change group is equal to the line 
after
+                        * the current change group.
                         */
                        while (i < nrec && recs_match(recs, start, i, flags)) {
                                blank_lines += is_blank_line(recs, i, flags);
@@ -491,16 +522,22 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, 
long flags) {
                                rchg[i++] = 1;
 
                                /*
-                                * This change might have joined two change 
groups,
-                                * so we try to take this scenario in account 
by moving
-                                * the start index accordingly (and so the 
other-file
-                                * end-of-group index). Keep tracking the 
reference
-                                * index in case we are shifting together with a
-                                * corresponding group of changes in the other 
file.
+                                * This change might have joined two change
+                                * groups. If so, move the start index 
accordingly
+                                * (and so the other-file end-of-group index).
+                                * Keep tracking the reference index in case we
+                                * are shifting together with a corresponding
+                                * group of changes in the other file.
                                 */
-                               for (; rchg[i]; i++);
-                               while (rchgo[++io])
+                               while (rchg[i])
+                                       i++;
+
+                               io++;
+                               if (rchgo[io]) {
                                        ixref = i;
+                                       while (rchgo[io])
+                                               io++;
+                               }
                        }
                } while (groupsize != i - start);
 
@@ -511,7 +548,10 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long 
flags) {
                while (ixref < i) {
                        rchg[--start] = 1;
                        rchg[--i] = 0;
-                       while (rchgo[--io]);
+
+                       io--;
+                       while (rchgo[io])
+                               io--;
                }
 
                /*
-- 
2.8.1

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to