Skip to content

Commit 5fedb8a

Browse files
ychinbrammool
authored andcommitted
patch 9.0.1418: the included xdiff code is a bit outdated
Problem: The included xdiff code is a bit outdated. Solution: Sync with the latest git xdiff code. (Yee Cheng Chin, closes #12181)
1 parent a1fa8b3 commit 5fedb8a

12 files changed

Lines changed: 131 additions & 147 deletions

File tree

src/version.c

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

696696
static int included_patches[] =
697697
{ /* Add new patch number below this line */
698+
/**/
699+
1418,
698700
/**/
699701
1417,
700702
/**/

src/xdiff/README.txt

Lines changed: 1 addition & 1 deletion
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 August 31, 2021 from git release v.2.33.0
3+
The files were last updated March 17, 2023 from git release v.2.40.0
44

55
This is originally based on libxdiff, which can be found here:
66
http://www.xmailserver.org/xdiff-lib.html

src/xdiff/xdiff.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ extern "C" {
6666

6767
/* merge output styles */
6868
#define XDL_MERGE_DIFF3 1
69+
#define XDL_MERGE_ZEALOUS_DIFF3 2
6970

7071
typedef struct s_mmfile {
7172
char *ptr;
@@ -126,6 +127,7 @@ typedef struct s_bdiffparam {
126127
#endif
127128

128129
#define xdl_malloc(x) lalloc((x), TRUE)
130+
#define xdl_calloc(n, sz) lalloc_clear(n*sz, TRUE)
129131
#define xdl_free(ptr) vim_free(ptr)
130132
#define xdl_realloc(ptr,x) vim_realloc((ptr),(x))
131133

src/xdiff/xdiffi.c

Lines changed: 28 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -315,16 +315,19 @@ int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
315315
long *kvd, *kvdf, *kvdb;
316316
xdalgoenv_t xenv;
317317
diffdata_t dd1, dd2;
318+
int res;
318319

319-
if (XDF_DIFF_ALG(xpp->flags) == XDF_PATIENCE_DIFF)
320-
return xdl_do_patience_diff(mf1, mf2, xpp, xe);
321-
322-
if (XDF_DIFF_ALG(xpp->flags) == XDF_HISTOGRAM_DIFF)
323-
return xdl_do_histogram_diff(mf1, mf2, xpp, xe);
320+
if (xdl_prepare_env(mf1, mf2, xpp, xe) < 0)
321+
return -1;
324322

325-
if (xdl_prepare_env(mf1, mf2, xpp, xe) < 0) {
323+
if (XDF_DIFF_ALG(xpp->flags) == XDF_PATIENCE_DIFF) {
324+
res = xdl_do_patience_diff(xpp, xe);
325+
goto out;
326+
}
326327

327-
return -1;
328+
if (XDF_DIFF_ALG(xpp->flags) == XDF_HISTOGRAM_DIFF) {
329+
res = xdl_do_histogram_diff(xpp, xe);
330+
goto out;
328331
}
329332

330333
/*
@@ -334,7 +337,7 @@ int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
334337
* One is to store the forward path and one to store the backward path.
335338
*/
336339
ndiags = xe->xdf1.nreff + xe->xdf2.nreff + 3;
337-
if (!(kvd = (long *) xdl_malloc((2 * ndiags + 2) * sizeof(long)))) {
340+
if (!XDL_ALLOC_ARRAY(kvd, 2 * ndiags + 2)) {
338341

339342
xdl_free_env(xe);
340343
return -1;
@@ -359,17 +362,15 @@ int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
359362
dd2.rchg = xe->xdf2.rchg;
360363
dd2.rindex = xe->xdf2.rindex;
361364

362-
if (xdl_recs_cmp(&dd1, 0, dd1.nrec, &dd2, 0, dd2.nrec,
363-
kvdf, kvdb, (xpp->flags & XDF_NEED_MINIMAL) != 0, &xenv) < 0) {
364-
365-
xdl_free(kvd);
366-
xdl_free_env(xe);
367-
return -1;
368-
}
369-
365+
res = xdl_recs_cmp(&dd1, 0, dd1.nrec, &dd2, 0, dd2.nrec,
366+
kvdf, kvdb, (xpp->flags & XDF_NEED_MINIMAL) != 0,
367+
&xenv);
370368
xdl_free(kvd);
369+
out:
370+
if (res < 0)
371+
xdl_free_env(xe);
371372

372-
return 0;
373+
return res;
373374
}
374375

375376

@@ -390,12 +391,9 @@ static xdchange_t *xdl_add_change(xdchange_t *xscr, long i1, long i2, long chg1,
390391
}
391392

392393

393-
static int recs_match(xrecord_t *rec1, xrecord_t *rec2, long flags)
394+
static int recs_match(xrecord_t *rec1, xrecord_t *rec2)
394395
{
395-
return (rec1->ha == rec2->ha &&
396-
xdl_recmatch(rec1->ptr, rec1->size,
397-
rec2->ptr, rec2->size,
398-
flags));
396+
return (rec1->ha == rec2->ha);
399397
}
400398

401399
/*
@@ -759,10 +757,10 @@ static inline int group_previous(xdfile_t *xdf, struct xdlgroup *g)
759757
* following group, expand this group to include it. Return 0 on success or -1
760758
* if g cannot be slid down.
761759
*/
762-
static int group_slide_down(xdfile_t *xdf, struct xdlgroup *g, long flags)
760+
static int group_slide_down(xdfile_t *xdf, struct xdlgroup *g)
763761
{
764762
if (g->end < xdf->nrec &&
765-
recs_match(xdf->recs[g->start], xdf->recs[g->end], flags)) {
763+
recs_match(xdf->recs[g->start], xdf->recs[g->end])) {
766764
xdf->rchg[g->start++] = 0;
767765
xdf->rchg[g->end++] = 1;
768766

@@ -780,10 +778,10 @@ static int group_slide_down(xdfile_t *xdf, struct xdlgroup *g, long flags)
780778
* into a previous group, expand this group to include it. Return 0 on success
781779
* or -1 if g cannot be slid up.
782780
*/
783-
static int group_slide_up(xdfile_t *xdf, struct xdlgroup *g, long flags)
781+
static int group_slide_up(xdfile_t *xdf, struct xdlgroup *g)
784782
{
785783
if (g->start > 0 &&
786-
recs_match(xdf->recs[g->start - 1], xdf->recs[g->end - 1], flags)) {
784+
recs_match(xdf->recs[g->start - 1], xdf->recs[g->end - 1])) {
787785
xdf->rchg[--g->start] = 1;
788786
xdf->rchg[--g->end] = 0;
789787

@@ -839,7 +837,7 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
839837
end_matching_other = -1;
840838

841839
/* Shift the group backward as much as possible: */
842-
while (!group_slide_up(xdf, &g, flags))
840+
while (!group_slide_up(xdf, &g))
843841
if (group_previous(xdfo, &go))
844842
xdl_bug("group sync broken sliding up");
845843

@@ -854,7 +852,7 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
854852

855853
/* Now shift the group forward as far as possible: */
856854
while (1) {
857-
if (group_slide_down(xdf, &g, flags))
855+
if (group_slide_down(xdf, &g))
858856
break;
859857
if (group_next(xdfo, &go))
860858
xdl_bug("group sync broken sliding down");
@@ -881,7 +879,7 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
881879
* other file that it can align with.
882880
*/
883881
while (go.end == go.start) {
884-
if (group_slide_up(xdf, &g, flags))
882+
if (group_slide_up(xdf, &g))
885883
xdl_bug("match disappeared");
886884
if (group_previous(xdfo, &go))
887885
xdl_bug("group sync broken sliding to match");
@@ -924,7 +922,7 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
924922
}
925923

926924
while (g.end > best_shift) {
927-
if (group_slide_up(xdf, &g, flags))
925+
if (group_slide_up(xdf, &g))
928926
xdl_bug("best shift unreached");
929927
if (group_previous(xdfo, &go))
930928
xdl_bug("group sync broken sliding to blank line");

src/xdiff/xdiffi.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,7 @@ int xdl_build_script(xdfenv_t *xe, xdchange_t **xscr);
5656
void xdl_free_script(xdchange_t *xscr);
5757
int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
5858
xdemitconf_t const *xecfg);
59-
int xdl_do_patience_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
60-
xdfenv_t *env);
61-
int xdl_do_histogram_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
62-
xdfenv_t *env);
59+
int xdl_do_patience_diff(xpparam_t const *xpp, xdfenv_t *env);
60+
int xdl_do_histogram_diff(xpparam_t const *xpp, xdfenv_t *env);
6361

6462
#endif /* #if !defined(XDIFFI_H) */

src/xdiff/xemit.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ xdchange_t *xdl_get_hunk(xdchange_t **xscr, xdemitconf_t const *xecfg)
6565
*xscr = xch;
6666
}
6767

68-
if (*xscr == NULL)
68+
if (!*xscr)
6969
return NULL;
7070

7171
lxch = *xscr;
@@ -96,7 +96,7 @@ xdchange_t *xdl_get_hunk(xdchange_t **xscr, xdemitconf_t const *xecfg)
9696

9797

9898
#if 0
99-
static long def_ff(const char *rec, long len, char *buf, long sz, void *priv UNUSED)
99+
static long def_ff(const char *rec, long len, char *buf, long sz)
100100
{
101101
if (len > 0 &&
102102
(isalpha((unsigned char)*rec) || /* identifier? */
@@ -120,7 +120,7 @@ static long match_func_rec(xdfile_t *xdf, xdemitconf_t const *xecfg, long ri,
120120
const char *rec;
121121
long len = xdl_get_rec(xdf, ri, &rec);
122122
if (!xecfg->find_func)
123-
return def_ff(rec, len, buf, sz, xecfg->find_func_priv);
123+
return def_ff(rec, len, buf, sz);
124124
return xecfg->find_func(rec, len, buf, sz, xecfg->find_func_priv);
125125
}
126126
#endif

src/xdiff/xhistogram.c

Lines changed: 11 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -88,19 +88,14 @@ struct region {
8888
#define REC(env, s, l) \
8989
(env->xdf##s.recs[l - 1])
9090

91-
static int cmp_recs(xpparam_t const *xpp,
92-
xrecord_t *r1, xrecord_t *r2)
91+
static int cmp_recs(xrecord_t *r1, xrecord_t *r2)
9392
{
94-
return r1->ha == r2->ha &&
95-
xdl_recmatch(r1->ptr, r1->size, r2->ptr, r2->size,
96-
xpp->flags);
97-
}
93+
return r1->ha == r2->ha;
9894

99-
#define CMP_ENV(xpp, env, s1, l1, s2, l2) \
100-
(cmp_recs(xpp, REC(env, s1, l1), REC(env, s2, l2)))
95+
}
10196

10297
#define CMP(i, s1, l1, s2, l2) \
103-
(cmp_recs(i->xpp, REC(i->env, s1, l1), REC(i->env, s2, l2)))
98+
(cmp_recs(REC(i->env, s1, l1), REC(i->env, s2, l2)))
10499

105100
#define TABLE_HASH(index, side, line) \
106101
XDL_HASHLONG((REC(index->env, side, line))->ha, index->table_bits)
@@ -256,7 +251,7 @@ static int find_lcs(xpparam_t const *xpp, xdfenv_t *env,
256251
int line1, int count1, int line2, int count2)
257252
{
258253
int b_ptr;
259-
int sz, ret = -1;
254+
int ret = -1;
260255
struct histindex index;
261256

262257
memset(&index, 0, sizeof(index));
@@ -270,23 +265,16 @@ static int find_lcs(xpparam_t const *xpp, xdfenv_t *env,
270265
index.rcha.head = NULL;
271266

272267
index.table_bits = xdl_hashbits(count1);
273-
sz = index.records_size = 1 << index.table_bits;
274-
sz *= sizeof(struct record *);
275-
if (!(index.records = (struct record **) xdl_malloc(sz)))
268+
index.records_size = 1 << index.table_bits;
269+
if (!XDL_CALLOC_ARRAY(index.records, index.records_size))
276270
goto cleanup;
277-
memset(index.records, 0, sz);
278271

279-
sz = index.line_map_size = count1;
280-
sz *= sizeof(struct record *);
281-
if (!(index.line_map = (struct record **) xdl_malloc(sz)))
272+
index.line_map_size = count1;
273+
if (!XDL_CALLOC_ARRAY(index.line_map, index.line_map_size))
282274
goto cleanup;
283-
memset(index.line_map, 0, sz);
284275

285-
sz = index.line_map_size;
286-
sz *= sizeof(unsigned int);
287-
if (!(index.next_ptrs = (unsigned int *) xdl_malloc(sz)))
276+
if (!XDL_CALLOC_ARRAY(index.next_ptrs, index.line_map_size))
288277
goto cleanup;
289-
memset(index.next_ptrs, 0, sz);
290278

291279
/* lines / 4 + 1 comes from xprepare.c:xdl_prepare_ctx() */
292280
if (xdl_cha_init(&index.rcha, sizeof(struct record), count1 / 4 + 1) < 0)
@@ -374,12 +362,8 @@ static int histogram_diff(xpparam_t const *xpp, xdfenv_t *env,
374362
return result;
375363
}
376364

377-
int xdl_do_histogram_diff(mmfile_t *file1, mmfile_t *file2,
378-
xpparam_t const *xpp, xdfenv_t *env)
365+
int xdl_do_histogram_diff(xpparam_t const *xpp, xdfenv_t *env)
379366
{
380-
if (xdl_prepare_env(file1, file2, xpp, env) < 0)
381-
return -1;
382-
383367
return histogram_diff(xpp, env,
384368
env->xdf1.dstart + 1, env->xdf1.dend - env->xdf1.dstart + 1,
385369
env->xdf2.dstart + 1, env->xdf2.dend - env->xdf2.dstart + 1);

src/xdiff/xmacros.h

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
#define XDL_ADDBITS(v,b) ((v) + ((v) >> (b)))
3535
#define XDL_MASKBITS(b) ((1UL << (b)) - 1)
3636
#define XDL_HASHLONG(v,b) (XDL_ADDBITS((unsigned long)(v), b) & XDL_MASKBITS(b))
37-
#define XDL_PTRFREE(p) do { if (p) { xdl_free(p); (p) = NULL; } } while (0)
3837
#define XDL_LE32_PUT(p, v) \
3938
do { \
4039
unsigned char *__p = (unsigned char *) (p); \
@@ -50,5 +49,23 @@ do { \
5049
((unsigned long) __p[2]) << 16 | ((unsigned long) __p[3]) << 24; \
5150
} while (0)
5251

52+
/* Allocate an array of nr elements, returns NULL on failure */
53+
#define XDL_ALLOC_ARRAY(p, nr) \
54+
((p) = SIZE_MAX / sizeof(*(p)) >= (size_t)(nr) \
55+
? xdl_malloc((nr) * sizeof(*(p))) \
56+
: NULL)
57+
58+
/* Allocate an array of nr zeroed out elements, returns NULL on failure */
59+
#define XDL_CALLOC_ARRAY(p, nr) ((p) = xdl_calloc(nr, sizeof(*(p))))
60+
61+
/*
62+
* Ensure array p can accommodate at least nr elements, growing the
63+
* array and updating alloc (which is the number of allocated
64+
* elements) as necessary. Frees p and returns -1 on failure, returns
65+
* 0 on success
66+
*/
67+
#define XDL_ALLOC_GROW(p, nr, alloc) \
68+
(-!((nr) <= (alloc) || \
69+
((p) = xdl_alloc_grow_helper((p), (nr), &(alloc), sizeof(*(p))))))
5370

5471
#endif /* #if !defined(XMACROS_H) */

0 commit comments

Comments
 (0)