xdiff/xpatience: factor out fall-back-diff function
authorTay Ray Chuan <rctay89@gmail.com>
Thu, 7 Jul 2011 04:23:57 +0000 (12:23 +0800)
committerJunio C Hamano <gitster@pobox.com>
Thu, 7 Jul 2011 16:41:24 +0000 (09:41 -0700)
This is in preparation for the histogram diff algorithm, which will also
re-use much of the code to call the default Meyers diff algorithm.

Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
xdiff/xpatience.c
xdiff/xutils.c
xdiff/xutils.h

index e42c16a807609b967c6a807a99d4ecbe2e1e0af8..fdd7d0263f576a8dc1a8e791ef50f8dbe25c7ee5 100644 (file)
@@ -287,34 +287,11 @@ static int walk_common_sequence(struct hashmap *map, struct entry *first,
 static int fall_back_to_classic_diff(struct hashmap *map,
                int line1, int count1, int line2, int count2)
 {
-       /*
-        * This probably does not work outside Git, since
-        * we have a very simple mmfile structure.
-        *
-        * Note: ideally, we would reuse the prepared environment, but
-        * the libxdiff interface does not (yet) allow for diffing only
-        * ranges of lines instead of the whole files.
-        */
-       mmfile_t subfile1, subfile2;
        xpparam_t xpp;
-       xdfenv_t env;
-
-       subfile1.ptr = (char *)map->env->xdf1.recs[line1 - 1]->ptr;
-       subfile1.size = map->env->xdf1.recs[line1 + count1 - 2]->ptr +
-               map->env->xdf1.recs[line1 + count1 - 2]->size - subfile1.ptr;
-       subfile2.ptr = (char *)map->env->xdf2.recs[line2 - 1]->ptr;
-       subfile2.size = map->env->xdf2.recs[line2 + count2 - 2]->ptr +
-               map->env->xdf2.recs[line2 + count2 - 2]->size - subfile2.ptr;
        xpp.flags = map->xpp->flags & ~XDF_PATIENCE_DIFF;
-       if (xdl_do_diff(&subfile1, &subfile2, &xpp, &env) < 0)
-               return -1;
 
-       memcpy(map->env->xdf1.rchg + line1 - 1, env.xdf1.rchg, count1);
-       memcpy(map->env->xdf2.rchg + line2 - 1, env.xdf2.rchg, count2);
-
-       xdl_free_env(&env);
-
-       return 0;
+       return xdl_fall_back_diff(map->env, &xpp,
+                                 line1, count1, line2, count2);
 }
 
 /*
index ab6503460f760356a393a3c7b3b8438213e1ee94..ded7c327dc3bbc5b5f6dc92e8b1b751671450520 100644 (file)
@@ -402,3 +402,34 @@ int xdl_emit_hunk_hdr(long s1, long c1, long s2, long c2,
 
        return 0;
 }
+
+int xdl_fall_back_diff(xdfenv_t *diff_env, xpparam_t const *xpp,
+               int line1, int count1, int line2, int count2)
+{
+       /*
+        * This probably does not work outside Git, since
+        * we have a very simple mmfile structure.
+        *
+        * Note: ideally, we would reuse the prepared environment, but
+        * the libxdiff interface does not (yet) allow for diffing only
+        * ranges of lines instead of the whole files.
+        */
+       mmfile_t subfile1, subfile2;
+       xdfenv_t env;
+
+       subfile1.ptr = (char *)diff_env->xdf1.recs[line1 - 1]->ptr;
+       subfile1.size = diff_env->xdf1.recs[line1 + count1 - 2]->ptr +
+               diff_env->xdf1.recs[line1 + count1 - 2]->size - subfile1.ptr;
+       subfile2.ptr = (char *)diff_env->xdf2.recs[line2 - 1]->ptr;
+       subfile2.size = diff_env->xdf2.recs[line2 + count2 - 2]->ptr +
+               diff_env->xdf2.recs[line2 + count2 - 2]->size - subfile2.ptr;
+       if (xdl_do_diff(&subfile1, &subfile2, xpp, &env) < 0)
+               return -1;
+
+       memcpy(diff_env->xdf1.rchg + line1 - 1, env.xdf1.rchg, count1);
+       memcpy(diff_env->xdf2.rchg + line2 - 1, env.xdf2.rchg, count2);
+
+       xdl_free_env(&env);
+
+       return 0;
+}
index d5de8292e05e7c36c4b68857c1cf9855e3d2f70a..674a657b08e7ee76ba743387dcd7d455e56d9bdc 100644 (file)
@@ -41,6 +41,8 @@ int xdl_num_out(char *out, long val);
 long xdl_atol(char const *str, char const **next);
 int xdl_emit_hunk_hdr(long s1, long c1, long s2, long c2,
                      const char *func, long funclen, xdemitcb_t *ecb);
+int xdl_fall_back_diff(xdfenv_t *diff_env, xpparam_t const *xpp,
+                      int line1, int count1, int line2, int count2);