--- /dev/null
+/*
+ * 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 <stdio.h>
+#include <assert.h>
+#include <zebrautl.h>
+#if ZMBOL
+#include <rsisamd.h>
+
+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