-
- /* forward R until past m, count levels */
-#if RSBETWEEN_DEBUG
- log2( p, "Before moving R", cmp_l, cmp_r);
-#endif
- if (p->more_r)
- cmp_r= (*info->cmp)(p->buf_r, p->buf_m);
- else
- cmp_r=2;
-#if RSBETWEEN_DEBUG
- log2( p, "after first R", cmp_l, cmp_r);
-#endif
- while (cmp_r < 0) /* r before m */
- {
- /* -2, earlier record, don't count level */
- if (cmp_r == -1)
- p->level--; /* relevant end tag */
- if (p->more_r)
- {
-#if NEWCODE
- if (cmp_r==-2)
- {
- p->more_r=rset_forward( info->rset_r, p->rfd_r,
- p->buf_r, info->cmp, p->buf_m);
- } else
- {
- p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
- }
- if (p->more_r)
- cmp_r= (*info->cmp)(p->buf_r, p->buf_m);
-
-#else
- p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
- cmp_r= (*info->cmp)(p->buf_r, p->buf_m);
-#endif
- }
- else
- cmp_r=2;
-#if RSBETWEEN_DEBUG
- log2( p, "End of R loop", cmp_l, cmp_r);
-#endif
- } /* forward R */
-
- if ( ( p->level <= 0 ) && ! p->more_l)
- return 0; /* no more start tags, nothing more to find */
-
- if ( attr_match && p->level > 0) /* within a tag pair (or deeper) */
- {
- memcpy (buf, p->buf_m, info->key_size);
-#if RSBETWEEN_DEBUG
- log2( p, "Returning a hit (and forwarding m)", cmp_l, cmp_r);
-#endif
- p->more_m = rset_read (info->rset_m, p->rfd_m, p->buf_m);
- if (cmp_l == 2)
- p->level = 0;
- p->hits++;
- return 1;