Added a missing config file
[idzebra-moved-to-github.git] / rset / rsbetween.c
index 63901cd..d099701 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: rsbetween.c,v 1.25 2004-09-09 10:08:06 heikki Exp $
+/* $Id: rsbetween.c,v 1.28 2004-10-22 10:12:51 heikki Exp $
    Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002
    Index Data Aps
 
@@ -43,19 +43,20 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 static RSFD r_open_between (RSET ct, int flag);
 static void r_close_between (RSFD rfd);
 static void r_delete_between (RSET ct);
-static void r_rewind_between (RSFD rfd);
-static int r_forward_between(RSFD rfd, void *buf, const void *untilbuf);
-static int r_read_between (RSFD rfd, void *buf);
+static int r_forward_between(RSFD rfd, void *buf, 
+                    TERMID *term, const void *untilbuf);
+static int r_read_between (RSFD rfd, void *buf, TERMID *term );
 static int r_write_between (RSFD rfd, const void *buf);
 static void r_pos_between (RSFD rfd, double *current, double *total);
+static void r_get_terms(RSET ct, TERMID *terms, int maxterms, int *curterm);
 
 static const struct rset_control control = 
 {
     "between",
     r_delete_between,
+    r_get_terms,
     r_open_between,
     r_close_between,
-    r_rewind_between,
     r_forward_between, 
     r_pos_between,
     r_read_between,
@@ -85,6 +86,7 @@ struct rset_between_rfd {
     void *buf_m;
     void *buf_r;
     void *buf_attr;
+    TERMID term_m; /* we only return terms for the mid argument */
     int level;  /* counting start/end tags */
     zint hits;
 };    
@@ -108,7 +110,7 @@ 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 rnew=rset_create_base(&control, nmem, kcontrol, scope);
+    RSET rnew=rset_create_base(&control, nmem, kcontrol, scope,0);
     struct rset_between_info *info=
         (struct rset_between_info *) nmem_malloc(rnew->nmem,sizeof(*info));
     info->rset_l = rset_l;
@@ -159,13 +161,13 @@ static RSFD r_open_between (RSET ct, int flag)
     p->rfd_m = rset_open (info->rset_m, RSETF_READ);
     p->rfd_r = rset_open (info->rset_r, RSETF_READ);
     
-    p->more_l = rset_read (p->rfd_l, p->buf_l);
-    p->more_m = rset_read (p->rfd_m, p->buf_m);
-    p->more_r = rset_read (p->rfd_r, p->buf_r);
+    p->more_l = rset_read (p->rfd_l, p->buf_l,NULL);
+    p->more_m = rset_read (p->rfd_m, p->buf_m, &p->term_m);
+    p->more_r = rset_read (p->rfd_r, p->buf_r,NULL);
     if (info->rset_attr)
     {
         p->rfd_attr = rset_open (info->rset_attr, RSETF_READ);
-        p->more_attr = rset_read (p->rfd_attr, p->buf_attr);
+        p->more_attr = rset_read (p->rfd_attr, p->buf_attr, NULL);
     }
     p->level=0;
     p->hits=0;
@@ -185,32 +187,10 @@ static void r_close_between (RSFD rfd)
     rfd_delete_base(rfd);
 }
 
