X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=rset%2Frsmultior.c;h=cf2e29872e6baf93d3707852405060b73db64b01;hb=ec214819d7b9e2f5c362584d8e38f83e13aae600;hp=38c0d94ef4dcf6e132ab3eda4f37f6d962e7ef03;hpb=863d336f803da454e03f39ee2225719fed05021e;p=idzebra-moved-to-github.git diff --git a/rset/rsmultior.c b/rset/rsmultior.c index 38c0d94..cf2e298 100644 --- a/rset/rsmultior.c +++ b/rset/rsmultior.c @@ -1,4 +1,4 @@ -/* $Id: rsmultior.c,v 1.4 2004-08-20 14:44:46 heikki Exp $ +/* $Id: rsmultior.c,v 1.6 2004-08-24 14:25:16 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -32,7 +32,6 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #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); @@ -47,7 +46,6 @@ static void r_pos (RSFD rfd, double *current, double *total); static const struct rset_control control = { "multi-or", - r_create, r_open, r_close, r_delete, @@ -219,13 +217,39 @@ static void heap_destroy (HEAP h) } +RSET rsmultior_create( NMEM nmem, int key_size, + int (*cmp)(const void *p1, const void *p2), + int no_rsets, RSET* rsets) +{ + RSET rnew=rset_create_base(&control, nmem); + struct rset_multior_info *info; + info = (struct rset_multior_info *) nmem_malloc(rnew->nmem,sizeof(*info)); + info->key_size = key_size; + info->cmp = cmp; + info->no_rsets=no_rsets; + info->rsets=(RSET*)nmem_malloc(rnew->nmem, no_rsets*sizeof(*rsets)); + memcpy(info->rsets,rsets,no_rsets*sizeof(*rsets)); + info->rfd_list = NULL; + rnew->priv=info; + return rnew; +} + +static void r_delete (RSET ct) +{ + struct rset_multior_info *info = (struct rset_multior_info *) ct->priv; + int i; + + assert (info->rfd_list == NULL); + for(i=0;ino_rsets;i++) + rset_delete(info->rsets[i]); +/* xfree(info->rsets); */ /* nmem'd */ +/* xfree(info); */ /* nmem'd */ +} +#if 0 static void *r_create (RSET ct, const struct rset_control *sel, void *parms) { rset_multior_parms *r_parms = (rset_multior_parms *) parms; struct rset_multior_info *info; - - ct->flags |= RSET_FLAG_VOLATILE; - /* FIXME - Remove the whole flags thing, from all rsets */ info = (struct rset_multior_info *) xmalloc (sizeof(*info)); info->key_size = r_parms->key_size; assert (info->key_size > 1); @@ -235,11 +259,12 @@ static void *r_create (RSET ct, const struct rset_control *sel, void *parms) info->rfd_list=0; return info; } +#endif static RSFD r_open (RSET ct, int flag) { struct rset_multior_rfd *rfd; - struct rset_multior_info *info = (struct rset_multior_info *) ct->buf; + struct rset_multior_info *info = (struct rset_multior_info *) ct->priv; int i; if (flag & RSETF_WRITE) @@ -296,17 +321,6 @@ static void r_close (RSFD rfd) assert (0); } -static void r_delete (RSET ct) -{ - struct rset_multior_info *info = (struct rset_multior_info *) ct->buf; - int i; - - assert (info->rfd_list == NULL); - for(i=0;ino_rsets;i++) - rset_delete(info->rsets[i]); - xfree(info->rsets); - xfree(info); -} static void r_rewind (RSFD rfd) {