X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=rset%2Frsbetween.c;h=83867fb7a258e7099569d797224d33375890933e;hb=cc9f94a61cbd9dcc0df0cf7d0c7c41d2cec88189;hp=17b26b5a5d00886a070f30b1a86e5e8023a27f4b;hpb=71e41c3f5146a6f783fbae7e59776bcdd4e3c4c8;p=idzebra-moved-to-github.git diff --git a/rset/rsbetween.c b/rset/rsbetween.c index 17b26b5..83867fb 100644 --- a/rset/rsbetween.c +++ b/rset/rsbetween.c @@ -1,9 +1,9 @@ /* * Copyright (C) 1994-2002, Index Data * All rights reserved. - * Sebastian Hammer, Adam Dickmeiss, Heikki Levanto + * Heikki Levanto * - * $Id: rsbetween.c,v 1.1 2002-04-09 15:24:13 heikki Exp $ + * $Id: rsbetween.c,v 1.5 2002-04-12 15:25:03 heikki Exp $ */ #include @@ -14,26 +14,26 @@ #include #include -static void *r_create(RSET ct, const struct rset_control *sel, void *parms); -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_count (RSET ct); -static int r_read (RSFD rfd, void *buf, int *term_index); -static int r_write (RSFD rfd, const void *buf); +static void *r_create_between(RSET ct, const struct rset_control *sel, void *parms); +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_count_between (RSET ct); +static int r_read_between (RSFD rfd, void *buf, int *term_index); +static int r_write_between (RSFD rfd, const void *buf); static const struct rset_control control_between = { "between", - r_create, - r_open, - r_close, - r_delete, - r_rewind, - r_count, - r_read, - r_write, + r_create_between, + r_open_between, + r_close_between, + r_delete_between, + r_rewind_between, + r_count_between, + r_read_between, + r_write_between, }; @@ -46,6 +46,7 @@ struct rset_between_info { RSET rset_r; int term_index_s; int (*cmp)(const void *p1, const void *p2); + char *(*printer)(const void *p1, char *buf); struct rset_between_rfd *rfd_list; }; @@ -67,7 +68,7 @@ struct rset_between_rfd { struct rset_between_info *info; }; -static void *r_create (RSET ct, const struct rset_control *sel, void *parms) +static void *r_create_between (RSET ct, const struct rset_control *sel, void *parms) { rset_between_parms *between_parms = (rset_between_parms *) parms; struct rset_between_info *info; @@ -82,6 +83,7 @@ static void *r_create (RSET ct, const struct rset_control *sel, void *parms) rset_is_volatile(info->rset_r)) ct->flags |= RSET_FLAG_VOLATILE; info->cmp = between_parms->cmp; + info->printer = between_parms->printer; info->rfd_list = NULL; info->term_index_s = info->rset_l->no_rset_terms; @@ -104,7 +106,7 @@ static void *r_create (RSET ct, const struct rset_control *sel, void *parms) return info; } -static RSFD r_open (RSET ct, int flag) +static RSFD r_open_between (RSET ct, int flag) { struct rset_between_info *info = (struct rset_between_info *) ct->buf; struct rset_between_rfd *rfd; @@ -135,7 +137,7 @@ static RSFD r_open (RSET ct, int flag) return rfd; } -static void r_close (RSFD rfd) +static void r_close_between (RSFD rfd) { struct rset_between_info *info = ((struct rset_between_rfd*)rfd)->info; struct rset_between_rfd **rfdp; @@ -153,11 +155,11 @@ static void r_close (RSFD rfd) xfree (rfd); return; } - logf (LOG_FATAL, "r_close but no rfd match!"); + logf (LOG_FATAL, "r_close_between but no rfd match!"); assert (0); } -static void r_delete (RSET ct) +static void r_delete_between (RSET ct) { struct rset_between_info *info = (struct rset_between_info *) ct->buf; @@ -169,7 +171,7 @@ static void r_delete (RSET ct) xfree (info); } -static void r_rewind (RSFD rfd) +static void r_rewind_between (RSFD rfd) { struct rset_between_info *info = ((struct rset_between_rfd*)rfd)->info; struct rset_between_rfd *p = (struct rset_between_rfd *) rfd; @@ -184,27 +186,41 @@ static void r_rewind (RSFD rfd) p->level=0; } -static int r_count (RSET ct) +static int r_count_between (RSET ct) { return 0; } -static int r_read (RSFD rfd, void *buf, int *term_index) +static void logit( struct rset_between_info *info, char *prefix, void *l, void *m, void *r) +{ + char buf_l[32]; + char buf_m[32]; + char buf_r[32]; + logf(LOG_DEBUG,"btw: %s l=%s m=%s r=%s", + prefix, + (*info->printer)(l, buf_l), + (*info->printer)(m, buf_m), + (*info->printer)(r, buf_r) ); +} + +static int r_read_between (RSFD rfd, void *buf, int *term_index) { struct rset_between_rfd *p = (struct rset_between_rfd *) rfd; struct rset_between_info *info = p->info; int cmp_l; int cmp_r; - while (p->more_m) { + logit( info, "start of loop", p->buf_l, p->buf_m, p->buf_r); /* forward L until past m, count levels, note rec boundaries */ if (p->more_l) cmp_l= (*info->cmp)(p->buf_l, p->buf_m); else cmp_l=2; /* past this record */ + logf(LOG_DEBUG, "cmp_l=%d", cmp_l); + while (cmp_l < 0) /* l before m */ { if (cmp_l == -2) @@ -216,6 +232,8 @@ static int r_read (RSFD rfd, void *buf, int *term_index) p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l, &p->term_index_l); cmp_l= (*info->cmp)(p->buf_l, p->buf_m); + logit( info, "forwarded L", p->buf_l, p->buf_m, p->buf_r); + logf(LOG_DEBUG, " cmp_l=%d", cmp_l); } else cmp_l=2; @@ -226,6 +244,7 @@ static int r_read (RSFD rfd, void *buf, int *term_index) cmp_r= (*info->cmp)(p->buf_r, p->buf_m); else cmp_r=2; + logf(LOG_DEBUG, "cmp_r=%d", cmp_r); while (cmp_r < 0) /* r before m */ { /* -2, earlier record, doesn't matter */ @@ -236,6 +255,8 @@ static int r_read (RSFD rfd, void *buf, int *term_index) p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r, &p->term_index_r); cmp_r= (*info->cmp)(p->buf_r, p->buf_m); + logit( info, "forwarded R", p->buf_l, p->buf_m, p->buf_r); + logf(LOG_DEBUG, " cmp_r=%d", cmp_r); } else cmp_r=2; @@ -248,6 +269,9 @@ static int r_read (RSFD rfd, void *buf, int *term_index) { memcpy (buf, p->buf_m, info->key_size); *term_index = p->term_index_m; + logit( info, "Returning a hit (m)", p->buf_l, p->buf_m, p->buf_r); + p->more_m = rset_read (info->rset_m, p->rfd_m, p->buf_m, + &p->term_index_m); return 1; } else @@ -258,12 +282,14 @@ static int r_read (RSFD rfd, void *buf, int *term_index) &p->term_index_m); } /* while more_m */ + logf(LOG_DEBUG,"Exiting, no more stuff in m"); return 0; /* no more data possible */ + } /* r_read */ -static int r_write (RSFD rfd, const void *buf) +static int r_write_between (RSFD rfd, const void *buf) { logf (LOG_FATAL, "between set type is read-only"); return -1;