-static void r_rewind_between (RSFD rfd)
-{
-    struct rset_between_info *info =(struct rset_between_info *)rfd->rset->priv;
-    struct rset_between_rfd *p=(struct rset_between_rfd *)rfd->priv;
-
-#if RSBETWEEN_DEBUG
-    logf (LOG_DEBUG, "rsbetween_rewind");
-#endif
-    rset_rewind (p->rfd_l);
-    rset_rewind (p->rfd_m);
-    rset_rewind (p->rfd_r);
-    p->more_l = rset_read (p->rfd_l, p->buf_l);
-    p->more_m = rset_read (p->rfd_m, p->buf_m);
-    p->more_r = rset_read (p->rfd_r, p->buf_r);
-    if (info->rset_attr)
-    {
-        rset_rewind (p->rfd_attr);
-        p->more_attr = rset_read (p->rfd_attr, p->buf_attr);
-    }
-    p->level=0;
-    p->hits=0;
-}
 
 
-
-static int r_forward_between(RSFD rfd, void *buf, const void *untilbuf)
+static int r_forward_between(RSFD rfd, void *buf, 
+                             TERMID *term, const void *untilbuf)
 {
     struct rset_between_rfd *p=(struct rset_between_rfd *)rfd->priv;
     int rc;
@@ -220,11 +200,11 @@ static int r_forward_between(RSFD rfd, void *buf, const void *untilbuf)
     /* It is enough to forward the m pointer here, the read will */
     /* naturally forward the l, m, and attr pointers */
     if (p->more_m)
-        p->more_m=rset_forward(p->rfd_m, p->buf_m,untilbuf);
+        p->more_m=rset_forward(p->rfd_m, p->buf_m, term, untilbuf);
 #if RSBETWEEN_DEBUG
     log2( p, "fwd: after forward M", 0,0);
 #endif
-    rc = r_read_between(rfd, buf);
+    rc = r_read_between(rfd, buf, term);
 #if RSBETWEEN_DEBUG
     log2( p, "fwd: after forward", 0,0);
 #endif
@@ -234,7 +214,7 @@ static int r_forward_between(RSFD rfd, void *buf, const void *untilbuf)
 
 
 
-static int r_read_between (RSFD rfd, void *buf)
+static int r_read_between (RSFD rfd, void *buf, TERMID *term)
 {
     struct rset_between_info *info =(struct rset_between_info *)rfd->rset->priv;
     struct rset_between_rfd *p=(struct rset_between_rfd *)rfd->priv;
@@ -286,14 +266,15 @@ static int r_read_between (RSFD rfd, void *buf)
                         else if (cmp_attr > 0)
                             break;
                         else if (cmp_attr > - rfd->rset->scope)  /* == -1 */
-                            p->more_attr = rset_read (p->rfd_attr, p->buf_attr);
+                            p->more_attr = rset_read (p->rfd_attr, 
+                                                      p->buf_attr,NULL);
                             /* if we had a forward that went all the way to
                              * the seqno, we could use that. But fwd only goes
                              * to the sysno */
                         else if (cmp_attr <= - rfd->rset->scope) /* ==-2 */
                         {
                             p->more_attr = rset_forward( p->rfd_attr,
-                                             p->buf_attr, p->buf_l);
+                                             p->buf_attr, NULL, p->buf_l);
 #if RSBETWEEN_DEBUG
                             logf(LOG_DEBUG, "btw: after frowarding attr m=%d",
                                       p->more_attr);
@@ -308,7 +289,7 @@ static int r_read_between (RSFD rfd, void *buf)
             {
                 if (p->more_l) 
                 {
-                    p->more_l=rset_forward(p->rfd_l, p->buf_l, p->buf_m);
+                    p->more_l=rset_forward(p->rfd_l, p->buf_l, NULL, p->buf_m);
                     if (p->more_l)
                         cmp_l= (*kctrl->cmp)(p->buf_l, p->buf_m);
                     else
@@ -319,10 +300,10 @@ static int r_read_between (RSFD rfd, void *buf)
                 }
             } else
             {
-                p->more_l = rset_read (p->rfd_l, p->buf_l);
+                p->more_l = rset_read (p->rfd_l, p->buf_l, NULL);
             }
 #else
-            p->more_l = rset_read (p->rfd_l, p->buf_l);
+            p->more_l = rset_read (p->rfd_l, p->buf_l, NULL);
 #endif
             if (p->more_l)
             {
@@ -357,16 +338,16 @@ static int r_read_between (RSFD rfd, void *buf)
 #if NEWCODE                
                 if (cmp_r <= - rfd->rset->scope) /* == -2 */
                 {
-                    p->more_r=rset_forward(p->rfd_r, p->buf_r, p->buf_m);
+                    p->more_r=rset_forward(p->rfd_r, p->buf_r, NULL, p->buf_m);
                 } else
                 {
-                    p->more_r = rset_read (p->rfd_r, p->buf_r);
+                    p->more_r = rset_read (p->rfd_r, p->buf_r, NULL);
                 }
                 if (p->more_r)
                     cmp_r= (*kctrl->cmp)(p->buf_r, p->buf_m);
 
 #else
-                p->more_r = rset_read (p->rfd_r, p->buf_r);
+                p->more_r = rset_read (p->rfd_r, p->buf_r, NULL);
                 cmp_r= (*kctrl->cmp)(p->buf_r, p->buf_m);
 #endif
             }
@@ -383,10 +364,12 @@ static int r_read_between (RSFD rfd, void *buf)
         if ( attr_match && p->level > 0)  /* within a tag pair (or deeper) */
         {
             memcpy (buf, p->buf_m, kctrl->key_size);
+            if (term)
+                *term=p->term_m;
 #if RSBETWEEN_DEBUG
             log2( p, "Returning a hit (and forwarding m)", cmp_l, cmp_r);
 #endif
-            p->more_m = rset_read (p->rfd_m, p->buf_m);
+            p->more_m = rset_read (p->rfd_m, p->buf_m, NULL);
             if (cmp_l >= rfd->rset->scope)  /* == 2 */
                 p->level = 0;
             p->hits++;
@@ -403,10 +386,10 @@ static int r_read_between (RSFD rfd, void *buf)
         if (cmp_l >= rfd->rset->scope) /* == 2 */
         {
             p->level = 0;
-            p->more_m=rset_forward(p->rfd_m, p->buf_m,  p->buf_l);
+            p->more_m=rset_forward(p->rfd_m, p->buf_m, &p->term_m, p->buf_l);
         } else
         {
-            p->more_m = rset_read (p->rfd_m, p->buf_m);
+            p->more_m = rset_read (p->rfd_m, p->buf_m, &p->term_m);
         }
 #else
         if (cmp_l >= rfd->rset->scope )  /* == 2 */
@@ -466,3 +449,10 @@ static void r_pos_between (RSFD rfd, double *current, double *total)
                     *current, *total, r);
 #endif
 }
+
+static void r_get_terms(RSET ct, TERMID *terms, int maxterms, int *curterm)
+{
+    struct rset_between_info *info = (struct rset_between_info *) ct->priv;
+    rset_getterms(info->rset_m, terms, maxterms, curterm);
+}
+