From: Heikki Levanto Date: Wed, 1 Sep 2004 15:01:32 +0000 (+0000) Subject: Using the key_control block for the first key-handling functions in all X-Git-Tag: snippet.version.1~375 X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=commitdiff_plain;h=56131846f59919027a4d3c59efb485afb6efb0de Using the key_control block for the first key-handling functions in all rsets. Fixed a few missed zints in rsprox. general cleaning --- diff --git a/include/rsbetween.h b/include/rsbetween.h index a6f117d..94fec58 100644 --- a/include/rsbetween.h +++ b/include/rsbetween.h @@ -1,4 +1,4 @@ -/* $Id: rsbetween.h,v 1.6 2004-08-24 14:25:15 heikki Exp $ +/* $Id: rsbetween.h,v 1.7 2004-09-01 15:01:32 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -31,6 +31,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA extern "C" { #endif +#error "do not use rsbetween.h, it all is in rset.h" 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, diff --git a/include/rsbool.h b/include/rsbool.h index fe5efd3..f2bf339 100644 --- a/include/rsbool.h +++ b/include/rsbool.h @@ -1,4 +1,4 @@ -/* $Id: rsbool.h,v 1.10 2004-08-24 14:25:15 heikki Exp $ +/* $Id: rsbool.h,v 1.11 2004-09-01 15:01:32 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -29,6 +29,8 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA extern "C" { #endif +#error "rsbool.h no longer needed, use rset.h insted" + RSET rsbool_create_and( NMEM nmem, int key_size, int (*cmp)(const void *p1, const void *p2), RSET rset_l, RSET rset_r, diff --git a/include/rset.h b/include/rset.h index 4517ba9..e0838e3 100644 --- a/include/rset.h +++ b/include/rset.h @@ -1,4 +1,4 @@ -/* $Id: rset.h,v 1.32 2004-08-31 10:43:35 heikki Exp $ +/* $Id: rset.h,v 1.33 2004-09-01 15:01:32 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -27,6 +27,12 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include +/* unfortunately we need the isam includes here, for the arguments for */ +/* rsisamX_create */ +#include +#include +#include + #ifdef __cplusplus extern "C" { #endif @@ -49,9 +55,7 @@ struct rset_control RSFD (*f_open)(RSET ct, int wflag); void (*f_close)(RSFD rfd); void (*f_rewind)(RSFD rfd); - int (*f_forward)(RSFD rfd, void *buf, - int (*cmpfunc)(const void *p1, const void *p2), - const void *untilbuf); + int (*f_forward)(RSFD rfd, void *buf, const void *untilbuf); void (*f_pos)(RSFD rfd, double *current, double *total); /* returns -1,-1 if pos function not implemented for this type */ int (*f_read)(RSFD rfd, void *buf); @@ -59,13 +63,22 @@ struct rset_control }; int rset_default_forward(RSFD rfd, void *buf, - int (*cmpfunc)(const void *p1, const void *p2), const void *untilbuf); +struct key_control { + int key_size; + int (*cmp) (const void *p1, const void *p2); + void (*key_logdump_txt) (int logmask, const void *p, const char *txt); + zint (*getseq)(const void *p); + /* FIXME - Should not need a getseq, it won't make much sense with */ + /* higher-order keys. Use a (generalized) cmp instead, or something */ + /* FIXME - decode and encode, and lots of other stuff */ +}; typedef struct rset { const struct rset_control *control; + const struct key_control *keycontrol; int count; /* reference count */ void *priv; /* stuff private to the given type of rset */ NMEM nmem; /* nibble memory for various allocs */ @@ -80,7 +93,9 @@ typedef struct rset RSFD rfd_create_base(RSET rs); void rfd_delete_base(RSFD rfd); -RSET rset_create_base(const struct rset_control *sel, NMEM nmem); +RSET rset_create_base(const struct rset_control *sel, + NMEM nmem, + const struct key_control *kcontrol); void rset_delete(RSET rs); RSET rset_dup (RSET rs); @@ -97,10 +112,8 @@ RSET rset_dup (RSET rs); #define rset_rewind(rfd) (*(rfd)->rset->control->f_rewind)((rfd)) /* int rset_forward(RSFD rfd, void *buf, void *untilbuf); */ -#define rset_forward(rfd, buf, cmpfunc, untilbuf) \ - (*(rfd)->rset->control->f_forward)((rfd),(buf),(cmpfunc),(untilbuf)) -/*FIXME - get rid of the cmp function here, keep it in a general */ -/* key_control block */ +#define rset_forward(rfd, buf, untilbuf) \ + (*(rfd)->rset->control->f_forward)((rfd),(buf),(untilbuf)) /* int rset_pos(RSFD fd, double *current, double *total); */ #define rset_pos(rfd,cur,tot) \ @@ -115,6 +128,42 @@ RSET rset_dup (RSET rs); /* int rset_type (RSET) */ #define rset_type(rs) ((rs)->control->desc) +RSET rstemp_create( NMEM nmem, const struct key_control *kcontrol, + const char *temp_path); + +RSET rsnull_create(NMEM nmem, const struct key_control *kcontrol); + +RSET rsbool_create_and( NMEM nmem, const struct key_control *kcontrol, + RSET rset_l, RSET rset_r); + +RSET rsbool_create_or ( NMEM nmem, const struct key_control *kcontrol, + RSET rset_l, RSET rset_r); + +RSET rsbool_create_not( NMEM nmem, const struct key_control *kcontrol, + RSET rset_l, RSET rset_r); + +RSET rsbetween_create( NMEM nmem, const struct key_control *kcontrol, + RSET rset_l, RSET rset_m, RSET rset_r, + RSET rset_attr); + +RSET rsmultior_create( NMEM nmem, const struct key_control *kcontrol, + int no_rsets, RSET* rsets); + +RSET rsprox_create( NMEM nmem, const struct key_control *kcontrol, + int rset_no, RSET *rset, + int ordered, int exclusion, + int relation, int distance); + +RSET rsisamb_create( NMEM nmem, const struct key_control *kcontrol, + ISAMB is, ISAMB_P pos); + +RSET rsisamc_create( NMEM nmem, const struct key_control *kcontrol, + ISAMC is, ISAMC_P pos); + +RSET rsisams_create( NMEM nmem, const struct key_control *kcontrol, + ISAMS is, ISAMS_P pos); + + #ifdef __cplusplus } diff --git a/include/rsisamb.h b/include/rsisamb.h index a95a6ba..8cd45bc 100644 --- a/include/rsisamb.h +++ b/include/rsisamb.h @@ -1,4 +1,4 @@ -/* $Id: rsisamb.h,v 1.4 2004-08-24 14:25:15 heikki Exp $ +/* $Id: rsisamb.h,v 1.5 2004-09-01 15:01:32 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -32,6 +32,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA extern "C" { #endif +#error "Never mind rsisamb.h, it is all in rset.h " /* extern const struct rset_control *rset_kind_isamb; */ RSET rsisamb_create( NMEM nmem, int key_size, diff --git a/include/rsisamc.h b/include/rsisamc.h index bd0d3f2..67b34ec 100644 --- a/include/rsisamc.h +++ b/include/rsisamc.h @@ -1,4 +1,4 @@ -/* $Id: rsisamc.h,v 1.9 2004-08-24 14:25:15 heikki Exp $ +/* $Id: rsisamc.h,v 1.10 2004-09-01 15:01:32 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -32,6 +32,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA extern "C" { #endif +#error "do not use rsisamc.h any more, rset.h covers it all " extern const struct rset_control *rset_kind_isamc; RSET rsisamc_create( NMEM nmem, int key_size, diff --git a/include/rsisams.h b/include/rsisams.h index 38d2370..4fabf75 100644 --- a/include/rsisams.h +++ b/include/rsisams.h @@ -1,4 +1,4 @@ -/* $Id: rsisams.h,v 1.4 2004-08-24 14:25:15 heikki Exp $ +/* $Id: rsisams.h,v 1.5 2004-09-01 15:01:32 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -32,6 +32,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA extern "C" { #endif +#error "do not use rsisams.h, it is all in rset.h" extern const struct rset_control *rset_kind_isams; RSET rsisams_create( NMEM nmem, int key_size, diff --git a/include/rsmultior.h b/include/rsmultior.h index 28f8f35..3903cf2 100644 --- a/include/rsmultior.h +++ b/include/rsmultior.h @@ -1,4 +1,4 @@ -/* $Id: rsmultior.h,v 1.4 2004-08-24 14:25:15 heikki Exp $ +/* $Id: rsmultior.h,v 1.5 2004-09-01 15:01:32 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -27,6 +27,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include +#error "do not use rsmultior.h any more, it is all in rset.h" YAZ_BEGIN_CDECL RSET rsmultior_create( NMEM nmem, int key_size, diff --git a/include/rsnull.h b/include/rsnull.h index fbd8a38..0c0f84c 100644 --- a/include/rsnull.h +++ b/include/rsnull.h @@ -1,4 +1,4 @@ -/* $Id: rsnull.h,v 1.7 2004-08-24 14:25:15 heikki Exp $ +/* $Id: rsnull.h,v 1.8 2004-09-01 15:01:32 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -31,6 +31,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA extern "C" { #endif +#error "rsnull.h not used any more, use rset.h instead" RSET rsnull_create(NMEM nmem); #ifdef __cplusplus diff --git a/include/rsprox.h b/include/rsprox.h index d3bb7a7..9b86db7 100644 --- a/include/rsprox.h +++ b/include/rsprox.h @@ -1,4 +1,4 @@ -/* $Id: rsprox.h,v 1.2 2004-08-24 14:25:15 heikki Exp $ +/* $Id: rsprox.h,v 1.3 2004-09-01 15:01:32 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -29,6 +29,8 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA extern "C" { #endif +#error "Do not use rsprox.h, it is all in rset.h" + RSET rsprox_create( NMEM nmem, int key_size, int (*cmp)(const void *p1, const void *p2), int (*getseq)(const void *p), diff --git a/include/rstemp.h b/include/rstemp.h index d4c8f69..016a1c6 100644 --- a/include/rstemp.h +++ b/include/rstemp.h @@ -1,4 +1,4 @@ -/* $Id: rstemp.h,v 1.11 2004-08-24 14:25:15 heikki Exp $ +/* $Id: rstemp.h,v 1.12 2004-09-01 15:01:32 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -31,18 +31,11 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA extern "C" { #endif -RSET rstemp_create( NMEM nmem, int key_size, - int (*cmp)(const void *p1, const void *p2), +#error "rstemp.h should no longer be used, its stuff is in rset.h" +/* moved into rset.h, this is too simple to keep in a file of its own */ +/* +RSET rstemp_create( NMEM nmem, const struct key_control *kcontrol, const char *temp_path); -/* -extern const struct rset_control *rset_kind_temp; - -typedef struct rset_temp_parms -{ - int (*cmp)(const void *p1, const void *p2); - int key_size; - const char *temp_path; -} rset_temp_parms; */ #ifdef __cplusplus diff --git a/index/index.h b/index/index.h index 7359cfc..d92e5e5 100644 --- a/index/index.h +++ b/index/index.h @@ -1,4 +1,4 @@ -/* $Id: index.h,v 1.116 2004-08-31 14:43:41 heikki Exp $ +/* $Id: index.h,v 1.117 2004-09-01 15:01:32 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -73,12 +73,6 @@ struct it_key { }; #endif -struct key_info { - int keysize; - int (*key_compare) (const void *p1, const void *p2); - void (*key_logdump_txt) (int logmask, const void *p, const char *txt); - /* FIXME - decode and encode, and lots of other stuff */ -}; enum dirsKind { dirs_dir, dirs_file }; @@ -122,7 +116,7 @@ int key_close (ZebraHandle zh); int key_compare (const void *p1, const void *p2); void key_init(struct it_key *k); char *key_print_it (const void *p, char *buf); -int key_get_seq (const void *p); +zint key_get_seq (const void *p); int key_compare_it (const void *p1, const void *p2); int key_qsort_compare (const void *p1, const void *p2); void key_logdump (int mask, const void *p); @@ -379,7 +373,8 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, RSET rset_trunc (ZebraHandle zh, ISAMS_P *isam_p, int no, const char *term, int length_term, const char *flags, - int preserve_position, int term_type, NMEM rset_nmem); + int preserve_position, int term_type, NMEM rset_nmem, + const struct key_control *kctrl); void resultSetAddTerm (ZebraHandle zh, ZebraSet s, int reg_type, const char *db, int set, diff --git a/index/kcompare.c b/index/kcompare.c index b1d8e93..3081bb1 100644 --- a/index/kcompare.c +++ b/index/kcompare.c @@ -1,4 +1,4 @@ -/* $Id: kcompare.c,v 1.50 2004-08-06 12:28:22 adam Exp $ +/* $Id: kcompare.c,v 1.51 2004-09-01 15:01:32 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -162,12 +162,12 @@ int key_compare (const void *p1, const void *p2) return 0; } -int key_get_seq(const void *p) +zint key_get_seq(const void *p) { struct it_key k; memcpy (&k, p, sizeof(k)); #if IT_KEY_NEW - return (int) k.mem[k.len-1]; + return k.mem[k.len-1]; #else return k.seqno; #endif diff --git a/index/trunc.c b/index/trunc.c index a537f38..3a954e1 100644 --- a/index/trunc.c +++ b/index/trunc.c @@ -1,4 +1,4 @@ -/* $Id: trunc.c,v 1.41 2004-08-31 14:43:41 heikki Exp $ +/* $Id: trunc.c,v 1.42 2004-09-01 15:01:32 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -25,12 +25,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include "index.h" -#include -#include -#include -#include -#include -#include +#include struct trunc_info { int *ptr; @@ -131,7 +126,8 @@ static void heap_close (struct trunc_info *ti) static RSET rset_trunc_r (ZebraHandle zi, const char *term, int length, const char *flags, ISAMS_P *isam_p, int from, int to, int merge_chunk, int preserve_position, - int term_type, NMEM rset_nmem) + int term_type, NMEM rset_nmem, + const struct key_control *kctrl) { RSET result; RSFD result_rsfd; @@ -144,8 +140,7 @@ static RSET rset_trunc_r (ZebraHandle zi, const char *term, int length, parms.temp_path = res_get (zi->res, "setTmpDir"); result = rset_create (rset_kind_temp, &parms); */ - result=rstemp_create( rset_nmem, /* NULL, FIXME - use a proper nmem */ - sizeof(struct it_key), key_compare_it, + result=rstemp_create( rset_nmem,kctrl, res_get (zi->res, "setTmpDir")); result_rsfd = rset_open (result, RSETF_WRITE); @@ -167,12 +162,12 @@ static RSET rset_trunc_r (ZebraHandle zi, const char *term, int length, rset[rscur] = rset_trunc_r (zi, term, length, flags, isam_p, i, i+i_add, merge_chunk, preserve_position, - term_type, rset_nmem); + term_type, rset_nmem, kctrl); else rset[rscur] = rset_trunc_r (zi, term, length, flags, isam_p, i, to, merge_chunk, preserve_position, - term_type, rset_nmem); + term_type, rset_nmem, kctrl); rscur++; } ti = heap_init (rscur, sizeof(struct it_key), key_compare_it); @@ -407,45 +402,24 @@ static int isamc_trunc_cmp (const void *p1, const void *p2) RSET rset_trunc (ZebraHandle zi, ISAMS_P *isam_p, int no, const char *term, int length, const char *flags, - int preserve_position, int term_type, NMEM rset_nmem) + int preserve_position, int term_type, NMEM rset_nmem, + const struct key_control *kctrl) { logf (LOG_DEBUG, "rset_trunc no=%d", no); if (no < 1) - return rsnull_create (rset_nmem); /* FIXME - use a proper nmem */ + return rsnull_create (rset_nmem,kctrl); if (zi->reg->isams) { if (no == 1) - return rsisams_create(rset_nmem, /* FIXME - use some nmem */ - sizeof(struct it_key), key_compare_it, + return rsisams_create(rset_nmem, kctrl, zi->reg->isams, *isam_p); - /* - { - rset_isams_parms parms; - - parms.pos = *isam_p; - parms.is = zi->reg->isams; - return rset_create (rset_kind_isams, &parms); - } - */ qsort (isam_p, no, sizeof(*isam_p), isams_trunc_cmp); } else if (zi->reg->isamc) { if (no == 1) - return rsisamc_create(rset_nmem, /* FIXME - use some nmem */ - sizeof(struct it_key), key_compare_it, + return rsisamc_create(rset_nmem, kctrl, zi->reg->isamc, *isam_p); - /* - { - rset_isamc_parms parms; - - parms.key_size = sizeof(struct it_key); - parms.cmp = key_compare_it; - parms.pos = *isam_p; - parms.is = zi->reg->isamc; - return rset_create (rset_kind_isamc, &parms); - } - */ #if 0 /* NEW_TRUNC */ /* FIXME - Use the new multi_or instead !! */ else if (no < 10000) @@ -466,62 +440,27 @@ RSET rset_trunc (ZebraHandle zi, ISAMS_P *isam_p, int no, else if (zi->reg->isamb) { if (no == 1) - return rsisamb_create(rset_nmem, /* FIXME - use some nmem */ - sizeof(struct it_key), key_compare_it, + return rsisamb_create(rset_nmem,kctrl, zi->reg->isamb, *isam_p); - /* - { - rset_isamb_parms parms; - parms.key_size = sizeof(struct it_key); - parms.cmp = key_compare_it; - parms.pos = *isam_p; - parms.is = zi->reg->isamb; - return rset_create (rset_kind_isamb, &parms); - } - */ -#if 1 else if (no <10000 ) /* FIXME - hardcoded number */ { RSET r; RSET *rsets=xmalloc(no*sizeof(RSET)); /* use nmem! */ int i; for (i=0;ireg->isamb, isam_p[i] ); - r=rsmultior_create( rset_nmem, /* FIXME - use some nmem */ - sizeof(struct it_key), key_compare_it, - no, rsets); + r=rsmultior_create( rset_nmem, kctrl, no, rsets); xfree(rsets); - return r; - /* - rset_multior_parms m_parms; - rset_isamb_parms b_parms; - int i; - m_parms.key_size = sizeof(struct it_key); - m_parms.cmp = key_compare_it; - m_parms.no_rsets=no; - m_parms.rsets=xmalloc(sizeof(*m_parms.rsets)*no); - b_parms.key_size = sizeof(struct it_key); - b_parms.cmp = key_compare_it; - b_parms.is = zi->reg->isamb; - for (i=0;i #include -#include -#include -#include -#include -#include -#include +#include + + +static const struct key_control it_ctrl={ + sizeof(struct it_key), + key_compare_it, + key_logdump_txt, /* FIXME - clean up these functions */ + key_get_seq, +}; + +const struct key_control *key_it_ctrl=&it_ctrl; struct rpn_char_map_info { ZebraMaps zm; @@ -891,7 +896,7 @@ static RSET term_trunc (ZebraHandle zh, Z_AttributesPlusTerm *zapt, return rset_trunc (zh, grep_info->isam_p_buf, grep_info->isam_p_indx, term_dst, strlen(term_dst), rank_type, 1 /* preserve pos */, - zapt->term->which, rset_nmem); + zapt->term->which, rset_nmem,key_it_ctrl); } @@ -1392,12 +1397,11 @@ static RSET rpn_search_APT_phrase (ZebraHandle zh, } grep_info_delete (&grep_info); if (rset_no == 0) - return rsnull_create (NULL); /* FIXME - Use a proper nmem */ + return rsnull_create (rset_nmem,key_it_ctrl); else if (rset_no == 1) return (rset[0]); else - result = rsprox_create( NULL, /* FIXME - use a proper nmem */ - sizeof(struct it_key), key_compare_it, key_get_seq, + result = rsprox_create( rset_nmem, key_it_ctrl, rset_no, rset, 1 /* ordered */, 0 /* exclusion */, 3 /* relation */, 1 /* distance */); @@ -1440,27 +1444,9 @@ static RSET rpn_search_APT_or_list (ZebraHandle zh, } grep_info_delete (&grep_info); if (rset_no == 0) - return rsnull_create (rset_nmem); - return rsmultior_create(rset_nmem, - sizeof(struct it_key), - key_compare_it, + return rsnull_create (rset_nmem,key_it_ctrl); + return rsmultior_create(rset_nmem, key_it_ctrl, rset_no, rset); - -#if 0 - /* The old code, kept for reference. May be deleted soon */ - result = rset[0]; - for (i = 1; iterm->which, rset_nmem); + zapt->term->which, rset_nmem, key_it_ctrl); assert (rset[rset_no]); if (++rset_no >= (int) (sizeof(rset)/sizeof(*rset))) break; } grep_info_delete (&grep_info); if (rset_no == 0) - return rsnull_create (rset_nmem); + return rsnull_create (rset_nmem,key_it_ctrl); result = rset[0]; for (i = 1; ires, "setTmpDir"); result = rset_create (rset_kind_temp, &parms); */ - result = rstemp_create( rset_nmem, - sizeof (struct it_key), key_compare_it, + result = rstemp_create( rset_nmem,key_it_ctrl, res_get (zh->res, "setTmpDir") ); rsfd = rset_open (result, RSETF_WRITE); @@ -1897,7 +1860,8 @@ static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt, sks->which = Z_SortKeySpec_null; sks->u.null = odr_nullval (); sort_sequence->specs[i] = sks; - return rsnull_create (NULL); /* FIXME - Use a proper nmem */ + return rsnull_create (NULL,key_it_ctrl); + /* FIXME - nmem?? */ } @@ -1935,10 +1899,10 @@ static RSET xpath_trunc(ZebraHandle zh, NMEM stream, const char *flags = "void"; if (grep_info_prepare (zh, 0 /* zapt */, &grep_info, '0', stream)) - return rsnull_create (rset_nmem); + return rsnull_create (rset_nmem,key_it_ctrl); if (ord < 0) - return rsnull_create (rset_nmem); + return rsnull_create (rset_nmem,key_it_ctrl); if (prefix_len) term_dict[prefix_len++] = '|'; else @@ -1963,7 +1927,7 @@ static RSET xpath_trunc(ZebraHandle zh, NMEM stream, grep_info.isam_p_indx); rset = rset_trunc (zh, grep_info.isam_p_buf, grep_info.isam_p_indx, term, strlen(term), - flags, 1, term_type,rset_nmem); + flags, 1, term_type,rset_nmem,key_it_ctrl); grep_info_delete (&grep_info); return rset; } @@ -2110,10 +2074,8 @@ static RSET rpn_search_xpath (ZebraHandle zh, parms.printer = key_print_it; rset = rset_create (rset_kind_between, &parms); */ - rset=rsbetween_create( rset_nmem, - sizeof(struct it_key), key_compare_it, - rset_start_tag, rset, rset_end_tag, rset_attr, - key_print_it ); + rset=rsbetween_create( rset_nmem,key_it_ctrl, + rset_start_tag, rset, rset_end_tag, rset_attr); } first_path = 0; } @@ -2239,19 +2201,13 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, switch (zop->which) { case Z_Operator_and: - r = rsbool_create_and( rset_nmem, - sizeof(struct it_key), key_compare_it, - rset_l, rset_r, key_logdump_txt ); + r = rsbool_create_and(rset_nmem,key_it_ctrl, rset_l,rset_r ); break; case Z_Operator_or: - r = rsbool_create_or( rset_nmem, - sizeof(struct it_key), key_compare_it, - rset_l, rset_r, key_logdump_txt ); + r = rsbool_create_or(rset_nmem,key_it_ctrl, rset_l,rset_r ); break; case Z_Operator_and_not: - r = rsbool_create_not( rset_nmem, - sizeof(struct it_key), key_compare_it, - rset_l, rset_r, key_logdump_txt ); + r = rsbool_create_not(rset_nmem,key_it_ctrl, rset_l,rset_r ); break; case Z_Operator_prox: if (zop->u.prox->which != Z_ProximityOperator_known) @@ -2274,29 +2230,13 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, twosets[0] = rset_l; twosets[1] = rset_r; - r=rsprox_create(rset_nmem, - sizeof(struct it_key), key_compare_it, - key_get_seq, + r=rsprox_create(rset_nmem,key_it_ctrl, 2, twosets, *zop->u.prox->ordered, (!zop->u.prox->exclusion ? 0 : *zop->u.prox->exclusion), *zop->u.prox->relationType, *zop->u.prox->distance ); - /* - parms.rset = twosets; - parms.rset_no = 2; - parms.ordered = *zop->u.prox->ordered; - parms.exclusion = (!zop->u.prox->exclusion ? 0 : - *zop->u.prox->exclusion); - parms.relation = *zop->u.prox->relationType; - parms.distance = *zop->u.prox->distance; - parms.key_size = sizeof(struct it_key); - parms.cmp = key_compare_it; - parms.getseq = key_get_seq; - parms.log_item = key_logdump_txt; - r = rset_create(rset_kind_prox, &parms); - */ } break; default: @@ -2319,7 +2259,7 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, r = resultSetRef (zh, zs->u.simple->u.resultSetId); if (!r) { - r = rsnull_create (rset_nmem); + r = rsnull_create (rset_nmem,key_it_ctrl); zh->errCode = 30; zh->errString = nmem_strdup (stream, zs->u.simple->u.resultSetId); @@ -2695,7 +2635,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, &glist[i+before].term, mterm); rset = rset_trunc (zh, &scan_info_array[j0].list[ptr[j0]].isam_p, 1, glist[i+before].term, strlen(glist[i+before].term), - NULL, 0, zapt->term->which, rset_nmem); + NULL, 0, zapt->term->which, rset_nmem, key_it_ctrl); ptr[j0]++; for (j = j0+1; jterm->which,rset_nmem); - rset = rsbool_create_or(rset_nmem, - sizeof(struct it_key), key_compare_it, - rset, rset2, key_logdump_txt); + zapt->term->which,rset_nmem,key_it_ctrl); + rset = rsbool_create_or(rset_nmem,key_it_ctrl, + rset, rset2); + /* FIXME - Use a proper multi-or */ ptr[j]++; } } if (limit_set) - rset = rsbool_create_and(rset_nmem, - sizeof(struct it_key), key_compare_it, - rset, rset_dup(limit_set), - key_logdump_txt); + rset = rsbool_create_and(rset_nmem,key_it_ctrl, + rset, rset_dup(limit_set)); count_set (rset, &glist[i+before].occurrences); rset_delete (rset); } @@ -2762,7 +2700,7 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, rset = rset_trunc (zh, &scan_info_array[j0].list[before-1-ptr[j0]].isam_p, 1, glist[before-1-i].term, strlen(glist[before-1-i].term), - NULL, 0, zapt->term->which,rset_nmem); + NULL, 0, zapt->term->which,rset_nmem,key_it_ctrl); ptr[j0]++; @@ -2778,19 +2716,16 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, &scan_info_array[j].list[before-1-ptr[j]].isam_p, 1, glist[before-1-i].term, strlen(glist[before-1-i].term), NULL, 0, - zapt->term->which, rset_nmem); - rset = rsbool_create_and(rset_nmem, - sizeof(struct it_key), key_compare_it, - rset, rset2, - key_logdump_txt); + zapt->term->which, rset_nmem,key_it_ctrl); + rset = rsbool_create_and(rset_nmem,key_it_ctrl, + rset, rset2); + /* FIXME - multi-and ?? */ ptr[j]++; } } if (limit_set) - rset = rsbool_create_and(rset_nmem, - sizeof(struct it_key), key_compare_it, - rset, rset_dup(limit_set), - key_logdump_txt); + rset = rsbool_create_and(rset_nmem,key_it_ctrl, + rset, rset_dup(limit_set)); count_set (rset, &glist[before-1-i].occurrences); rset_delete (rset); } diff --git a/index/zsets.c b/index/zsets.c index 91d3627..c25ac6a 100644 --- a/index/zsets.c +++ b/index/zsets.c @@ -1,4 +1,4 @@ -/* $Id: zsets.c,v 1.59 2004-08-31 10:43:35 heikki Exp $ +/* $Id: zsets.c,v 1.60 2004-09-01 15:01:32 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -30,7 +30,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #endif #include "index.h" -#include +#include #define SORT_IDX_ENTRYSIZE 64 #define ZSET_SORT_MAX_LEVEL 3 diff --git a/rset/rsbetween.c b/rset/rsbetween.c index 8fd4338..93ab3e7 100644 --- a/rset/rsbetween.c +++ b/rset/rsbetween.c @@ -1,4 +1,4 @@ -/* $Id: rsbetween.c,v 1.23 2004-08-31 10:43:36 heikki Exp $ +/* $Id: rsbetween.c,v 1.24 2004-09-01 15:01:32 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -36,7 +36,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include -#include +#include #define RSBETWEEN_DEBUG 0 @@ -44,9 +44,7 @@ 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_forward_between(RSFD rfd, void *buf, - int (*cmpfunc)(const void *p1, const void *p2), - const void *untilbuf); +static int r_forward_between(RSFD rfd, void *buf, const void *untilbuf); 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); @@ -58,7 +56,7 @@ static const struct rset_control control = r_open_between, r_close_between, r_rewind_between, - r_forward_between, /* rset_default_forward, */ + r_forward_between, r_pos_between, r_read_between, r_write_between, @@ -68,13 +66,10 @@ static const struct rset_control control = const struct rset_control *rset_kind_between = &control; struct rset_between_info { - int key_size; - RSET rset_l; - RSET rset_m; - RSET rset_r; - RSET rset_attr; - int (*cmp)(const void *p1, const void *p2); - char *(*printer)(const void *p1, char *buf); + RSET rset_l; /* left arg, start tag */ + RSET rset_m; /* the thing itself */ + RSET rset_r; /* right arg, end tag */ + RSET rset_attr; /* attributes , optional */ }; struct rset_between_rfd { @@ -90,9 +85,7 @@ struct rset_between_rfd { void *buf_m; void *buf_r; void *buf_attr; - int level; - struct rset_between_rfd *next; - struct rset_between_info *info; + int level; /* counting start/end tags */ zint hits; }; @@ -111,22 +104,16 @@ 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 rsbetween_create( NMEM nmem, const struct key_control *kcontrol, + RSET rset_l, RSET rset_m, RSET rset_r, RSET rset_attr) { - 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; + RSET rnew=rset_create_base(&control, nmem, kcontrol); + struct rset_between_info *info= + (struct rset_between_info *) nmem_malloc(rnew->nmem,sizeof(*info)); 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; - rnew->priv=info; return rnew; } @@ -161,10 +148,10 @@ static RSFD r_open_between (RSET ct, int flag) else { p = (struct rset_between_rfd *) nmem_malloc(ct->nmem, (sizeof(*p))); rfd->priv=p; - p->buf_l = nmem_malloc(ct->nmem, (info->key_size)); - p->buf_m = nmem_malloc(ct->nmem, (info->key_size)); - p->buf_r = nmem_malloc(ct->nmem, (info->key_size)); - p->buf_attr = nmem_malloc(ct->nmem, (info->key_size)); + p->buf_l = nmem_malloc(ct->nmem, (ct->keycontrol->key_size)); + p->buf_m = nmem_malloc(ct->nmem, (ct->keycontrol->key_size)); + p->buf_r = nmem_malloc(ct->nmem, (ct->keycontrol->key_size)); + p->buf_attr = nmem_malloc(ct->nmem, (ct->keycontrol->key_size)); } p->rfd_l = rset_open (info->rset_l, RSETF_READ); @@ -222,11 +209,8 @@ static void r_rewind_between (RSFD rfd) -static int r_forward_between(RSFD rfd, void *buf, - int (*cmpfunc)(const void *p1, const void *p2), - const void *untilbuf) +static int r_forward_between(RSFD rfd, void *buf, const void *untilbuf) { - struct rset_between_info *info =(struct rset_between_info *)rfd->rset->priv; struct rset_between_rfd *p=(struct rset_between_rfd *)rfd->priv; int rc; #if RSBETWEEN_DEBUG @@ -235,8 +219,7 @@ static int r_forward_between(RSFD rfd, void *buf, /* It is enough to forward the m pointer here, the read will */ /* naturally forward the l, m, and attr pointers */ if (p->more_m) - p->more_m=rset_forward(p->rfd_m, p->buf_m, - info->cmp,untilbuf); + p->more_m=rset_forward(p->rfd_m, p->buf_m,untilbuf); #if RSBETWEEN_DEBUG log2( p, "fwd: after forward M", 0,0); #endif @@ -254,6 +237,7 @@ static int r_read_between (RSFD rfd, void *buf) { struct rset_between_info *info =(struct rset_between_info *)rfd->rset->priv; struct rset_between_rfd *p=(struct rset_between_rfd *)rfd->priv; + const struct key_control *kctrl=rfd->rset->keycontrol; int cmp_l=0; int cmp_r=0; int attr_match = 0; @@ -266,7 +250,7 @@ static int r_read_between (RSFD rfd, void *buf) /* forward L until past m, count levels, note rec boundaries */ if (p->more_l) - cmp_l= (*info->cmp)(p->buf_l, p->buf_m); + cmp_l= (*kctrl->cmp)(p->buf_l, p->buf_m); else { p->level = 0; @@ -292,7 +276,7 @@ static int r_read_between (RSFD rfd, void *buf) attr_match = 0; while (p->more_attr) { - cmp_attr = (*info->cmp)(p->buf_attr, p->buf_l); + cmp_attr = (*kctrl->cmp)(p->buf_attr, p->buf_l); if (cmp_attr == 0) { attr_match = 1; @@ -308,9 +292,10 @@ static int r_read_between (RSFD rfd, void *buf) else if (cmp_attr==-2) { p->more_attr = rset_forward( p->rfd_attr, - p->buf_attr, info->cmp, p->buf_l); + p->buf_attr, p->buf_l); #if RSBETWEEN_DEBUG - logf(LOG_DEBUG, "btw: after frowarding attr m=%d",p->more_attr); + logf(LOG_DEBUG, "btw: after frowarding attr m=%d", + p->more_attr); #endif } } /* while more_attr */ @@ -322,10 +307,9 @@ static int r_read_between (RSFD rfd, void *buf) { if (p->more_l) { - p->more_l=rset_forward(p->rfd_l, - p->buf_l, info->cmp, p->buf_m); + p->more_l=rset_forward(p->rfd_l, p->buf_l, p->buf_m); if (p->more_l) - cmp_l= (*info->cmp)(p->buf_l, p->buf_m); + cmp_l= (*kctrl->cmp)(p->buf_l, p->buf_m); else cmp_l=2; #if RSBETWEEN_DEBUG @@ -341,7 +325,7 @@ static int r_read_between (RSFD rfd, void *buf) #endif if (p->more_l) { - cmp_l= (*info->cmp)(p->buf_l, p->buf_m); + cmp_l= (*kctrl->cmp)(p->buf_l, p->buf_m); } else cmp_l=2; @@ -356,7 +340,7 @@ static int r_read_between (RSFD rfd, void *buf) log2( p, "Before moving R", cmp_l, cmp_r); #endif if (p->more_r) - cmp_r= (*info->cmp)(p->buf_r, p->buf_m); + cmp_r= (*kctrl->cmp)(p->buf_r, p->buf_m); else cmp_r=2; #if RSBETWEEN_DEBUG @@ -372,18 +356,17 @@ static int r_read_between (RSFD rfd, void *buf) #if NEWCODE if (cmp_r==-2) { - p->more_r=rset_forward(p->rfd_r, - p->buf_r, info->cmp, p->buf_m); + p->more_r=rset_forward(p->rfd_r, p->buf_r, p->buf_m); } else { p->more_r = rset_read (p->rfd_r, p->buf_r); } if (p->more_r) - cmp_r= (*info->cmp)(p->buf_r, p->buf_m); + cmp_r= (*kctrl->cmp)(p->buf_r, p->buf_m); #else p->more_r = rset_read (p->rfd_r, p->buf_r); - cmp_r= (*info->cmp)(p->buf_r, p->buf_m); + cmp_r= (*kctrl->cmp)(p->buf_r, p->buf_m); #endif } else @@ -398,7 +381,7 @@ static int r_read_between (RSFD rfd, void *buf) if ( attr_match && p->level > 0) /* within a tag pair (or deeper) */ { - memcpy (buf, p->buf_m, info->key_size); + memcpy (buf, p->buf_m, kctrl->key_size); #if RSBETWEEN_DEBUG log2( p, "Returning a hit (and forwarding m)", cmp_l, cmp_r); #endif @@ -419,8 +402,7 @@ static int r_read_between (RSFD rfd, void *buf) if (cmp_l == 2) { p->level = 0; - p->more_m=rset_forward(p->rfd_m, - p->buf_m, info->cmp, p->buf_l); + p->more_m=rset_forward(p->rfd_m, p->buf_m, p->buf_l); } else { p->more_m = rset_read (p->rfd_m, p->buf_m); diff --git a/rset/rsbool.c b/rset/rsbool.c index a427538..574f782 100644 --- a/rset/rsbool.c +++ b/rset/rsbool.c @@ -1,4 +1,4 @@ -/* $Id: rsbool.c,v 1.45 2004-08-31 10:43:39 heikki Exp $ +/* $Id: rsbool.c,v 1.46 2004-09-01 15:01:32 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -27,7 +27,6 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include -#include #ifndef RSET_DEBUG #define RSET_DEBUG 0 @@ -37,9 +36,7 @@ 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_forward(RSFD rfd, void *buf, - int (*cmpfunc)(const void *p1, const void *p2), - const void *untilbuf); +static int r_forward(RSFD rfd, void *buf, const void *untilbuf); static void r_pos (RSFD rfd, double *current, double *total); static int r_read_and (RSFD rfd, void *buf); static int r_read_or (RSFD rfd, void *buf); @@ -87,15 +84,12 @@ static const struct rset_control control_not = const struct rset_control *rset_kind_and = &control_and; -const struct rset_control *rset_kind_or = &control_or; +const struct rset_control *rset_kind_or = &control_or; const struct rset_control *rset_kind_not = &control_not; struct rset_bool_info { - int key_size; RSET rset_l; RSET rset_r; - int (*cmp)(const void *p1, const void *p2); - void (*log_item)(int logmask, const void *p, const char *txt); }; struct rset_bool_rfd { @@ -107,55 +101,41 @@ struct rset_bool_rfd { void *buf_l; void *buf_r; int tail; - struct rset_bool_rfd *next; - struct rset_bool_info *info; }; static RSET rsbool_create_base( const struct rset_control *ctrl, - NMEM nmem, int key_size, - int (*cmp)(const void *p1, const void *p2), - RSET rset_l, RSET rset_r, - void (*log_item)(int logmask, const void *p, const char *txt) ) + NMEM nmem, const struct key_control *kcontrol, + RSET rset_l, RSET rset_r) { - RSET rnew=rset_create_base(ctrl, nmem); + RSET rnew=rset_create_base(ctrl, nmem, kcontrol); struct rset_bool_info *info; info = (struct rset_bool_info *) nmem_malloc(rnew->nmem,sizeof(*info)); - info->key_size = key_size; info->rset_l = rset_l; info->rset_r = rset_r; - info->cmp = cmp; - info->log_item = log_item; - rnew->priv=info; return rnew; } -RSET rsbool_create_and( NMEM nmem, int key_size, - int (*cmp)(const void *p1, const void *p2), - RSET rset_l, RSET rset_r, - void (*log_item)(int logmask, const void *p, const char *txt) ) +RSET rsbool_create_and( NMEM nmem, const struct key_control *kcontrol, + RSET rset_l, RSET rset_r) { - return rsbool_create_base(rset_kind_and, nmem, key_size, cmp, - rset_l, rset_r, log_item); + return rsbool_create_base(rset_kind_and, nmem, kcontrol, + rset_l, rset_r); } -RSET rsbool_create_or( NMEM nmem, int key_size, - int (*cmp)(const void *p1, const void *p2), - RSET rset_l, RSET rset_r, - void (*log_item)(int logmask, const void *p, const char *txt) ) +RSET rsbool_create_or( NMEM nmem, const struct key_control *kcontrol, + RSET rset_l, RSET rset_r) { - return rsbool_create_base(rset_kind_or, nmem, key_size, cmp, - rset_l, rset_r, log_item); + return rsbool_create_base(rset_kind_or, nmem, kcontrol, + rset_l, rset_r); } -RSET rsbool_create_not( NMEM nmem, int key_size, - int (*cmp)(const void *p1, const void *p2), - RSET rset_l, RSET rset_r, - void (*log_item)(int logmask, const void *p, const char *txt) ) +RSET rsbool_create_not( NMEM nmem, const struct key_control *kcontrol, + RSET rset_l, RSET rset_r) { - return rsbool_create_base(rset_kind_not, nmem, key_size, cmp, - rset_l, rset_r, log_item); + return rsbool_create_base(rset_kind_not, nmem, kcontrol, + rset_l, rset_r); } static void r_delete (RSET ct) @@ -184,8 +164,8 @@ static RSFD r_open (RSET ct, int flag) else { p=nmem_malloc(ct->nmem,sizeof(*p)); rfd->priv=p; - p->buf_l = nmem_malloc(ct->nmem, info->key_size); - p->buf_r = nmem_malloc(ct->nmem, info->key_size); + p->buf_l = nmem_malloc(ct->nmem, ct->keycontrol->key_size); + p->buf_r = nmem_malloc(ct->nmem, ct->keycontrol->key_size); } logf(LOG_DEBUG,"rsbool (%s) open [%p]", ct->control->desc, rfd); @@ -224,22 +204,17 @@ static void r_rewind (RSFD rfd) } static int r_forward (RSFD rfd, void *buf, - int (*cmpfunc)(const void *p1, const void *p2), const void *untilbuf) { - struct rset_bool_info *info = (struct rset_bool_info*)(rfd->rset->priv); struct rset_bool_rfd *p=(struct rset_bool_rfd *)rfd->priv; - int rc; - - if ( p->more_l && ((cmpfunc)(untilbuf,p->buf_l)==2) ) - p->more_l = rset_forward(p->rfd_l, p->buf_l, - info->cmp, untilbuf); - if ( p->more_r && ((cmpfunc)(untilbuf,p->buf_r)==2)) - p->more_r = rset_forward(p->rfd_r, p->buf_r, - info->cmp, untilbuf); + const struct key_control *kctrl=rfd->rset->keycontrol; + + if ( p->more_l && ((kctrl->cmp)(untilbuf,p->buf_l)==2) ) + p->more_l = rset_forward(p->rfd_l, p->buf_l, untilbuf); + if ( p->more_r && ((kctrl->cmp)(untilbuf,p->buf_r)==2)) + p->more_r = rset_forward(p->rfd_r, p->buf_r, untilbuf); p->tail=0; - rc = rset_read(rfd,buf); - return rc; + return rset_read(rfd,buf); } @@ -260,15 +235,15 @@ static int r_forward (RSFD rfd, void *buf, static int r_read_and (RSFD rfd, void *buf) { - struct rset_bool_info *info = (struct rset_bool_info*)(rfd->rset->priv); struct rset_bool_rfd *p=(struct rset_bool_rfd *)rfd->priv; + const struct key_control *kctrl=rfd->rset->keycontrol; while (p->more_l || p->more_r) { int cmp; if (p->more_l && p->more_r) - cmp = (*info->cmp)(p->buf_l, p->buf_r); + cmp = (*kctrl->cmp)(p->buf_l, p->buf_r); else if (p->more_l) cmp = -2; else @@ -276,73 +251,54 @@ static int r_read_and (RSFD rfd, void *buf) #if RSET_DEBUG logf (LOG_DEBUG, "r_read_and [%p] looping: m=%d/%d c=%d t=%d", rfd, p->more_l, p->more_r, cmp, p->tail); - (*info->log_item)(LOG_DEBUG, p->buf_l, "left "); - (*info->log_item)(LOG_DEBUG, p->buf_r, "right "); + (*kctrl->log_item)(LOG_DEBUG, p->buf_l, "left "); + (*kctrl->log_item)(LOG_DEBUG, p->buf_r, "right "); #endif if (!cmp) { - memcpy (buf, p->buf_l, info->key_size); + memcpy (buf, p->buf_l, kctrl->key_size); p->more_l = rset_read (p->rfd_l, p->buf_l); p->tail = 1; } else if (cmp == 1) { - memcpy (buf, p->buf_r, info->key_size); + memcpy (buf, p->buf_r, kctrl->key_size); p->more_r = rset_read (p->rfd_r, p->buf_r); p->tail = 1; #if RSET_DEBUG logf (LOG_DEBUG, "r_read_and [%p] returning R m=%d/%d c=%d", rfd, p->more_l, p->more_r, cmp); key_logdump(LOG_DEBUG,buf); - (*info->log_item)(LOG_DEBUG, buf, ""); + (*kctrl->log_item)(LOG_DEBUG, buf, ""); #endif p->hits++; return 1; } else if (cmp == -1) { - memcpy (buf, p->buf_l, info->key_size); + memcpy (buf, p->buf_l, kctrl->key_size); p->more_l = rset_read (p->rfd_l, p->buf_l); p->tail = 1; #if RSET_DEBUG logf (LOG_DEBUG, "r_read_and [%p] returning L m=%d/%d c=%d", rfd, p->more_l, p->more_r, cmp); - (*info->log_item)(LOG_DEBUG, buf, ""); + (*kctrl->log_item)(LOG_DEBUG, buf, ""); #endif p->hits++; return 1; } else if (cmp > 1) /* cmp == 2 */ { -#define OLDCODE 0 -#if OLDCODE - memcpy (buf, p->buf_r, info->key_size); - - p->more_r = rset_read (p->rfd_r, p->buf_r); - if (p->tail) - { - if (!p->more_r || (*info->cmp)(p->buf_r, buf) > 1) - p->tail = 0; -#if RSET_DEBUG - logf (LOG_DEBUG, "r_read_and returning C m=%d/%d c=%d", - p->more_l, p->more_r, cmp); - (*info->log_item)(LOG_DEBUG, buf, ""); -#endif - p->hits++; - return 1; - } -#else - if (p->tail) { - memcpy (buf, p->buf_r, info->key_size); + memcpy (buf, p->buf_r, kctrl->key_size); p->more_r = rset_read (p->rfd_r, p->buf_r); - if (!p->more_r || (*info->cmp)(p->buf_r, buf) > 1) + if (!p->more_r || (*kctrl->cmp)(p->buf_r, buf) > 1) p->tail = 0; #if RSET_DEBUG logf (LOG_DEBUG, "r_read_and [%p] returning R tail m=%d/%d c=%d", rfd, p->more_l, p->more_r, cmp); - (*info->log_item)(LOG_DEBUG, buf, ""); + (*kctrl->log_item)(LOG_DEBUG, buf, ""); #endif p->hits++; return 1; @@ -350,45 +306,28 @@ static int r_read_and (RSFD rfd, void *buf) else { #if RSET_DEBUG - logf (LOG_DEBUG, "r_read_and [%p] about to forward R m=%d/%d c=%d", + logf (LOG_DEBUG, "r_read_and [%p] about to forward R " + "m=%d/%d c=%d", rfd, p->more_l, p->more_r, cmp); #endif if (p->more_r && p->more_l) - p->more_r = rset_forward( p->rfd_r, - p->buf_r, (info->cmp), p->buf_l); + p->more_r = rset_forward( p->rfd_r, p->buf_r, p->buf_l); else return 0; /* no point in reading further */ } -#endif } else /* cmp == -2 */ { -#if OLDCODE - memcpy (buf, p->buf_l, info->key_size); - p->more_l = rset_read (p->rfd_l, p->buf_l); - if (p->tail) - { - if (!p->more_l || (*info->cmp)(p->buf_l, buf) > 1) - p->tail = 0; -#if RSET_DEBUG - logf (LOG_DEBUG, "r_read_and [%p] returning R tail m=%d/%d c=%d", - rfd, p->more_l, p->more_r, cmp); - (*info->log_item)(LOG_DEBUG, buf, ""); -#endif - p->hits++; - return 1; - } -#else if (p->tail) { - memcpy (buf, p->buf_l, info->key_size); + memcpy (buf, p->buf_l, kctrl->key_size); p->more_l = rset_read (p->rfd_l, p->buf_l); - if (!p->more_l || (*info->cmp)(p->buf_l, buf) > 1) + if (!p->more_l || (*kctrl->cmp)(p->buf_l, buf) > 1) p->tail = 0; #if RSET_DEBUG logf (LOG_DEBUG, "r_read_and [%p] returning L tail m=%d/%d c=%d", rfd, p->more_l, p->more_r, cmp); - (*info->log_item)(LOG_DEBUG, buf, ""); + (*kctrl->log_item)(LOG_DEBUG, buf, ""); #endif p->hits++; return 1; @@ -396,16 +335,15 @@ static int r_read_and (RSFD rfd, void *buf) else { #if RSET_DEBUG - logf (LOG_DEBUG, "r_read_and [%p] about to forward L m=%d/%d c=%d", + logf (LOG_DEBUG, "r_read_and [%p] about to forward L " + "m=%d/%d c=%d", rfd, p->more_l, p->more_r, cmp); #endif if (p->more_r && p->more_l) - p->more_l = rset_forward(p->rfd_l, - p->buf_l, (info->cmp), p->buf_r); + p->more_l = rset_forward(p->rfd_l, p->buf_l, p->buf_r); else return 0; /* no point in reading further */ } -#endif } } #if RSET_DEBUG @@ -416,52 +354,52 @@ static int r_read_and (RSFD rfd, void *buf) static int r_read_or (RSFD rfd, void *buf) { - struct rset_bool_info *info = (struct rset_bool_info*)(rfd->rset->priv); struct rset_bool_rfd *p=(struct rset_bool_rfd *)rfd->priv; + const struct key_control *kctrl=rfd->rset->keycontrol; while (p->more_l || p->more_r) { int cmp; if (p->more_l && p->more_r) - cmp = (*info->cmp)(p->buf_l, p->buf_r); + cmp = (*kctrl->cmp)(p->buf_l, p->buf_r); else if (p->more_r) cmp = 2; else cmp = -2; if (!cmp) { - memcpy (buf, p->buf_l, info->key_size); + memcpy (buf, p->buf_l, kctrl->key_size); p->more_l = rset_read (p->rfd_l, p->buf_l); p->more_r = rset_read (p->rfd_r, p->buf_r); #if RSET_DEBUG logf (LOG_DEBUG, "r_read_or returning A m=%d/%d c=%d", p->more_l, p->more_r, cmp); - (*info->log_item)(LOG_DEBUG, buf, ""); + (*kctrl->log_item)(LOG_DEBUG, buf, ""); #endif p->hits++; return 1; } else if (cmp > 0) { - memcpy (buf, p->buf_r, info->key_size); + memcpy (buf, p->buf_r, kctrl->key_size); p->more_r = rset_read (p->rfd_r, p->buf_r); #if RSET_DEBUG logf (LOG_DEBUG, "r_read_or returning B m=%d/%d c=%d", p->more_l, p->more_r, cmp); - (*info->log_item)(LOG_DEBUG, buf, ""); + (*kctrl->log_item)(LOG_DEBUG, buf, ""); #endif p->hits++; return 1; } else { - memcpy (buf, p->buf_l, info->key_size); + memcpy (buf, p->buf_l, kctrl->key_size); p->more_l = rset_read ( p->rfd_l, p->buf_l); #if RSET_DEBUG logf (LOG_DEBUG, "r_read_or returning C m=%d/%d c=%d", p->more_l, p->more_r, cmp); - (*info->log_item)(LOG_DEBUG, buf, ""); + (*kctrl->log_item)(LOG_DEBUG, buf, ""); #endif p->hits++; return 1; @@ -472,47 +410,44 @@ static int r_read_or (RSFD rfd, void *buf) static int r_read_not (RSFD rfd, void *buf) { - struct rset_bool_info *info = (struct rset_bool_info*)(rfd->rset->priv); struct rset_bool_rfd *p=(struct rset_bool_rfd *)rfd->priv; + const struct key_control *kctrl=rfd->rset->keycontrol; while (p->more_l || p->more_r) { int cmp; if (p->more_l && p->more_r) - cmp = (*info->cmp)(p->buf_l, p->buf_r); + cmp = (*kctrl->cmp)(p->buf_l, p->buf_r); else if (p->more_r) cmp = 2; else cmp = -2; if (cmp < -1) { - memcpy (buf, p->buf_l, info->key_size); + memcpy (buf, p->buf_l, kctrl->key_size); p->more_l = rset_read (p->rfd_l, p->buf_l); p->hits++; return 1; } else if (cmp > 1) - { - p->more_r = rset_forward( p->rfd_r, - p->buf_r, (info->cmp), p->buf_l); - } + p->more_r = rset_forward( p->rfd_r, p->buf_r, p->buf_l); else { - memcpy (buf, p->buf_l, info->key_size); + memcpy (buf, p->buf_l, kctrl->key_size); do { p->more_l = rset_read (p->rfd_l, p->buf_l); if (!p->more_l) break; - cmp = (*info->cmp)(p->buf_l, buf); + cmp = (*kctrl->cmp)(p->buf_l, buf); } while (cmp >= -1 && cmp <= 1); do { p->more_r = rset_read (p->rfd_r, p->buf_r); if (!p->more_r) break; - cmp = (*info->cmp)(p->buf_r, buf); + cmp = (*kctrl->cmp)(p->buf_r, buf); } while (cmp >= -1 && cmp <= 1); } } diff --git a/rset/rset.c b/rset/rset.c index 798ff8b..a118ee5 100644 --- a/rset/rset.c +++ b/rset/rset.c @@ -1,4 +1,4 @@ -/* $Id: rset.c,v 1.30 2004-08-31 14:43:42 heikki Exp $ +/* $Id: rset.c,v 1.31 2004-09-01 15:01:32 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -67,7 +67,8 @@ void rfd_delete_base(RSFD rfd) } -RSET rset_create_base(const struct rset_control *sel, NMEM nmem) +RSET rset_create_base(const struct rset_control *sel, + NMEM nmem, const struct key_control *kcontrol) /* FIXME - Add keysize and cmp function */ /* FIXME - Add a general key-func block for cmp, dump, etc */ { @@ -89,6 +90,7 @@ RSET rset_create_base(const struct rset_control *sel, NMEM nmem) rnew->count = 1; rnew->priv = 0; rnew->free_list=NULL; + rnew->keycontrol=kcontrol; return rnew; } @@ -125,7 +127,6 @@ void rset_default_pos (RSFD rfd, double *current, double *total) #endif int rset_default_forward(RSFD rfd, void *buf, - int (*cmpfunc)(const void *p1, const void *p2), const void *untilbuf) { int more=1; @@ -138,7 +139,7 @@ int rset_default_forward(RSFD rfd, void *buf, logf (LOG_DEBUG, "rset_default_forward looping m=%d c=%d",more,cmp); more=rset_read(rfd, buf); if (more) - cmp=(*cmpfunc)(untilbuf,buf); + cmp=(rfd->rset->keycontrol->cmp)(untilbuf,buf); /* if (more) key_logdump(LOG_DEBUG,buf); */ } diff --git a/rset/rsisamb.c b/rset/rsisamb.c index e4c58e1..170a22d 100644 --- a/rset/rsisamb.c +++ b/rset/rsisamb.c @@ -1,4 +1,4 @@ -/* $Id: rsisamb.c,v 1.20 2004-08-31 14:43:42 heikki Exp $ +/* $Id: rsisamb.c,v 1.21 2004-09-01 15:01:32 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -23,9 +23,8 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include #include -#include +#include #include -#include <../index/index.h> /* for log_keydump. Debugging only */ #ifndef RSET_DEBUG #define RSET_DEBUG 0 @@ -35,9 +34,7 @@ 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_forward(RSFD rfd, void *buf, - int (*cmpfunc)(const void *p1, const void *p2), - const void *untilbuf); +static int r_forward(RSFD rfd, void *buf, const void *untilbuf); static void r_pos (RSFD rfd, double *current, double *total); static int r_read (RSFD rfd, void *buf); static int r_write (RSFD rfd, const void *buf); @@ -65,19 +62,14 @@ struct rset_pp_info { struct rset_isamb_info { ISAMB is; ISAMB_P pos; - int key_size; - int (*cmp)(const void *p1, const void *p2); }; -RSET rsisamb_create( NMEM nmem, int key_size, - int (*cmp)(const void *p1, const void *p2), +RSET rsisamb_create( NMEM nmem, const struct key_control *kcontrol, ISAMB is, ISAMB_P pos) { - RSET rnew=rset_create_base(&control, nmem); + RSET rnew=rset_create_base(&control, nmem, kcontrol); struct rset_isamb_info *info; info = (struct rset_isamb_info *) nmem_malloc(rnew->nmem,sizeof(*info)); - info->key_size = key_size; - info->cmp = cmp; info->is=is; info->pos=pos; rnew->priv=info; @@ -104,8 +96,8 @@ RSFD r_open (RSET ct, int flag) if (rfd->priv) ptinfo=(struct rset_pp_info *) (rfd->priv); else { - ptinfo = (struct rset_pp_info *) nmem_malloc (ct->nmem,sizeof(*ptinfo)); - ptinfo->buf = nmem_malloc (ct->nmem,info->key_size); + ptinfo = (struct rset_pp_info *)nmem_malloc(ct->nmem,sizeof(*ptinfo)); + ptinfo->buf = nmem_malloc (ct->nmem,ct->keycontrol->key_size); rfd->priv=ptinfo; } ptinfo->pt = isamb_pp_open (info->is, info->pos); @@ -126,9 +118,7 @@ static void r_rewind (RSFD rfd) abort (); } -static int r_forward(RSFD rfd, void *buf, - int (*cmpfunc)(const void *p1, const void *p2), - const void *untilbuf) +static int r_forward(RSFD rfd, void *buf, const void *untilbuf) { struct rset_pp_info *pinfo=(struct rset_pp_info *)(rfd->priv); return isamb_pp_forward(pinfo->pt, buf, untilbuf); diff --git a/rset/rsisamc.c b/rset/rsisamc.c index 126066e..5761a9b 100644 --- a/rset/rsisamc.c +++ b/rset/rsisamc.c @@ -1,4 +1,4 @@ -/* $Id: rsisamc.c,v 1.23 2004-08-31 10:43:39 heikki Exp $ +/* $Id: rsisamc.c,v 1.24 2004-09-01 15:01:32 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -27,7 +27,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include #include -#include +#include static RSFD r_open (RSET ct, int flag); static void r_close (RSFD rfd); @@ -54,31 +54,20 @@ const struct rset_control *rset_kind_isamc = &control; struct rset_pp_info { ISAMC_PP pt; - struct rset_pp_info *next; - struct rset_isamc_info *info; void *buf; }; struct rset_isamc_info { ISAMC is; ISAMC_P pos; - int key_size; - int (*cmp)(const void *p1, const void *p2); - struct rset_pp_info *ispt_list; - struct rset_pp_info *free_list; }; -RSET rsisamc_create( NMEM nmem, int key_size, - int (*cmp)(const void *p1, const void *p2), - ISAMC is, ISAMC_P pos) +RSET rsisamc_create( NMEM nmem, const struct key_control *kcontrol, + ISAMC is, ISAMC_P pos) { - RSET rnew=rset_create_base(&control, nmem); + RSET rnew=rset_create_base(&control, nmem, kcontrol); struct rset_isamc_info *info; info = (struct rset_isamc_info *) nmem_malloc(rnew->nmem,sizeof(*info)); - info->key_size = key_size; - info->cmp = cmp; - info->ispt_list = NULL; - info->free_list = NULL; info->is=is; info->pos=pos; rnew->priv=info; @@ -87,16 +76,12 @@ RSET rsisamc_create( NMEM nmem, int key_size, static void r_delete (RSET ct) { - struct rset_isamc_info *info = (struct rset_isamc_info *) ct->priv; - logf (LOG_DEBUG, "rsisamc_delete"); - assert (info->ispt_list == NULL); } RSFD r_open (RSET ct, int flag) { - struct rset_isamc_info *info = (struct rset_isamc_info *) ct->priv; RSFD rfd; struct rset_pp_info *ptinfo; @@ -112,7 +97,7 @@ RSFD r_open (RSET ct, int flag) else { ptinfo = (struct rset_pp_info *) nmem_malloc (ct->nmem,sizeof(*ptinfo)); rfd->priv=ptinfo; - ptinfo->buf = nmem_malloc (ct->nmem,info->key_size); + ptinfo->buf = nmem_malloc (ct->nmem,ct->keycontrol->key_size); } return rfd; } @@ -151,3 +136,4 @@ static void r_pos (RSFD rfd, double *current, double *total) *current=-1; /* sorry, not implemented yet */ *total=-1; } + diff --git a/rset/rsisams.c b/rset/rsisams.c index e6031e1..835f715 100644 --- a/rset/rsisams.c +++ b/rset/rsisams.c @@ -1,4 +1,4 @@ -/* $Id: rsisams.c,v 1.11 2004-08-31 10:43:39 heikki Exp $ +/* $Id: rsisams.c,v 1.12 2004-09-01 15:01:32 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -25,7 +25,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include #include -#include +#include static RSFD r_open (RSET ct, int flag); static void r_close (RSFD rfd); @@ -60,18 +60,15 @@ struct rset_isams_info { }; -RSET rsisams_create( NMEM nmem, int key_size, - int (*cmp)(const void *p1, const void *p2), +RSET rsisams_create( NMEM nmem, const struct key_control *kcontrol, ISAMS is, ISAMS_P pos) { - RSET rnew=rset_create_base(&control, nmem); + RSET rnew=rset_create_base(&control, nmem, kcontrol); struct rset_isams_info *info; info = (struct rset_isams_info *) nmem_malloc(rnew->nmem,sizeof(*info)); - assert(key_size); /* FIXME - these belong to the general rset */ - assert(cmp); + rnew->priv=info; info->is=is; info->pos=pos; - rnew->priv=info; return rnew; } diff --git a/rset/rsmultior.c b/rset/rsmultior.c index 70e22b6..83a24fe 100644 --- a/rset/rsmultior.c +++ b/rset/rsmultior.c @@ -1,4 +1,4 @@ -/* $Id: rsmultior.c,v 1.8 2004-08-31 10:43:39 heikki Exp $ +/* $Id: rsmultior.c,v 1.9 2004-09-01 15:01:32 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -30,7 +30,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include -#include +#include static RSFD r_open (RSET ct, int flag); static void r_close (RSFD rfd); @@ -39,7 +39,6 @@ static void r_rewind (RSFD rfd); static int r_read (RSFD rfd, void *buf); static int r_write (RSFD rfd, const void *buf); static int r_forward(RSFD rfd, void *buf, - int (*cmpfunc)(const void *p1, const void *p2), const void *untilbuf); static void r_pos (RSFD rfd, double *current, double *total); @@ -75,17 +74,13 @@ struct heap_item { struct heap { int heapnum; int heapmax; - int keysize; - int (*cmp)(const void *p1, const void *p2); + const struct key_control *kctrl; struct heap_item **heap; /* ptrs to the rfd */ }; typedef struct heap *HEAP; struct rset_multior_info { - int key_size; - int no_rec; - int (*cmp)(const void *p1, const void *p2); int no_rsets; RSET *rsets; }; @@ -96,8 +91,6 @@ struct rset_multior_rfd { struct heap_item *items; /* we alloc and free them here */ HEAP h; zint hits; /* returned so far */ - char *prevvalue; /* to see if we are in another record */ - /* FIXME - is this really needed? */ }; #if 0 @@ -127,7 +120,7 @@ static void heap_swap (HEAP h, int x, int y) static int heap_cmp(HEAP h, int x, int y) { - return (*h->cmp)(h->heap[x]->buf,h->heap[y]->buf); + return (*h->kctrl->cmp)(h->heap[x]->buf,h->heap[y]->buf); } static int heap_empty(HEAP h) @@ -192,17 +185,15 @@ static void heap_insert (HEAP h, struct heap_item *hi) static -HEAP heap_create (NMEM nmem, int size, int key_size, - int (*cmp)(const void *p1, const void *p2)) +HEAP heap_create (NMEM nmem, int size, const struct key_control *kctrl) { HEAP h = (HEAP) nmem_malloc (nmem, sizeof(*h)); ++size; /* heap array starts at 1 */ h->heapnum = 0; h->heapmax = size; - h->keysize = key_size; - h->cmp = cmp; - h->heap = (struct heap_item**) nmem_malloc(nmem,(size)*sizeof(*h->heap)); + h->kctrl=kctrl; + h->heap = (struct heap_item**) nmem_malloc(nmem,size*sizeof(*h->heap)); h->heap[0]=0; /* not used */ return h; } @@ -219,15 +210,12 @@ static void heap_destroy (HEAP h) } -RSET rsmultior_create( NMEM nmem, int key_size, - int (*cmp)(const void *p1, const void *p2), +RSET rsmultior_create( NMEM nmem, const struct key_control *kcontrol, int no_rsets, RSET* rsets) { - RSET rnew=rset_create_base(&control, nmem); + RSET rnew=rset_create_base(&control, nmem,kcontrol); 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)); @@ -248,6 +236,7 @@ static RSFD r_open (RSET ct, int flag) RSFD rfd; struct rset_multior_rfd *p; struct rset_multior_info *info = (struct rset_multior_info *) ct->priv; + const struct key_control *kctrl = ct->keycontrol; int i; if (flag & RSETF_WRITE) @@ -265,17 +254,15 @@ static RSFD r_open (RSET ct, int flag) else { p = (struct rset_multior_rfd *) nmem_malloc (ct->nmem,sizeof(*p)); rfd->priv=p; - p->h = heap_create( ct->nmem, info->no_rsets, - info->key_size, info->cmp); + p->h = heap_create( ct->nmem, info->no_rsets, kctrl); p->items=(struct heap_item *) nmem_malloc(ct->nmem, info->no_rsets*sizeof(*p->items)); for (i=0; ino_rsets; i++){ p->items[i].rset=info->rsets[i]; - p->items[i].buf=nmem_malloc(ct->nmem,info->key_size); + p->items[i].buf=nmem_malloc(ct->nmem,kctrl->key_size); } } p->flag = flag; - p->prevvalue=0; p->hits=0; for (i=0; ino_rsets; i++){ p->items[i].fd=rset_open(info->rsets[i],RSETF_READ); @@ -305,23 +292,19 @@ static void r_rewind (RSFD rfd) } -static int r_forward(RSFD rfd, void *buf, - int (*cmpfunc)(const void *p1, const void *p2), - const void *untilbuf) +static int r_forward(RSFD rfd, void *buf, const void *untilbuf) { - struct rset_multior_info *info=(struct rset_multior_info *)(rfd->rset->priv); - struct rset_multior_rfd *mrfd=(struct rset_multior_rfd *)(rfd->priv); + struct rset_multior_rfd *mrfd=rfd->priv; + const struct key_control *kctrl=rfd->rset->keycontrol; struct heap_item it; int rdres; if (heap_empty(mrfd->h)) return 0; - if (cmpfunc) - assert(cmpfunc==info->cmp); it = *(mrfd->h->heap[1]); - memcpy(buf,it.buf, info->key_size); + memcpy(buf,it.buf, kctrl->key_size); (mrfd->hits)++; if (untilbuf) - rdres=rset_forward(it.fd, it.buf, cmpfunc,untilbuf); + rdres=rset_forward(it.fd, it.buf, untilbuf); else rdres=rset_read(it.fd, it.buf); if ( rdres ) @@ -334,7 +317,7 @@ static int r_forward(RSFD rfd, void *buf, static int r_read (RSFD rfd, void *buf) { - return r_forward(rfd, buf,0,0); + return r_forward(rfd, buf,0); } static void r_pos (RSFD rfd, double *current, double *total) diff --git a/rset/rsnull.c b/rset/rsnull.c index 4bd90c6..6f3e44a 100644 --- a/rset/rsnull.c +++ b/rset/rsnull.c @@ -1,4 +1,4 @@ -/* $Id: rsnull.c,v 1.24 2004-08-31 10:43:39 heikki Exp $ +/* $Id: rsnull.c,v 1.25 2004-09-01 15:01:32 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -25,7 +25,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include #include -#include +#include static RSFD r_open (RSET ct, int flag); @@ -51,9 +51,9 @@ static const struct rset_control control = const struct rset_control *rset_kind_null = &control; -RSET rsnull_create(NMEM nmem ) +RSET rsnull_create(NMEM nmem, const struct key_control *kcontrol ) { - RSET rnew=rset_create_base(&control, nmem); + RSET rnew=rset_create_base(&control, nmem, kcontrol); rnew->priv=NULL; return rnew; } diff --git a/rset/rsprox.c b/rset/rsprox.c index d7618fa..558d030 100644 --- a/rset/rsprox.c +++ b/rset/rsprox.c @@ -1,4 +1,4 @@ -/* $Id: rsprox.c,v 1.13 2004-08-31 10:43:40 heikki Exp $ +/* $Id: rsprox.c,v 1.14 2004-09-01 15:01:32 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -26,7 +26,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include -#include +#include #ifndef RSET_DEBUG #define RSET_DEBUG 0 @@ -36,9 +36,7 @@ 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_forward(RSFD rfd, void *buf, - int (*cmpfunc)(const void *p1, const void *p2), - const void *untilbuf); +static int r_forward(RSFD rfd, void *buf, const void *untilbuf); static int r_read (RSFD rfd, void *buf); static int r_write (RSFD rfd, const void *buf); static void r_pos (RSFD rfd, double *current, double *total); @@ -59,16 +57,12 @@ static const struct rset_control control = const struct rset_control *rset_kind_prox = &control; struct rset_prox_info { -/* struct rset_prox_parms p; */ - RSET *rset; - int rset_no; + RSET *rset; /* array of 'child' rsets */ + int rset_no; /* how many of them */ int ordered; int exclusion; int relation; int distance; - int key_size; - int (*cmp)(const void *p1, const void *p2); - int (*getseq)(const void *p); }; struct rset_prox_rfd { @@ -79,19 +73,14 @@ struct rset_prox_rfd { }; -RSET rsprox_create( NMEM nmem, int key_size, - int (*cmp)(const void *p1, const void *p2), - int (*getseq)(const void *p), +RSET rsprox_create( NMEM nmem, const struct key_control *kcontrol, int rset_no, RSET *rset, int ordered, int exclusion, int relation, int distance) { - RSET rnew=rset_create_base(&control, nmem); + RSET rnew=rset_create_base(&control, nmem, kcontrol); struct rset_prox_info *info; info = (struct rset_prox_info *) nmem_malloc(rnew->nmem,sizeof(*info)); - info->key_size = key_size; - info->cmp = cmp; - info->getseq=getseq; /* FIXME - what about multi-level stuff ?? */ info->rset = nmem_malloc(rnew->nmem,rset_no * sizeof(*info->rset)); memcpy(info->rset, rset, rset_no * sizeof(*info->rset)); @@ -136,10 +125,11 @@ static RSFD r_open (RSET ct, int flag) p->more = nmem_malloc (ct->nmem,sizeof(*p->more) * info->rset_no); p->buf = nmem_malloc(ct->nmem,sizeof(*p->buf) * info->rset_no); for (i = 0; i < info->rset_no; i++) - p->buf[i] = nmem_malloc(ct->nmem,info->key_size); + p->buf[i] = nmem_malloc(ct->nmem,ct->keycontrol->key_size); p->rfd = nmem_malloc(ct->nmem,sizeof(*p->rfd) * info->rset_no); } - logf(LOG_DEBUG,"rsprox (%s) open [%p]", ct->control->desc, rfd); + logf(LOG_DEBUG,"rsprox (%s) open [%p] n=%d", + ct->control->desc, rfd, info->rset_no); for (i = 0; i < info->rset_no; i++) { p->rfd[i] = rset_open (info->rset[i], RSETF_READ); @@ -176,21 +166,19 @@ static void r_rewind (RSFD rfd) p->hits=0; } -static int r_forward (RSFD rfd, void *buf, - int (*cmpfunc)(const void *p1, const void *p2), - const void *untilbuf) +static int r_forward (RSFD rfd, void *buf, const void *untilbuf) { struct rset_prox_info *info = (struct rset_prox_info *)(rfd->rset->priv); struct rset_prox_rfd *p=(struct rset_prox_rfd *)(rfd->priv); + const struct key_control *kctrl=rfd->rset->keycontrol; int cmp=0; int i; if (untilbuf) { /* it is enough to forward first one. Other will follow. */ - if ( p->more[0] && ((cmpfunc)(untilbuf, p->buf[0]) >= 2) ) - p->more[0] = rset_forward(p->rfd[0], p->buf[0], - info->cmp, untilbuf); + if ( p->more[0] && ((kctrl->cmp)(untilbuf, p->buf[0]) >= 2) ) + p->more[0] = rset_forward(p->rfd[0], p->buf[0], untilbuf); } if (info->ordered && info->relation == 3 && info->exclusion == 0 && info->distance == 1) @@ -204,19 +192,18 @@ static int r_forward (RSFD rfd, void *buf, p->more[0] = 0; /* saves us a goto out of while loop. */ break; } - cmp = (*info->cmp) (p->buf[i], p->buf[i-1]); + cmp = (*kctrl->cmp) (p->buf[i], p->buf[i-1]); if (cmp > 1) { p->more[i-1] = rset_forward (p->rfd[i-1], p->buf[i-1], - info->cmp, p->buf[i]); break; } else if (cmp == 1) { - if ((*info->getseq)(p->buf[i-1]) +1 != - (*info->getseq)(p->buf[i])) + if ((*kctrl->getseq)(p->buf[i-1]) +1 != + (*kctrl->getseq)(p->buf[i])) { /* FIXME - We need more flexible multilevel stuff */ p->more[i-1] = rset_read ( p->rfd[i-1], p->buf[i-1]); break; @@ -224,14 +211,14 @@ static int r_forward (RSFD rfd, void *buf, } else { - p->more[i] = rset_forward (p->rfd[i], p->buf[i], - info->cmp, p->buf[i-1]); + p->more[i] = rset_forward (p->rfd[i], + p->buf[i], p->buf[i-1]); break; } } if (i == info->rset_no) { - memcpy (buf, p->buf[0], info->key_size); + memcpy (buf, p->buf[0], kctrl->key_size); p->more[0] = rset_read (p->rfd[0], p->buf[0]); p->hits++; return 1; @@ -242,28 +229,29 @@ static int r_forward (RSFD rfd, void *buf, { while (p->more[0] && p->more[1]) { - int cmp = (*info->cmp)(p->buf[0], p->buf[1]); + int cmp = (*kctrl->cmp)(p->buf[0], p->buf[1]); if (cmp < -1) p->more[0] = rset_forward (p->rfd[0], - p->buf[0], info->cmp, p->buf[0]); + p->buf[0], p->buf[0]); + /* FIXME - this certainly looks wrong! */ else if (cmp > 1) p->more[1] = rset_forward (p->rfd[1], - p->buf[1], info->cmp, p->buf[1]); + p->buf[1], p->buf[1]); else { - int seqno[500]; + zint seqno[500]; /* FIXME - why 500 ?? */ int n = 0; - seqno[n++] = (*info->getseq)(p->buf[0]); + seqno[n++] = (*kctrl->getseq)(p->buf[0]); while ((p->more[0] = rset_read (p->rfd[0], p->buf[0])) >= -1 && p->more[0] <= -1) if (n < 500) - seqno[n++] = (*info->getseq)(p->buf[0]); + seqno[n++] = (*kctrl->getseq)(p->buf[0]); for (i = 0; igetseq)(p->buf[1]) - seqno[i]; + int diff = (*kctrl->getseq)(p->buf[1]) - seqno[i]; int excl = info->exclusion; if (!info->ordered && diff < 0) diff = -diff; @@ -296,7 +284,7 @@ static int r_forward (RSFD rfd, void *buf, } if (excl) { - memcpy (buf, p->buf[1], info->key_size); + memcpy (buf, p->buf[1], kctrl->key_size); p->more[1] = rset_read ( p->rfd[1], p->buf[1]); p->hits++; @@ -313,7 +301,7 @@ static int r_forward (RSFD rfd, void *buf, static int r_read (RSFD rfd, void *buf) { - return r_forward(rfd, buf, 0, 0); + return r_forward(rfd, buf, 0); } static int r_write (RSFD rfd, const void *buf) diff --git a/rset/rstemp.c b/rset/rstemp.c index 4450132..afdeb54 100644 --- a/rset/rstemp.c +++ b/rset/rstemp.c @@ -1,4 +1,4 @@ -/* $Id: rstemp.c,v 1.47 2004-08-31 10:43:40 heikki Exp $ +/* $Id: rstemp.c,v 1.48 2004-09-01 15:01:32 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003 Index Data Aps @@ -32,7 +32,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include -#include +#include static RSFD r_open (RSET ct, int flag); static void r_close (RSFD rfd); @@ -59,9 +59,8 @@ static const struct rset_control control = const struct rset_control *rset_kind_temp = &control; struct rset_temp_info { - int fd; - char *fname; - size_t key_size; /* key size */ + int fd; /* file descriptor for temp file */ + char *fname; /* name of temp file */ char *buf_mem; /* window buffer */ size_t buf_size; /* size of window */ size_t pos_end; /* last position in set */ @@ -70,7 +69,6 @@ struct rset_temp_info { int dirty; /* window is dirty */ zint hits; /* no of hits */ char *temp_path; - int (*cmp)(const void *p1, const void *p2); }; struct rset_temp_rfd { @@ -80,24 +78,21 @@ struct rset_temp_rfd { zint cur; /* number of the current hit */ }; -RSET rstemp_create( NMEM nmem, int key_size, - int (*cmp)(const void *p1, const void *p2), +RSET rstemp_create( NMEM nmem, const struct key_control *kcontrol, const char *temp_path) { - RSET rnew=rset_create_base(&control, nmem); + RSET rnew=rset_create_base(&control, nmem, kcontrol); struct rset_temp_info *info; info = (struct rset_temp_info *) nmem_malloc(rnew->nmem, sizeof(*info)); info->fd = -1; info->fname = NULL; - info->key_size = key_size; info->buf_size = 4096; info->buf_mem = (char *) nmem_malloc (rnew->nmem, info->buf_size); info->pos_end = 0; info->pos_buf = 0; info->dirty = 0; info->hits = 0; - info->cmp = cmp; if (!temp_path) info->temp_path = NULL; @@ -111,19 +106,12 @@ static void r_delete (RSET ct) { struct rset_temp_info *info = (struct rset_temp_info*) ct->priv; - xfree (info->buf_mem); logf (LOG_DEBUG, "r_delete: set size %ld", (long) info->pos_end); if (info->fname) { logf (LOG_DEBUG, "r_delete: unlink %s", info->fname); unlink (info->fname); - xfree (info->fname); /* FIXME should be nmem'd, and not freed here */ } - /* - if (info->temp_path) - xfree (info->temp_path); - xfree (info); - */ /* nmem'd */ } @@ -149,7 +137,7 @@ static RSFD r_open (RSET ct, int flag) if (!rfd->priv){ prfd= (struct rset_temp_rfd *) nmem_malloc(ct->nmem, sizeof(*prfd)); rfd->priv=(void *)prfd; - prfd->buf = nmem_malloc (ct->nmem,info->key_size); + prfd->buf = nmem_malloc (ct->nmem,ct->keycontrol->key_size); } r_rewind (rfd); return rfd; @@ -180,11 +168,11 @@ static void r_flush (RSFD rfd, int mk) logf (LOG_FATAL|LOG_ERRNO, "mkstemp %s", template); exit (1); } - info->fname = (char *) xmalloc (strlen(template)+1); + info->fname= nmem_malloc(rfd->rset->nmem,strlen(template)+1); strcpy (info->fname, template); #else char *s = (char*) tempnam (info->temp_path, "zrs"); - info->fname = (char *) xmalloc (strlen(s)+1); + info->fname= nmem_malloc(rfd->rset->nmem,strlen(template)+1); strcpy (info->fname, s); logf (LOG_DEBUG, "creating tempfile %s", info->fname); @@ -293,7 +281,7 @@ static int r_read (RSFD rfd, void *buf) struct rset_temp_rfd *mrfd = (struct rset_temp_rfd*) rfd->priv; struct rset_temp_info *info = (struct rset_temp_info *)rfd->rset->priv; - size_t nc = mrfd->pos_cur + info->key_size; + size_t nc = mrfd->pos_cur + rfd->rset->keycontrol->key_size; if (mrfd->pos_cur < info->pos_buf || nc > info->pos_border) { @@ -304,7 +292,7 @@ static int r_read (RSFD rfd, void *buf) r_reread (rfd); } memcpy (buf, info->buf_mem + (mrfd->pos_cur - info->pos_buf), - info->key_size); + rfd->rset->keycontrol->key_size); mrfd->pos_cur = nc; mrfd->cur++; return 1; @@ -315,7 +303,7 @@ static int r_write (RSFD rfd, const void *buf) struct rset_temp_rfd *mrfd = (struct rset_temp_rfd*) rfd->priv; struct rset_temp_info *info = (struct rset_temp_info *)rfd->rset->priv; - size_t nc = mrfd->pos_cur + info->key_size; + size_t nc = mrfd->pos_cur + rfd->rset->keycontrol->key_size; if (nc > info->pos_buf + info->buf_size) { @@ -326,7 +314,7 @@ static int r_write (RSFD rfd, const void *buf) } info->dirty = 1; memcpy (info->buf_mem + (mrfd->pos_cur - info->pos_buf), buf, - info->key_size); + rfd->rset->keycontrol->key_size); mrfd->pos_cur = nc; if (nc > info->pos_end) info->pos_border = info->pos_end = nc;