X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=rset%2Frset.c;h=93fe8df7eea11738b1e5968d96517ce4a6685166;hb=2b1851bd5565e3d21f9cf9a37661a584c063b75f;hp=667bd1d98de2471d1891d5217f3e7e17a3c5438f;hpb=affd7e4168d70b94e015b777748b7eca1cd00ec0;p=idzebra-moved-to-github.git diff --git a/rset/rset.c b/rset/rset.c index 667bd1d..93fe8df 100644 --- a/rset/rset.c +++ b/rset/rset.c @@ -1,34 +1,150 @@ /* - * Copyright (C) 1994, Index Data I/S + * Copyright (C) 1994-1999, Index Data * All rights reserved. * Sebastian Hammer, Adam Dickmeiss * * $Log: rset.c,v $ - * Revision 1.1 1994-11-04 13:21:28 quinn + * Revision 1.15 2002-03-20 20:24:30 adam + * Hits per term. Returned in SearchResult-1 + * + * Revision 1.14 1999/05/26 07:49:14 adam + * C++ compilation. + * + * Revision 1.13 1999/02/02 14:51:33 adam + * Updated WIN32 code specific sections. Changed header. + * + * Revision 1.12 1998/04/26 10:56:57 adam + * Added include of string.h. + * + * Revision 1.11 1998/03/05 08:36:28 adam + * New result set model. + * + * Revision 1.10 1998/02/10 11:56:46 adam + * Implemented rset_dup. + * + * Revision 1.9 1996/10/29 13:55:21 adam + * Include of zebrautl.h instead of alexutil.h. + * + * Revision 1.8 1995/12/11 09:15:23 adam + * New set types: sand/sor/snot - ranked versions of and/or/not in + * ranked/semi-ranked result sets. + * Note: the snot not finished yet. + * New rset member: flag. + * Bug fix: r_delete in rsrel.c did free bad memory block. + * + * Revision 1.7 1995/10/12 12:41:56 adam + * Private info (buf) moved from struct rset_control to struct rset. + * Bug fixes in relevance. + * + * Revision 1.6 1995/09/08 14:52:41 adam + * Work on relevance feedback. + * + * Revision 1.5 1995/09/07 13:58:43 adam + * New parameter: result-set file descriptor (RSFD) to support multiple + * positions within the same result-set. + * Boolean operators: and, or, not implemented. + * + * Revision 1.4 1995/09/06 16:11:56 adam + * More work on boolean sets. + * + * Revision 1.3 1995/09/04 15:20:39 adam + * More work on temp sets. is_open member removed. + * + * Revision 1.2 1995/09/04 12:33:56 adam + * Various cleanup. YAZ util used instead. + * + * Revision 1.1 1994/11/04 13:21:28 quinn * Working. * */ -/* TODO: mem management */ - -#include +#include +#include +#include #include -RSET rset_create(const rset_control *sel, void *parms) +RSET rset_create(const struct rset_control *sel, void *parms) { - RSET new; + RSET rnew; + int i; - new = xmalloc(sizeof(*new)); /* make dynamic alloc scheme */ - if (!(new->control = (*sel->f_create)(sel, parms))) - return 0; - return new; + logf (LOG_DEBUG, "rs_create(%s)", sel->desc); + rnew = (RSET) xmalloc(sizeof(*rnew)); + rnew->control = sel; + rnew->flags = 0; + rnew->count = 1; + rnew->rset_terms = NULL; + rnew->no_rset_terms = 0; + rnew->buf = (*sel->f_create)(rnew, sel, parms); + logf (LOG_DEBUG, "no_rset_terms: %d", rnew->no_rset_terms); + for (i = 0; ino_rset_terms; i++) + logf (LOG_DEBUG, " %s", rnew->rset_terms[i]->name); + return rnew; +} + +void rset_delete (RSET rs) +{ + (rs->count)--; + if (!rs->count) + { + (*rs->control->f_delete)(rs); + xfree(rs); + } +} + +RSET rset_dup (RSET rs) +{ + (rs->count)++; + return rs; +} + +RSET_TERM *rset_terms(RSET rs, int *no) +{ + *no = rs->no_rset_terms; + return rs->rset_terms; +} + +RSET_TERM rset_term_create (const char *name, int length, const char *flags) +{ + RSET_TERM t = (RSET_TERM) xmalloc (sizeof(*t)); + if (!name) + t->name = NULL; + else if (length == -1) + t->name = xstrdup (name); + else + { + t->name = (char*) xmalloc (length+1); + memcpy (t->name, name, length); + t->name[length] = '\0'; + } + if (!flags) + t->flags = NULL; + else + t->flags = xstrdup (flags); + t->nn = -1; + t->count = 0; + return t; +} + +void rset_term_destroy (RSET_TERM t) +{ + xfree (t->name); + xfree (t->flags); + xfree (t); } -void rset_delete(RSET rs) +RSET_TERM rset_term_dup (RSET_TERM t) { - if (rs->is_open) - rset_close(rs); - (*rs->control->f_delete)(rs->control); - xfree(rs); + RSET_TERM nt = (RSET_TERM) xmalloc (sizeof(*nt)); + if (t->name) + nt->name = xstrdup (t->name); + else + nt->name = NULL; + if (t->flags) + nt->flags = xstrdup (t->flags); + else + nt->flags = NULL; + nt->nn = t->nn; + return nt; }