Skip to content

Commit 6aac706

Browse files
ychinchrisbra
authored andcommitted
patch 9.1.1921: xdiff: included xdiff code is outdated
Problem: xdiff: included xdiff code is outdated because it is based on git 2.40.0 Solution: Sync with xdiff from git 2.52 (Yee Cheng Chin). Git [v2.52](https://github.com/git/git/releases/tag/v2.52.0) has just been released. Merge from upstream to get the latest version of xdiff. Vim's xdiff was last updated in #12181 (Patch v9.0.1418) from Git v2.33 to v2.40. I have refined the strategy for merging from upstream a bit compared to last time. I use the following commands to create an orphaned branch that extracts the before/after xdiff source code from the Git codebase, and then perform a subtree merge. The commits in the orphaned branch are reproducible deterministically so a reviewer can reproduce the steps and it should result in identical commit hashes (63264f229d and d741f0e230). The commands are as follows (you could run in a separate Vim repo to keep things clean): ```bash git remote add --no-tags git https://github.com/git/git.git git fetch git git switch --orphan xdiff-orig git read-tree --reset -u 73876f4861:xdiff/ # Git v2.40.0 git rm -f xmerge.c # Vim doesn't use xmerge (GIT_COMMITTER_NAME="dummy" GIT_COMMITTER_EMAIL="dummy" GIT_COMMITTER_DATE="1600000000 +0000" \ git commit --no-gpg-sign --reuse-message=73876f4861) git switch -c xdiff-new git read-tree --reset -u 9a2fb147f2:xdiff/ # Git v2.52.0 git rm -f xmerge.c (GIT_COMMITTER_NAME="dummy" GIT_COMMITTER_EMAIL="dummy" GIT_COMMITTER_DATE="1600000000 +0000" \ git commit --no-gpg-sign --reuse-message=9a2fb147f2) git switch master git switch -c xdiff-upstream-v2.52.0 git merge -s ours --no-edit --allow-unrelated-histories xdiff-orig git merge -Xsubtree=xdiff xdiff-new ``` The commit graph looks like so: ``` * a005e268bd 2025-11-17 17:11:26 Yee Cheng Chin (HEAD -> xdiff-upstream-v2.52.0) Update xdiff README * d353c6f2c8 2025-11-17 16:26:15 Yee Cheng Chin Merge branch 'xdiff-new' into xdiff-upstream-v2.52.0 |\ | * d741f0e230 2025-11-17 07:35:33 Junio C Hamano (xdiff-new) Git 2.52 * | c4f8b15dd9 2025-11-17 16:22:30 Yee Cheng Chin Merge branch 'xdiff-orig' into xdiff-upstream-v2.52.0 |\| | * 63264f229d 2023-03-12 14:34:41 Junio C Hamano (xdiff-orig) Git 2.40 * 6437997 2025-11-16 18:30:42 Girish Palya (tag: v9.1.1918, origin/master, origin/HEAD, master) patch 9.1.1918: completion: crash with fuzzy completion ``` For reviewing I recommend using the following commands which simplifies the diff to only what we care about: - `git show --remerge-diff d353c6f2c8`: This shows how my merge actually resolved the merge conflicts. - `vimdiff <(git diff-tree -U0 63264f229d master:src/xdiff/) \ <(git diff-tree -U0 d741f0e230 xdiff-upstream-v2.52.0:src/xdiff) \ -c "silent windo %s/^index.*/index/" \ -c "silent windo %s/^@@ [-+, 0-9]* @@/@@/"`: This shows how the patch (downstream changes done in Vim on top of Git) has changed. Note that some local changes for fixing compiler warnings are now gone because they are fixed upstream. - git/git@d39e28e added a dependency (`signed_add_overflows`) to Git code base. I replaced it with a custom one since it's not hard to implement. - Upstream had fixed a lot of compiler warnings with signed/unsigned integers, so the compiler warning fixes that were done in Vim downstream were removed. - Replace new `BUG()` calls with `xdl_bug()` where we use Vim's assertion mechanisms instead. - Performance improvement due to optimizations in the line hashing function (git/git@41d9783 and git/git@a4bbe8a). - From personal unscientific testing (Apple M1 Max, macOS 15), when using the new xdiff, for simple/normal diff's this could result in **11%/29%** overall diff speed improvement. For larger more pathologically complicated diff this results in a more modest **4%/7%** improvement. - The two improvement numbers above are for compiling Vim with `-O3 -flto` vs `-O2`. The more optimized version of Vim results in lower performance improvement as it was already doing inlining via link-time-optimization before. - Just for reference, the command I used to test this was the following (use either test case and comment out the other one): ```bash # Simple/normal diff test case (COMMIT=0d9160e11ce; git show ${COMMIT}:src/diff.c > test1.txt; git show ${COMMIT}~:src/diff.c > test2.txt) # Larger diff test case (COMMIT=9670f61d468; git show ${COMMIT}:src/auto/configure > test1.txt; git show ${COMMIT}~:src/auto/configure > test2.txt) # Build Vim with old/new xdiff, then copy ./src/vim to ./src/vim_orig / ./src/vim_new respectively. hyperfine --warmup 4 --runs 20 -L vimcmd vim_orig,vim_new \ "./src/{vimcmd} -u NONE -U NONE -es -V1 -c \"let g:f1=readfile('test1.txt')\" -c \"let g:f2=readfile('test2.txt')\" -c \"for i in range(1,200) | call diff(g:f1, g:f2) | endfor\" -c 'q'" ``` closes: #18765 Signed-off-by: Yee Cheng Chin <[email protected]> Signed-off-by: Christian Brabandt <[email protected]>
1 parent eb33c2e commit 6aac706

File tree

13 files changed

+353
-342
lines changed

13 files changed

+353
-342
lines changed

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -729,6 +729,8 @@ static char *(features[]) =
729729

730730
static int included_patches[] =
731731
{ /* Add new patch number below this line */
732+
/**/
733+
1921,
732734
/**/
733735
1920,
734736
/**/

src/xdiff/README.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
The files in this directory come from the xdiff implementation in git.
22
You can find it here: https://github.com/git/git/tree/master/xdiff
3-
The files were last updated March 17, 2023 from git release v.2.40.0
3+
The files were last updated November 17, 2025 from git release v.2.52.0
44

55
This is originally based on libxdiff, which can be found here:
66
http://www.xmailserver.org/xdiff-lib.html
@@ -11,7 +11,8 @@ And since it's part of git it is expected to be reliable.
1111
The code is distributed under the GNU LGPL license. It is included in the
1212
COPYING file.
1313

14-
Changes in these files were made to avoid compiler warnings.
14+
Changes in these files were made to avoid compiler warnings, replacing function
15+
calls into Git core with Vim ones, and removing unused code such as xmerge.
1516

1617
The /* */ comments are kept to make syncing to a newer version easier, do not
1718
change them to // comments!

src/xdiff/xdiff.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ typedef struct s_xpparam {
8787
size_t ignore_regex_nr;
8888
#endif
8989

90-
/* See Documentation/diff-options.txt. */
90+
/* See Documentation/diff-options.adoc. */
9191
char **anchors;
9292
size_t anchors_nr;
9393
} xpparam_t;

src/xdiff/xdiffi.c

Lines changed: 55 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@
2222

2323
#include "xinclude.h"
2424

25+
static unsigned long get_hash(xdfile_t *xdf, long index)
26+
{
27+
return xdf->recs[xdf->rindex[index]].ha;
28+
}
29+
2530
#define XDL_MAX_COST_MIN 256
2631
#define XDL_HEUR_MIN_COST 256
2732
#define XDL_LINE_MAX (long)((1UL << (CHAR_BIT * sizeof(long) - 1)) - 1)
@@ -42,8 +47,8 @@ typedef struct s_xdpsplit {
4247
* using this algorithm, so a little bit of heuristic is needed to cut the
4348
* search and to return a suboptimal point.
4449
*/
45-
static long xdl_split(unsigned long const *ha1, long off1, long lim1,
46-
unsigned long const *ha2, long off2, long lim2,
50+
static long xdl_split(xdfile_t *xdf1, long off1, long lim1,
51+
xdfile_t *xdf2, long off2, long lim2,
4752
long *kvdf, long *kvdb, int need_min, xdpsplit_t *spl,
4853
xdalgoenv_t *xenv) {
4954
long dmin = off1 - lim2, dmax = lim1 - off2;
@@ -87,7 +92,7 @@ static long xdl_split(unsigned long const *ha1, long off1, long lim1,
8792
i1 = kvdf[d + 1];
8893
prev1 = i1;
8994
i2 = i1 - d;
90-
for (; i1 < lim1 && i2 < lim2 && ha1[i1] == ha2[i2]; i1++, i2++);
95+
for (; i1 < lim1 && i2 < lim2 && get_hash(xdf1, i1) == get_hash(xdf2, i2); i1++, i2++);
9196
if (i1 - prev1 > xenv->snake_cnt)
9297
got_snake = 1;
9398
kvdf[d] = i1;
@@ -124,7 +129,7 @@ static long xdl_split(unsigned long const *ha1, long off1, long lim1,
124129
i1 = kvdb[d + 1] - 1;
125130
prev1 = i1;
126131
i2 = i1 - d;
127-
for (; i1 > off1 && i2 > off2 && ha1[i1 - 1] == ha2[i2 - 1]; i1--, i2--);
132+
for (; i1 > off1 && i2 > off2 && get_hash(xdf1, i1 - 1) == get_hash(xdf2, i2 - 1); i1--, i2--);
128133
if (prev1 - i1 > xenv->snake_cnt)
129134
got_snake = 1;
130135
kvdb[d] = i1;
@@ -159,7 +164,7 @@ static long xdl_split(unsigned long const *ha1, long off1, long lim1,
159164
if (v > XDL_K_HEUR * ec && v > best &&
160165
off1 + xenv->snake_cnt <= i1 && i1 < lim1 &&
161166
off2 + xenv->snake_cnt <= i2 && i2 < lim2) {
162-
for (k = 1; ha1[i1 - k] == ha2[i2 - k]; k++)
167+
for (k = 1; get_hash(xdf1, i1 - k) == get_hash(xdf2, i2 - k); k++)
163168
if (k == xenv->snake_cnt) {
164169
best = v;
165170
spl->i1 = i1;
@@ -183,7 +188,7 @@ static long xdl_split(unsigned long const *ha1, long off1, long lim1,
183188
if (v > XDL_K_HEUR * ec && v > best &&
184189
off1 < i1 && i1 <= lim1 - xenv->snake_cnt &&
185190
off2 < i2 && i2 <= lim2 - xenv->snake_cnt) {
186-
for (k = 0; ha1[i1 + k] == ha2[i2 + k]; k++)
191+
for (k = 0; get_hash(xdf1, i1 + k) == get_hash(xdf2, i2 + k); k++)
187192
if (k == xenv->snake_cnt - 1) {
188193
best = v;
189194
spl->i1 = i1;
@@ -211,8 +216,10 @@ static long xdl_split(unsigned long const *ha1, long off1, long lim1,
211216
for (d = fmax; d >= fmin; d -= 2) {
212217
i1 = XDL_MIN(kvdf[d], lim1);
213218
i2 = i1 - d;
214-
if (lim2 < i2)
215-
i1 = lim2 + d, i2 = lim2;
219+
if (lim2 < i2) {
220+
i1 = lim2 + d;
221+
i2 = lim2;
222+
}
216223
if (fbest < i1 + i2) {
217224
fbest = i1 + i2;
218225
fbest1 = i1;
@@ -223,8 +230,10 @@ static long xdl_split(unsigned long const *ha1, long off1, long lim1,
223230
for (d = bmax; d >= bmin; d -= 2) {
224231
i1 = XDL_MAX(off1, kvdb[d]);
225232
i2 = i1 - d;
226-
if (i2 < off2)
227-
i1 = off2 + d, i2 = off2;
233+
if (i2 < off2) {
234+
i1 = off2 + d;
235+
i2 = off2;
236+
}
228237
if (i1 + i2 < bbest) {
229238
bbest = i1 + i2;
230239
bbest1 = i1;
@@ -253,41 +262,34 @@ static long xdl_split(unsigned long const *ha1, long off1, long lim1,
253262
* sub-boxes by calling the box splitting function. Note that the real job
254263
* (marking changed lines) is done in the two boundary reaching checks.
255264
*/
256-
int xdl_recs_cmp(diffdata_t *dd1, long off1, long lim1,
257-
diffdata_t *dd2, long off2, long lim2,
265+
int xdl_recs_cmp(xdfile_t *xdf1, long off1, long lim1,
266+
xdfile_t *xdf2, long off2, long lim2,
258267
long *kvdf, long *kvdb, int need_min, xdalgoenv_t *xenv) {
259-
unsigned long const *ha1 = dd1->ha, *ha2 = dd2->ha;
260268

261269
/*
262270
* Shrink the box by walking through each diagonal snake (SW and NE).
263271
*/
264-
for (; off1 < lim1 && off2 < lim2 && ha1[off1] == ha2[off2]; off1++, off2++);
265-
for (; off1 < lim1 && off2 < lim2 && ha1[lim1 - 1] == ha2[lim2 - 1]; lim1--, lim2--);
272+
for (; off1 < lim1 && off2 < lim2 && get_hash(xdf1, off1) == get_hash(xdf2, off2); off1++, off2++);
273+
for (; off1 < lim1 && off2 < lim2 && get_hash(xdf1, lim1 - 1) == get_hash(xdf2, lim2 - 1); lim1--, lim2--);
266274

267275
/*
268276
* If one dimension is empty, then all records on the other one must
269277
* be obviously changed.
270278
*/
271279
if (off1 == lim1) {
272-
char *rchg2 = dd2->rchg;
273-
long *rindex2 = dd2->rindex;
274-
275280
for (; off2 < lim2; off2++)
276-
rchg2[rindex2[off2]] = 1;
281+
xdf2->changed[xdf2->rindex[off2]] = true;
277282
} else if (off2 == lim2) {
278-
char *rchg1 = dd1->rchg;
279-
long *rindex1 = dd1->rindex;
280-
281283
for (; off1 < lim1; off1++)
282-
rchg1[rindex1[off1]] = 1;
284+
xdf1->changed[xdf1->rindex[off1]] = true;
283285
} else {
284286
xdpsplit_t spl;
285287
spl.i1 = spl.i2 = 0;
286288

287289
/*
288290
* Divide ...
289291
*/
290-
if (xdl_split(ha1, off1, lim1, ha2, off2, lim2, kvdf, kvdb,
292+
if (xdl_split(xdf1, off1, lim1, xdf2, off2, lim2, kvdf, kvdb,
291293
need_min, &spl, xenv) < 0) {
292294

293295
return -1;
@@ -296,9 +298,9 @@ int xdl_recs_cmp(diffdata_t *dd1, long off1, long lim1,
296298
/*
297299
* ... et Impera.
298300
*/
299-
if (xdl_recs_cmp(dd1, off1, spl.i1, dd2, off2, spl.i2,
301+
if (xdl_recs_cmp(xdf1, off1, spl.i1, xdf2, off2, spl.i2,
300302
kvdf, kvdb, spl.min_lo, xenv) < 0 ||
301-
xdl_recs_cmp(dd1, spl.i1, lim1, dd2, spl.i2, lim2,
303+
xdl_recs_cmp(xdf1, spl.i1, lim1, xdf2, spl.i2, lim2,
302304
kvdf, kvdb, spl.min_hi, xenv) < 0) {
303305

304306
return -1;
@@ -314,7 +316,6 @@ int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
314316
long ndiags;
315317
long *kvd, *kvdf, *kvdb;
316318
xdalgoenv_t xenv;
317-
diffdata_t dd1, dd2;
318319
int res;
319320

320321
if (xdl_prepare_env(mf1, mf2, xpp, xe) < 0)
@@ -353,16 +354,7 @@ int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
353354
xenv.snake_cnt = XDL_SNAKE_CNT;
354355
xenv.heur_min = XDL_HEUR_MIN_COST;
355356

356-
dd1.nrec = xe->xdf1.nreff;
357-
dd1.ha = xe->xdf1.ha;
358-
dd1.rchg = xe->xdf1.rchg;
359-
dd1.rindex = xe->xdf1.rindex;
360-
dd2.nrec = xe->xdf2.nreff;
361-
dd2.ha = xe->xdf2.ha;
362-
dd2.rchg = xe->xdf2.rchg;
363-
dd2.rindex = xe->xdf2.rindex;
364-
365-
res = xdl_recs_cmp(&dd1, 0, dd1.nrec, &dd2, 0, dd2.nrec,
357+
res = xdl_recs_cmp(&xe->xdf1, 0, xe->xdf1.nreff, &xe->xdf2, 0, xe->xdf2.nreff,
366358
kvdf, kvdb, (xpp->flags & XDF_NEED_MINIMAL) != 0,
367359
&xenv);
368360
xdl_free(kvd);
@@ -497,13 +489,13 @@ static void measure_split(const xdfile_t *xdf, long split,
497489
m->indent = -1;
498490
} else {
499491
m->end_of_file = 0;
500-
m->indent = xget_indent(xdf->recs[split]);
492+
m->indent = xget_indent(&xdf->recs[split]);
501493
}
502494

503495
m->pre_blank = 0;
504496
m->pre_indent = -1;
505497
for (i = split - 1; i >= 0; i--) {
506-
m->pre_indent = xget_indent(xdf->recs[i]);
498+
m->pre_indent = xget_indent(&xdf->recs[i]);
507499
if (m->pre_indent != -1)
508500
break;
509501
m->pre_blank += 1;
@@ -516,7 +508,7 @@ static void measure_split(const xdfile_t *xdf, long split,
516508
m->post_blank = 0;
517509
m->post_indent = -1;
518510
for (i = split + 1; i < xdf->nrec; i++) {
519-
m->post_indent = xget_indent(xdf->recs[i]);
511+
m->post_indent = xget_indent(&xdf->recs[i]);
520512
if (m->post_indent != -1)
521513
break;
522514
m->post_blank += 1;
@@ -716,7 +708,7 @@ struct xdlgroup {
716708
static void group_init(xdfile_t *xdf, struct xdlgroup *g)
717709
{
718710
g->start = g->end = 0;
719-
while (xdf->rchg[g->end])
711+
while (xdf->changed[g->end])
720712
g->end++;
721713
}
722714

@@ -730,7 +722,7 @@ static inline int group_next(xdfile_t *xdf, struct xdlgroup *g)
730722
return -1;
731723

732724
g->start = g->end + 1;
733-
for (g->end = g->start; xdf->rchg[g->end]; g->end++)
725+
for (g->end = g->start; xdf->changed[g->end]; g->end++)
734726
;
735727

736728
return 0;
@@ -746,7 +738,7 @@ static inline int group_previous(xdfile_t *xdf, struct xdlgroup *g)
746738
return -1;
747739

748740
g->end = g->start - 1;
749-
for (g->start = g->end; xdf->rchg[g->start - 1]; g->start--)
741+
for (g->start = g->end; xdf->changed[g->start - 1]; g->start--)
750742
;
751743

752744
return 0;
@@ -760,11 +752,11 @@ static inline int group_previous(xdfile_t *xdf, struct xdlgroup *g)
760752
static int group_slide_down(xdfile_t *xdf, struct xdlgroup *g)
761753
{
762754
if (g->end < xdf->nrec &&
763-
recs_match(xdf->recs[g->start], xdf->recs[g->end])) {
764-
xdf->rchg[g->start++] = 0;
765-
xdf->rchg[g->end++] = 1;
755+
recs_match(&xdf->recs[g->start], &xdf->recs[g->end])) {
756+
xdf->changed[g->start++] = false;
757+
xdf->changed[g->end++] = true;
766758

767-
while (xdf->rchg[g->end])
759+
while (xdf->changed[g->end])
768760
g->end++;
769761

770762
return 0;
@@ -781,11 +773,11 @@ static int group_slide_down(xdfile_t *xdf, struct xdlgroup *g)
781773
static int group_slide_up(xdfile_t *xdf, struct xdlgroup *g)
782774
{
783775
if (g->start > 0 &&
784-
recs_match(xdf->recs[g->start - 1], xdf->recs[g->end - 1])) {
785-
xdf->rchg[--g->start] = 1;
786-
xdf->rchg[--g->end] = 0;
776+
recs_match(&xdf->recs[g->start - 1], &xdf->recs[g->end - 1])) {
777+
xdf->changed[--g->start] = true;
778+
xdf->changed[--g->end] = false;
787779

788-
while (xdf->rchg[g->start - 1])
780+
while (xdf->changed[g->start - 1])
789781
g->start--;
790782

791783
return 0;
@@ -794,7 +786,7 @@ static int group_slide_up(xdfile_t *xdf, struct xdlgroup *g)
794786
}
795787
}
796788

797-
static void xdl_bug(const char *msg)
789+
void xdl_bug(const char *msg)
798790
{
799791
fprintf(stderr, "BUG: %s\n", msg);
800792
exit(1);
@@ -946,16 +938,16 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
946938

947939
int xdl_build_script(xdfenv_t *xe, xdchange_t **xscr) {
948940
xdchange_t *cscr = NULL, *xch;
949-
char *rchg1 = xe->xdf1.rchg, *rchg2 = xe->xdf2.rchg;
941+
bool *changed1 = xe->xdf1.changed, *changed2 = xe->xdf2.changed;
950942
long i1, i2, l1, l2;
951943

952944
/*
953945
* Trivial. Collects "groups" of changes and creates an edit script.
954946
*/
955947
for (i1 = xe->xdf1.nrec, i2 = xe->xdf2.nrec; i1 >= 0 || i2 >= 0; i1--, i2--)
956-
if (rchg1[i1 - 1] || rchg2[i2 - 1]) {
957-
for (l1 = i1; rchg1[i1 - 1]; i1--);
958-
for (l2 = i2; rchg2[i2 - 1]; i2--);
948+
if (changed1[i1 - 1] || changed2[i2 - 1]) {
949+
for (l1 = i1; changed1[i1 - 1]; i1--);
950+
for (l2 = i2; changed2[i2 - 1]; i2--);
959951

960952
if (!(xch = xdl_add_change(cscr, i1, i2, l1 - i1, l2 - i2))) {
961953
xdl_free_script(cscr);
@@ -1002,16 +994,16 @@ static void xdl_mark_ignorable_lines(xdchange_t *xscr, xdfenv_t *xe, long flags)
1002994

1003995
for (xch = xscr; xch; xch = xch->next) {
1004996
int ignore = 1;
1005-
xrecord_t **rec;
997+
xrecord_t *rec;
1006998
long i;
1007999

10081000
rec = &xe->xdf1.recs[xch->i1];
10091001
for (i = 0; i < xch->chg1 && ignore; i++)
1010-
ignore = xdl_blankline(rec[i]->ptr, rec[i]->size, flags);
1002+
ignore = xdl_blankline(rec[i].ptr, rec[i].size, flags);
10111003

10121004
rec = &xe->xdf2.recs[xch->i2];
10131005
for (i = 0; i < xch->chg2 && ignore; i++)
1014-
ignore = xdl_blankline(rec[i]->ptr, rec[i]->size, flags);
1006+
ignore = xdl_blankline(rec[i].ptr, rec[i].size, flags);
10151007

10161008
xch->ignore = ignore;
10171009
}
@@ -1020,7 +1012,7 @@ static void xdl_mark_ignorable_lines(xdchange_t *xscr, xdfenv_t *xe, long flags)
10201012
#if 0 // unused by Vim
10211013
static int record_matches_regex(xrecord_t *rec, xpparam_t const *xpp) {
10221014
regmatch_t regmatch;
1023-
int i;
1015+
size_t i;
10241016

10251017
for (i = 0; i < xpp->ignore_regex_nr; i++)
10261018
if (!regexec_buf(xpp->ignore_regex[i], rec->ptr, rec->size, 1,
@@ -1036,7 +1028,7 @@ static void xdl_mark_ignorable_regex(xdchange_t *xscr, const xdfenv_t *xe,
10361028
xdchange_t *xch;
10371029

10381030
for (xch = xscr; xch; xch = xch->next) {
1039-
xrecord_t **rec;
1031+
xrecord_t *rec;
10401032
int ignore = 1;
10411033
long i;
10421034

@@ -1048,11 +1040,11 @@ static void xdl_mark_ignorable_regex(xdchange_t *xscr, const xdfenv_t *xe,
10481040

10491041
rec = &xe->xdf1.recs[xch->i1];
10501042
for (i = 0; i < xch->chg1 && ignore; i++)
1051-
ignore = record_matches_regex(rec[i], xpp);
1043+
ignore = record_matches_regex(&rec[i], xpp);
10521044

10531045
rec = &xe->xdf2.recs[xch->i2];
10541046
for (i = 0; i < xch->chg2 && ignore; i++)
1055-
ignore = record_matches_regex(rec[i], xpp);
1047+
ignore = record_matches_regex(&rec[i], xpp);
10561048

10571049
xch->ignore = ignore;
10581050
}

src/xdiff/xdiffi.h

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,6 @@
2424
#define XDIFFI_H
2525

2626

27-
typedef struct s_diffdata {
28-
long nrec;
29-
unsigned long const *ha;
30-
long *rindex;
31-
char *rchg;
32-
} diffdata_t;
33-
3427
typedef struct s_xdalgoenv {
3528
long mxcost;
3629
long snake_cnt;
@@ -46,8 +39,8 @@ typedef struct s_xdchange {
4639

4740

4841

49-
int xdl_recs_cmp(diffdata_t *dd1, long off1, long lim1,
50-
diffdata_t *dd2, long off2, long lim2,
42+
int xdl_recs_cmp(xdfile_t *xdf1, long off1, long lim1,
43+
xdfile_t *xdf2, long off2, long lim2,
5144
long *kvdf, long *kvdb, int need_min, xdalgoenv_t *xenv);
5245
int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
5346
xdfenv_t *xe);

0 commit comments

Comments
 (0)