X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=rset%2Frsbetween.c;h=49346fb1f3841df8a9f1554db00d047703a82305;hb=ec214819d7b9e2f5c362584d8e38f83e13aae600;hp=4249c7e379fdb4ff056c04c9e9569a1deb96414e;hpb=863d336f803da454e03f39ee2225719fed05021e;p=idzebra-moved-to-github.git diff --git a/rset/rsbetween.c b/rset/rsbetween.c index 4249c7e..49346fb 100644 --- a/rset/rsbetween.c +++ b/rset/rsbetween.c @@ -1,4 +1,4 @@ -/* $Id: rsbetween.c,v 1.18 2004-08-20 14:44:46 heikki Exp $ +/* $Id: rsbetween.c,v 1.21 2004-08-24 15:00:16 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -40,7 +40,6 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #define RSBETWEEN_DEBUG 0 -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); @@ -52,10 +51,9 @@ static int r_read_between (RSFD rfd, void *buf); static int r_write_between (RSFD rfd, const void *buf); static void r_pos_between (RSFD rfd, double *current, double *total); -static const struct rset_control control_between = +static const struct rset_control control = { "between", - r_create_between, r_open_between, r_close_between, r_delete_between, @@ -67,7 +65,7 @@ static const struct rset_control control_between = }; -const struct rset_control *rset_kind_between = &control_between; +const struct rset_control *rset_kind_between = &control; struct rset_between_info { int key_size; @@ -114,6 +112,28 @@ static void log2 (struct rset_between_rfd *p, char *msg, int cmp_l, int cmp_r) } #endif +RSET rsbetween_create( NMEM nmem, int key_size, + int (*cmp)(const void *p1, const void *p2), + RSET rset_l, RSET rset_m, RSET rset_r, RSET rset_attr, + char *(*printer)(const void *p1, char *buf) ) +{ + RSET rnew=rset_create_base(&control, nmem); + struct rset_between_info *info; + info = (struct rset_between_info *) nmem_malloc(rnew->nmem,sizeof(*info)); + info->key_size = key_size; + info->rset_l = rset_l; + info->rset_m = rset_m; + info->rset_r = rset_r; + info->rset_attr = rset_attr; + info->cmp = cmp; + info->printer = printer; + info->rfd_list = NULL; + + rnew->priv=info; + return rnew; +} + +/* static void *r_create_between (RSET ct, const struct rset_control *sel, void *parms) { @@ -126,19 +146,30 @@ static void *r_create_between (RSET ct, const struct rset_control *sel, info->rset_m = between_parms->rset_m; info->rset_r = between_parms->rset_r; info->rset_attr = between_parms->rset_attr; - if (rset_is_volatile(info->rset_l) || - rset_is_volatile(info->rset_m) || - 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; return info; } +*/ + + +static void r_delete_between (RSET ct) +{ + struct rset_between_info *info = (struct rset_between_info *) ct->priv; + + assert (info->rfd_list == NULL); + rset_delete (info->rset_l); + rset_delete (info->rset_m); + rset_delete (info->rset_r); + if (info->rset_attr) + rset_delete (info->rset_attr); +} + static RSFD r_open_between (RSET ct, int flag) { - struct rset_between_info *info = (struct rset_between_info *) ct->buf; + struct rset_between_info *info = (struct rset_between_info *) ct->priv; struct rset_between_rfd *rfd; if (flag & RSETF_WRITE) @@ -146,15 +177,15 @@ static RSFD r_open_between (RSET ct, int flag) logf (LOG_FATAL, "between set type is read-only"); return NULL; } - rfd = (struct rset_between_rfd *) xmalloc (sizeof(*rfd)); + rfd = (struct rset_between_rfd *) nmem_malloc(ct->nmem, (sizeof(*rfd))); rfd->next = info->rfd_list; info->rfd_list = rfd; rfd->info = info; - rfd->buf_l = xmalloc (info->key_size); - rfd->buf_m = xmalloc (info->key_size); - rfd->buf_r = xmalloc (info->key_size); - rfd->buf_attr = xmalloc (info->key_size); + rfd->buf_l = nmem_malloc(ct->nmem, (info->key_size)); + rfd->buf_m = nmem_malloc(ct->nmem, (info->key_size)); + rfd->buf_r = nmem_malloc(ct->nmem, (info->key_size)); + rfd->buf_attr = nmem_malloc(ct->nmem, (info->key_size)); rfd->rfd_l = rset_open (info->rset_l, RSETF_READ); rfd->rfd_m = rset_open (info->rset_m, RSETF_READ); @@ -182,10 +213,6 @@ static void r_close_between (RSFD rfd) for (rfdp = &info->rfd_list; *rfdp; rfdp = &(*rfdp)->next) if (*rfdp == rfd) { - xfree ((*rfdp)->buf_l); - xfree ((*rfdp)->buf_m); - xfree ((*rfdp)->buf_r); - xfree ((*rfdp)->buf_attr); rset_close (info->rset_l, (*rfdp)->rfd_l); rset_close (info->rset_m, (*rfdp)->rfd_m); rset_close (info->rset_r, (*rfdp)->rfd_r); @@ -193,26 +220,12 @@ static void r_close_between (RSFD rfd) rset_close (info->rset_attr, (*rfdp)->rfd_attr); *rfdp = (*rfdp)->next; - xfree (rfd); return; } logf (LOG_FATAL, "r_close_between but no rfd match!"); assert (0); } -static void r_delete_between (RSET ct) -{ - struct rset_between_info *info = (struct rset_between_info *) ct->buf; - - assert (info->rfd_list == NULL); - rset_delete (info->rset_l); - rset_delete (info->rset_m); - rset_delete (info->rset_r); - if (info->rset_attr) - rset_delete (info->rset_attr); - xfree (info); -} - static void r_rewind_between (RSFD rfd) { struct rset_between_info *info = ((struct rset_between_rfd*)rfd)->info;