2 * Copyright (C) 1994-1995, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.4 1995-09-08 08:54:04 adam
8 * More efficient and operation.
10 * Revision 1.3 1995/09/07 13:58:43 adam
11 * New parameter: result-set file descriptor (RSFD) to support multiple
12 * positions within the same result-set.
13 * Boolean operators: and, or, not implemented.
15 * Revision 1.2 1995/09/06 16:11:55 adam
16 * More work on boolean sets.
18 * Revision 1.1 1995/09/06 13:27:15 adam
19 * New set type: bool. Not finished yet.
29 static rset_control *r_create(const struct rset_control *sel, void *parms);
30 static RSFD r_open (rset_control *ct, int wflag);
31 static void r_close (RSFD rfd);
32 static void r_delete (rset_control *ct);
33 static void r_rewind (RSFD rfd);
34 static int r_count (rset_control *ct);
35 static int r_read_and (RSFD rfd, void *buf);
36 static int r_read_or (RSFD rfd, void *buf);
37 static int r_read_not (RSFD rfd, void *buf);
38 static int r_write (RSFD rfd, const void *buf);
40 static const rset_control control_and =
54 static const rset_control control_or =
68 static const rset_control control_not =
83 const rset_control *rset_kind_and = &control_and;
84 const rset_control *rset_kind_or = &control_or;
85 const rset_control *rset_kind_not = &control_not;
87 struct rset_bool_info {
91 int (*cmp)(const void *p1, const void *p2);
92 struct rset_bool_rfd *rfd_list;
95 struct rset_bool_rfd {
102 struct rset_bool_rfd *next;
103 struct rset_bool_info *info;
106 static rset_control *r_create (const struct rset_control *sel, void *parms)
109 rset_bool_parms *bool_parms = parms;
110 struct rset_bool_info *info;
112 logf (LOG_DEBUG, "rsbool_create(%s)", sel->desc);
113 newct = xmalloc(sizeof(*newct));
114 memcpy (newct, sel, sizeof(*sel));
115 newct->buf = xmalloc (sizeof(struct rset_bool_info));
116 info = (struct rset_bool_info*) newct->buf;
117 info->key_size = bool_parms->key_size;
118 info->rset_l = bool_parms->rset_l;
119 info->rset_r = bool_parms->rset_r;
120 info->cmp = bool_parms->cmp;
121 info->rfd_list = NULL;
125 static RSFD r_open (rset_control *ct, int wflag)
127 struct rset_bool_info *info = ct->buf;
128 struct rset_bool_rfd *rfd;
132 logf (LOG_FATAL, "bool set type is read-only");
135 rfd = xmalloc (sizeof(*rfd));
136 rfd->next = info->rfd_list;
137 info->rfd_list = rfd;
139 rfd->buf_l = xmalloc (info->key_size);
140 rfd->buf_r = xmalloc (info->key_size);
141 rfd->rfd_l = rset_open (info->rset_l, wflag);
142 rfd->rfd_r = rset_open (info->rset_r, wflag);
143 rfd->more_l = rset_read (info->rset_l, rfd->rfd_l, rfd->buf_l);
144 rfd->more_r = rset_read (info->rset_r, rfd->rfd_r, rfd->buf_r);
149 static void r_close (RSFD rfd)
151 struct rset_bool_info *info = ((struct rset_bool_rfd*)rfd)->info;
152 struct rset_bool_rfd **rfdp;
154 for (rfdp = &info->rfd_list; *rfdp; rfdp = &(*rfdp)->next)
157 xfree ((*rfdp)->buf_l);
158 xfree ((*rfdp)->buf_r);
159 rset_close (info->rset_l, (*rfdp)->rfd_l);
160 rset_close (info->rset_r, (*rfdp)->rfd_r);
161 *rfdp = (*rfdp)->next;
165 logf (LOG_FATAL, "r_close but no rfd match!");
169 static void r_delete (rset_control *ct)
171 struct rset_bool_info *info = ct->buf;
173 assert (info->rfd_list == NULL);
178 static void r_rewind (RSFD rfd)
180 struct rset_bool_info *info = ((struct rset_bool_rfd*)rfd)->info;
181 struct rset_bool_rfd *p = rfd;
183 logf (LOG_DEBUG, "rsbool_rewind");
184 rset_rewind (info->rset_l, p->rfd_l);
185 rset_rewind (info->rset_r, p->rfd_r);
186 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l);
187 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
190 static int r_count (rset_control *ct)
195 static int r_read_and (RSFD rfd, void *buf)
197 struct rset_bool_rfd *p = rfd;
198 struct rset_bool_info *info = p->info;
200 while (p->more_l && p->more_r)
204 cmp = (*info->cmp)(p->buf_l, p->buf_r);
207 memcpy (buf, p->buf_l, info->key_size);
208 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l);
209 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
214 memcpy (buf, p->buf_r, info->key_size);
215 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
220 memcpy (buf, p->buf_l, info->key_size);
221 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l);
225 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
227 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l);
232 static int r_read_or (RSFD rfd, void *buf)
234 struct rset_bool_rfd *p = rfd;
235 struct rset_bool_info *info = p->info;
237 while (p->more_l || p->more_r)
241 if (p->more_l && p->more_r)
242 cmp = (*info->cmp)(p->buf_l, p->buf_r);
249 memcpy (buf, p->buf_l, info->key_size);
250 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l);
251 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
256 memcpy (buf, p->buf_r, info->key_size);
257 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
262 memcpy (buf, p->buf_l, info->key_size);
263 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l);
270 static int r_read_not (RSFD rfd, void *buf)
272 struct rset_bool_rfd *p = rfd;
273 struct rset_bool_info *info = p->info;
275 while (p->more_l || p->more_r)
279 if (p->more_l && p->more_r)
280 cmp = (*info->cmp)(p->buf_l, p->buf_r);
287 memcpy (buf, p->buf_l, info->key_size);
288 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l);
292 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
295 memcpy (buf, p->buf_l, info->key_size);
298 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l);
301 cmp = (*info->cmp)(p->buf_l, buf);
302 } while (cmp >= -1 && cmp <= 1);
305 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
308 cmp = (*info->cmp)(p->buf_r, buf);
309 } while (cmp >= -1 && cmp <= 1);
316 static int r_write (RSFD rfd, const void *buf)
318 logf (LOG_FATAL, "bool set type is read-only");