Merge branch 'il/archive-err-signal'
[gitweb.git] / xdiff / xhistogram.c
index 391333a1a44892547be93d71cad59a7505e86e78..18f6f997c321b5ac1f4d4211a4d448dc8542c22f 100644 (file)
@@ -102,7 +102,7 @@ static int cmp_recs(xpparam_t const *xpp,
        (cmp_recs(xpp, REC(env, s1, l1), REC(env, s2, l2)))
 
 #define CMP(i, s1, l1, s2, l2) \
-       (CMP_ENV(i->xpp, i->env, s1, l1, s2, l2))
+       (cmp_recs(i->xpp, REC(i->env, s1, l1), REC(i->env, s2, l2)))
 
 #define TABLE_HASH(index, side, line) \
        XDL_HASHLONG((REC(index->env, side, line))->ha, index->table_bits)
@@ -248,23 +248,6 @@ static int find_lcs(struct histindex *index, struct region *lcs,
        return index->has_common && index->max_chain_length < index->cnt;
 }
 
-static void reduce_common_start_end(xpparam_t const *xpp, xdfenv_t *env,
-       int *line1, int *count1, int *line2, int *count2)
-{
-       if (*count1 <= 1 || *count2 <= 1)
-               return;
-       while (*count1 > 1 && *count2 > 1 && CMP_ENV(xpp, env, 1, *line1, 2, *line2)) {
-               (*line1)++;
-               (*count1)--;
-               (*line2)++;
-               (*count2)--;
-       }
-       while (*count1 > 1 && *count2 > 1 && CMP_ENV(xpp, env, 1, LINE_END_PTR(1), 2, LINE_END_PTR(2))) {
-               (*count1)--;
-               (*count2)--;
-       }
-}
-
 static int fall_back_to_classic_diff(struct histindex *index,
                int line1, int count1, int line2, int count2)
 {
@@ -339,21 +322,23 @@ static int histogram_diff(xpparam_t const *xpp, xdfenv_t *env,
        if (find_lcs(&index, &lcs, line1, count1, line2, count2))
                result = fall_back_to_classic_diff(&index, line1, count1, line2, count2);
        else {
-               result = 0;
                if (lcs.begin1 == 0 && lcs.begin2 == 0) {
-                       int ptr;
-                       for (ptr = 0; ptr < count1; ptr++)
-                               env->xdf1.rchg[line1 + ptr - 1] = 1;
-                       for (ptr = 0; ptr < count2; ptr++)
-                               env->xdf2.rchg[line2 + ptr - 1] = 1;
+                       while (count1--)
+                               env->xdf1.rchg[line1++ - 1] = 1;
+                       while (count2--)
+                               env->xdf2.rchg[line2++ - 1] = 1;
+                       result = 0;
                } else {
                        result = histogram_diff(xpp, env,
-                               line1, lcs.begin1 - line1,
-                               line2, lcs.begin2 - line2);
+                                               line1, lcs.begin1 - line1,
+                                               line2, lcs.begin2 - line2);
+                       if (result)
+                               goto cleanup;
                        result = histogram_diff(xpp, env,
-                               lcs.end1 + 1, LINE_END(1) - lcs.end1,
-                               lcs.end2 + 1, LINE_END(2) - lcs.end2);
-                       result *= -1;
+                                               lcs.end1 + 1, LINE_END(1) - lcs.end1,
+                                               lcs.end2 + 1, LINE_END(2) - lcs.end2);
+                       if (result)
+                               goto cleanup;
                }
        }
 
@@ -369,16 +354,10 @@ static int histogram_diff(xpparam_t const *xpp, xdfenv_t *env,
 int xdl_do_histogram_diff(mmfile_t *file1, mmfile_t *file2,
        xpparam_t const *xpp, xdfenv_t *env)
 {
-       int line1, line2, count1, count2;
-
        if (xdl_prepare_env(file1, file2, xpp, env) < 0)
                return -1;
 
-       line1 = line2 = 1;
-       count1 = env->xdf1.nrec;
-       count2 = env->xdf2.nrec;
-
-       reduce_common_start_end(xpp, env, &line1, &count1, &line2, &count2);
-
-       return histogram_diff(xpp, env, line1, count1, line2, count2);
+       return histogram_diff(xpp, env,
+               env->xdf1.dstart + 1, env->xdf1.dend - env->xdf1.dstart + 1,
+               env->xdf2.dstart + 1, env->xdf2.dend - env->xdf2.dstart + 1);
 }