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 {
720708static 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)
764752static 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)
785773static 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
945933int 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 }
0 commit comments