2 * Copyright (C) 1994-1995, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.3 1995-09-07 13:58:43 adam
8 * New parameter: result-set file descriptor (RSFD) to support multiple
9 * positions within the same result-set.
10 * Boolean operators: and, or, not implemented.
12 * Revision 1.2 1995/09/06 16:11:55 adam
13 * More work on boolean sets.
15 * Revision 1.1 1995/09/06 13:27:15 adam
16 * New set type: bool. Not finished yet.
26 static rset_control *r_create(const struct rset_control *sel, void *parms);
27 static RSFD r_open (rset_control *ct, int wflag);
28 static void r_close (RSFD rfd);
29 static void r_delete (rset_control *ct);
30 static void r_rewind (RSFD rfd);
31 static int r_count (rset_control *ct);
32 static int r_read_and (RSFD rfd, void *buf);
33 static int r_read_or (RSFD rfd, void *buf);
34 static int r_read_not (RSFD rfd, void *buf);
35 static int r_write (RSFD rfd, const void *buf);
37 static const rset_control control_and =
51 static const rset_control control_or =
65 static const rset_control control_not =
80 const rset_control *rset_kind_and = &control_and;
81 const rset_control *rset_kind_or = &control_or;
82 const rset_control *rset_kind_not = &control_not;
84 struct rset_bool_info {
88 int (*cmp)(const void *p1, const void *p2);
89 struct rset_bool_rfd *rfd_list;
92 struct rset_bool_rfd {
99 struct rset_bool_rfd *next;
100 struct rset_bool_info *info;
103 static rset_control *r_create (const struct rset_control *sel, void *parms)
106 rset_bool_parms *bool_parms = parms;
107 struct rset_bool_info *info;
109 logf (LOG_DEBUG, "rsbool_create(%s)", sel->desc);
110 newct = xmalloc(sizeof(*newct));
111 memcpy (newct, sel, sizeof(*sel));
112 newct->buf = xmalloc (sizeof(struct rset_bool_info));
113 info = (struct rset_bool_info*) newct->buf;
114 info->key_size = bool_parms->key_size;
115 info->rset_l = bool_parms->rset_l;
116 info->rset_r = bool_parms->rset_r;
117 info->cmp = bool_parms->cmp;
118 info->rfd_list = NULL;
122 static RSFD r_open (rset_control *ct, int wflag)
124 struct rset_bool_info *info = ct->buf;
125 struct rset_bool_rfd *rfd;
129 logf (LOG_FATAL, "bool set type is read-only");
132 rfd = xmalloc (sizeof(*rfd));
133 rfd->next = info->rfd_list;
134 info->rfd_list = rfd;
136 rfd->buf_l = xmalloc (info->key_size);
137 rfd->buf_r = xmalloc (info->key_size);
138 rfd->rfd_l = rset_open (info->rset_l, wflag);
139 rfd->rfd_r = rset_open (info->rset_r, wflag);
140 rfd->more_l = rset_read (info->rset_l, rfd->rfd_l, rfd->buf_l);
141 rfd->more_r = rset_read (info->rset_r, rfd->rfd_r, rfd->buf_r);
146 static void r_close (RSFD rfd)
148 struct rset_bool_info *info = ((struct rset_bool_rfd*)rfd)->info;
149 struct rset_bool_rfd **rfdp;
151 for (rfdp = &info->rfd_list; *rfdp; rfdp = &(*rfdp)->next)
154 xfree ((*rfdp)->buf_l);
155 xfree ((*rfdp)->buf_r);
156 rset_close (info->rset_l, (*rfdp)->rfd_l);
157 rset_close (info->rset_r, (*rfdp)->rfd_r);
158 *rfdp = (*rfdp)->next;
162 logf (LOG_FATAL, "r_close but no rfd match!");
166 static void r_delete (rset_control *ct)
168 struct rset_bool_info *info = ct->buf;
170 assert (info->rfd_list == NULL);
175 static void r_rewind (RSFD rfd)
177 struct rset_bool_info *info = ((struct rset_bool_rfd*)rfd)->info;
178 struct rset_bool_rfd *p = rfd;
180 logf (LOG_DEBUG, "rsbool_rewind");
181 rset_rewind (info->rset_l, p->rfd_l);
182 rset_rewind (info->rset_r, p->rfd_r);
183 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l);
184 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
187 static int r_count (rset_control *ct)
192 static int r_read_and (RSFD rfd, void *buf)
194 struct rset_bool_rfd *p = rfd;
195 struct rset_bool_info *info = p->info;
197 while (p->more_l || p->more_r)
201 if (p->more_l && p->more_r)
202 cmp = (*info->cmp)(p->buf_l, p->buf_r);
209 memcpy (buf, p->buf_l, info->key_size);
210 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l);
211 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
216 memcpy (buf, p->buf_r, info->key_size);
217 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
222 memcpy (buf, p->buf_l, info->key_size);
223 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l);
227 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
229 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l);
234 static int r_read_or (RSFD rfd, void *buf)
236 struct rset_bool_rfd *p = rfd;
237 struct rset_bool_info *info = p->info;
239 while (p->more_l || p->more_r)
243 if (p->more_l && p->more_r)
244 cmp = (*info->cmp)(p->buf_l, p->buf_r);
251 memcpy (buf, p->buf_l, info->key_size);
252 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l);
253 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
258 memcpy (buf, p->buf_r, info->key_size);
259 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
264 memcpy (buf, p->buf_l, info->key_size);
265 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l);
272 static int r_read_not (RSFD rfd, void *buf)
274 struct rset_bool_rfd *p = rfd;
275 struct rset_bool_info *info = p->info;
277 while (p->more_l || p->more_r)
281 if (p->more_l && p->more_r)
282 cmp = (*info->cmp)(p->buf_l, p->buf_r);
289 memcpy (buf, p->buf_l, info->key_size);
290 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l);
294 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
297 memcpy (buf, p->buf_l, info->key_size);
300 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l);
303 cmp = (*info->cmp)(p->buf_l, buf);
304 } while (cmp >= -1 && cmp <= 1);
307 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
310 cmp = (*info->cmp)(p->buf_r, buf);
311 } while (cmp >= -1 && cmp <= 1);
318 static int r_write (RSFD rfd, const void *buf)
320 logf (LOG_FATAL, "bool set type is read-only");