+ struct rfd_private *p = (struct rfd_private *)rfd->priv;
+ const struct rset_key_control *kctrl = rfd->rset->keycontrol;
+
+ while (p->more_l || p->more_r)
+ {
+ int cmp;
+
+ if (p->more_l && p->more_r)
+ cmp = (*kctrl->cmp)(p->buf_l, p->buf_r);
+ else if (p->more_r)
+ cmp = rfd->rset->scope;
+ else
+ cmp = -rfd->rset->scope;
+
+ if (cmp <= -rfd->rset->scope)
+ { /* cmp == -2 */
+ memcpy (buf, p->buf_l, kctrl->key_size);
+ if (term)
+ *term=p->term_l;
+ p->more_l = rset_read(p->rfd_l, p->buf_l, &p->term_l);
+ p->hits++;
+ return 1;
+ }
+ else if (cmp >= rfd->rset->scope) /* cmp >1 */
+ p->more_r = rset_forward( p->rfd_r, p->buf_r,
+ &p->term_r, p->buf_l);
+ else
+ { /* cmp== -1, 0, or 1 */
+ memcpy (buf, p->buf_l, kctrl->key_size);
+ if (term)
+ *term = p->term_l;
+ do
+ {
+ p->more_l = rset_read(p->rfd_l, p->buf_l, &p->term_l);
+ if (!p->more_l)
+ break;
+ cmp = (*kctrl->cmp)(p->buf_l, buf);
+ } while (abs(cmp)<rfd->rset->scope);
+ /* (cmp >= -1 && cmp <= 1) */
+ do
+ {
+ p->more_r = rset_read(p->rfd_r, p->buf_r, &p->term_r);
+ if (!p->more_r)
+ break;
+ cmp = (*kctrl->cmp)(p->buf_r, buf);
+ } while (abs(cmp)<rfd->rset->scope);
+ /* (cmp >= -1 && cmp <= 1) */
+ }
+ }