-/* $Id: rset.h,v 1.34 2004-09-09 10:08:04 heikki Exp $
+/* $Id: rset.h,v 1.35 2004-09-28 16:39:46 heikki Exp $
Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002
Index Data Aps
int scope,
RSET rset_l, RSET rset_r);
-RSET rsbetween_create( NMEM nmem, const struct key_control *kcontrol,
+RSET rsbetween_create( NMEM nmem, const struct key_control *kcontrol,
int scope,
RSET rset_l, RSET rset_m, RSET rset_r,
RSET rset_attr);
-RSET rsmultior_create( NMEM nmem, const struct key_control *kcontrol,
+RSET rsmultior_create( NMEM nmem, const struct key_control *kcontrol,
int scope,
- int no_rsets, RSET* rsets);
+ int no_rsets, RSET* rsets);
+
+RSET rsmultiand_create( NMEM nmem, const struct key_control *kcontrol,
+ int scope,
+ int no_rsets, RSET* rsets);
RSET rsprox_create( NMEM nmem, const struct key_control *kcontrol,
int scope,
-/* $Id: zrpn.c,v 1.153 2004-09-15 08:13:51 adam Exp $
+/* $Id: zrpn.c,v 1.154 2004-09-28 16:39:46 heikki Exp $
Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004
Index Data Aps
NMEM rset_nmem)
{
char term_dst[IT_MAX_WORD+1];
- RSET rset[60], result;
- int i, rset_no = 0;
+ RSET rset[60]; /* FIXME - bug 160 - should be dynamic somehow */
+ int rset_no = 0;
struct grep_info grep_info;
char *termz = normalize_term(zh, zapt, termz_org, stream, reg_type);
const char *termp = termz;
grep_info_delete (&grep_info);
if (rset_no == 0)
return rsnull_create (rset_nmem,key_it_ctrl);
- result = rset[0];
- /* FIXME - Use a proper rsmultiand */
- for (i = 1; i<rset_no; i++)
- result= rsbool_create_and(rset_nmem,key_it_ctrl,key_it_ctrl->scope,
- result, rset[i] );
- return result;
+
+ return rsmultiand_create( rset_nmem, key_it_ctrl, key_it_ctrl->scope,
+ rset_no, rset);
}
static int numeric_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt,
-/* $Id: rsmultiandor.c,v 1.2 2004-09-28 16:12:42 heikki Exp $
+/* $Id: rsmultiandor.c,v 1.3 2004-09-28 16:39:46 heikki Exp $
Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002
Index Data Aps
static int r_forward_and(RSFD rfd, void *buf, const void *untilbuf)
-{
- return 0;
+{
+ struct rset_multiandor_rfd *p=rfd->priv;
+ const struct key_control *kctrl=rfd->rset->keycontrol;
+ struct rset_multiandor_info *info=rfd->rset->priv;
+ int i;
+ int cmp;
+ int killtail=0;
+
+ for (i=0; i<info->no_rsets;i++)
+ {
+ cmp=(*kctrl->cmp)(p->items[i].buf,untilbuf);
+ if ( cmp <= -rfd->rset->scope )
+ {
+ killtail=1; /* we are moving to a different hit */
+ if (!rset_forward(p->items[i].fd, p->items[i].buf,
+ untilbuf))
+ {
+ p->eof=1; /* game over */
+ p->tailcount=0;
+ return 0;
+ }
+ }
+ }
+ if (killtail)
+ {
+ for (i=0; i<info->no_rsets;i++)
+ p->tailbits[i]=0;
+ p->tailcount=0;
+ }
+ return r_read_and(rfd,buf);
}
static void r_pos (RSFD rfd, double *current, double *total)