2 * Copyright (C) 1994-1995, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.5 1995-09-08 14:52:41 adam
8 * Work on relevance feedback.
10 * Revision 1.4 1995/09/08 08:54:04 adam
11 * More efficient and operation.
13 * Revision 1.3 1995/09/07 13:58:43 adam
14 * New parameter: result-set file descriptor (RSFD) to support multiple
15 * positions within the same result-set.
16 * Boolean operators: and, or, not implemented.
18 * Revision 1.2 1995/09/06 16:11:55 adam
19 * More work on boolean sets.
21 * Revision 1.1 1995/09/06 13:27:15 adam
22 * New set type: bool. Not finished yet.
32 static rset_control *r_create(const struct rset_control *sel, void *parms);
33 static RSFD r_open (rset_control *ct, int wflag);
34 static void r_close (RSFD rfd);
35 static void r_delete (rset_control *ct);
36 static void r_rewind (RSFD rfd);
37 static int r_count (rset_control *ct);
38 static int r_read_and (RSFD rfd, void *buf);
39 static int r_read_or (RSFD rfd, void *buf);
40 static int r_read_not (RSFD rfd, void *buf);
41 static int r_write (RSFD rfd, const void *buf);
43 static const rset_control control_and =
57 static const rset_control control_or =
71 static const rset_control control_not =
86 const rset_control *rset_kind_and = &control_and;
87 const rset_control *rset_kind_or = &control_or;
88 const rset_control *rset_kind_not = &control_not;
90 struct rset_bool_info {
94 int (*cmp)(const void *p1, const void *p2);
95 struct rset_bool_rfd *rfd_list;
98 struct rset_bool_rfd {
105 struct rset_bool_rfd *next;
106 struct rset_bool_info *info;
109 static rset_control *r_create (const struct rset_control *sel, void *parms)
112 rset_bool_parms *bool_parms = parms;
113 struct rset_bool_info *info;
115 newct = xmalloc(sizeof(*newct));
116 memcpy (newct, sel, sizeof(*sel));
117 newct->buf = xmalloc (sizeof(struct rset_bool_info));
118 info = (struct rset_bool_info*) newct->buf;
119 info->key_size = bool_parms->key_size;
120 info->rset_l = bool_parms->rset_l;
121 info->rset_r = bool_parms->rset_r;
122 info->cmp = bool_parms->cmp;
123 info->rfd_list = NULL;
127 static RSFD r_open (rset_control *ct, int wflag)
129 struct rset_bool_info *info = ct->buf;
130 struct rset_bool_rfd *rfd;
134 logf (LOG_FATAL, "bool set type is read-only");
137 rfd = xmalloc (sizeof(*rfd));
138 rfd->next = info->rfd_list;
139 info->rfd_list = rfd;
141 rfd->buf_l = xmalloc (info->key_size);
142 rfd->buf_r = xmalloc (info->key_size);
143 rfd->rfd_l = rset_open (info->rset_l, wflag);
144 rfd->rfd_r = rset_open (info->rset_r, wflag);
145 rfd->more_l = rset_read (info->rset_l, rfd->rfd_l, rfd->buf_l);
146 rfd->more_r = rset_read (info->rset_r, rfd->rfd_r, rfd->buf_r);
151 static void r_close (RSFD rfd)
153 struct rset_bool_info *info = ((struct rset_bool_rfd*)rfd)->info;
154 struct rset_bool_rfd **rfdp;
156 for (rfdp = &info->rfd_list; *rfdp; rfdp = &(*rfdp)->next)
159 xfree ((*rfdp)->buf_l);
160 xfree ((*rfdp)->buf_r);
161 rset_close (info->rset_l, (*rfdp)->rfd_l);
162 rset_close (info->rset_r, (*rfdp)->rfd_r);
163 *rfdp = (*rfdp)->next;
167 logf (LOG_FATAL, "r_close but no rfd match!");
171 static void r_delete (rset_control *ct)
173 struct rset_bool_info *info = ct->buf;
175 assert (info->rfd_list == NULL);
180 static void r_rewind (RSFD rfd)
182 struct rset_bool_info *info = ((struct rset_bool_rfd*)rfd)->info;
183 struct rset_bool_rfd *p = rfd;
185 logf (LOG_DEBUG, "rsbool_rewind");
186 rset_rewind (info->rset_l, p->rfd_l);
187 rset_rewind (info->rset_r, p->rfd_r);
188 p->more_l = rset_read (info->rset_l, p->rfd_l, p->buf_l);
189 p->more_r = rset_read (info->rset_r, p->rfd_r, p->buf_r);
192 static int r_count (rset_control *ct)
197 static int r_read_and (RSFD rfd, void *buf)
199 struct rset_bool_rfd *p = rfd;
200 struct rset_bool_info *info = p->info;
202 while (p->more_l && p->more_r)
206 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");