git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 4/8] xdiff/xpatience: factor out fall-back-diff function

From
Tay Ray Chuan <rctay89@gmail.com>
Date
Aug 1, 2011, 03:16 UTC
Message-ID
<1312168608-10828-5-git-send-email-rctay89@gmail.com>
In-Reply-To
<1312168608-10828-4-git-send-email-rctay89@gmail.com>

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>
---
 xdiff/xpatience.c |   27 ++-------------------------
 xdiff/xutils.c    |   31 +++++++++++++++++++++++++++++++
 xdiff/xutils.h    |    2 ++
 3 files changed, 35 insertions(+), 25 deletions(-)
diff --git a/xdiff/xpatience.c b/xdiff/xpatience.c
index e42c16a..fdd7d02 100644
--- a/xdiff/xpatience.c
+++ b/xdiff/xpatience.c
@@ -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);
 }
 
 /*
diff --git a/xdiff/xutils.c b/xdiff/xutils.c
index ea1357d..890cc4f 100644
--- a/xdiff/xutils.c
+++ b/xdiff/xutils.c
@@ -390,3 +390,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;
+}
diff --git a/xdiff/xutils.h b/xdiff/xutils.h
index d5de829..674a657 100644
--- a/xdiff/xutils.h
+++ b/xdiff/xutils.h
@@ -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);
 
 
 
-- 
1.7.3.4.730.g67af1.dirty
Previous: Tay Ray ChuanNext: Tay Ray Chuan
Message 15 of 24 in “teach --histogram to diff”
  1. 0/3 teach --histogram to diffTay Ray Chuan, Jul 12, 2011
  2. 1/3 teach --histogram to diffTay Ray Chuan, Jul 12, 2011
  3. 2/3 xdiff/xprepare: skip classificationTay Ray Chuan, Jul 12, 2011
  4. 3/3 xdiff/xprepare: use a smaller sample size for histogram diffTay Ray Chuan, Jul 12, 2011
  5. Junio C HamanoJul 12, 2011
  6. Tay Ray ChuanJul 13, 2011
  7. Shawn PearceJul 12, 2011
  8. Junio C HamanoJul 12, 2011
  9. Tay Ray ChuanJul 13, 2011
  10. Tay Ray ChuanJul 13, 2011
  11. 0/8 teach --histogram to diffTay Ray Chuan, Aug 1, 2011
  12. 1/8 xdiff/xprepare: use memset()Tay Ray Chuan, Aug 1, 2011
  13. 2/8 do away with xdl_mmfile_next()Tay Ray Chuan, Aug 1, 2011
  14. 3/8 xdiff/xprepare: refactor abort cleanupsTay Ray Chuan, Aug 1, 2011
  15. 4/8 xdiff/xpatience: factor out fall-back-diff functionTay Ray Chuan, Aug 1, 2011
  16. 5/8 t4033-diff-patience: factor out testsTay Ray Chuan, Aug 1, 2011
  17. 6/8 teach --histogram to diffTay Ray Chuan, Aug 1, 2011
  18. 7/8 xdiff/xprepare: skip classificationTay Ray Chuan, Aug 1, 2011
  19. 8/8 xdiff/xprepare: use a smaller sample size for histogram diffTay Ray Chuan, Aug 1, 2011
  20. 0/4 changes for rc/histogram-diff in 'next'Tay Ray Chuan, Aug 1, 2011
  21. 1/4 xdiff: do away with xdl_mmfile_next()Tay Ray Chuan, Aug 1, 2011
  22. 2/4 xdiff/xhistogram: rework handling of recursed resultsTay Ray Chuan, Aug 1, 2011
  23. 3/4 xdiff/xhistogram: rely on xdl_trim_ends()Tay Ray Chuan, Aug 1, 2011
  24. 4/4 xdiff/xhistogram: drop need for additional variableTay Ray Chuan, Aug 1, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.