Write things out a bit longer but less cryptically. Add more comments.
Signed-off-by: Michael Haggerty <[email protected]>
---
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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html