Merge branch 'pw/xdiff-classify-record-in-histogram'
"diff --histogram" optimization. * pw/xdiff-classify-record-in-histogram: xdiff: drop unused flags parameter from recs_match xdiff: drop xpparam_t parameter from histogram cmp_recs() xdiff: drop CMP_ENV macro from xhistogram xdiff: simplify comparison xdiff: avoid unnecessary memory allocations diff histogram: intern stringsmaint
commit
a0f5ca94dd
|
@ -390,12 +390,9 @@ static xdchange_t *xdl_add_change(xdchange_t *xscr, long i1, long i2, long chg1,
|
|||
}
|
||||
|
||||
|
||||
static int recs_match(xrecord_t *rec1, xrecord_t *rec2, long flags)
|
||||
static int recs_match(xrecord_t *rec1, xrecord_t *rec2)
|
||||
{
|
||||
return (rec1->ha == rec2->ha &&
|
||||
xdl_recmatch(rec1->ptr, rec1->size,
|
||||
rec2->ptr, rec2->size,
|
||||
flags));
|
||||
return (rec1->ha == rec2->ha);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -759,10 +756,10 @@ static inline int group_previous(xdfile_t *xdf, struct xdlgroup *g)
|
|||
* following group, expand this group to include it. Return 0 on success or -1
|
||||
* if g cannot be slid down.
|
||||
*/
|
||||
static int group_slide_down(xdfile_t *xdf, struct xdlgroup *g, long flags)
|
||||
static int group_slide_down(xdfile_t *xdf, struct xdlgroup *g)
|
||||
{
|
||||
if (g->end < xdf->nrec &&
|
||||
recs_match(xdf->recs[g->start], xdf->recs[g->end], flags)) {
|
||||
recs_match(xdf->recs[g->start], xdf->recs[g->end])) {
|
||||
xdf->rchg[g->start++] = 0;
|
||||
xdf->rchg[g->end++] = 1;
|
||||
|
||||
|
@ -780,10 +777,10 @@ static int group_slide_down(xdfile_t *xdf, struct xdlgroup *g, long flags)
|
|||
* into a previous group, expand this group to include it. Return 0 on success
|
||||
* or -1 if g cannot be slid up.
|
||||
*/
|
||||
static int group_slide_up(xdfile_t *xdf, struct xdlgroup *g, long flags)
|
||||
static int group_slide_up(xdfile_t *xdf, struct xdlgroup *g)
|
||||
{
|
||||
if (g->start > 0 &&
|
||||
recs_match(xdf->recs[g->start - 1], xdf->recs[g->end - 1], flags)) {
|
||||
recs_match(xdf->recs[g->start - 1], xdf->recs[g->end - 1])) {
|
||||
xdf->rchg[--g->start] = 1;
|
||||
xdf->rchg[--g->end] = 0;
|
||||
|
||||
|
@ -833,7 +830,7 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
|
|||
end_matching_other = -1;
|
||||
|
||||
/* Shift the group backward as much as possible: */
|
||||
while (!group_slide_up(xdf, &g, flags))
|
||||
while (!group_slide_up(xdf, &g))
|
||||
if (group_previous(xdfo, &go))
|
||||
BUG("group sync broken sliding up");
|
||||
|
||||
|
@ -848,7 +845,7 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
|
|||
|
||||
/* Now shift the group forward as far as possible: */
|
||||
while (1) {
|
||||
if (group_slide_down(xdf, &g, flags))
|
||||
if (group_slide_down(xdf, &g))
|
||||
break;
|
||||
if (group_next(xdfo, &go))
|
||||
BUG("group sync broken sliding down");
|
||||
|
@ -875,7 +872,7 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
|
|||
* other file that it can align with.
|
||||
*/
|
||||
while (go.end == go.start) {
|
||||
if (group_slide_up(xdf, &g, flags))
|
||||
if (group_slide_up(xdf, &g))
|
||||
BUG("match disappeared");
|
||||
if (group_previous(xdfo, &go))
|
||||
BUG("group sync broken sliding to match");
|
||||
|
@ -918,7 +915,7 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
|
|||
}
|
||||
|
||||
while (g.end > best_shift) {
|
||||
if (group_slide_up(xdf, &g, flags))
|
||||
if (group_slide_up(xdf, &g))
|
||||
BUG("best shift unreached");
|
||||
if (group_previous(xdfo, &go))
|
||||
BUG("group sync broken sliding to blank line");
|
||||
|
|
|
@ -88,19 +88,14 @@ struct region {
|
|||
#define REC(env, s, l) \
|
||||
(env->xdf##s.recs[l - 1])
|
||||
|
||||
static int cmp_recs(xpparam_t const *xpp,
|
||||
xrecord_t *r1, xrecord_t *r2)
|
||||
static int cmp_recs(xrecord_t *r1, xrecord_t *r2)
|
||||
{
|
||||
return r1->ha == r2->ha &&
|
||||
xdl_recmatch(r1->ptr, r1->size, r2->ptr, r2->size,
|
||||
xpp->flags);
|
||||
return r1->ha == r2->ha;
|
||||
|
||||
}
|
||||
|
||||
#define CMP_ENV(xpp, env, s1, l1, s2, l2) \
|
||||
(cmp_recs(xpp, REC(env, s1, l1), REC(env, s2, l2)))
|
||||
|
||||
#define CMP(i, s1, l1, s2, l2) \
|
||||
(cmp_recs(i->xpp, REC(i->env, s1, l1), REC(i->env, s2, l2)))
|
||||
(cmp_recs(REC(i->env, s1, l1), REC(i->env, s2, l2)))
|
||||
|
||||
#define TABLE_HASH(index, side, line) \
|
||||
XDL_HASHLONG((REC(index->env, side, line))->ha, index->table_bits)
|
||||
|
|
|
@ -181,15 +181,11 @@ static int xdl_prepare_ctx(unsigned int pass, mmfile_t *mf, long narec, xpparam_
|
|||
if (!(recs = (xrecord_t **) xdl_malloc(narec * sizeof(xrecord_t *))))
|
||||
goto abort;
|
||||
|
||||
if (XDF_DIFF_ALG(xpp->flags) == XDF_HISTOGRAM_DIFF)
|
||||
hbits = hsize = 0;
|
||||
else {
|
||||
hbits = xdl_hashbits((unsigned int) narec);
|
||||
hsize = 1 << hbits;
|
||||
if (!(rhash = (xrecord_t **) xdl_malloc(hsize * sizeof(xrecord_t *))))
|
||||
goto abort;
|
||||
memset(rhash, 0, hsize * sizeof(xrecord_t *));
|
||||
}
|
||||
hbits = xdl_hashbits((unsigned int) narec);
|
||||
hsize = 1 << hbits;
|
||||
if (!(rhash = (xrecord_t **) xdl_malloc(hsize * sizeof(xrecord_t *))))
|
||||
goto abort;
|
||||
memset(rhash, 0, hsize * sizeof(xrecord_t *));
|
||||
|
||||
nrec = 0;
|
||||
if ((cur = blk = xdl_mmfile_first(mf, &bsize)) != NULL) {
|
||||
|
@ -208,9 +204,7 @@ static int xdl_prepare_ctx(unsigned int pass, mmfile_t *mf, long narec, xpparam_
|
|||
crec->size = (long) (cur - prev);
|
||||
crec->ha = hav;
|
||||
recs[nrec++] = crec;
|
||||
|
||||
if ((XDF_DIFF_ALG(xpp->flags) != XDF_HISTOGRAM_DIFF) &&
|
||||
xdl_classify_record(pass, cf, rhash, hbits, crec) < 0)
|
||||
if (xdl_classify_record(pass, cf, rhash, hbits, crec) < 0)
|
||||
goto abort;
|
||||
}
|
||||
}
|
||||
|
@ -219,10 +213,13 @@ static int xdl_prepare_ctx(unsigned int pass, mmfile_t *mf, long narec, xpparam_
|
|||
goto abort;
|
||||
memset(rchg, 0, (nrec + 2) * sizeof(char));
|
||||
|
||||
if (!(rindex = (long *) xdl_malloc((nrec + 1) * sizeof(long))))
|
||||
goto abort;
|
||||
if (!(ha = (unsigned long *) xdl_malloc((nrec + 1) * sizeof(unsigned long))))
|
||||
goto abort;
|
||||
if ((XDF_DIFF_ALG(xpp->flags) != XDF_PATIENCE_DIFF) &&
|
||||
(XDF_DIFF_ALG(xpp->flags) != XDF_HISTOGRAM_DIFF)) {
|
||||
if (!(rindex = xdl_malloc((nrec + 1) * sizeof(*rindex))))
|
||||
goto abort;
|
||||
if (!(ha = xdl_malloc((nrec + 1) * sizeof(*ha))))
|
||||
goto abort;
|
||||
}
|
||||
|
||||
xdf->nrec = nrec;
|
||||
xdf->recs = recs;
|
||||
|
@ -279,8 +276,7 @@ int xdl_prepare_env(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
|
|||
enl1 = xdl_guess_lines(mf1, sample) + 1;
|
||||
enl2 = xdl_guess_lines(mf2, sample) + 1;
|
||||
|
||||
if (XDF_DIFF_ALG(xpp->flags) != XDF_HISTOGRAM_DIFF &&
|
||||
xdl_init_classifier(&cf, enl1 + enl2 + 1, xpp->flags) < 0)
|
||||
if (xdl_init_classifier(&cf, enl1 + enl2 + 1, xpp->flags) < 0)
|
||||
return -1;
|
||||
|
||||
if (xdl_prepare_ctx(1, mf1, enl1, xpp, &cf, &xe->xdf1) < 0) {
|
||||
|
@ -305,8 +301,7 @@ int xdl_prepare_env(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
|
|||
return -1;
|
||||
}
|
||||
|
||||
if (XDF_DIFF_ALG(xpp->flags) != XDF_HISTOGRAM_DIFF)
|
||||
xdl_free_classifier(&cf);
|
||||
xdl_free_classifier(&cf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue