From 4825ec6553e8d87b63d59527c94a46dd7fe4e3ab Mon Sep 17 00:00:00 2001 From: Heikki Levanto Date: Tue, 16 Jan 2001 19:17:18 +0000 Subject: [PATCH] Added rsisamd.c --- rset/Makefile.in | 5 -- rset/rsisamd.c | 143 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 143 insertions(+), 5 deletions(-) create mode 100644 rset/rsisamd.c diff --git a/rset/Makefile.in b/rset/Makefile.in index 3c1e831..f982bc1 100644 --- a/rset/Makefile.in +++ b/rset/Makefile.in @@ -67,11 +67,6 @@ RANLIB = @RANLIB@ TCL_INCLUDE = @TCL_INCLUDE@ TCL_LIB = @TCL_LIB@ VERSION = @VERSION@ -YAZINC = @YAZINC@ -YAZLALIB = @YAZLALIB@ -YAZLIB = @YAZLIB@ -YAZVERSION = @YAZVERSION@ -yazconfig = @yazconfig@ noinst_LIBRARIES = librset.a diff --git a/rset/rsisamd.c b/rset/rsisamd.c new file mode 100644 index 0000000..3aceccb --- /dev/null +++ b/rset/rsisamd.c @@ -0,0 +1,143 @@ +/* + * Copyright (C) 1994-1999, Index Data + * All rights reserved. + * Sebastian Hammer, Adam Dickmeiss + * + * $Log: rsisamd.c,v $ + * Revision 1.1 2001-01-16 19:17:18 heikki + * Added rsisamd.c + * + * + */ + + +#include +#include +#include +#if ZMBOL +#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); +static void r_rewind (RSFD rfd); +static int r_count (RSET ct); +static int r_read (RSFD rfd, void *buf, int *term_index); +static int r_write (RSFD rfd, const void *buf); + +static const struct rset_control control = +{ + "isamd", + r_create, + r_open, + r_close, + r_delete, + r_rewind, + r_count, + r_read, + r_write, +}; + +const struct rset_control *rset_kind_isamd = &control; + +struct rset_pp_info { + ISAMD_PP pt; + struct rset_pp_info *next; + struct rset_isamd_info *info; +}; + +struct rset_isamd_info { + ISAMD is; + ISAMD_P pos; + struct rset_pp_info *ispt_list; +}; + +static void *r_create(RSET ct, const struct rset_control *sel, void *parms) +{ + rset_isamd_parms *pt = (rset_isamd_parms *) parms; + struct rset_isamd_info *info; + + ct->flags |= RSET_FLAG_VOLATILE; + info = (struct rset_isamd_info *) xmalloc (sizeof(*info)); + info->is = pt->is; + info->pos = pt->pos; + info->ispt_list = NULL; + ct->no_rset_terms = 1; + ct->rset_terms = (RSET_TERM *) xmalloc (sizeof(*ct->rset_terms)); + ct->rset_terms[0] = pt->rset_term; + return info; +} + +RSFD r_open (RSET ct, int flag) +{ + struct rset_isamd_info *info = (struct rset_isamd_info *) ct->buf; + struct rset_pp_info *ptinfo; + + logf (LOG_DEBUG, "risamd_open"); + if (flag & RSETF_WRITE) + { + logf (LOG_FATAL, "ISAMD set type is read-only"); + return NULL; + } + ptinfo = (struct rset_pp_info *) xmalloc (sizeof(*ptinfo)); + ptinfo->next = info->ispt_list; + info->ispt_list = ptinfo; + ptinfo->pt = isamd_pp_open (info->is, info->pos); + ptinfo->info = info; + if (ct->rset_terms[0]->nn < 0) + ct->rset_terms[0]->nn = isamd_pp_num (ptinfo->pt); + return ptinfo; +} + +static void r_close (RSFD rfd) +{ + struct rset_isamd_info *info = ((struct rset_pp_info*) rfd)->info; + struct rset_pp_info **ptinfop; + + for (ptinfop = &info->ispt_list; *ptinfop; ptinfop = &(*ptinfop)->next) + if (*ptinfop == rfd) + { + isamd_pp_close ((*ptinfop)->pt); + *ptinfop = (*ptinfop)->next; + xfree (rfd); + return; + } + logf (LOG_FATAL, "r_close but no rfd match!"); + assert (0); +} + +static void r_delete (RSET ct) +{ + struct rset_isamd_info *info = (struct rset_isamd_info *) ct->buf; + + logf (LOG_DEBUG, "rsisamd_delete"); + assert (info->ispt_list == NULL); + rset_term_destroy (ct->rset_terms[0]); + xfree (ct->rset_terms); + xfree (info); +} + +static void r_rewind (RSFD rfd) +{ + logf (LOG_DEBUG, "rsisamd_rewind"); + abort (); +} + +static int r_count (RSET ct) +{ + return 0; +} + +static int r_read (RSFD rfd, void *buf, int *term_index) +{ + *term_index = 0; + return isamd_pp_read( ((struct rset_pp_info*) rfd)->pt, buf); +} + +static int r_write (RSFD rfd, const void *buf) +{ + logf (LOG_FATAL, "ISAMD set type is read-only"); + return -1; +} +#endif -- 1.7.10.4