22
22
23
23
#include "xinclude.h"
24
24
25
+ static unsigned long get_hash (xdfile_t * xdf , long index )
26
+ {
27
+ return xdf -> recs [xdf -> rindex [index ]].ha ;
28
+ }
29
+
25
30
#define XDL_MAX_COST_MIN 256
26
31
#define XDL_HEUR_MIN_COST 256
27
32
#define XDL_LINE_MAX (long)((1UL << (CHAR_BIT * sizeof(long) - 1)) - 1)
@@ -42,8 +47,8 @@ typedef struct s_xdpsplit {
42
47
* using this algorithm, so a little bit of heuristic is needed to cut the
43
48
* search and to return a suboptimal point.
44
49
*/
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 ,
47
52
long * kvdf , long * kvdb , int need_min , xdpsplit_t * spl ,
48
53
xdalgoenv_t * xenv ) {
49
54
long dmin = off1 - lim2 , dmax = lim1 - off2 ;
@@ -87,7 +92,7 @@ static long xdl_split(unsigned long const *ha1, long off1, long lim1,
87
92
i1 = kvdf [d + 1 ];
88
93
prev1 = i1 ;
89
94
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 ++ );
91
96
if (i1 - prev1 > xenv -> snake_cnt )
92
97
got_snake = 1 ;
93
98
kvdf [d ] = i1 ;
@@ -124,7 +129,7 @@ static long xdl_split(unsigned long const *ha1, long off1, long lim1,
124
129
i1 = kvdb [d + 1 ] - 1 ;
125
130
prev1 = i1 ;
126
131
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 -- );
128
133
if (prev1 - i1 > xenv -> snake_cnt )
129
134
got_snake = 1 ;
130
135
kvdb [d ] = i1 ;
@@ -159,7 +164,7 @@ static long xdl_split(unsigned long const *ha1, long off1, long lim1,
159
164
if (v > XDL_K_HEUR * ec && v > best &&
160
165
off1 + xenv -> snake_cnt <= i1 && i1 < lim1 &&
161
166
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 ++ )
163
168
if (k == xenv -> snake_cnt ) {
164
169
best = v ;
165
170
spl -> i1 = i1 ;
@@ -183,7 +188,7 @@ static long xdl_split(unsigned long const *ha1, long off1, long lim1,
183
188
if (v > XDL_K_HEUR * ec && v > best &&
184
189
off1 < i1 && i1 <= lim1 - xenv -> snake_cnt &&
185
190
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 ++ )
187
192
if (k == xenv -> snake_cnt - 1 ) {
188
193
best = v ;
189
194
spl -> i1 = i1 ;
@@ -257,41 +262,34 @@ static long xdl_split(unsigned long const *ha1, long off1, long lim1,
257
262
* sub-boxes by calling the box splitting function. Note that the real job
258
263
* (marking changed lines) is done in the two boundary reaching checks.
259
264
*/
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 ,
262
267
long * kvdf , long * kvdb , int need_min , xdalgoenv_t * xenv ) {
263
- unsigned long const * ha1 = dd1 -> ha , * ha2 = dd2 -> ha ;
264
268
265
269
/*
266
270
* Shrink the box by walking through each diagonal snake (SW and NE).
267
271
*/
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 -- );
270
274
271
275
/*
272
276
* If one dimension is empty, then all records on the other one must
273
277
* be obviously changed.
274
278
*/
275
279
if (off1 == lim1 ) {
276
- char * rchg2 = dd2 -> rchg ;
277
- long * rindex2 = dd2 -> rindex ;
278
-
279
280
for (; off2 < lim2 ; off2 ++ )
280
- rchg2 [ rindex2 [off2 ]] = 1 ;
281
+ xdf2 -> changed [ xdf2 -> rindex [off2 ]] = true ;
281
282
} else if (off2 == lim2 ) {
282
- char * rchg1 = dd1 -> rchg ;
283
- long * rindex1 = dd1 -> rindex ;
284
-
285
283
for (; off1 < lim1 ; off1 ++ )
286
- rchg1 [ rindex1 [off1 ]] = 1 ;
284
+ xdf1 -> changed [ xdf1 -> rindex [off1 ]] = true ;
287
285
} else {
288
286
xdpsplit_t spl ;
289
287
spl .i1 = spl .i2 = 0 ;
290
288
291
289
/*
292
290
* Divide ...
293
291
*/
294
- if (xdl_split (ha1 , off1 , lim1 , ha2 , off2 , lim2 , kvdf , kvdb ,
292
+ if (xdl_split (xdf1 , off1 , lim1 , xdf2 , off2 , lim2 , kvdf , kvdb ,
295
293
need_min , & spl , xenv ) < 0 ) {
296
294
297
295
return -1 ;
@@ -300,9 +298,9 @@ int xdl_recs_cmp(diffdata_t *dd1, long off1, long lim1,
300
298
/*
301
299
* ... et Impera.
302
300
*/
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 ,
304
302
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 ,
306
304
kvdf , kvdb , spl .min_hi , xenv ) < 0 ) {
307
305
308
306
return -1 ;
@@ -318,7 +316,6 @@ int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
318
316
long ndiags ;
319
317
long * kvd , * kvdf , * kvdb ;
320
318
xdalgoenv_t xenv ;
321
- diffdata_t dd1 , dd2 ;
322
319
int res ;
323
320
324
321
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,
357
354
xenv .snake_cnt = XDL_SNAKE_CNT ;
358
355
xenv .heur_min = XDL_HEUR_MIN_COST ;
359
356
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 ,
370
358
kvdf , kvdb , (xpp -> flags & XDF_NEED_MINIMAL ) != 0 ,
371
359
& xenv );
372
360
xdl_free (kvd );
@@ -501,13 +489,13 @@ static void measure_split(const xdfile_t *xdf, long split,
501
489
m -> indent = -1 ;
502
490
} else {
503
491
m -> end_of_file = 0 ;
504
- m -> indent = get_indent (xdf -> recs [split ]);
492
+ m -> indent = get_indent (& xdf -> recs [split ]);
505
493
}
506
494
507
495
m -> pre_blank = 0 ;
508
496
m -> pre_indent = -1 ;
509
497
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 ]);
511
499
if (m -> pre_indent != -1 )
512
500
break ;
513
501
m -> pre_blank += 1 ;
@@ -520,7 +508,7 @@ static void measure_split(const xdfile_t *xdf, long split,
520
508
m -> post_blank = 0 ;
521
509
m -> post_indent = -1 ;
522
510
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 ]);
524
512
if (m -> post_indent != -1 )
525
513
break ;
526
514
m -> post_blank += 1 ;
@@ -720,7 +708,7 @@ struct xdlgroup {
720
708
static void group_init (xdfile_t * xdf , struct xdlgroup * g )
721
709
{
722
710
g -> start = g -> end = 0 ;
723
- while (xdf -> rchg [g -> end ])
711
+ while (xdf -> changed [g -> end ])
724
712
g -> end ++ ;
725
713
}
726
714
@@ -734,7 +722,7 @@ static inline int group_next(xdfile_t *xdf, struct xdlgroup *g)
734
722
return -1 ;
735
723
736
724
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 ++ )
738
726
;
739
727
740
728
return 0 ;
@@ -750,7 +738,7 @@ static inline int group_previous(xdfile_t *xdf, struct xdlgroup *g)
750
738
return -1 ;
751
739
752
740
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 -- )
754
742
;
755
743
756
744
return 0 ;
@@ -764,11 +752,11 @@ static inline int group_previous(xdfile_t *xdf, struct xdlgroup *g)
764
752
static int group_slide_down (xdfile_t * xdf , struct xdlgroup * g )
765
753
{
766
754
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 ;
770
758
771
- while (xdf -> rchg [g -> end ])
759
+ while (xdf -> changed [g -> end ])
772
760
g -> end ++ ;
773
761
774
762
return 0 ;
@@ -785,11 +773,11 @@ static int group_slide_down(xdfile_t *xdf, struct xdlgroup *g)
785
773
static int group_slide_up (xdfile_t * xdf , struct xdlgroup * g )
786
774
{
787
775
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 ;
791
779
792
- while (xdf -> rchg [g -> start - 1 ])
780
+ while (xdf -> changed [g -> start - 1 ])
793
781
g -> start -- ;
794
782
795
783
return 0 ;
@@ -944,16 +932,16 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
944
932
945
933
int xdl_build_script (xdfenv_t * xe , xdchange_t * * xscr ) {
946
934
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 ;
948
936
long i1 , i2 , l1 , l2 ;
949
937
950
938
/*
951
939
* Trivial. Collects "groups" of changes and creates an edit script.
952
940
*/
953
941
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 -- );
957
945
958
946
if (!(xch = xdl_add_change (cscr , i1 , i2 , l1 - i1 , l2 - i2 ))) {
959
947
xdl_free_script (cscr );
@@ -1000,16 +988,16 @@ static void xdl_mark_ignorable_lines(xdchange_t *xscr, xdfenv_t *xe, long flags)
1000
988
1001
989
for (xch = xscr ; xch ; xch = xch -> next ) {
1002
990
int ignore = 1 ;
1003
- xrecord_t * * rec ;
991
+ xrecord_t * rec ;
1004
992
long i ;
1005
993
1006
994
rec = & xe -> xdf1 .recs [xch -> i1 ];
1007
995
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 );
1009
997
1010
998
rec = & xe -> xdf2 .recs [xch -> i2 ];
1011
999
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 );
1013
1001
1014
1002
xch -> ignore = ignore ;
1015
1003
}
@@ -1033,7 +1021,7 @@ static void xdl_mark_ignorable_regex(xdchange_t *xscr, const xdfenv_t *xe,
1033
1021
xdchange_t * xch ;
1034
1022
1035
1023
for (xch = xscr ; xch ; xch = xch -> next ) {
1036
- xrecord_t * * rec ;
1024
+ xrecord_t * rec ;
1037
1025
int ignore = 1 ;
1038
1026
long i ;
1039
1027
@@ -1045,11 +1033,11 @@ static void xdl_mark_ignorable_regex(xdchange_t *xscr, const xdfenv_t *xe,
1045
1033
1046
1034
rec = & xe -> xdf1 .recs [xch -> i1 ];
1047
1035
for (i = 0 ; i < xch -> chg1 && ignore ; i ++ )
1048
- ignore = record_matches_regex (rec [i ], xpp );
1036
+ ignore = record_matches_regex (& rec [i ], xpp );
1049
1037
1050
1038
rec = & xe -> xdf2 .recs [xch -> i2 ];
1051
1039
for (i = 0 ; i < xch -> chg2 && ignore ; i ++ )
1052
- ignore = record_matches_regex (rec [i ], xpp );
1040
+ ignore = record_matches_regex (& rec [i ], xpp );
1053
1041
1054
1042
xch -> ignore = ignore ;
1055
1043
}
0 commit comments