X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=rset%2Frsprox.c;h=1089de97aace379193a4438d17f00a8f9dec9626;hb=6ec32a146d639c16e9929435fdbfd8d915e918b3;hp=558d03089a90cdf6fce705924cc18caedc4eba87;hpb=56131846f59919027a4d3c59efb485afb6efb0de;p=idzebra-moved-to-github.git diff --git a/rset/rsprox.c b/rset/rsprox.c index 558d030..1089de9 100644 --- a/rset/rsprox.c +++ b/rset/rsprox.c @@ -1,4 +1,4 @@ -/* $Id: rsprox.c,v 1.14 2004-09-01 15:01:32 heikki Exp $ +/* $Id: rsprox.c,v 1.17 2004-09-30 09:53:05 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -35,7 +35,6 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA static RSFD r_open (RSET ct, int flag); static void r_close (RSFD rfd); static void r_delete (RSET ct); -static void r_rewind (RSFD rfd); static int r_forward(RSFD rfd, void *buf, const void *untilbuf); static int r_read (RSFD rfd, void *buf); static int r_write (RSFD rfd, const void *buf); @@ -47,7 +46,6 @@ static const struct rset_control control = r_delete, r_open, r_close, - r_rewind, r_forward, r_pos, r_read, @@ -73,12 +71,12 @@ struct rset_prox_rfd { }; -RSET rsprox_create( NMEM nmem, const struct key_control *kcontrol, +RSET rsprox_create( NMEM nmem, const struct key_control *kcontrol, int scope, int rset_no, RSET *rset, int ordered, int exclusion, int relation, int distance) { - RSET rnew=rset_create_base(&control, nmem, kcontrol); + RSET rnew=rset_create_base(&control, nmem, kcontrol, scope); struct rset_prox_info *info; info = (struct rset_prox_info *) nmem_malloc(rnew->nmem,sizeof(*info)); info->rset = nmem_malloc(rnew->nmem,rset_no * sizeof(*info->rset)); @@ -150,22 +148,6 @@ static void r_close (RSFD rfd) rfd_delete_base(rfd); } -static void r_rewind (RSFD rfd) -{ - struct rset_prox_info *info = (struct rset_prox_info *)(rfd->rset->priv); - struct rset_prox_rfd *p=(struct rset_prox_rfd *)(rfd->priv); - int i; - - logf (LOG_DEBUG, "rsprox_rewind"); - - for (i = 0; i < info->rset_no; i++) - { - rset_rewind (p->rfd[i]); - p->more[i] = rset_read (p->rfd[i], p->buf[i]); - } - p->hits=0; -} - static int r_forward (RSFD rfd, void *buf, const void *untilbuf) { struct rset_prox_info *info = (struct rset_prox_info *)(rfd->rset->priv); @@ -177,7 +159,8 @@ static int r_forward (RSFD rfd, void *buf, const void *untilbuf) if (untilbuf) { /* it is enough to forward first one. Other will follow. */ - if ( p->more[0] && ((kctrl->cmp)(untilbuf, p->buf[0]) >= 2) ) + if ( p->more[0] && /* was: cmp >=2 */ + ((kctrl->cmp)(untilbuf, p->buf[0]) >= rfd->rset->scope) ) p->more[0] = rset_forward(p->rfd[0], p->buf[0], untilbuf); } if (info->ordered && info->relation == 3 && info->exclusion == 0 @@ -193,14 +176,14 @@ static int r_forward (RSFD rfd, void *buf, const void *untilbuf) break; } cmp = (*kctrl->cmp) (p->buf[i], p->buf[i-1]); - if (cmp > 1) + if (cmp >= rfd->rset->scope ) /* cmp>1 */ { p->more[i-1] = rset_forward (p->rfd[i-1], p->buf[i-1], p->buf[i]); break; } - else if (cmp == 1) + else if ( cmp>0 ) /* cmp == 1*/ { if ((*kctrl->getseq)(p->buf[i-1]) +1 != (*kctrl->getseq)(p->buf[i])) @@ -230,13 +213,12 @@ static int r_forward (RSFD rfd, void *buf, const void *untilbuf) while (p->more[0] && p->more[1]) { int cmp = (*kctrl->cmp)(p->buf[0], p->buf[1]); - if (cmp < -1) + if ( cmp <= - rfd->rset->scope) /* cmp<-1*/ p->more[0] = rset_forward (p->rfd[0], - p->buf[0], p->buf[0]); - /* FIXME - this certainly looks wrong! */ - else if (cmp > 1) + p->buf[0], p->buf[1]); + else if ( cmp >= rfd->rset->scope ) /* cmp>1 */ p->more[1] = rset_forward (p->rfd[1], - p->buf[1], p->buf[1]); + p->buf[1], p->buf[0]); else { zint seqno[500]; /* FIXME - why 500 ?? */