From: Heikki Levanto Date: Tue, 24 Aug 2004 14:25:15 +0000 (+0000) Subject: Cleaned up the creation of rsets, added nmem X-Git-Tag: snippet.version.1~397 X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=commitdiff_plain;h=927733195c5646988dcc65365bb45b978b02a15a Cleaned up the creation of rsets, added nmem --- diff --git a/include/rsbetween.h b/include/rsbetween.h index 540a224..a6f117d 100644 --- a/include/rsbetween.h +++ b/include/rsbetween.h @@ -1,4 +1,4 @@ -/* $Id: rsbetween.h,v 1.5 2002-08-02 19:26:55 adam Exp $ +/* $Id: rsbetween.h,v 1.6 2004-08-24 14:25:15 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -31,18 +31,12 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA extern "C" { #endif -extern const struct rset_control *rset_kind_between; +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) ); -typedef struct rset_between_parms -{ - 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 *p,char *buf); /* prints p into buf and returns buf */ -} rset_between_parms; +extern const struct rset_control *rset_kind_between; #ifdef __cplusplus } diff --git a/include/rsbool.h b/include/rsbool.h index c38c963..fe5efd3 100644 --- a/include/rsbool.h +++ b/include/rsbool.h @@ -1,4 +1,4 @@ -/* $Id: rsbool.h,v 1.9 2004-06-02 12:31:23 adam Exp $ +/* $Id: rsbool.h,v 1.10 2004-08-24 14:25:15 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -29,18 +29,20 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA extern "C" { #endif -extern const struct rset_control *rset_kind_and; -extern const struct rset_control *rset_kind_or; -extern const struct rset_control *rset_kind_not; - -typedef struct rset_bool_parms -{ - int key_size; - RSET rset_l; - RSET rset_r; - int (*cmp)(const void *p1, const void *p2); - void (*log_item)(int logmask, const void *a, const char *txt); -} rset_bool_parms; +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_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_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) ); #ifdef __cplusplus } diff --git a/include/rset.h b/include/rset.h index 23e72ec..2add4a1 100644 --- a/include/rset.h +++ b/include/rset.h @@ -1,4 +1,4 @@ -/* $Id: rset.h,v 1.30 2004-08-23 12:38:53 heikki Exp $ +/* $Id: rset.h,v 1.31 2004-08-24 14:25:15 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -30,14 +30,14 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #ifdef __cplusplus extern "C" { #endif -typedef void *RSFD; +typedef void *RSFD; /* Rset "file descriptor" */ typedef struct rset *RSET; struct rset_control { char *desc; /* text description of set type (for debugging) */ - void *(*f_create)(RSET ct, const struct rset_control *sel, void *parms); +/* void *(*f_create)(RSET ct, const struct rset_control *sel, void *parms); */ RSFD (*f_open)(RSET ct, int wflag); void (*f_close)(RSFD rfd); void (*f_delete)(RSET ct); @@ -56,39 +56,39 @@ int rset_default_forward(RSET ct, RSFD rfd, void *buf, const void *untilbuf); void rset_default_pos(RSFD rfd, double *current, double *total); -/* -struct rset_term { - char *name; - zint nn; - char *flags; - zint count; - int type; -}; -*/ typedef struct rset { const struct rset_control *control; - int count; - void *buf; + int count; /* reference count */ + void *priv; /* stuff private to the given type of rset */ + NMEM nmem; /* nibble memory for various allocs */ + char my_nmem; /* Should the nmem be destroyed with the rset? */ + /* 1 if created with it, 0 if passed from above */ } rset; +/* rset is a "virtual base class", which will never exist on its own */ +/* all instances are rsets of some specific type, like rsisamb, or rsbool */ +/* They keep their own stuff behind the priv pointer. */ #define RSETF_READ 0 #define RSETF_WRITE 1 -RSET rset_create(const struct rset_control *sel, void *parms); +RSET rset_create_base(const struct rset_control *sel, NMEM nmem); + +RSET rset_create_OLD(const struct rset_control *sel, void *parms); /* parameters? */ -/* int rset_open(RSET rs, int wflag); */ +void rset_delete(RSET rs); + +RSET rset_dup (RSET rs); + + +/* RSFD rset_open(RSET rs, int wflag); */ #define rset_open(rs, wflag) (*(rs)->control->f_open)((rs), (wflag)) /* void rset_close(RSET rs); */ #define rset_close(rs, rfd) (*(rs)->control->f_close)(rfd) -void rset_delete(RSET rs); - -RSET rset_dup (RSET rs); - /* void rset_rewind(RSET rs); */ #define rset_rewind(rs, rfd) (*(rs)->control->f_rewind)((rfd)) diff --git a/include/rsisamb.h b/include/rsisamb.h index 94c4c8a..a95a6ba 100644 --- a/include/rsisamb.h +++ b/include/rsisamb.h @@ -1,4 +1,4 @@ -/* $Id: rsisamb.h,v 1.3 2004-08-20 14:44:45 heikki Exp $ +/* $Id: rsisamb.h,v 1.4 2004-08-24 14:25:15 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -32,15 +32,12 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA extern "C" { #endif -extern const struct rset_control *rset_kind_isamb; +/* extern const struct rset_control *rset_kind_isamb; */ + +RSET rsisamb_create( NMEM nmem, int key_size, + int (*cmp)(const void *p1, const void *p2), + ISAMB is, ISAMB_P pos); -typedef struct rset_isamb_parms -{ - int (*cmp)(const void *p1, const void *p2); - int key_size; - ISAMB is; - ISAMB_P pos; -} rset_isamb_parms; #ifdef __cplusplus } diff --git a/include/rsisamc.h b/include/rsisamc.h index 027c533..bd0d3f2 100644 --- a/include/rsisamc.h +++ b/include/rsisamc.h @@ -1,4 +1,4 @@ -/* $Id: rsisamc.h,v 1.8 2004-08-20 14:44:45 heikki Exp $ +/* $Id: rsisamc.h,v 1.9 2004-08-24 14:25:15 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -34,13 +34,9 @@ extern "C" { extern const struct rset_control *rset_kind_isamc; -typedef struct rset_isamc_parms -{ - int (*cmp)(const void *p1, const void *p2); - int key_size; - ISAMC is; - ISAMC_P pos; -} rset_isamc_parms; +RSET rsisamc_create( NMEM nmem, int key_size, + int (*cmp)(const void *p1, const void *p2), + ISAMC is, ISAMC_P pos); #ifdef __cplusplus } diff --git a/include/rsisams.h b/include/rsisams.h index e0a51e6..38d2370 100644 --- a/include/rsisams.h +++ b/include/rsisams.h @@ -1,4 +1,4 @@ -/* $Id: rsisams.h,v 1.3 2004-08-20 14:44:45 heikki Exp $ +/* $Id: rsisams.h,v 1.4 2004-08-24 14:25:15 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -34,11 +34,9 @@ extern "C" { extern const struct rset_control *rset_kind_isams; -typedef struct rset_isams_parms -{ - ISAMS is; - ISAMS_P pos; -} rset_isams_parms; +RSET rsisams_create( NMEM nmem, int key_size, + int (*cmp)(const void *p1, const void *p2), + ISAMS is, ISAMS_P pos); #ifdef __cplusplus } diff --git a/include/rsmultior.h b/include/rsmultior.h index 1f63e72..28f8f35 100644 --- a/include/rsmultior.h +++ b/include/rsmultior.h @@ -1,4 +1,4 @@ -/* $Id: rsmultior.h,v 1.3 2004-08-20 14:44:45 heikki Exp $ +/* $Id: rsmultior.h,v 1.4 2004-08-24 14:25:15 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -29,20 +29,9 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA YAZ_BEGIN_CDECL -extern const struct rset_control *rset_kind_multior; - -typedef struct rset_multior_parms -{ - int key_size; - int (*cmp)(const void *p1, const void *p2); - - int no_rsets; - RSET *rsets; /* array of rsets to multi-or */ - /* allocated when creating parms, */ - /* rset will free when deleted */ - int no_isam_positions; - int no_save_positions; -} rset_multior_parms; +RSET rsmultior_create( NMEM nmem, int key_size, + int (*cmp)(const void *p1, const void *p2), + int no_rsets, RSET* rsets); YAZ_END_CDECL diff --git a/include/rsnull.h b/include/rsnull.h index ae0e546..fbd8a38 100644 --- a/include/rsnull.h +++ b/include/rsnull.h @@ -1,4 +1,4 @@ -/* $Id: rsnull.h,v 1.6 2004-08-20 14:44:45 heikki Exp $ +/* $Id: rsnull.h,v 1.7 2004-08-24 14:25:15 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -31,13 +31,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA extern "C" { #endif -typedef struct rset_null_parms -{ - int key_size; - char *temp_path; -} rset_null_parms; - -extern const struct rset_control *rset_kind_null; +RSET rsnull_create(NMEM nmem); #ifdef __cplusplus } diff --git a/include/rsprox.h b/include/rsprox.h index 49fc043..d3bb7a7 100644 --- a/include/rsprox.h +++ b/include/rsprox.h @@ -1,4 +1,4 @@ -/* $Id: rsprox.h,v 1.1 2004-06-09 12:15:25 adam Exp $ +/* $Id: rsprox.h,v 1.2 2004-08-24 14:25:15 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -29,21 +29,12 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA extern "C" { #endif -extern const struct rset_control *rset_kind_prox; - -typedef struct rset_prox_parms -{ - RSET *rset; - int rset_no; - int ordered; - int exclusion; - int relation; - int distance; - int key_size; - int (*cmp)(const void *p1, const void *p2); - int (*getseq)(const void *p); - void (*log_item)(int logmask, const void *a, const char *txt); -} rset_prox_parms; +RSET rsprox_create( NMEM nmem, int key_size, + int (*cmp)(const void *p1, const void *p2), + int (*getseq)(const void *p), + int rset_no, RSET *rset, + int ordered, int exclusion, + int relation, int distance); #ifdef __cplusplus } diff --git a/include/rstemp.h b/include/rstemp.h index c12c8d0..d4c8f69 100644 --- a/include/rstemp.h +++ b/include/rstemp.h @@ -1,4 +1,4 @@ -/* $Id: rstemp.h,v 1.10 2004-08-20 14:44:45 heikki Exp $ +/* $Id: rstemp.h,v 1.11 2004-08-24 14:25:15 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -31,6 +31,10 @@ 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), + const char *temp_path); +/* extern const struct rset_control *rset_kind_temp; typedef struct rset_temp_parms @@ -39,6 +43,7 @@ typedef struct rset_temp_parms int key_size; const char *temp_path; } rset_temp_parms; +*/ #ifdef __cplusplus } diff --git a/index/trunc.c b/index/trunc.c index acd9e4a..6a5f5bb 100644 --- a/index/trunc.c +++ b/index/trunc.c @@ -1,4 +1,4 @@ -/* $Id: trunc.c,v 1.36 2004-08-20 14:44:46 heikki Exp $ +/* $Id: trunc.c,v 1.37 2004-08-24 14:25:16 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -140,13 +140,18 @@ static RSET rset_trunc_r (ZebraHandle zi, const char *term, int length, { RSET result; RSFD result_rsfd; - rset_temp_parms parms; int nn = 0; + /* + rset_temp_parms parms; parms.cmp = key_compare_it; parms.key_size = sizeof(struct it_key); parms.temp_path = res_get (zi->res, "setTmpDir"); result = rset_create (rset_kind_temp, &parms); + */ + result=rstemp_create(NULL, /* FIXME - use a proper nmem */ + sizeof(struct it_key), key_compare_it, + res_get (zi->res, "setTmpDir")); result_rsfd = rset_open (result, RSETF_WRITE); if (to - from > merge_chunk) @@ -411,13 +416,14 @@ RSET rset_trunc (ZebraHandle zi, ISAMS_P *isam_p, int no, { logf (LOG_DEBUG, "rset_trunc no=%d", no); if (no < 1) - { - rset_null_parms parms; - return rset_create (rset_kind_null, &parms); - } + return rsnull_create (NULL); /* FIXME - use a proper nmem */ if (zi->reg->isams) { if (no == 1) + return rsisams_create(NULL, /* FIXME - use some nmem */ + sizeof(struct it_key), key_compare_it, + zi->reg->isams, *isam_p); + /* { rset_isams_parms parms; @@ -425,11 +431,16 @@ RSET rset_trunc (ZebraHandle zi, ISAMS_P *isam_p, int no, 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(NULL, /* FIXME - use some nmem */ + sizeof(struct it_key), key_compare_it, + zi->reg->isamc, *isam_p); + /* { rset_isamc_parms parms; @@ -439,6 +450,8 @@ RSET rset_trunc (ZebraHandle zi, ISAMS_P *isam_p, int no, 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) { @@ -458,6 +471,10 @@ RSET rset_trunc (ZebraHandle zi, ISAMS_P *isam_p, int no, else if (zi->reg->isamb) { if (no == 1) + return rsisamb_create(NULL, /* FIXME - use some nmem */ + sizeof(struct it_key), key_compare_it, + zi->reg->isamb, *isam_p); + /* { rset_isamb_parms parms; parms.key_size = sizeof(struct it_key); @@ -466,9 +483,20 @@ RSET rset_trunc (ZebraHandle zi, ISAMS_P *isam_p, int no, parms.is = zi->reg->isamb; return rset_create (rset_kind_isamb, &parms); } + */ #if 1 else if (no <10000 ) /* FIXME - hardcoded number */ { + RSET *rsets=xmalloc(no*sizeof(RSET)); /* use nmem! */ + int i; + for (i=0;ireg->isamb, isam_p[i] ); + return rsmultior_create( NULL, /* FIXME - use some nmem */ + sizeof(struct it_key), key_compare_it, + no, rsets); + /* rset_multior_parms m_parms; rset_isamb_parms b_parms; int i; @@ -479,14 +507,13 @@ RSET rset_trunc (ZebraHandle zi, ISAMS_P *isam_p, int no, b_parms.key_size = sizeof(struct it_key); b_parms.cmp = key_compare_it; b_parms.is = zi->reg->isamb; - /* FIXME - make it so that we can pass a null ptr to term */ - /* needs changes in all rsets, here and there! */ for (i=0;i #include #include +#include #include #include @@ -73,7 +74,7 @@ static const char **rpn_char_map_handler (void *vp, const char **from, int len) } static void rpn_char_map_prepare (struct zebra_register *reg, int reg_type, - struct rpn_char_map_info *map_info) + struct rpn_char_map_info *map_info) { map_info->zm = reg->zebra_maps; map_info->reg_type = reg_type; @@ -81,7 +82,7 @@ static void rpn_char_map_prepare (struct zebra_register *reg, int reg_type, } static int attr_find_ex (AttrType *src, oid_value *attributeSetP, - const char **string_value) + const char **string_value) { int num_attributes; @@ -108,7 +109,7 @@ static int attr_find_ex (AttrType *src, oid_value *attributeSetP, break; case Z_AttributeValue_complex: if (src->minor >= element->value.complex->num_list) - break; + break; if (element->attributeSet && attributeSetP) { oident *attrset; @@ -118,23 +119,23 @@ static int attr_find_ex (AttrType *src, oid_value *attributeSetP, } if (element->value.complex->list[src->minor]->which == Z_StringOrNumeric_numeric) - { - ++(src->minor); - return - *element->value.complex->list[src->minor-1]->u.numeric; - } - else if (element->value.complex->list[src->minor]->which == - Z_StringOrNumeric_string) - { - if (!string_value) - break; - ++(src->minor); - *string_value = - element->value.complex->list[src->minor-1]->u.string; - return -2; - } - else - break; + { + ++(src->minor); + return + *element->value.complex->list[src->minor-1]->u.numeric; + } + else if (element->value.complex->list[src->minor]->which == + Z_StringOrNumeric_string) + { + if (!string_value) + break; + ++(src->minor); + *string_value = + element->value.complex->list[src->minor-1]->u.string; + return -2; + } + else + break; default: assert (0); } @@ -173,24 +174,24 @@ struct grep_info { }; static void term_untrans (ZebraHandle zh, int reg_type, - char *dst, const char *src) + char *dst, const char *src) { int len = 0; while (*src) { const char *cp = zebra_maps_output (zh->reg->zebra_maps, - reg_type, &src); - if (!cp && len < IT_MAX_WORD-1) - dst[len++] = *src++; - else - while (*cp && len < IT_MAX_WORD-1) - dst[len++] = *cp++; + reg_type, &src); + if (!cp && len < IT_MAX_WORD-1) + dst[len++] = *src++; + else + while (*cp && len < IT_MAX_WORD-1) + dst[len++] = *cp++; } dst[len] = '\0'; } static void add_isam_p (const char *name, const char *info, - struct grep_info *p) + struct grep_info *p) { if (p->isam_p_indx == p->isam_p_size) { @@ -200,7 +201,7 @@ static void add_isam_p (const char *name, const char *info, #endif p->isam_p_size = 2*p->isam_p_size + 100; new_isam_p_buf = (ISAMC_P *) xmalloc (sizeof(*new_isam_p_buf) * - p->isam_p_size); + p->isam_p_size); if (p->isam_p_buf) { memcpy (new_isam_p_buf, p->isam_p_buf, @@ -211,7 +212,7 @@ static void add_isam_p (const char *name, const char *info, #ifdef TERM_COUNT new_term_no = (int *) xmalloc (sizeof(*new_term_no) * - p->isam_p_size); + p->isam_p_size); if (p->term_no) { memcpy (new_term_no, p->isam_p_buf, @@ -227,20 +228,20 @@ static void add_isam_p (const char *name, const char *info, #if 1 if (p->termset) { - const char *db; - int set, use; - char term_tmp[IT_MAX_WORD]; - int su_code = 0; - int len = key_SU_decode (&su_code, name); - - term_untrans (p->zh, p->reg_type, term_tmp, name+len+1); - logf (LOG_LOG, "grep: %d %c %s", su_code, name[len], term_tmp); - zebraExplain_lookup_ord (p->zh->reg->zei, - su_code, &db, &set, &use); - logf (LOG_LOG, "grep: set=%d use=%d db=%s", set, use, db); - - resultSetAddTerm (p->zh, p->termset, name[len], db, - set, use, term_tmp); + const char *db; + int set, use; + char term_tmp[IT_MAX_WORD]; + int su_code = 0; + int len = key_SU_decode (&su_code, name); + + term_untrans (p->zh, p->reg_type, term_tmp, name+len+1); + logf (LOG_LOG, "grep: %d %c %s", su_code, name[len], term_tmp); + zebraExplain_lookup_ord (p->zh->reg->zei, + su_code, &db, &set, &use); + logf (LOG_LOG, "grep: set=%d use=%d db=%s", set, use, db); + + resultSetAddTerm (p->zh, p->termset, name[len], db, + set, use, term_tmp); } #endif (p->isam_p_indx)++; @@ -253,7 +254,7 @@ static int grep_handle (char *name, const char *info, void *p) } static int term_pre (ZebraMaps zebra_maps, int reg_type, const char **src, - const char *ct1, const char *ct2) + const char *ct1, const char *ct2) { const char *s1, *s0 = *src; const char **map; @@ -279,8 +280,8 @@ static int term_pre (ZebraMaps zebra_maps, int reg_type, const char **src, /* term_100: handle term, where trunc=none (no operators at all) */ static int term_100 (ZebraMaps zebra_maps, int reg_type, - const char **src, char *dst, int space_split, - char *dst_term) + const char **src, char *dst, int space_split, + char *dst_term) { const char *s0, *s1; const char **map; @@ -297,38 +298,38 @@ static int term_100 (ZebraMaps zebra_maps, int reg_type, { s1 = s0; map = zebra_maps_input (zebra_maps, reg_type, &s0, strlen(s0)); - if (space_split) - { - if (**map == *CHR_SPACE) - break; - } - else /* complete subfield only. */ - { - if (**map == *CHR_SPACE) - { /* save space mapping for later .. */ - space_start = s1; - space_end = s0; - continue; - } - else if (space_start) - { /* reload last space */ - while (space_start < space_end) - { + if (space_split) + { + if (**map == *CHR_SPACE) + break; + } + else /* complete subfield only. */ + { + if (**map == *CHR_SPACE) + { /* save space mapping for later .. */ + space_start = s1; + space_end = s0; + continue; + } + else if (space_start) + { /* reload last space */ + while (space_start < space_end) + { if (strchr (REGEX_CHARS, *space_start)) - dst[i++] = '\\'; - dst_term[j++] = *space_start; - dst[i++] = *space_start++; - } - /* and reset */ - space_start = space_end = 0; - } - } - /* add non-space char */ + dst[i++] = '\\'; + dst_term[j++] = *space_start; + dst[i++] = *space_start++; + } + /* and reset */ + space_start = space_end = 0; + } + } + /* add non-space char */ while (s1 < s0) { if (strchr(REGEX_CHARS, *s1)) dst[i++] = '\\'; - dst_term[j++] = *s1; + dst_term[j++] = *s1; dst[i++] = *s1++; } } @@ -340,8 +341,8 @@ static int term_100 (ZebraMaps zebra_maps, int reg_type, /* term_101: handle term, where trunc=Process # */ static int term_101 (ZebraMaps zebra_maps, int reg_type, - const char **src, char *dst, int space_split, - char *dst_term) + const char **src, char *dst, int space_split, + char *dst_term) { const char *s0, *s1; const char **map; @@ -357,7 +358,7 @@ static int term_101 (ZebraMaps zebra_maps, int reg_type, { dst[i++] = '.'; dst[i++] = '*'; - dst_term[j++] = *s0++; + dst_term[j++] = *s0++; } else { @@ -369,7 +370,7 @@ static int term_101 (ZebraMaps zebra_maps, int reg_type, { if (strchr(REGEX_CHARS, *s1)) dst[i++] = '\\'; - dst_term[j++] = *s1; + dst_term[j++] = *s1; dst[i++] = *s1++; } } @@ -382,8 +383,8 @@ static int term_101 (ZebraMaps zebra_maps, int reg_type, /* term_103: handle term, where trunc=re-2 (regular expressions) */ static int term_103 (ZebraMaps zebra_maps, int reg_type, const char **src, - char *dst, int *errors, int space_split, - char *dst_term) + char *dst, int *errors, int space_split, + char *dst_term) { int i = 0; int j = 0; @@ -404,10 +405,10 @@ static int term_103 (ZebraMaps zebra_maps, int reg_type, const char **src, while (*s0) { if (strchr ("^\\()[].*+?|-", *s0)) - { - dst_term[j++] = *s0; + { + dst_term[j++] = *s0; dst[i++] = *s0++; - } + } else { s1 = s0; @@ -418,7 +419,7 @@ static int term_103 (ZebraMaps zebra_maps, int reg_type, const char **src, { if (strchr(REGEX_CHARS, *s1)) dst[i++] = '\\'; - dst_term[j++] = *s1; + dst_term[j++] = *s1; dst[i++] = *s1++; } } @@ -431,17 +432,17 @@ static int term_103 (ZebraMaps zebra_maps, int reg_type, const char **src, /* term_103: handle term, where trunc=re-1 (regular expressions) */ static int term_102 (ZebraMaps zebra_maps, int reg_type, const char **src, - char *dst, int space_split, char *dst_term) + char *dst, int space_split, char *dst_term) { return term_103 (zebra_maps, reg_type, src, dst, NULL, space_split, - dst_term); + dst_term); } /* term_104: handle term, where trunc=Process # and ! */ static int term_104 (ZebraMaps zebra_maps, int reg_type, - const char **src, char *dst, int space_split, - char *dst_term) + const char **src, char *dst, int space_split, + char *dst_term) { const char *s0, *s1; const char **map; @@ -455,7 +456,7 @@ static int term_104 (ZebraMaps zebra_maps, int reg_type, { if (*s0 == '?') { - dst_term[j++] = *s0++; + dst_term[j++] = *s0++; if (*s0 >= '0' && *s0 <= '9') { int limit = 0; @@ -482,13 +483,13 @@ static int term_104 (ZebraMaps zebra_maps, int reg_type, { dst[i++] = '.'; dst[i++] = '*'; - dst_term[j++] = *s0++; + dst_term[j++] = *s0++; } else if (*s0 == '#') - { + { dst[i++] = '.'; - dst_term[j++] = *s0++; - } + dst_term[j++] = *s0++; + } { s1 = s0; map = zebra_maps_input (zebra_maps, reg_type, &s0, strlen(s0)); @@ -498,7 +499,7 @@ static int term_104 (ZebraMaps zebra_maps, int reg_type, { if (strchr(REGEX_CHARS, *s1)) dst[i++] = '\\'; - dst_term[j++] = *s1; + dst_term[j++] = *s1; dst[i++] = *s1++; } } @@ -511,8 +512,8 @@ static int term_104 (ZebraMaps zebra_maps, int reg_type, /* term_105/106: handle term, where trunc=Process * and ! and right trunc */ static int term_105 (ZebraMaps zebra_maps, int reg_type, - const char **src, char *dst, int space_split, - char *dst_term, int right_truncate) + const char **src, char *dst, int space_split, + char *dst_term, int right_truncate) { const char *s0, *s1; const char **map; @@ -528,13 +529,13 @@ static int term_105 (ZebraMaps zebra_maps, int reg_type, { dst[i++] = '.'; dst[i++] = '*'; - dst_term[j++] = *s0++; + dst_term[j++] = *s0++; } else if (*s0 == '!') - { + { dst[i++] = '.'; - dst_term[j++] = *s0++; - } + dst_term[j++] = *s0++; + } { s1 = s0; map = zebra_maps_input (zebra_maps, reg_type, &s0, strlen(s0)); @@ -544,7 +545,7 @@ static int term_105 (ZebraMaps zebra_maps, int reg_type, { if (strchr(REGEX_CHARS, *s1)) dst[i++] = '\\'; - dst_term[j++] = *s1; + dst_term[j++] = *s1; dst[i++] = *s1++; } } @@ -659,14 +660,14 @@ static void gen_regular_rel (char *dst, int val, int islt) dst[dst_p] = '\0'; if (islt) { - /* match everything less than 10^(pos-1) */ - strcat (dst, "0*"); - for (i=1; ireg->zebra_maps, reg_type, - term_sub, term_component, - space_split, term_dst)) + term_sub, term_component, + space_split, term_dst)) return 0; logf (LOG_DEBUG, "Relation <"); - - *term_tmp++ = '('; - for (i = 0; term_component[i]; ) - { - int j = 0; + + *term_tmp++ = '('; + for (i = 0; term_component[i]; ) + { + int j = 0; - if (i) - *term_tmp++ = '|'; - while (j < i) - string_rel_add_char (&term_tmp, term_component, &j); + if (i) + *term_tmp++ = '|'; + while (j < i) + string_rel_add_char (&term_tmp, term_component, &j); - *term_tmp++ = '['; + *term_tmp++ = '['; - *term_tmp++ = '^'; - string_rel_add_char (&term_tmp, term_component, &i); - *term_tmp++ = '-'; + *term_tmp++ = '^'; + string_rel_add_char (&term_tmp, term_component, &i); + *term_tmp++ = '-'; - *term_tmp++ = ']'; - *term_tmp++ = '.'; - *term_tmp++ = '*'; + *term_tmp++ = ']'; + *term_tmp++ = '.'; + *term_tmp++ = '*'; if ((term_tmp - term_dict) > IT_MAX_WORD) break; - } - *term_tmp++ = ')'; - *term_tmp = '\0'; + } + *term_tmp++ = ')'; + *term_tmp = '\0'; break; case 2: if (!term_100 (zh->reg->zebra_maps, reg_type, - term_sub, term_component, - space_split, term_dst)) + term_sub, term_component, + space_split, term_dst)) return 0; logf (LOG_DEBUG, "Relation <="); - *term_tmp++ = '('; - for (i = 0; term_component[i]; ) - { - int j = 0; + *term_tmp++ = '('; + for (i = 0; term_component[i]; ) + { + int j = 0; - while (j < i) - string_rel_add_char (&term_tmp, term_component, &j); - *term_tmp++ = '['; + while (j < i) + string_rel_add_char (&term_tmp, term_component, &j); + *term_tmp++ = '['; - *term_tmp++ = '^'; - string_rel_add_char (&term_tmp, term_component, &i); - *term_tmp++ = '-'; + *term_tmp++ = '^'; + string_rel_add_char (&term_tmp, term_component, &i); + *term_tmp++ = '-'; - *term_tmp++ = ']'; - *term_tmp++ = '.'; - *term_tmp++ = '*'; + *term_tmp++ = ']'; + *term_tmp++ = '.'; + *term_tmp++ = '*'; - *term_tmp++ = '|'; + *term_tmp++ = '|'; if ((term_tmp - term_dict) > IT_MAX_WORD) break; - } - for (i = 0; term_component[i]; ) - string_rel_add_char (&term_tmp, term_component, &i); - *term_tmp++ = ')'; - *term_tmp = '\0'; + } + for (i = 0; term_component[i]; ) + string_rel_add_char (&term_tmp, term_component, &i); + *term_tmp++ = ')'; + *term_tmp = '\0'; break; case 5: if (!term_100 (zh->reg->zebra_maps, reg_type, - term_sub, term_component, space_split, term_dst)) + term_sub, term_component, space_split, term_dst)) return 0; logf (LOG_DEBUG, "Relation >"); - *term_tmp++ = '('; - for (i = 0; term_component[i];) - { - int j = 0; + *term_tmp++ = '('; + for (i = 0; term_component[i];) + { + int j = 0; - while (j < i) - string_rel_add_char (&term_tmp, term_component, &j); - *term_tmp++ = '['; - - *term_tmp++ = '^'; - *term_tmp++ = '-'; - string_rel_add_char (&term_tmp, term_component, &i); + while (j < i) + string_rel_add_char (&term_tmp, term_component, &j); + *term_tmp++ = '['; + + *term_tmp++ = '^'; + *term_tmp++ = '-'; + string_rel_add_char (&term_tmp, term_component, &i); - *term_tmp++ = ']'; - *term_tmp++ = '.'; - *term_tmp++ = '*'; + *term_tmp++ = ']'; + *term_tmp++ = '.'; + *term_tmp++ = '*'; - *term_tmp++ = '|'; + *term_tmp++ = '|'; if ((term_tmp - term_dict) > IT_MAX_WORD) break; - } - for (i = 0; term_component[i];) - string_rel_add_char (&term_tmp, term_component, &i); - *term_tmp++ = '.'; - *term_tmp++ = '+'; - *term_tmp++ = ')'; - *term_tmp = '\0'; + } + for (i = 0; term_component[i];) + string_rel_add_char (&term_tmp, term_component, &i); + *term_tmp++ = '.'; + *term_tmp++ = '+'; + *term_tmp++ = ')'; + *term_tmp = '\0'; break; case 4: if (!term_100 (zh->reg->zebra_maps, reg_type, term_sub, - term_component, space_split, term_dst)) + term_component, space_split, term_dst)) return 0; logf (LOG_DEBUG, "Relation >="); - *term_tmp++ = '('; - for (i = 0; term_component[i];) - { - int j = 0; - - if (i) - *term_tmp++ = '|'; - while (j < i) - string_rel_add_char (&term_tmp, term_component, &j); - *term_tmp++ = '['; - - if (term_component[i+1]) - { - *term_tmp++ = '^'; - *term_tmp++ = '-'; - string_rel_add_char (&term_tmp, term_component, &i); - } - else - { - string_rel_add_char (&term_tmp, term_component, &i); - *term_tmp++ = '-'; - } - *term_tmp++ = ']'; - *term_tmp++ = '.'; - *term_tmp++ = '*'; + *term_tmp++ = '('; + for (i = 0; term_component[i];) + { + int j = 0; + + if (i) + *term_tmp++ = '|'; + while (j < i) + string_rel_add_char (&term_tmp, term_component, &j); + *term_tmp++ = '['; + + if (term_component[i+1]) + { + *term_tmp++ = '^'; + *term_tmp++ = '-'; + string_rel_add_char (&term_tmp, term_component, &i); + } + else + { + string_rel_add_char (&term_tmp, term_component, &i); + *term_tmp++ = '-'; + } + *term_tmp++ = ']'; + *term_tmp++ = '.'; + *term_tmp++ = '*'; if ((term_tmp - term_dict) > IT_MAX_WORD) break; - } - *term_tmp++ = ')'; - *term_tmp = '\0'; + } + *term_tmp++ = ')'; + *term_tmp = '\0'; break; case 3: default: logf (LOG_DEBUG, "Relation ="); if (!term_100 (zh->reg->zebra_maps, reg_type, term_sub, - term_component, space_split, term_dst)) + term_component, space_split, term_dst)) return 0; - strcat (term_tmp, "("); - strcat (term_tmp, term_component); - strcat (term_tmp, ")"); + strcat (term_tmp, "("); + strcat (term_tmp, term_component); + strcat (term_tmp, ")"); } return 1; } @@ -950,7 +951,7 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, id_xpath_attr.next = 0; id_xpath_attr.local = use_value; } - else if (curAttributeSet == VAL_IDXPATH) + else if (curAttributeSet == VAL_IDXPATH) { attp.local_attributes = &id_xpath_attr; attp.attset_ordinal = VAL_IDXPATH; @@ -960,7 +961,7 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, else { if ((r=att_getentbyatt (zh, &attp, curAttributeSet, use_value, - use_string))) + use_string))) { logf (LOG_DEBUG, "att_getentbyatt fail. set=%d use=%d r=%d", curAttributeSet, use_value, r); @@ -968,14 +969,14 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, { /* set was found, but value wasn't defined */ errCode = 114; - if (use_string) - errString = nmem_strdup(stream, use_string); - else + if (use_string) + errString = nmem_strdup(stream, use_string); + else { char val_str[32]; sprintf (val_str, "%d", use_value); errString = nmem_strdup (stream, val_str); - } + } } else { @@ -1019,144 +1020,144 @@ static int string_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, if (!prefix_len) { #if 1 - bases_ok++; + bases_ok++; #else char val_str[32]; sprintf (val_str, "%d", use_value); errCode = 114; errString = nmem_strdup (stream, val_str); #endif - continue; + continue; } - bases_ok++; /* this has OK attributes */ + bases_ok++; /* this has OK attributes */ term_dict[prefix_len++] = ')'; term_dict[prefix_len++] = 1; term_dict[prefix_len++] = reg_type; - logf (LOG_DEBUG, "reg_type = %d", term_dict[prefix_len-1]); + logf (LOG_DEBUG, "reg_type = %d", term_dict[prefix_len-1]); term_dict[prefix_len] = '\0'; - j = prefix_len; - switch (truncation_value) - { - case -1: /* not specified */ - case 100: /* do not truncate */ - if (!string_relation (zh, zapt, &termp, term_dict, - attributeSet, - reg_type, space_split, term_dst)) - return 0; - logf (LOG_LOG, "dict_lookup_grep: %s", term_dict+prefix_len); - r = dict_lookup_grep (zh->reg->dict, term_dict, 0, - grep_info, &max_pos, 0, grep_handle); - if (r) - logf (LOG_WARN, "dict_lookup_grep fail %d", r); - break; - case 1: /* right truncation */ - term_dict[j++] = '('; - if (!term_100 (zh->reg->zebra_maps, reg_type, - &termp, term_dict + j, space_split, term_dst)) - return 0; - strcat (term_dict, ".*)"); - dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, - &max_pos, 0, grep_handle); - break; - case 2: /* keft truncation */ - term_dict[j++] = '('; term_dict[j++] = '.'; term_dict[j++] = '*'; - if (!term_100 (zh->reg->zebra_maps, reg_type, - &termp, term_dict + j, space_split, term_dst)) - return 0; - strcat (term_dict, ")"); - dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, - &max_pos, 0, grep_handle); - break; - case 3: /* left&right truncation */ - term_dict[j++] = '('; term_dict[j++] = '.'; term_dict[j++] = '*'; - if (!term_100 (zh->reg->zebra_maps, reg_type, - &termp, term_dict + j, space_split, term_dst)) - return 0; - strcat (term_dict, ".*)"); - dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, - &max_pos, 0, grep_handle); - break; - zh->errCode = 120; - return -1; - case 101: /* process # in term */ - term_dict[j++] = '('; - if (!term_101 (zh->reg->zebra_maps, reg_type, - &termp, term_dict + j, space_split, term_dst)) - return 0; - strcat (term_dict, ")"); - r = dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, - &max_pos, 0, grep_handle); - if (r) - logf (LOG_WARN, "dict_lookup_grep err, trunc=#: %d", r); - break; - case 102: /* Regexp-1 */ - term_dict[j++] = '('; - if (!term_102 (zh->reg->zebra_maps, reg_type, - &termp, term_dict + j, space_split, term_dst)) - return 0; - strcat (term_dict, ")"); - logf (LOG_DEBUG, "Regexp-1 tolerance=%d", r); - r = dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, - &max_pos, 0, grep_handle); - if (r) - logf (LOG_WARN, "dict_lookup_grep err, trunc=regular: %d", - r); - break; - case 103: /* Regexp-2 */ - r = 1; - term_dict[j++] = '('; - if (!term_103 (zh->reg->zebra_maps, reg_type, - &termp, term_dict + j, &r, space_split, term_dst)) - return 0; - strcat (term_dict, ")"); - logf (LOG_DEBUG, "Regexp-2 tolerance=%d", r); - r = dict_lookup_grep (zh->reg->dict, term_dict, r, grep_info, - &max_pos, 2, grep_handle); - if (r) - logf (LOG_WARN, "dict_lookup_grep err, trunc=eregular: %d", - r); - break; - case 104: /* process # and ! in term */ - term_dict[j++] = '('; - if (!term_104 (zh->reg->zebra_maps, reg_type, - &termp, term_dict + j, space_split, term_dst)) - return 0; - strcat (term_dict, ")"); - r = dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, - &max_pos, 0, grep_handle); - if (r) - logf (LOG_WARN, "dict_lookup_grep err, trunc=#/!: %d", r); - break; - case 105: /* process * and ! in term */ - term_dict[j++] = '('; - if (!term_105 (zh->reg->zebra_maps, reg_type, - &termp, term_dict + j, space_split, term_dst, 1)) - return 0; - strcat (term_dict, ")"); - r = dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, - &max_pos, 0, grep_handle); - if (r) - logf (LOG_WARN, "dict_lookup_grep err, trunc=*/!: %d", r); - break; - case 106: /* process * and ! in term */ - term_dict[j++] = '('; - if (!term_105 (zh->reg->zebra_maps, reg_type, - &termp, term_dict + j, space_split, term_dst, 0)) - return 0; - strcat (term_dict, ")"); - r = dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, - &max_pos, 0, grep_handle); - if (r) - logf (LOG_WARN, "dict_lookup_grep err, trunc=*/!: %d", r); - break; + j = prefix_len; + switch (truncation_value) + { + case -1: /* not specified */ + case 100: /* do not truncate */ + if (!string_relation (zh, zapt, &termp, term_dict, + attributeSet, + reg_type, space_split, term_dst)) + return 0; + logf (LOG_LOG, "dict_lookup_grep: %s", term_dict+prefix_len); + r = dict_lookup_grep (zh->reg->dict, term_dict, 0, + grep_info, &max_pos, 0, grep_handle); + if (r) + logf (LOG_WARN, "dict_lookup_grep fail %d", r); + break; + case 1: /* right truncation */ + term_dict[j++] = '('; + if (!term_100 (zh->reg->zebra_maps, reg_type, + &termp, term_dict + j, space_split, term_dst)) + return 0; + strcat (term_dict, ".*)"); + dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, + &max_pos, 0, grep_handle); + break; + case 2: /* keft truncation */ + term_dict[j++] = '('; term_dict[j++] = '.'; term_dict[j++] = '*'; + if (!term_100 (zh->reg->zebra_maps, reg_type, + &termp, term_dict + j, space_split, term_dst)) + return 0; + strcat (term_dict, ")"); + dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, + &max_pos, 0, grep_handle); + break; + case 3: /* left&right truncation */ + term_dict[j++] = '('; term_dict[j++] = '.'; term_dict[j++] = '*'; + if (!term_100 (zh->reg->zebra_maps, reg_type, + &termp, term_dict + j, space_split, term_dst)) + return 0; + strcat (term_dict, ".*)"); + dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, + &max_pos, 0, grep_handle); + break; + zh->errCode = 120; + return -1; + case 101: /* process # in term */ + term_dict[j++] = '('; + if (!term_101 (zh->reg->zebra_maps, reg_type, + &termp, term_dict + j, space_split, term_dst)) + return 0; + strcat (term_dict, ")"); + r = dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, + &max_pos, 0, grep_handle); + if (r) + logf (LOG_WARN, "dict_lookup_grep err, trunc=#: %d", r); + break; + case 102: /* Regexp-1 */ + term_dict[j++] = '('; + if (!term_102 (zh->reg->zebra_maps, reg_type, + &termp, term_dict + j, space_split, term_dst)) + return 0; + strcat (term_dict, ")"); + logf (LOG_DEBUG, "Regexp-1 tolerance=%d", r); + r = dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, + &max_pos, 0, grep_handle); + if (r) + logf (LOG_WARN, "dict_lookup_grep err, trunc=regular: %d", + r); + break; + case 103: /* Regexp-2 */ + r = 1; + term_dict[j++] = '('; + if (!term_103 (zh->reg->zebra_maps, reg_type, + &termp, term_dict + j, &r, space_split, term_dst)) + return 0; + strcat (term_dict, ")"); + logf (LOG_DEBUG, "Regexp-2 tolerance=%d", r); + r = dict_lookup_grep (zh->reg->dict, term_dict, r, grep_info, + &max_pos, 2, grep_handle); + if (r) + logf (LOG_WARN, "dict_lookup_grep err, trunc=eregular: %d", + r); + break; + case 104: /* process # and ! in term */ + term_dict[j++] = '('; + if (!term_104 (zh->reg->zebra_maps, reg_type, + &termp, term_dict + j, space_split, term_dst)) + return 0; + strcat (term_dict, ")"); + r = dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, + &max_pos, 0, grep_handle); + if (r) + logf (LOG_WARN, "dict_lookup_grep err, trunc=#/!: %d", r); + break; + case 105: /* process * and ! in term */ + term_dict[j++] = '('; + if (!term_105 (zh->reg->zebra_maps, reg_type, + &termp, term_dict + j, space_split, term_dst, 1)) + return 0; + strcat (term_dict, ")"); + r = dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, + &max_pos, 0, grep_handle); + if (r) + logf (LOG_WARN, "dict_lookup_grep err, trunc=*/!: %d", r); + break; + case 106: /* process * and ! in term */ + term_dict[j++] = '('; + if (!term_105 (zh->reg->zebra_maps, reg_type, + &termp, term_dict + j, space_split, term_dst, 0)) + return 0; + strcat (term_dict, ")"); + r = dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, + &max_pos, 0, grep_handle); + if (r) + logf (LOG_WARN, "dict_lookup_grep err, trunc=*/!: %d", r); + break; } } if (!bases_ok) { - zh->errCode = errCode; - zh->errString = errString; - return -1; + zh->errCode = errCode; + zh->errString = errString; + return -1; } *term_sub = termp; logf (LOG_DEBUG, "%d positions", grep_info->isam_p_indx); @@ -1254,7 +1255,7 @@ static int trans_scan_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, } char *normalize_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, - const char *termz, NMEM stream, unsigned reg_id) + const char *termz, NMEM stream, unsigned reg_id) { WRBUF wrbuf = 0; AttrType truncation; @@ -1267,33 +1268,33 @@ char *normalize_term(ZebraHandle zh, Z_AttributesPlusTerm *zapt, switch (truncation_value) { default: - ex_list = ""; - break; + ex_list = ""; + break; case 101: - ex_list = "#"; - break; + ex_list = "#"; + break; case 102: case 103: - ex_list = 0; - break; + ex_list = 0; + break; case 104: - ex_list = "!#"; - break; + ex_list = "!#"; + break; case 105: - ex_list = "!*"; - break; + ex_list = "!*"; + break; } if (ex_list) - wrbuf = zebra_replace(zh->reg->zebra_maps, reg_id, ex_list, - termz, strlen(termz)); + wrbuf = zebra_replace(zh->reg->zebra_maps, reg_id, ex_list, + termz, strlen(termz)); if (!wrbuf) - return nmem_strdup(stream, termz); + return nmem_strdup(stream, termz); else { - char *buf = (char*) nmem_malloc (stream, wrbuf_len(wrbuf)+1); - memcpy (buf, wrbuf_buf(wrbuf), wrbuf_len(wrbuf)); - buf[wrbuf_len(wrbuf)] = '\0'; - return buf; + char *buf = (char*) nmem_malloc (stream, wrbuf_len(wrbuf)+1); + memcpy (buf, wrbuf_buf(wrbuf), wrbuf_len(wrbuf)); + buf[wrbuf_len(wrbuf)] = '\0'; + return buf; } } @@ -1306,10 +1307,10 @@ static void grep_info_delete (struct grep_info *grep_info) } static int grep_info_prepare (ZebraHandle zh, - Z_AttributesPlusTerm *zapt, - struct grep_info *grep_info, - int reg_type, - NMEM stream) + Z_AttributesPlusTerm *zapt, + struct grep_info *grep_info, + int reg_type, + NMEM stream) { AttrType termset; int termset_value_numeric; @@ -1328,40 +1329,40 @@ static int grep_info_prepare (ZebraHandle zh, return 0; attr_init (&termset, zapt, 8); termset_value_numeric = - attr_find_ex (&termset, NULL, &termset_value_string); + attr_find_ex (&termset, NULL, &termset_value_string); if (termset_value_numeric != -1) { - char resname[32]; - const char *termset_name = 0; - if (termset_value_numeric != -2) - { + char resname[32]; + const char *termset_name = 0; + if (termset_value_numeric != -2) + { - sprintf (resname, "%d", termset_value_numeric); - termset_name = resname; - } - else - termset_name = termset_value_string; - logf (LOG_LOG, "creating termset set %s", termset_name); - grep_info->termset = resultSetAdd (zh, termset_name, 1); - if (!grep_info->termset) - { - zh->errCode = 128; - zh->errString = nmem_strdup (stream, termset_name); - return -1; - } + sprintf (resname, "%d", termset_value_numeric); + termset_name = resname; + } + else + termset_name = termset_value_string; + logf (LOG_LOG, "creating termset set %s", termset_name); + grep_info->termset = resultSetAdd (zh, termset_name, 1); + if (!grep_info->termset) + { + zh->errCode = 128; + zh->errString = nmem_strdup (stream, termset_name); + return -1; + } } return 0; } - + static RSET rpn_search_APT_phrase (ZebraHandle zh, Z_AttributesPlusTerm *zapt, - const char *termz_org, + const char *termz_org, oid_value attributeSet, - NMEM stream, - int reg_type, int complete_flag, - const char *rank_type, int xpath_use, - int num_bases, char **basenames) + NMEM stream, + int reg_type, int complete_flag, + const char *rank_type, int xpath_use, + int num_bases, char **basenames) { char term_dst[IT_MAX_WORD+1]; RSET rset[60], result; @@ -1372,10 +1373,10 @@ static RSET rpn_search_APT_phrase (ZebraHandle zh, *term_dst = 0; if (grep_info_prepare (zh, zapt, &grep_info, reg_type, stream)) - return 0; + return 0; while (1) { - logf (LOG_DEBUG, "APT_phrase termp=%s", termp); + logf (LOG_DEBUG, "APT_phrase termp=%s", termp); rset[rset_no] = term_trunc (zh, zapt, &termp, attributeSet, stream, &grep_info, reg_type, complete_flag, @@ -1389,54 +1390,40 @@ static RSET rpn_search_APT_phrase (ZebraHandle zh, } grep_info_delete (&grep_info); if (rset_no == 0) - { - rset_null_parms parms; - return rset_create (rset_kind_null, &parms); - } + return rsnull_create (NULL); /* FIXME - Use a proper nmem */ else if (rset_no == 1) return (rset[0]); else - { - /* new / old prox */ - rset_prox_parms parms; - - parms.rset = rset; - parms.rset_no = rset_no; - parms.ordered = 1; - parms.exclusion = 0; - parms.relation = 3; - parms.distance = 1; - parms.key_size = sizeof(struct it_key); - parms.cmp = key_compare_it; - parms.getseq = key_get_seq; - parms.log_item = key_logdump_txt; - result = rset_create(rset_kind_prox, &parms); - } + result = rsprox_create( NULL, /* FIXME - use a proper nmem */ + sizeof(struct it_key), key_compare_it, key_get_seq, + rset_no, rset, + 1 /* ordered */, 0 /* exclusion */, + 3 /* relation */, 1 /* distance */); return result; } static RSET rpn_search_APT_or_list (ZebraHandle zh, Z_AttributesPlusTerm *zapt, - const char *termz_org, + const char *termz_org, oid_value attributeSet, - NMEM stream, - int reg_type, int complete_flag, - const char *rank_type, + NMEM stream, + int reg_type, int complete_flag, + const char *rank_type, int xpath_use, - int num_bases, char **basenames) + int num_bases, char **basenames) { char term_dst[IT_MAX_WORD+1]; - RSET rset[60], result; - int i, rset_no = 0; + RSET rset[60]; + int rset_no = 0; struct grep_info grep_info; char *termz = normalize_term(zh, zapt, termz_org, stream, reg_type); const char *termp = termz; if (grep_info_prepare (zh, zapt, &grep_info, reg_type, stream)) - return 0; + return 0; while (1) { - logf (LOG_DEBUG, "APT_or_list termp=%s", termp); + logf (LOG_DEBUG, "APT_or_list termp=%s", termp); rset[rset_no] = term_trunc (zh, zapt, &termp, attributeSet, stream, &grep_info, reg_type, complete_flag, @@ -1450,34 +1437,38 @@ static RSET rpn_search_APT_or_list (ZebraHandle zh, } grep_info_delete (&grep_info); if (rset_no == 0) - { - rset_null_parms parms; - return rset_create (rset_kind_null, &parms); - } + return rsnull_create (NULL); /* FIXME - Use a proper nmem */ + return rsmultior_create(NULL, /* FIXME */ + sizeof(struct it_key), + key_compare_it, + rset_no, rset); + +#if 0 + /* The old code, kept for reference. May be deleted soon */ result = rset[0]; for (i = 1; ireg->zebra_maps, reg_type, term_sub, term_tmp, 1, - term_dst)) - return 0; + term_dst)) + return 0; term_value = atoi (term_tmp); switch (relation_value) { @@ -1568,8 +1561,8 @@ static int numeric_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, break; case 3: default: - logf (LOG_DEBUG, "Relation ="); - sprintf (term_tmp, "(0*%d)", term_value); + logf (LOG_DEBUG, "Relation ="); + sprintf (term_tmp, "(0*%d)", term_value); } logf (LOG_DEBUG, "dict_lookup_grep: %s", term_tmp); r = dict_lookup_grep (zh->reg->dict, term_dict, 0, grep_info, max_pos, @@ -1581,11 +1574,11 @@ static int numeric_relation (ZebraHandle zh, Z_AttributesPlusTerm *zapt, } static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, - const char **term_sub, - oid_value attributeSet, struct grep_info *grep_info, - int reg_type, int complete_flag, - int num_bases, char **basenames, - char *term_dst, int xpath_use, NMEM stream) + const char **term_sub, + oid_value attributeSet, struct grep_info *grep_info, + int reg_type, int complete_flag, + int num_bases, char **basenames, + char *term_dst, int xpath_use, NMEM stream) { char term_dict[2*IT_MAX_WORD+2]; int r, base_no; @@ -1623,7 +1616,7 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, id_xpath_attr.next = 0; id_xpath_attr.local = use_value; } - else if (curAttributeSet == VAL_IDXPATH) + else if (curAttributeSet == VAL_IDXPATH) { attp.local_attributes = &id_xpath_attr; attp.attset_ordinal = VAL_IDXPATH; @@ -1633,17 +1626,17 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, else { if ((r=att_getentbyatt (zh, &attp, curAttributeSet, use_value, - use_string))) + use_string))) { logf (LOG_DEBUG, "att_getentbyatt fail. set=%d use=%d r=%d", curAttributeSet, use_value, r); if (r == -1) - { + { char val_str[32]; sprintf (val_str, "%d", use_value); errString = nmem_strdup (stream, val_str); errCode = 114; - } + } else errCode = 121; continue; @@ -1659,8 +1652,8 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, local_attr = local_attr->next) { int ord; - char ord_buf[32]; - int i, ord_len; + char ord_buf[32]; + int i, ord_len; ord = zebraExplain_lookupSU (zh->reg->zei, attp.attset_ordinal, local_attr->local); @@ -1671,12 +1664,12 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, else term_dict[prefix_len++] = '('; - ord_len = key_SU_encode (ord, ord_buf); - for (i = 0; ierrCode = errCode; - zh->errString = errString; - return -1; + zh->errCode = errCode; + zh->errString = errString; + return -1; } *term_sub = termp; logf (LOG_DEBUG, "%d positions", grep_info->isam_p_indx); @@ -1709,13 +1702,13 @@ static int numeric_term (ZebraHandle zh, Z_AttributesPlusTerm *zapt, } static RSET rpn_search_APT_numeric (ZebraHandle zh, - Z_AttributesPlusTerm *zapt, - const char *termz, - oid_value attributeSet, - NMEM stream, - int reg_type, int complete_flag, - const char *rank_type, int xpath_use, - int num_bases, char **basenames) + Z_AttributesPlusTerm *zapt, + const char *termz, + oid_value attributeSet, + NMEM stream, + int reg_type, int complete_flag, + const char *rank_type, int xpath_use, + int num_bases, char **basenames) { char term_dst[IT_MAX_WORD+1]; const char *termp = termz; @@ -1724,21 +1717,21 @@ static RSET rpn_search_APT_numeric (ZebraHandle zh, struct grep_info grep_info; if (grep_info_prepare (zh, zapt, &grep_info, reg_type, stream)) - return 0; + return 0; while (1) { - logf (LOG_DEBUG, "APT_numeric termp=%s", termp); - grep_info.isam_p_indx = 0; + logf (LOG_DEBUG, "APT_numeric termp=%s", termp); + grep_info.isam_p_indx = 0; r = numeric_term (zh, zapt, &termp, attributeSet, &grep_info, - reg_type, complete_flag, num_bases, basenames, - term_dst, xpath_use, - stream); + reg_type, complete_flag, num_bases, basenames, + term_dst, xpath_use, + stream); if (r < 1) break; - logf (LOG_DEBUG, "term: %s", term_dst); + logf (LOG_DEBUG, "term: %s", term_dst); rset[rset_no] = rset_trunc (zh, grep_info.isam_p_buf, grep_info.isam_p_indx, term_dst, - strlen(term_dst), rank_type, + strlen(term_dst), rank_type, 0 /* preserve position */, zapt->term->which); assert (rset[rset_no]); @@ -1747,46 +1740,53 @@ static RSET rpn_search_APT_numeric (ZebraHandle zh, } grep_info_delete (&grep_info); if (rset_no == 0) - { - rset_null_parms parms; - return rset_create (rset_kind_null, &parms); - } + return rsnull_create (NULL); /* FIXME - Use a proper nmem */ result = rset[0]; for (i = 1; ires, "setTmpDir"); result = rset_create (rset_kind_temp, &parms); + */ + result = rstemp_create( NULL, /* FIXME - use a proper nmem */ + sizeof (struct it_key), key_compare_it, + res_get (zh->res, "setTmpDir") ); rsfd = rset_open (result, RSETF_WRITE); sys = atoi(termz); if (sys <= 0) - sys = 1; + sys = 1; #if IT_KEY_NEW key.mem[0] = sys; key.mem[1] = 1; @@ -1803,11 +1803,10 @@ static RSET rpn_search_APT_local (ZebraHandle zh, Z_AttributesPlusTerm *zapt, } static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt, - oid_value attributeSet, NMEM stream, - Z_SortKeySpecList *sort_sequence, - const char *rank_type) + oid_value attributeSet, NMEM stream, + Z_SortKeySpecList *sort_sequence, + const char *rank_type) { - rset_null_parms parms; int i; int sort_relation_value; AttrType sort_relation_type; @@ -1828,72 +1827,72 @@ static RSET rpn_sort_spec (ZebraHandle zh, Z_AttributesPlusTerm *zapt, if (!sort_sequence->specs) { - sort_sequence->num_specs = 10; - sort_sequence->specs = (Z_SortKeySpec **) - nmem_malloc (stream, sort_sequence->num_specs * - sizeof(*sort_sequence->specs)); - for (i = 0; inum_specs; i++) - sort_sequence->specs[i] = 0; + sort_sequence->num_specs = 10; + sort_sequence->specs = (Z_SortKeySpec **) + nmem_malloc (stream, sort_sequence->num_specs * + sizeof(*sort_sequence->specs)); + for (i = 0; inum_specs; i++) + sort_sequence->specs[i] = 0; } if (zapt->term->which != Z_Term_general) - i = 0; + i = 0; else - i = atoi_n ((char *) zapt->term->u.general->buf, - zapt->term->u.general->len); + i = atoi_n ((char *) zapt->term->u.general->buf, + zapt->term->u.general->len); if (i >= sort_sequence->num_specs) - i = 0; + i = 0; sprintf (termz, "%d", i); oe.proto = PROTO_Z3950; oe.oclass = CLASS_ATTSET; oe.value = attributeSet; if (!oid_ent_to_oid (&oe, oid)) - return 0; + return 0; sks = (Z_SortKeySpec *) nmem_malloc (stream, sizeof(*sks)); sks->sortElement = (Z_SortElement *) - nmem_malloc (stream, sizeof(*sks->sortElement)); + nmem_malloc (stream, sizeof(*sks->sortElement)); sks->sortElement->which = Z_SortElement_generic; sk = sks->sortElement->u.generic = (Z_SortKey *) - nmem_malloc (stream, sizeof(*sk)); + nmem_malloc (stream, sizeof(*sk)); sk->which = Z_SortKey_sortAttributes; sk->u.sortAttributes = (Z_SortAttributes *) - nmem_malloc (stream, sizeof(*sk->u.sortAttributes)); + nmem_malloc (stream, sizeof(*sk->u.sortAttributes)); sk->u.sortAttributes->id = oid; sk->u.sortAttributes->list = (Z_AttributeList *) - nmem_malloc (stream, sizeof(*sk->u.sortAttributes->list)); + nmem_malloc (stream, sizeof(*sk->u.sortAttributes->list)); sk->u.sortAttributes->list->num_attributes = 1; sk->u.sortAttributes->list->attributes = (Z_AttributeElement **) - nmem_malloc (stream, sizeof(*sk->u.sortAttributes->list->attributes)); + nmem_malloc (stream, sizeof(*sk->u.sortAttributes->list->attributes)); ae = *sk->u.sortAttributes->list->attributes = (Z_AttributeElement *) - nmem_malloc (stream, sizeof(**sk->u.sortAttributes->list->attributes)); + nmem_malloc (stream, sizeof(**sk->u.sortAttributes->list->attributes)); ae->attributeSet = 0; - ae->attributeType = (int *) - nmem_malloc (stream, sizeof(*ae->attributeType)); + ae->attributeType = (int *) + nmem_malloc (stream, sizeof(*ae->attributeType)); *ae->attributeType = 1; ae->which = Z_AttributeValue_numeric; ae->value.numeric = (int *) - nmem_malloc (stream, sizeof(*ae->value.numeric)); + nmem_malloc (stream, sizeof(*ae->value.numeric)); *ae->value.numeric = use_value; sks->sortRelation = (int *) - nmem_malloc (stream, sizeof(*sks->sortRelation)); + nmem_malloc (stream, sizeof(*sks->sortRelation)); if (sort_relation_value == 1) - *sks->sortRelation = Z_SortKeySpec_ascending; + *sks->sortRelation = Z_SortKeySpec_ascending; else if (sort_relation_value == 2) - *sks->sortRelation = Z_SortKeySpec_descending; + *sks->sortRelation = Z_SortKeySpec_descending; else - *sks->sortRelation = Z_SortKeySpec_ascending; + *sks->sortRelation = Z_SortKeySpec_ascending; sks->caseSensitivity = (int *) - nmem_malloc (stream, sizeof(*sks->caseSensitivity)); + nmem_malloc (stream, sizeof(*sks->caseSensitivity)); *sks->caseSensitivity = 0; sks->which = Z_SortKeySpec_null; sks->u.null = odr_nullval (); sort_sequence->specs[i] = sks; - return rset_create (rset_kind_null, &parms); + return rsnull_create (NULL); /* FIXME - Use a proper nmem */ } @@ -1931,16 +1930,10 @@ static RSET xpath_trunc(ZebraHandle zh, NMEM stream, const char *flags = "void"; if (grep_info_prepare (zh, 0 /* zapt */, &grep_info, '0', stream)) - { - rset_null_parms parms; - return rset_create (rset_kind_null, &parms); - } + return rsnull_create (NULL); /* FIXME - Use a proper nmem */ if (ord < 0) - { - rset_null_parms parms; - return rset_create (rset_kind_null, &parms); - } + return rsnull_create (NULL); /* FIXME - Use a proper nmem */ if (prefix_len) term_dict[prefix_len++] = '|'; else @@ -2028,7 +2021,6 @@ static RSET rpn_search_xpath (ZebraHandle zh, { char xpath_rev[128]; int i, len; - rset_between_parms parms; RSET rset_start_tag = 0, rset_end_tag = 0, rset_attr = 0; *xpath_rev = 0; @@ -2067,25 +2059,25 @@ static RSET rpn_search_xpath (ZebraHandle zh, xpath[level].predicate->which == XPATH_PREDICATE_RELATION && xpath[level].predicate->u.relation.name[0]) { - WRBUF wbuf = wrbuf_alloc(); - wrbuf_puts(wbuf, xpath[level].predicate->u.relation.name+1); + WRBUF wbuf = wrbuf_alloc(); + wrbuf_puts(wbuf, xpath[level].predicate->u.relation.name+1); if (xpath[level].predicate->u.relation.value) { - const char *cp = xpath[level].predicate->u.relation.value; - wrbuf_putc(wbuf, '='); - - while (*cp) - { - if (strchr(REGEX_CHARS, *cp)) - wrbuf_putc(wbuf, '\\'); - wrbuf_putc(wbuf, *cp); - cp++; - } + const char *cp = xpath[level].predicate->u.relation.value; + wrbuf_putc(wbuf, '='); + + while (*cp) + { + if (strchr(REGEX_CHARS, *cp)) + wrbuf_putc(wbuf, '\\'); + wrbuf_putc(wbuf, *cp); + cp++; + } } - wrbuf_puts(wbuf, ""); + wrbuf_puts(wbuf, ""); rset_attr = xpath_trunc ( zh, stream, '0', wrbuf_buf(wbuf), 3, curAttributeSet); - wrbuf_free(wbuf, 1); + wrbuf_free(wbuf, 1); } else { @@ -2093,14 +2085,15 @@ static RSET rpn_search_xpath (ZebraHandle zh, continue; } yaz_log (LOG_LOG, "xpath_rev (%d) = %s", level, xpath_rev); - if (strlen(xpath_rev)) - { + if (strlen(xpath_rev)) + { rset_start_tag = xpath_trunc(zh, stream, '0', xpath_rev, 1, curAttributeSet); rset_end_tag = xpath_trunc(zh, stream, '0', xpath_rev, 2, curAttributeSet); + /* parms.key_size = sizeof(struct it_key); parms.cmp = key_compare_it; parms.rset_l = rset_start_tag; @@ -2109,6 +2102,11 @@ static RSET rpn_search_xpath (ZebraHandle zh, parms.rset_attr = rset_attr; parms.printer = key_print_it; rset = rset_create (rset_kind_between, &parms); + */ + rset=rsbetween_create( NULL, /* FIXME */ + sizeof(struct it_key), key_compare_it, + rset_start_tag, rset, rset_end_tag, rset_attr, + key_print_it ); } first_path = 0; } @@ -2121,7 +2119,7 @@ static RSET rpn_search_xpath (ZebraHandle zh, static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt, oid_value attributeSet, NMEM stream, - Z_SortKeySpecList *sort_sequence, + Z_SortKeySpecList *sort_sequence, int num_bases, char **basenames) { unsigned reg_id; @@ -2136,7 +2134,7 @@ static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt, struct xpath_location_step xpath[10]; zebra_maps_attr (zh->reg->zebra_maps, zapt, ®_id, &search_type, - rank_type, &complete_flag, &sort_flag); + rank_type, &complete_flag, &sort_flag); logf (LOG_DEBUG, "reg_id=%c", reg_id); logf (LOG_DEBUG, "complete_flag=%d", complete_flag); @@ -2147,8 +2145,8 @@ static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt, return 0; if (sort_flag) - return rpn_sort_spec (zh, zapt, attributeSet, stream, sort_sequence, - rank_type); + return rpn_sort_spec (zh, zapt, attributeSet, stream, sort_sequence, + rank_type); xpath_len = parse_xpath(zh, zapt, attributeSet, xpath, 10, stream); if (xpath_len >= 0) { @@ -2159,36 +2157,36 @@ static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt, if (!strcmp (search_type, "phrase")) { - rset = rpn_search_APT_phrase (zh, zapt, termz, attributeSet, stream, - reg_id, complete_flag, rank_type, + rset = rpn_search_APT_phrase (zh, zapt, termz, attributeSet, stream, + reg_id, complete_flag, rank_type, xpath_use, - num_bases, basenames); + num_bases, basenames); } else if (!strcmp (search_type, "and-list")) { - rset = rpn_search_APT_and_list (zh, zapt, termz, attributeSet, stream, - reg_id, complete_flag, rank_type, + rset = rpn_search_APT_and_list (zh, zapt, termz, attributeSet, stream, + reg_id, complete_flag, rank_type, xpath_use, - num_bases, basenames); + num_bases, basenames); } else if (!strcmp (search_type, "or-list")) { - rset = rpn_search_APT_or_list (zh, zapt, termz, attributeSet, stream, - reg_id, complete_flag, rank_type, + rset = rpn_search_APT_or_list (zh, zapt, termz, attributeSet, stream, + reg_id, complete_flag, rank_type, xpath_use, - num_bases, basenames); + num_bases, basenames); } else if (!strcmp (search_type, "local")) { rset = rpn_search_APT_local (zh, zapt, termz, attributeSet, stream, - rank_type); + rank_type); } else if (!strcmp (search_type, "numeric")) { - rset = rpn_search_APT_numeric (zh, zapt, termz, attributeSet, stream, - reg_id, complete_flag, rank_type, + rset = rpn_search_APT_numeric (zh, zapt, termz, attributeSet, stream, + reg_id, complete_flag, rank_type, xpath_use, - num_bases, basenames); + num_bases, basenames); } else if (!strcmp (search_type, "always")) { @@ -2202,44 +2200,48 @@ static RSET rpn_search_APT (ZebraHandle zh, Z_AttributesPlusTerm *zapt, static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, oid_value attributeSet, NMEM stream, - Z_SortKeySpecList *sort_sequence, + Z_SortKeySpecList *sort_sequence, int num_bases, char **basenames) { RSET r = NULL; if (zs->which == Z_RPNStructure_complex) { Z_Operator *zop = zs->u.complex->roperator; - rset_bool_parms bool_parms; - - bool_parms.rset_l = rpn_search_structure (zh, zs->u.complex->s1, - attributeSet, stream, - sort_sequence, - num_bases, basenames); - if (bool_parms.rset_l == NULL) + RSET rset_l; + RSET rset_r; + + rset_l = rpn_search_structure (zh, zs->u.complex->s1, + attributeSet, stream, + sort_sequence, + num_bases, basenames); + if (rset_l == NULL) return NULL; - bool_parms.rset_r = rpn_search_structure (zh, zs->u.complex->s2, - attributeSet, stream, - sort_sequence, - num_bases, basenames); - if (bool_parms.rset_r == NULL) + rset_r = rpn_search_structure (zh, zs->u.complex->s2, + attributeSet, stream, + sort_sequence, + num_bases, basenames); + if (rset_r == NULL) { - rset_delete (bool_parms.rset_l); + rset_delete (rset_l); return NULL; } - bool_parms.key_size = sizeof(struct it_key); - bool_parms.cmp = key_compare_it; - bool_parms.log_item = key_logdump_txt; switch (zop->which) { case Z_Operator_and: - r = rset_create (rset_kind_and, &bool_parms); + r = rsbool_create_and( NULL, /* FIXME - use a proper nmem */ + sizeof(struct it_key), key_compare_it, + rset_l, rset_r, key_logdump_txt ); break; case Z_Operator_or: - r = rset_create (rset_kind_or, &bool_parms); + r = rsbool_create_or( NULL, /* FIXME - use a proper nmem */ + sizeof(struct it_key), key_compare_it, + rset_l, rset_r, key_logdump_txt ); break; case Z_Operator_and_not: - r = rset_create (rset_kind_not, &bool_parms); + r = rsbool_create_not( NULL, /* FIXME - use a proper nmem */ + sizeof(struct it_key), key_compare_it, + rset_l, rset_r, key_logdump_txt ); break; case Z_Operator_prox: if (zop->u.prox->which != Z_ProximityOperator_known) @@ -2255,27 +2257,37 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, sprintf (val, "%d", *zop->u.prox->u.known); return NULL; } - else - { - /* new / old prox */ - rset_prox_parms parms; - RSET twosets[2]; - - twosets[0] = bool_parms.rset_l; - twosets[1] = bool_parms.rset_r; - 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); - } + else + { + /* new / old prox */ + RSET twosets[2]; + + twosets[0] = rset_l; + twosets[1] = rset_r; + r=rsprox_create(NULL, /* FIXME - use a proper nmem */ + sizeof(struct it_key), key_compare_it, + key_get_seq, + 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: zh->errCode = 110; @@ -2289,20 +2301,20 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, logf (LOG_DEBUG, "rpn_search_APT"); r = rpn_search_APT (zh, zs->u.simple->u.attributesPlusTerm, attributeSet, stream, sort_sequence, - num_bases, basenames); + num_bases, basenames); } else if (zs->u.simple->which == Z_Operand_resultSetId) { logf (LOG_DEBUG, "rpn_search_ref"); r = resultSetRef (zh, zs->u.simple->u.resultSetId); - if (!r) - { - r = rset_create (rset_kind_null, NULL); - zh->errCode = 30; - zh->errString = - nmem_strdup (stream, zs->u.simple->u.resultSetId); - return 0; - } + if (!r) + { + r = rsnull_create (NULL); /* FIXME - Use a proper nmem */ + zh->errCode = 30; + zh->errString = + nmem_strdup (stream, zs->u.simple->u.resultSetId); + return 0; + } else rset_dup(r); } @@ -2322,9 +2334,9 @@ static RSET rpn_search_structure (ZebraHandle zh, Z_RPNStructure *zs, RSET rpn_search (ZebraHandle zh, NMEM nmem, - Z_RPNQuery *rpn, int num_bases, char **basenames, - const char *setname, - ZebraSet sset) + Z_RPNQuery *rpn, int num_bases, char **basenames, + const char *setname, + ZebraSet sset) { RSET rset; oident *attrset; @@ -2337,38 +2349,38 @@ RSET rpn_search (ZebraHandle zh, NMEM nmem, zh->hits = 0; sort_sequence = (Z_SortKeySpecList *) - nmem_malloc (nmem, sizeof(*sort_sequence)); + nmem_malloc (nmem, sizeof(*sort_sequence)); sort_sequence->num_specs = 10; sort_sequence->specs = (Z_SortKeySpec **) - nmem_malloc (nmem, sort_sequence->num_specs * - sizeof(*sort_sequence->specs)); + nmem_malloc (nmem, sort_sequence->num_specs * + sizeof(*sort_sequence->specs)); for (i = 0; inum_specs; i++) - sort_sequence->specs[i] = 0; + sort_sequence->specs[i] = 0; attrset = oid_getentbyoid (rpn->attributeSetId); attributeSet = attrset->value; rset = rpn_search_structure (zh, rpn->RPNStructure, attributeSet, - nmem, sort_sequence, num_bases, basenames); + nmem, sort_sequence, num_bases, basenames); if (!rset) - return 0; + return 0; if (zh->errCode) logf (LOG_DEBUG, "search error: %d", zh->errCode); for (i = 0; sort_sequence->specs[i]; i++) - ; + ; sort_sequence->num_specs = i; if (!i) - resultSetRank (zh, sset, rset); + resultSetRank (zh, sset, rset); else { - logf (LOG_DEBUG, "resultSetSortSingle in rpn_search"); - resultSetSortSingle (zh, nmem, sset, rset, - sort_sequence, &sort_status); - if (zh->errCode) - { - logf (LOG_DEBUG, "resultSetSortSingle status = %d", zh->errCode); - } + logf (LOG_DEBUG, "resultSetSortSingle in rpn_search"); + resultSetSortSingle (zh, nmem, sset, rset, + sort_sequence, &sort_status); + if (zh->errCode) + { + logf (LOG_DEBUG, "resultSetSortSingle status = %d", zh->errCode); + } } return rset; } @@ -2397,7 +2409,7 @@ static int scan_handle (char *name, const char *info, int pos, void *client) else idx = - pos - 1; scan_info->list[idx].term = (char *) - odr_malloc (scan_info->odr, strlen(name + len_prefix)+1); + odr_malloc (scan_info->odr, strlen(name + len_prefix)+1); strcpy (scan_info->list[idx].term, name + len_prefix); assert (*info == sizeof(ISAMC_P)); memcpy (&scan_info->list[idx].isam_p, info+1, sizeof(ISAMC_P)); @@ -2405,7 +2417,7 @@ static int scan_handle (char *name, const char *info, int pos, void *client) } static void scan_term_untrans (ZebraHandle zh, NMEM stream, int reg_type, - char **dst, const char *src) + char **dst, const char *src) { char term_src[IT_MAX_WORD]; char term_dst[IT_MAX_WORD]; @@ -2469,10 +2481,10 @@ static void count_set (RSET r, int *count) } void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, - oid_value attributeset, - int num_bases, char **basenames, - int *position, int *num_entries, ZebraScanEntry **list, - int *is_partial, RSET limit_set, int return_zero) + oid_value attributeset, + int num_bases, char **basenames, + int *position, int *num_entries, ZebraScanEntry **list, + int *is_partial, RSET limit_set, int return_zero) { int i; int pos = *position; @@ -2537,11 +2549,11 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, use_value = attr_find_ex (&use, &attributeset, &use_string); if (zebra_maps_attr (zh->reg->zebra_maps, zapt, ®_id, &search_type, - rank_type, &complete_flag, &sort_flag)) + rank_type, &complete_flag, &sort_flag)) { - *num_entries = 0; - zh->errCode = 113; - return ; + *num_entries = 0; + zh->errCode = 113; + return ; } yaz_log (LOG_DEBUG, "use_value = %d", use_value); @@ -2549,85 +2561,85 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, use_value = 1016; for (base_no = 0; base_no < num_bases && ord_no < 32; base_no++) { - int r; + int r; attent attp; data1_local_attribute *local_attr; if ((r=att_getentbyatt (zh, &attp, attributeset, use_value, - use_string))) + use_string))) { logf (LOG_DEBUG, "att_getentbyatt fail. set=%d use=%d", attributeset, use_value); - if (r == -1) - { + if (r == -1) + { char val_str[32]; sprintf (val_str, "%d", use_value); errCode = 114; errString = odr_strdup (stream, val_str); - } - else - errCode = 121; - continue; + } + else + errCode = 121; + continue; } if (zebraExplain_curDatabase (zh->reg->zei, basenames[base_no])) { zh->errString = basenames[base_no]; - zh->errCode = 109; /* Database unavailable */ - *num_entries = 0; - return; + zh->errCode = 109; /* Database unavailable */ + *num_entries = 0; + return; } - bases_ok++; + bases_ok++; for (local_attr = attp.local_attributes; local_attr && ord_no < 32; local_attr = local_attr->next) { int ord; ord = zebraExplain_lookupSU (zh->reg->zei, attp.attset_ordinal, - local_attr->local); + local_attr->local); if (ord > 0) ords[ord_no++] = ord; } } if (!bases_ok && errCode) { - zh->errCode = errCode; - zh->errString = errString; - *num_entries = 0; + zh->errCode = errCode; + zh->errString = errString; + *num_entries = 0; } if (ord_no == 0) { - char val_str[32]; - sprintf (val_str, "%d", use_value); - zh->errCode = 114; - zh->errString = odr_strdup (stream, val_str); + char val_str[32]; + sprintf (val_str, "%d", use_value); + zh->errCode = 114; + zh->errString = odr_strdup (stream, val_str); - *num_entries = 0; - return; + *num_entries = 0; + return; } /* prepare dictionary scanning */ before = pos-1; after = 1+num-pos; scan_info_array = (struct scan_info *) - odr_malloc (stream, ord_no * sizeof(*scan_info_array)); + odr_malloc (stream, ord_no * sizeof(*scan_info_array)); for (i = 0; i < ord_no; i++) { int j, prefix_len = 0; int before_tmp = before, after_tmp = after; struct scan_info *scan_info = scan_info_array + i; - struct rpn_char_map_info rcmi; + struct rpn_char_map_info rcmi; - rpn_char_map_prepare (zh->reg, reg_id, &rcmi); + rpn_char_map_prepare (zh->reg, reg_id, &rcmi); scan_info->before = before; scan_info->after = after; scan_info->odr = stream; scan_info->list = (struct scan_info_entry *) - odr_malloc (stream, (before+after) * sizeof(*scan_info->list)); + odr_malloc (stream, (before+after) * sizeof(*scan_info->list)); for (j = 0; jlist[j].term = NULL; - prefix_len += key_SU_encode (ords[i], termz + prefix_len); + prefix_len += key_SU_encode (ords[i], termz + prefix_len); termz[prefix_len++] = reg_id; termz[prefix_len] = 0; strcpy (scan_info->prefix, termz); @@ -2636,10 +2648,10 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, return ; dict_scan (zh->reg->dict, termz, &before_tmp, &after_tmp, - scan_info, scan_handle); + scan_info, scan_handle); } glist = (ZebraScanEntry *) - odr_malloc (stream, (before+after)*sizeof(*glist)); + odr_malloc (stream, (before+after)*sizeof(*glist)); /* consider terms after main term */ for (i = 0; i < ord_no; i++) @@ -2666,10 +2678,10 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, if (j0 == -1) break; scan_term_untrans (zh, stream->mem, reg_id, - &glist[i+before].term, mterm); + &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); + glist[i+before].term, strlen(glist[i+before].term), + NULL, 0, zapt->term->which); ptr[j0]++; for (j = j0+1; jterm->which); - +/* bool_parms.key_size = sizeof(struct it_key); bool_parms.cmp = key_compare_it; - bool_parms.log_item = key_logdump_txt; - bool_parms.rset_l = rset; + bool_parms.log_item = key_logdump_txt; + bool_parms.rset_l = rset; bool_parms.rset_r = rset2; - rset = rset_create (rset_kind_or, &bool_parms); +*/ + rset = rsbool_create_or(NULL, /* FIXME -use a proper nmem */ + sizeof(struct it_key), key_compare_it, + rset, rset2, key_logdump_txt); ptr[j]++; } } if (limit_set) { + /* rset_bool_parms bool_parms; - bool_parms.key_size = sizeof(struct it_key); bool_parms.cmp = key_compare_it; - bool_parms.log_item = key_logdump_txt; - bool_parms.rset_l = rset; + bool_parms.log_item = key_logdump_txt; + bool_parms.rset_l = rset; bool_parms.rset_r = rset_dup(limit_set); - rset = rset_create (rset_kind_and, &bool_parms); + */ + rset = rsbool_create_and(NULL, /* FIXME -use a proper nmem */ + sizeof(struct it_key), key_compare_it, + rset, rset_dup(limit_set), + key_logdump_txt); } count_set (rset, &glist[i+before].occurrences); rset_delete (rset); @@ -2744,12 +2762,12 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, break; scan_term_untrans (zh, stream->mem, reg_id, - &glist[before-1-i].term, mterm); + &glist[before-1-i].term, mterm); 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); + glist[before-1-i].term, strlen(glist[before-1-i].term), + NULL, 0, zapt->term->which); ptr[j0]++; @@ -2759,37 +2777,45 @@ void rpn_scan (ZebraHandle zh, ODR stream, Z_AttributesPlusTerm *zapt, (tst=scan_info_array[j].list[before-1-ptr[j]].term) && !strcmp (tst, mterm)) { - rset_bool_parms bool_parms; RSET rset2; rset2 = rset_trunc (zh, &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, + glist[before-1-i].term, + strlen(glist[before-1-i].term), NULL, 0, zapt->term->which); - +/* bool_parms.key_size = sizeof(struct it_key); bool_parms.cmp = key_compare_it; - bool_parms.log_item = key_logdump_txt; - bool_parms.rset_l = rset; + bool_parms.log_item = key_logdump_txt; + bool_parms.rset_l = rset; bool_parms.rset_r = rset2; - rset = rset_create (rset_kind_or, &bool_parms); - +*/ + rset = rsbool_create_and(NULL, /* FIXME -use a proper nmem */ + sizeof(struct it_key), key_compare_it, + rset, rset2, + key_logdump_txt); ptr[j]++; } } if (limit_set) { + /* rset_bool_parms bool_parms; bool_parms.key_size = sizeof(struct it_key); bool_parms.cmp = key_compare_it; - bool_parms.log_item = key_logdump_txt; + bool_parms.log_item = key_logdump_txt; bool_parms.rset_l = rset; bool_parms.rset_r = rset_dup(limit_set); rset = rset_create (rset_kind_and, &bool_parms); + */ + rset = rsbool_create_and(NULL, /* FIXME -use a proper nmem */ + sizeof(struct it_key), key_compare_it, + rset, rset_dup(limit_set), + key_logdump_txt); } count_set (rset, &glist[before-1-i].occurrences); rset_delete (rset); diff --git a/rset/rsbetween.c b/rset/rsbetween.c index 28fa700..4d7a813 100644 --- a/rset/rsbetween.c +++ b/rset/rsbetween.c @@ -1,4 +1,4 @@ -/* $Id: rsbetween.c,v 1.19 2004-08-23 12:38:53 heikki Exp $ +/* $Id: rsbetween.c,v 1.20 2004-08-24 14:25: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) { @@ -131,10 +151,26 @@ static void *r_create_between (RSET ct, const struct rset_control *sel, 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); + /* xfree (info); */ +} + 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) @@ -196,19 +232,6 @@ static void r_close_between (RSFD rfd) 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; diff --git a/rset/rsbool.c b/rset/rsbool.c index f33400f..179cac4 100644 --- a/rset/rsbool.c +++ b/rset/rsbool.c @@ -1,4 +1,4 @@ -/* $Id: rsbool.c,v 1.39 2004-08-23 12:38:53 heikki Exp $ +/* $Id: rsbool.c,v 1.40 2004-08-24 14:25:16 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -33,7 +33,6 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #define RSET_DEBUG 0 #endif -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); @@ -50,7 +49,6 @@ static int r_write (RSFD rfd, const void *buf); static const struct rset_control control_and = { "and", - r_create, r_open, r_close, r_delete, @@ -64,7 +62,6 @@ static const struct rset_control control_and = static const struct rset_control control_or = { "or", - r_create, r_open, r_close, r_delete, @@ -78,7 +75,6 @@ static const struct rset_control control_or = static const struct rset_control control_not = { "not", - r_create, r_open, r_close, r_delete, @@ -116,6 +112,65 @@ struct rset_bool_rfd { 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) ) +{ + RSET rnew=rset_create_base(ctrl, nmem); + 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; + info->rfd_list = NULL; + + 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) ) +{ + return rsbool_create_base(rset_kind_and, nmem, key_size, cmp, + rset_l, rset_r, log_item); +} + +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) ) +{ + return rsbool_create_base(rset_kind_or, nmem, key_size, cmp, + rset_l, rset_r, log_item); +} + +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) ) +{ + return rsbool_create_base(rset_kind_not, nmem, key_size, cmp, + rset_l, rset_r, log_item); +} + +static void r_delete (RSET ct) +{ + struct rset_bool_info *info = (struct rset_bool_info *) ct->priv; + + assert (info->rfd_list == NULL); + rset_delete (info->rset_l); + rset_delete (info->rset_r); + /* xfree (info); */ /* nmem'd */ +} + +#if 0 static void *r_create (RSET ct, const struct rset_control *sel, void *parms) { rset_bool_parms *bool_parms = (rset_bool_parms *) parms; @@ -131,10 +186,11 @@ static void *r_create (RSET ct, const struct rset_control *sel, void *parms) return info; } +#endif static RSFD r_open (RSET ct, int flag) { - struct rset_bool_info *info = (struct rset_bool_info *) ct->buf; + struct rset_bool_info *info = (struct rset_bool_info *) ct->priv; struct rset_bool_rfd *rfd; if (flag & RSETF_WRITE) @@ -179,15 +235,6 @@ static void r_close (RSFD rfd) assert (0); } -static void r_delete (RSET ct) -{ - struct rset_bool_info *info = (struct rset_bool_info *) ct->buf; - - assert (info->rfd_list == NULL); - rset_delete (info->rset_l); - rset_delete (info->rset_r); - xfree (info); -} static void r_rewind (RSFD rfd) { diff --git a/rset/rset.c b/rset/rset.c index 6355cfa..15954d8 100644 --- a/rset/rset.c +++ b/rset/rset.c @@ -1,4 +1,4 @@ -/* $Id: rset.c,v 1.26 2004-08-23 12:38:53 heikki Exp $ +/* $Id: rset.c,v 1.27 2004-08-24 14:25:16 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -26,11 +26,12 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include #include #include - +#include #include -/* #include <../index/index.h> */ /* for log_keydump. Debugging only */ -RSET rset_create(const struct rset_control *sel, void *parms) +RSET rset_create_base(const struct rset_control *sel, NMEM nmem) + /* FIXME - Add keysize and cmp function */ + /* FIXME - Add a general key-func block for cmp, dump, etc */ { RSET rnew; @@ -38,7 +39,14 @@ RSET rset_create(const struct rset_control *sel, void *parms) rnew = (RSET) xmalloc(sizeof(*rnew)); rnew->control = sel; rnew->count = 1; - rnew->buf = (*sel->f_create)(rnew, sel, parms); + rnew->priv = 0; + rnew->nmem=nmem; + if (nmem) + rnew->my_nmem=0; + else { + rnew->nmem=nmem_create(); + rnew->my_nmem=1; + } return rnew; } @@ -48,6 +56,8 @@ void rset_delete (RSET rs) if (!rs->count) { (*rs->control->f_delete)(rs); + if (rs->my_nmem) + nmem_destroy(rs->nmem); xfree(rs); } } diff --git a/rset/rsisamb.c b/rset/rsisamb.c index 1227cd5..d5683c4 100644 --- a/rset/rsisamb.c +++ b/rset/rsisamb.c @@ -1,4 +1,4 @@ -/* $Id: rsisamb.c,v 1.16 2004-08-23 12:38:53 heikki Exp $ +/* $Id: rsisamb.c,v 1.17 2004-08-24 14:25:16 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -31,7 +31,6 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #define RSET_DEBUG 0 #endif -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); @@ -46,7 +45,6 @@ static int r_write (RSFD rfd, const void *buf); static const struct rset_control control = { "isamb", - r_create, r_open, r_close, r_delete, @@ -74,6 +72,31 @@ struct rset_isamb_info { struct rset_pp_info *ispt_list; }; +RSET rsisamb_create( NMEM nmem, int key_size, + int (*cmp)(const void *p1, const void *p2), + ISAMB is, ISAMB_P pos) +{ + RSET rnew=rset_create_base(&control, nmem); + 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; + info->ispt_list = NULL; + rnew->priv=info; + return rnew; +} + +static void r_delete (RSET ct) +{ + struct rset_isamb_info *info = (struct rset_isamb_info *) ct->priv; + + logf (LOG_DEBUG, "rsisamb_delete"); + assert (info->ispt_list == NULL); +} + +#if 0 static void *r_create(RSET ct, const struct rset_control *sel, void *parms) { rset_isamb_parms *pt = (rset_isamb_parms *) parms; @@ -87,10 +110,11 @@ static void *r_create(RSET ct, const struct rset_control *sel, void *parms) info->ispt_list = NULL; return info; } +#endif RSFD r_open (RSET ct, int flag) { - struct rset_isamb_info *info = (struct rset_isamb_info *) ct->buf; + struct rset_isamb_info *info = (struct rset_isamb_info *) ct->priv; struct rset_pp_info *ptinfo; logf (LOG_DEBUG, "risamb_open"); @@ -126,14 +150,6 @@ static void r_close (RSFD rfd) assert (0); } -static void r_delete (RSET ct) -{ - struct rset_isamb_info *info = (struct rset_isamb_info *) ct->buf; - - logf (LOG_DEBUG, "rsisamb_delete"); - assert (info->ispt_list == NULL); - xfree (info); -} static void r_rewind (RSFD rfd) { diff --git a/rset/rsisamc.c b/rset/rsisamc.c index a70d7ae..316d1b9 100644 --- a/rset/rsisamc.c +++ b/rset/rsisamc.c @@ -1,4 +1,4 @@ -/* $Id: rsisamc.c,v 1.20 2004-08-24 08:52:30 heikki Exp $ +/* $Id: rsisamc.c,v 1.21 2004-08-24 14:25:16 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -29,7 +29,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); @@ -40,7 +39,6 @@ static int r_write (RSFD rfd, const void *buf); static const struct rset_control control = { "isamc", - r_create, r_open, r_close, r_delete, @@ -68,6 +66,31 @@ struct rset_isamc_info { struct rset_pp_info *ispt_list; }; +RSET rsisamc_create( NMEM nmem, int key_size, + int (*cmp)(const void *p1, const void *p2), + ISAMC is, ISAMC_P pos) +{ + RSET rnew=rset_create_base(&control, nmem); + 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->is=is; + info->pos=pos; + rnew->priv=info; + return rnew; +} + +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); +} + +/* static void *r_create(RSET ct, const struct rset_control *sel, void *parms) { rset_isamc_parms *pt = (rset_isamc_parms *) parms; @@ -81,10 +104,11 @@ static void *r_create(RSET ct, const struct rset_control *sel, void *parms) info->ispt_list = NULL; return info; } +*/ RSFD r_open (RSET ct, int flag) { - struct rset_isamc_info *info = (struct rset_isamc_info *) ct->buf; + struct rset_isamc_info *info = (struct rset_isamc_info *) ct->priv; struct rset_pp_info *ptinfo; logf (LOG_DEBUG, "risamc_open"); @@ -120,14 +144,6 @@ static void r_close (RSFD rfd) assert (0); } -static void r_delete (RSET ct) -{ - struct rset_isamc_info *info = (struct rset_isamc_info *) ct->buf; - - logf (LOG_DEBUG, "rsisamc_delete"); - assert (info->ispt_list == NULL); - xfree (info); -} static void r_rewind (RSFD rfd) { diff --git a/rset/rsisams.c b/rset/rsisams.c index 0ad55d5..79ee4f4 100644 --- a/rset/rsisams.c +++ b/rset/rsisams.c @@ -1,4 +1,4 @@ -/* $Id: rsisams.c,v 1.9 2004-08-23 12:38:53 heikki Exp $ +/* $Id: rsisams.c,v 1.10 2004-08-24 14:25:16 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -27,7 +27,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); @@ -38,7 +37,6 @@ static int r_write (RSFD rfd, const void *buf); static const struct rset_control control = { "isams", - r_create, r_open, r_close, r_delete, @@ -63,6 +61,33 @@ struct rset_isams_info { struct rset_pp_info *ispt_list; }; + +RSET rsisams_create( NMEM nmem, int key_size, + int (*cmp)(const void *p1, const void *p2), + ISAMS is, ISAMS_P pos) +{ + RSET rnew=rset_create_base(&control, nmem); + 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); + info->is=is; + info->pos=pos; + info->ispt_list = NULL; + rnew->priv=info; + return rnew; +} + +static void r_delete (RSET ct) +{ + struct rset_isams_info *info = (struct rset_isams_info *) ct->priv; + + logf (LOG_DEBUG, "rsisams_delete"); + assert (info->ispt_list == NULL); + /* xfree (info); */ +} + +#if 0 static void *r_create(RSET ct, const struct rset_control *sel, void *parms) { rset_isams_parms *pt = (struct rset_isams_parms *) parms; @@ -74,10 +99,11 @@ static void *r_create(RSET ct, const struct rset_control *sel, void *parms) info->ispt_list = NULL; return info; } +#endif RSFD r_open (RSET ct, int flag) { - struct rset_isams_info *info = (struct rset_isams_info *) ct->buf; + struct rset_isams_info *info = (struct rset_isams_info *) ct->priv; struct rset_pp_info *ptinfo; logf (LOG_DEBUG, "risams_open"); @@ -111,15 +137,6 @@ static void r_close (RSFD rfd) assert (0); } -static void r_delete (RSET ct) -{ - struct rset_isams_info *info = (struct rset_isams_info *) ct->buf; - - logf (LOG_DEBUG, "rsisams_delete"); - assert (info->ispt_list == NULL); - xfree (info); -} - static void r_rewind (RSFD rfd) { logf (LOG_DEBUG, "rsisams_rewind"); diff --git a/rset/rsmultior.c b/rset/rsmultior.c index 77d2aca..cf2e298 100644 --- a/rset/rsmultior.c +++ b/rset/rsmultior.c @@ -1,4 +1,4 @@ -/* $Id: rsmultior.c,v 1.5 2004-08-23 12:38:53 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,6 +217,35 @@ 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; @@ -232,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) @@ -293,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) { diff --git a/rset/rsnull.c b/rset/rsnull.c index a8c9825..2b0902e 100644 --- a/rset/rsnull.c +++ b/rset/rsnull.c @@ -1,4 +1,4 @@ -/* $Id: rsnull.c,v 1.21 2004-08-20 14:44:46 heikki Exp $ +/* $Id: rsnull.c,v 1.22 2004-08-24 14:25:16 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 Index Data Aps @@ -27,7 +27,8 @@ 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); +/* FIXME - Use the nmem instead of xmalloc all the way through */ + static RSFD r_open (RSET ct, int flag); static void r_close (RSFD rfd); static void r_delete (RSET ct); @@ -39,7 +40,6 @@ static int r_write (RSFD rfd, const void *buf); static const struct rset_control control = { "null", - r_create, r_open, r_close, r_delete, @@ -52,17 +52,26 @@ static const struct rset_control control = const struct rset_control *rset_kind_null = &control; +RSET rsnull_create(NMEM nmem ) +{ + RSET rnew=rset_create_base(&control, nmem); + rnew->priv=NULL; + return rnew; +} + +#if 0 static void *r_create(RSET ct, const struct rset_control *sel, void *parms) { return NULL; } +#endif static RSFD r_open (RSET ct, int flag) { if (flag & RSETF_WRITE) { - logf (LOG_FATAL, "NULL set type is read-only"); - return NULL; + logf (LOG_FATAL, "NULL set type is read-only"); + return NULL; } return ""; } diff --git a/rset/rsprox.c b/rset/rsprox.c index 9c05a9f..4c5701c 100644 --- a/rset/rsprox.c +++ b/rset/rsprox.c @@ -1,4 +1,4 @@ -/* $Id: rsprox.c,v 1.10 2004-08-23 12:38:53 heikki Exp $ +/* $Id: rsprox.c,v 1.11 2004-08-24 14:25:16 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004 Index Data Aps @@ -32,7 +32,6 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #define RSET_DEBUG 0 #endif -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); @@ -44,10 +43,9 @@ 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); -static const struct rset_control control_prox = +static const struct rset_control control = { "prox", - r_create, r_open, r_close, r_delete, @@ -58,11 +56,19 @@ static const struct rset_control control_prox = r_write, }; -const struct rset_control *rset_kind_prox = &control_prox; +const struct rset_control *rset_kind_prox = &control; struct rset_prox_info { - struct rset_prox_parms p; - +/* struct rset_prox_parms p; */ + RSET *rset; + int rset_no; + 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 *rfd_list; }; @@ -75,6 +81,47 @@ struct rset_prox_rfd { zint hits; }; + +RSET rsprox_create( NMEM nmem, int key_size, + int (*cmp)(const void *p1, const void *p2), + int (*getseq)(const void *p), + int rset_no, RSET *rset, + int ordered, int exclusion, + int relation, int distance) +{ + RSET rnew=rset_create_base(&control, nmem); + 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)); + info->rset_no=rset_no; + info->ordered=ordered; + info->exclusion=exclusion; + info->relation=relation; + info->distance=distance; + info->rfd_list = NULL; + rnew->priv=info; + return rnew; +} + + +static void r_delete (RSET ct) +{ + struct rset_prox_info *info = (struct rset_prox_info *) ct->priv; + int i; + + assert (info->rfd_list == NULL); + for (i = 0; irset_no; i++) + rset_delete (info->rset[i]); +/* xfree (info->rset); */ /* nmems! */ +/* xfree (info); */ +} + +#if 0 static void *r_create (RSET ct, const struct rset_control *sel, void *parms) { rset_prox_parms *prox_parms = (rset_prox_parms *) parms; @@ -89,10 +136,11 @@ static void *r_create (RSET ct, const struct rset_control *sel, void *parms) info->rfd_list = NULL; return info; } +#endif static RSFD r_open (RSET ct, int flag) { - struct rset_prox_info *info = (struct rset_prox_info *) ct->buf; + struct rset_prox_info *info = (struct rset_prox_info *) ct->priv; struct rset_prox_rfd *rfd; int i; @@ -107,18 +155,18 @@ static RSFD r_open (RSET ct, int flag) info->rfd_list = rfd; rfd->info = info; - rfd->more = xmalloc (sizeof(*rfd->more) * info->p.rset_no); + rfd->more = xmalloc (sizeof(*rfd->more) * info->rset_no); - rfd->buf = xmalloc(sizeof(*rfd->buf) * info->p.rset_no); - for (i = 0; i < info->p.rset_no; i++) - rfd->buf[i] = xmalloc (info->p.key_size); + rfd->buf = xmalloc(sizeof(*rfd->buf) * info->rset_no); + for (i = 0; i < info->rset_no; i++) + rfd->buf[i] = xmalloc (info->key_size); - rfd->rfd = xmalloc(sizeof(*rfd->rfd) * info->p.rset_no); - for (i = 0; i < info->p.rset_no; i++) - rfd->rfd[i] = rset_open (info->p.rset[i], RSETF_READ); + rfd->rfd = xmalloc(sizeof(*rfd->rfd) * info->rset_no); + for (i = 0; i < info->rset_no; i++) + rfd->rfd[i] = rset_open (info->rset[i], RSETF_READ); - for (i = 0; i < info->p.rset_no; i++) - rfd->more[i] = rset_read (info->p.rset[i], rfd->rfd[i], + for (i = 0; i < info->rset_no; i++) + rfd->more[i] = rset_read (info->rset[i], rfd->rfd[i], rfd->buf[i]); rfd->hits=0; return rfd; @@ -133,13 +181,13 @@ static void r_close (RSFD rfd) if (*rfdp == rfd) { int i; - for (i = 0; ip.rset_no; i++) + for (i = 0; irset_no; i++) xfree ((*rfdp)->buf[i]); xfree ((*rfdp)->buf); xfree ((*rfdp)->more); - for (i = 0; ip.rset_no; i++) - rset_close (info->p.rset[i], (*rfdp)->rfd[i]); + for (i = 0; irset_no; i++) + rset_close (info->rset[i], (*rfdp)->rfd[i]); xfree ((*rfdp)->rfd); *rfdp = (*rfdp)->next; @@ -150,18 +198,6 @@ static void r_close (RSFD rfd) assert (0); } -static void r_delete (RSET ct) -{ - struct rset_prox_info *info = (struct rset_prox_info *) ct->buf; - int i; - - assert (info->rfd_list == NULL); - for (i = 0; ip.rset_no; i++) - rset_delete (info->p.rset[i]); - xfree (info->p.rset); - xfree (info); -} - static void r_rewind (RSFD rfd) { struct rset_prox_info *info = ((struct rset_prox_rfd*)rfd)->info; @@ -170,10 +206,10 @@ static void r_rewind (RSFD rfd) logf (LOG_DEBUG, "rsprox_rewind"); - for (i = 0; i < info->p.rset_no; i++) + for (i = 0; i < info->rset_no; i++) { - rset_rewind (info->p.rset[i], p->rfd[i]); - p->more[i] = rset_read (info->p.rset[i], p->rfd[i], p->buf[i]); + rset_rewind (info->rset[i], p->rfd[i]); + p->more[i] = rset_read (info->rset[i], p->rfd[i], p->buf[i]); } p->hits=0; } @@ -193,126 +229,126 @@ static int r_forward (RSET ct, RSFD rfd, void *buf, /* it's enough to forward first one. Other will follow automatically */ if ( p->more[0] && ((cmpfunc)(untilbuf, p->buf[0]) >= 2) ) - p->more[0] = rset_forward(info->p.rset[0], p->rfd[0], - p->buf[0], info->p.cmp, + p->more[0] = rset_forward(info->rset[0], p->rfd[0], + p->buf[0], info->cmp, untilbuf); } - if (info->p.ordered && info->p.relation == 3 && info->p.exclusion == 0 - && info->p.distance == 1) + if (info->ordered && info->relation == 3 && info->exclusion == 0 + && info->distance == 1) { while (p->more[0]) { - for (i = 1; i < info->p.rset_no; i++) + for (i = 1; i < info->rset_no; i++) { if (!p->more[i]) { p->more[0] = 0; /* saves us a goto out of while loop. */ break; } - cmp = (*info->p.cmp) (p->buf[i], p->buf[i-1]); + cmp = (*info->cmp) (p->buf[i], p->buf[i-1]); if (cmp > 1) { - p->more[i-1] = rset_forward (info->p.rset[i-1], + p->more[i-1] = rset_forward (info->rset[i-1], p->rfd[i-1], p->buf[i-1], - info->p.cmp, + info->cmp, p->buf[i]); break; } else if (cmp == 1) { - if ((*info->p.getseq)(p->buf[i-1]) +1 != - (*info->p.getseq)(p->buf[i])) + if ((*info->getseq)(p->buf[i-1]) +1 != + (*info->getseq)(p->buf[i])) { - p->more[i-1] = rset_read ( info->p.rset[i-1], + p->more[i-1] = rset_read ( info->rset[i-1], p->rfd[i-1], p->buf[i-1]); break; } } else { - p->more[i] = rset_forward (info->p.rset[i], p->rfd[i], - p->buf[i], info->p.cmp, + p->more[i] = rset_forward (info->rset[i], p->rfd[i], + p->buf[i], info->cmp, p->buf[i-1]); break; } } - if (i == p->info->p.rset_no) + if (i == p->info->rset_no) { - memcpy (buf, p->buf[0], info->p.key_size); - p->more[0] = rset_read (info->p.rset[0], p->rfd[0], p->buf[0]); + memcpy (buf, p->buf[0], info->key_size); + p->more[0] = rset_read (info->rset[0], p->rfd[0], p->buf[0]); p->hits++; return 1; } } } - else if (info->p.rset_no == 2) + else if (info->rset_no == 2) { while (p->more[0] && p->more[1]) { - int cmp = (*info->p.cmp)(p->buf[0], p->buf[1]); + int cmp = (*info->cmp)(p->buf[0], p->buf[1]); if (cmp < -1) - p->more[0] = rset_forward (info->p.rset[0], p->rfd[0], - p->buf[0], info->p.cmp, p->buf[0]); + p->more[0] = rset_forward (info->rset[0], p->rfd[0], + p->buf[0], info->cmp, p->buf[0]); else if (cmp > 1) - p->more[1] = rset_forward (info->p.rset[1], p->rfd[1], - p->buf[1], info->p.cmp, p->buf[1]); + p->more[1] = rset_forward (info->rset[1], p->rfd[1], + p->buf[1], info->cmp, p->buf[1]); else { int seqno[500]; int n = 0; - seqno[n++] = (*info->p.getseq)(p->buf[0]); - while ((p->more[0] = rset_read (info->p.rset[0], p->rfd[0], + seqno[n++] = (*info->getseq)(p->buf[0]); + while ((p->more[0] = rset_read (info->rset[0], p->rfd[0], p->buf[0])) >= -1 && p->more[0] <= -1) if (n < 500) - seqno[n++] = (*info->p.getseq)(p->buf[0]); + seqno[n++] = (*info->getseq)(p->buf[0]); for (i = 0; ip.getseq)(p->buf[1]) - seqno[i]; - int excl = info->p.exclusion; - if (!info->p.ordered && diff < 0) + int diff = (*info->getseq)(p->buf[1]) - seqno[i]; + int excl = info->exclusion; + if (!info->ordered && diff < 0) diff = -diff; - switch (info->p.relation) + switch (info->relation) { case 1: /* < */ - if (diff < info->p.distance && diff >= 0) + if (diff < info->distance && diff >= 0) excl = !excl; break; case 2: /* <= */ - if (diff <= info->p.distance && diff >= 0) + if (diff <= info->distance && diff >= 0) excl = !excl; break; case 3: /* == */ - if (diff == info->p.distance && diff >= 0) + if (diff == info->distance && diff >= 0) excl = !excl; break; case 4: /* >= */ - if (diff >= info->p.distance && diff >= 0) + if (diff >= info->distance && diff >= 0) excl = !excl; break; case 5: /* > */ - if (diff > info->p.distance && diff >= 0) + if (diff > info->distance && diff >= 0) excl = !excl; break; case 6: /* != */ - if (diff != info->p.distance && diff >= 0) + if (diff != info->distance && diff >= 0) excl = !excl; break; } if (excl) { - memcpy (buf, p->buf[1], info->p.key_size); + memcpy (buf, p->buf[1], info->key_size); - p->more[1] = rset_read (info->p.rset[1], + p->more[1] = rset_read (info->rset[1], p->rfd[1], p->buf[1]); p->hits++; return 1; } } - p->more[1] = rset_read (info->p.rset[1], p->rfd[1], + p->more[1] = rset_read (info->rset[1], p->rfd[1], p->buf[1]); } } @@ -344,9 +380,9 @@ static void r_pos (RSFD rfd, double *current, double *total) logf (LOG_DEBUG, "rsprox_pos"); - for (i = 0; i < info->p.rset_no; i++) + for (i = 0; i < info->rset_no; i++) { - rset_pos(info->p.rset[i], p->rfd[i], &cur, &tot); + rset_pos(info->rset[i], p->rfd[i], &cur, &tot); if (tot>0) { scur += cur; stot += tot; diff --git a/rset/rstemp.c b/rset/rstemp.c index 325faf2..b9983fa 100644 --- a/rset/rstemp.c +++ b/rset/rstemp.c @@ -1,4 +1,4 @@ -/* $Id: rstemp.c,v 1.44 2004-08-24 08:52:30 heikki Exp $ +/* $Id: rstemp.c,v 1.45 2004-08-24 14:25:16 heikki Exp $ Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003 Index Data Aps @@ -34,7 +34,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); @@ -44,10 +43,11 @@ 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); +/* FIXME - Use the nmem instead of xmalloc all the way through */ + static const struct rset_control control = { "temp", - r_create, r_open, r_close, r_delete, @@ -84,6 +84,35 @@ 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), + const char *temp_path) +{ + RSET rnew=rset_create_base(&control, nmem); + 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; + info->rfd_list = NULL; + + if (!temp_path) + info->temp_path = NULL; + else + info->temp_path = nmem_strdup(rnew->nmem,temp_path); + rnew->priv=info; + return rnew; +} /* rstemp_create */ + +#if 0 static void *r_create(RSET ct, const struct rset_control *sel, void *parms) { rset_temp_parms *temp_parms = (rset_temp_parms *) parms; @@ -112,10 +141,31 @@ static void *r_create(RSET ct, const struct rset_control *sel, void *parms) return info; } +#endif + +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 */ +} + static RSFD r_open (RSET ct, int flag) { - struct rset_temp_info *info = (struct rset_temp_info *) ct->buf; + struct rset_temp_info *info = (struct rset_temp_info *) ct->priv; struct rset_temp_rfd *rfd; if (info->fd == -1 && info->fname) @@ -232,24 +282,6 @@ static void r_close (RSFD rfd) assert (0); } -static void r_delete (RSET ct) -{ - struct rset_temp_info *info = (struct rset_temp_info*) ct->buf; - - if (info->fname) - unlink (info->fname); - 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); - } - if (info->temp_path) - xfree (info->temp_path); - xfree (info); -} /* r_reread: read from file to window if file is assocated with set -