Skip to content

Commit 5bc21d0

Browse files
committed
Merge branch 'en/xdiff-cleanup' into next
A lot of code clean-up of xdiff. Split out of a larger topic. * en/xdiff-cleanup: xdiff: change type of xdfile_t.changed from char to bool xdiff: add macros DISCARD(0), KEEP(1), INVESTIGATE(2) in xprepare.c xdiff: rename rchg -> changed in xdfile_t xdiff: delete chastore from xdfile_t xdiff: delete fields ha, line, size in xdlclass_t in favor of an xrecord_t xdiff: delete redundant array xdfile_t.ha xdiff: delete struct diffdata_t xdiff: delete local variables that alias fields in xrecord_t xdiff: delete superfluous function xdl_get_rec() in xemit xdiff: delete unnecessary fields from xrecord_t and xdfile_t xdiff: delete local variables and initialize/free xdfile_t directly xdiff: delete static forward declarations in xprepare
2 parents 3fdb4a8 + 8b9c5d2 commit 5bc21d0

File tree

9 files changed

+269
-337
lines changed

9 files changed

+269
-337
lines changed

xdiff/xdiffi.c

Lines changed: 45 additions & 57 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;
@@ -257,41 +262,34 @@ static long xdl_split(unsigned long const *ha1, long off1, long lim1,
257262
* sub-boxes by calling the box splitting function. Note that the real job
258263
* (marking changed lines) is done in the two boundary reaching checks.
259264
*/
260-
int xdl_recs_cmp(diffdata_t *dd1, long off1, long lim1,
261-
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,
262267
long *kvdf, long *kvdb, int need_min, xdalgoenv_t *xenv) {
263-
unsigned long const *ha1 = dd1->ha, *ha2 = dd2->ha;
264268

265269
/*
266270
* Shrink the box by walking through each diagonal snake (SW and NE).
267271
*/
268-
for (; off1 < lim1 && off2 < lim2 && ha1[off1] == ha2[off2]; off1++, off2++);
269-
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--);
270274

271275
/*
272276
* If one dimension is empty, then all records on the other one must
273277
* be obviously changed.
274278
*/
275279
if (off1 == lim1) {
276-
char *rchg2 = dd2->rchg;
277-
long *rindex2 = dd2->rindex;
278-
279280
for (; off2 < lim2; off2++)
280-
rchg2[rindex2[off2]] = 1;
281+
xdf2->changed[xdf2->rindex[off2]] = true;
281282
} else if (off2 == lim2) {
282-
char *rchg1 = dd1->rchg;
283-
long *rindex1 = dd1->rindex;
284-
285283
for (; off1 < lim1; off1++)
286-
rchg1[rindex1[off1]] = 1;
284+
xdf1->changed[xdf1->rindex[off1]] = true;
287285
} else {
288286
xdpsplit_t spl;
289287
spl.i1 = spl.i2 = 0;
290288

291289
/*
292290
* Divide ...
293291
*/
294-
if (xdl_split(ha1, off1, lim1, ha2, off2, lim2, kvdf, kvdb,
292+
if (xdl_split(xdf1, off1, lim1, xdf2, off2, lim2, kvdf, kvdb,
295293
need_min, &spl, xenv) < 0) {
296294

297295
return -1;
@@ -300,9 +298,9 @@ int xdl_recs_cmp(diffdata_t *dd1, long off1, long lim1,
300298
/*
301299
* ... et Impera.
302300
*/
303-
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,
304302
kvdf, kvdb, spl.min_lo, xenv) < 0 ||
305-
xdl_recs_cmp(dd1, spl.i1, lim1, dd2, spl.i2, lim2,
303+
xdl_recs_cmp(xdf1, spl.i1, lim1, xdf2, spl.i2, lim2,
306304
kvdf, kvdb, spl.min_hi, xenv) < 0) {
307305

308306
return -1;
@@ -318,7 +316,6 @@ int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
318316
long ndiags;
319317
long *kvd, *kvdf, *kvdb;
320318
xdalgoenv_t xenv;
321-
diffdata_t dd1, dd2;
322319
int res;
323320

324321
if (xdl_prepare_env(mf1, mf2, xpp, xe) < 0)
@@ -357,16 +354,7 @@ int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
357354
xenv.snake_cnt = XDL_SNAKE_CNT;
358355
xenv.heur_min = XDL_HEUR_MIN_COST;
359356

360-
dd1.nrec = xe->xdf1.nreff;
361-
dd1.ha = xe->xdf1.ha;
362-
dd1.rchg = xe->xdf1.rchg;
363-
dd1.rindex = xe->xdf1.rindex;
364-
dd2.nrec = xe->xdf2.nreff;
365-
dd2.ha = xe->xdf2.ha;
366-
dd2.rchg = xe->xdf2.rchg;
367-
dd2.rindex = xe->xdf2.rindex;
368-
369-
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,
370358
kvdf, kvdb, (xpp->flags & XDF_NEED_MINIMAL) != 0,
371359
&xenv);
372360
xdl_free(kvd);
@@ -501,13 +489,13 @@ static void measure_split(const xdfile_t *xdf, long split,
501489
m->indent = -1;
502490
} else {
503491
m->end_of_file = 0;
504-
m->indent = get_indent(xdf->recs[split]);
492+
m->indent = get_indent(&xdf->recs[split]);
505493
}
506494

507495
m->pre_blank = 0;
508496
m->pre_indent = -1;
509497
for (i = split - 1; i >= 0; i--) {
510-
m->pre_indent = get_indent(xdf->recs[i]);
498+
m->pre_indent = get_indent(&xdf->recs[i]);
511499
if (m->pre_indent != -1)
512500
break;
513501
m->pre_blank += 1;
@@ -520,7 +508,7 @@ static void measure_split(const xdfile_t *xdf, long split,
520508
m->post_blank = 0;
521509
m->post_indent = -1;
522510
for (i = split + 1; i < xdf->nrec; i++) {
523-
m->post_indent = get_indent(xdf->recs[i]);
511+
m->post_indent = get_indent(&xdf->recs[i]);
524512
if (m->post_indent != -1)
525513
break;
526514
m->post_blank += 1;
@@ -720,7 +708,7 @@ struct xdlgroup {
720708
static void group_init(xdfile_t *xdf, struct xdlgroup *g)
721709
{
722710
g->start = g->end = 0;
723-
while (xdf->rchg[g->end])
711+
while (xdf->changed[g->end])
724712
g->end++;
725713
}
726714

@@ -734,7 +722,7 @@ static inline int group_next(xdfile_t *xdf, struct xdlgroup *g)
734722
return -1;
735723

736724
g->start = g->end + 1;
737-
for (g->end = g->start; xdf->rchg[g->end]; g->end++)
725+
for (g->end = g->start; xdf->changed[g->end]; g->end++)
738726
;
739727

740728
return 0;
@@ -750,7 +738,7 @@ static inline int group_previous(xdfile_t *xdf, struct xdlgroup *g)
750738
return -1;
751739

752740
g->end = g->start - 1;
753-
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--)
754742
;
755743

756744
return 0;
@@ -764,11 +752,11 @@ static inline int group_previous(xdfile_t *xdf, struct xdlgroup *g)
764752
static int group_slide_down(xdfile_t *xdf, struct xdlgroup *g)
765753
{
766754
if (g->end < xdf->nrec &&
767-
recs_match(xdf->recs[g->start], xdf->recs[g->end])) {
768-
xdf->rchg[g->start++] = 0;
769-
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;
770758

771-
while (xdf->rchg[g->end])
759+
while (xdf->changed[g->end])
772760
g->end++;
773761

774762
return 0;
@@ -785,11 +773,11 @@ static int group_slide_down(xdfile_t *xdf, struct xdlgroup *g)
785773
static int group_slide_up(xdfile_t *xdf, struct xdlgroup *g)
786774
{
787775
if (g->start > 0 &&
788-
recs_match(xdf->recs[g->start - 1], xdf->recs[g->end - 1])) {
789-
xdf->rchg[--g->start] = 1;
790-
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;
791779

792-
while (xdf->rchg[g->start - 1])
780+
while (xdf->changed[g->start - 1])
793781
g->start--;
794782

795783
return 0;
@@ -944,16 +932,16 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
944932

945933
int xdl_build_script(xdfenv_t *xe, xdchange_t **xscr) {
946934
xdchange_t *cscr = NULL, *xch;
947-
char *rchg1 = xe->xdf1.rchg, *rchg2 = xe->xdf2.rchg;
935+
bool *changed1 = xe->xdf1.changed, *changed2 = xe->xdf2.changed;
948936
long i1, i2, l1, l2;
949937

950938
/*
951939
* Trivial. Collects "groups" of changes and creates an edit script.
952940
*/
953941
for (i1 = xe->xdf1.nrec, i2 = xe->xdf2.nrec; i1 >= 0 || i2 >= 0; i1--, i2--)
954-
if (rchg1[i1 - 1] || rchg2[i2 - 1]) {
955-
for (l1 = i1; rchg1[i1 - 1]; i1--);
956-
for (l2 = i2; rchg2[i2 - 1]; i2--);
942+
if (changed1[i1 - 1] || changed2[i2 - 1]) {
943+
for (l1 = i1; changed1[i1 - 1]; i1--);
944+
for (l2 = i2; changed2[i2 - 1]; i2--);
957945

958946
if (!(xch = xdl_add_change(cscr, i1, i2, l1 - i1, l2 - i2))) {
959947
xdl_free_script(cscr);
@@ -1000,16 +988,16 @@ static void xdl_mark_ignorable_lines(xdchange_t *xscr, xdfenv_t *xe, long flags)
1000988

1001989
for (xch = xscr; xch; xch = xch->next) {
1002990
int ignore = 1;
1003-
xrecord_t **rec;
991+
xrecord_t *rec;
1004992
long i;
1005993

1006994
rec = &xe->xdf1.recs[xch->i1];
1007995
for (i = 0; i < xch->chg1 && ignore; i++)
1008-
ignore = xdl_blankline(rec[i]->ptr, rec[i]->size, flags);
996+
ignore = xdl_blankline(rec[i].ptr, rec[i].size, flags);
1009997

1010998
rec = &xe->xdf2.recs[xch->i2];
1011999
for (i = 0; i < xch->chg2 && ignore; i++)
1012-
ignore = xdl_blankline(rec[i]->ptr, rec[i]->size, flags);
1000+
ignore = xdl_blankline(rec[i].ptr, rec[i].size, flags);
10131001

10141002
xch->ignore = ignore;
10151003
}
@@ -1033,7 +1021,7 @@ static void xdl_mark_ignorable_regex(xdchange_t *xscr, const xdfenv_t *xe,
10331021
xdchange_t *xch;
10341022

10351023
for (xch = xscr; xch; xch = xch->next) {
1036-
xrecord_t **rec;
1024+
xrecord_t *rec;
10371025
int ignore = 1;
10381026
long i;
10391027

@@ -1045,11 +1033,11 @@ static void xdl_mark_ignorable_regex(xdchange_t *xscr, const xdfenv_t *xe,
10451033

10461034
rec = &xe->xdf1.recs[xch->i1];
10471035
for (i = 0; i < xch->chg1 && ignore; i++)
1048-
ignore = record_matches_regex(rec[i], xpp);
1036+
ignore = record_matches_regex(&rec[i], xpp);
10491037

10501038
rec = &xe->xdf2.recs[xch->i2];
10511039
for (i = 0; i < xch->chg2 && ignore; i++)
1052-
ignore = record_matches_regex(rec[i], xpp);
1040+
ignore = record_matches_regex(&rec[i], xpp);
10531041

10541042
xch->ignore = ignore;
10551043
}

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);

xdiff/xemit.c

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -22,23 +22,13 @@
2222

2323
#include "xinclude.h"
2424

25-
static long xdl_get_rec(xdfile_t *xdf, long ri, char const **rec) {
2625

27-
*rec = xdf->recs[ri]->ptr;
28-
29-
return xdf->recs[ri]->size;
30-
}
31-
32-
33-
static int xdl_emit_record(xdfile_t *xdf, long ri, char const *pre, xdemitcb_t *ecb) {
34-
long size, psize = strlen(pre);
35-
char const *rec;
36-
37-
size = xdl_get_rec(xdf, ri, &rec);
38-
if (xdl_emit_diffrec(rec, size, pre, psize, ecb) < 0) {
26+
static int xdl_emit_record(xdfile_t *xdf, long ri, char const *pre, xdemitcb_t *ecb)
27+
{
28+
xrecord_t *rec = &xdf->recs[ri];
3929

30+
if (xdl_emit_diffrec(rec->ptr, rec->size, pre, strlen(pre), ecb) < 0)
4031
return -1;
41-
}
4232

4333
return 0;
4434
}
@@ -120,11 +110,11 @@ static long def_ff(const char *rec, long len, char *buf, long sz)
120110
static long match_func_rec(xdfile_t *xdf, xdemitconf_t const *xecfg, long ri,
121111
char *buf, long sz)
122112
{
123-
const char *rec;
124-
long len = xdl_get_rec(xdf, ri, &rec);
113+
xrecord_t *rec = &xdf->recs[ri];
114+
125115
if (!xecfg->find_func)
126-
return def_ff(rec, len, buf, sz);
127-
return xecfg->find_func(rec, len, buf, sz, xecfg->find_func_priv);
116+
return def_ff(rec->ptr, rec->size, buf, sz);
117+
return xecfg->find_func(rec->ptr, rec->size, buf, sz, xecfg->find_func_priv);
128118
}
129119

130120
static int is_func_rec(xdfile_t *xdf, xdemitconf_t const *xecfg, long ri)
@@ -160,14 +150,12 @@ static long get_func_line(xdfenv_t *xe, xdemitconf_t const *xecfg,
160150

161151
static int is_empty_rec(xdfile_t *xdf, long ri)
162152
{
163-
const char *rec;
164-
long len = xdl_get_rec(xdf, ri, &rec);
153+
xrecord_t *rec = &xdf->recs[ri];
154+
long i = 0;
165155

166-
while (len > 0 && XDL_ISSPACE(*rec)) {
167-
rec++;
168-
len--;
169-
}
170-
return !len;
156+
for (; i < rec->size && XDL_ISSPACE(rec->ptr[i]); i++);
157+
158+
return i == rec->size;
171159
}
172160

173161
int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,

0 commit comments

Comments
 (0)