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 ;
@@ -260,13 +265,12 @@ static long xdl_split(unsigned long const *ha1, long off1, long lim1,
260265int xdl_recs_cmp (xdfile_t * xdf1 , long off1 , long lim1 ,
261266 xdfile_t * xdf2 , long off2 , long lim2 ,
262267 long * kvdf , long * kvdb , int need_min , xdalgoenv_t * xenv ) {
263- unsigned long const * ha1 = xdf1 -> ha , * ha2 = xdf2 -> 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
@@ -285,7 +289,7 @@ int xdl_recs_cmp(xdfile_t *xdf1, long off1, long lim1,
285289 /*
286290 * Divide ...
287291 */
288- if (xdl_split (ha1 , off1 , lim1 , ha2 , off2 , lim2 , kvdf , kvdb ,
292+ if (xdl_split (xdf1 , off1 , lim1 , xdf2 , off2 , lim2 , kvdf , kvdb ,
289293 need_min , & spl , xenv ) < 0 ) {
290294
291295 return -1 ;
0 commit comments