1 /* CCL find (to rpn conversion)
5 * Revision 1.3 1995/02/14 10:25:56 adam
6 * The constructions 'qualifier rel term ...' implemented.
8 * Revision 1.2 1995/02/13 15:15:07 adam
9 * Added handling of qualifiers. Not finished yet.
11 * Revision 1.1 1995/02/13 12:35:20 adam
12 * First version of CCL. Qualifiers aren't handled yet.
23 static struct ccl_token *look_token;
25 static CCL_bibset bibset;
27 #define KIND (look_token->kind)
28 #define ADVANCE look_token = look_token->next
29 #define ADVX(x) x=(x)->next
31 static int *qual_val (struct ccl_rpn_attr *list, int type)
35 if (list->type == type)
42 static void strxcat (char *n, const char *src, int len)
51 static char *copy_token_name (struct ccl_token *tp)
53 char *str = malloc (tp->len + 1);
55 memcpy (str, tp->name, tp->len);
60 static struct ccl_rpn_node *mk_node (enum rpn_node_kind kind)
62 struct ccl_rpn_node *p;
63 p = malloc (sizeof(*p));
69 void ccl_rpn_delete (struct ccl_rpn_node *rpn)
71 struct ccl_rpn_attr *attr, *attr1;
79 ccl_rpn_delete (rpn->u.p[0]);
80 ccl_rpn_delete (rpn->u.p[1]);
84 for (attr = rpn->u.t.attr_list; attr; attr = attr1)
91 free (rpn->u.setname);
94 ccl_rpn_delete (rpn->u.p[0]);
95 ccl_rpn_delete (rpn->u.p[1]);
101 static struct ccl_rpn_node *find_spec (struct ccl_rpn_attr **qa);
102 static struct ccl_rpn_node *search_terms (struct ccl_rpn_attr **qa);
104 static void add_attr (struct ccl_rpn_node *p, int type, int value)
106 struct ccl_rpn_attr *n;
108 n = malloc (sizeof(*n));
112 n->next = p->u.t.attr_list;
113 p->u.t.attr_list = n;
116 static struct ccl_rpn_node *search_term (struct ccl_rpn_attr **qa)
118 struct ccl_rpn_node *p;
119 struct ccl_token *lookahead = look_token;
123 if (KIND != CCL_TOK_TERM)
125 ccl_error = CCL_ERR_TERM_EXPECTED;
128 while (lookahead->kind == CCL_TOK_TERM)
131 len += 1+lookahead->len;
132 lookahead = lookahead->next;
135 p->u.t.term = malloc (len);
136 p->u.t.attr_list = NULL;
137 p->u.t.term[0] = '\0';
138 assert (p->u.t.term);
139 strxcat (p->u.t.term, look_token->name, look_token->len);
141 while (KIND == CCL_TOK_TERM)
143 strcat (p->u.t.term, " ");
144 strxcat (p->u.t.term, look_token->name, look_token->len);
151 for (i=0; qa[i]; i++)
153 struct ccl_rpn_attr *attr;
155 for (attr = qa[i]; attr; attr = attr->next)
157 add_attr (p, attr->type, attr->value);
159 if ((intp = qual_val (qa[0], CCL_BIB1_STR)) &&
160 *intp == CCL_BIB1_STR_WP)
163 add_attr (p, CCL_BIB1_STR, 2);
165 add_attr (p, CCL_BIB1_STR, 1);
171 static struct ccl_rpn_node *qualifiers (struct ccl_token *la,
172 struct ccl_rpn_attr **qa)
174 struct ccl_token *lookahead = look_token;
175 struct ccl_rpn_attr **ap;
182 ccl_error = CCL_ERR_DOBBLE_QUAL;
185 for (lookahead = look_token; lookahead != la; lookahead=lookahead->next)
187 ap = malloc (no * sizeof(*ap));
189 for (i=0; look_token != la; i++)
191 ap[i] = ccl_qual_search (bibset, look_token->name, look_token->len);
194 ccl_error = CCL_ERR_UNKNOWN_QUAL;
199 if (KIND == CCL_TOK_COMMA)
203 if (! (intp = qual_val (ap[0], CCL_BIB1_REL)) || *intp == 3)
205 /* unordered relation */
206 struct ccl_rpn_node *p;
207 if (KIND != CCL_TOK_EQ)
209 ccl_error = CCL_ERR_EQ_EXPECTED;
214 if (KIND == CCL_TOK_LP)
217 if (!(p = find_spec (ap)))
222 if (KIND != CCL_TOK_RP)
224 ccl_error = CCL_ERR_RP_EXPECTED;
232 p = search_terms (ap);
237 if (look_token->len == 1)
239 if (look_token->name[0] == '<')
241 else if (look_token->name[0] == '=')
243 else if (look_token->name[0] == '>')
246 else if (look_token->len == 2)
248 if (!memcmp (look_token->name, "<=", 2))
250 else if (!memcmp (look_token->name, ">=", 2))
252 else if (!memcmp (look_token->name, "<>", 2))
256 ccl_error = CCL_ERR_BAD_RELATION;
259 struct ccl_rpn_node *p;
262 p = search_term (ap);
263 add_attr (p, CCL_BIB1_REL, rel);
271 static struct ccl_rpn_node *search_terms (struct ccl_rpn_attr **qa)
273 struct ccl_rpn_node *p1, *p2, *pn;
274 p1 = search_term (qa);
279 if (KIND == CCL_TOK_PROX)
282 p2 = search_term (qa);
293 else if (KIND == CCL_TOK_TERM)
295 p2 = search_term (qa);
312 static struct ccl_rpn_node *search_elements (struct ccl_rpn_attr **qa)
314 struct ccl_rpn_node *p1;
315 struct ccl_token *lookahead;
316 if (KIND == CCL_TOK_LP)
322 if (KIND != CCL_TOK_RP)
324 ccl_error = CCL_ERR_RP_EXPECTED;
331 else if (KIND == CCL_TOK_SET)
334 if (KIND == CCL_TOK_EQ)
336 if (KIND != CCL_TOK_TERM)
338 ccl_error = CCL_ERR_SETNAME_EXPECTED;
342 p1->u.setname = copy_token_name (look_token);
346 lookahead = look_token;
348 while (lookahead->kind==CCL_TOK_TERM || lookahead->kind==CCL_TOK_COMMA)
349 lookahead = lookahead->next;
350 if (lookahead->kind == CCL_TOK_REL || lookahead->kind == CCL_TOK_EQ)
351 return qualifiers (lookahead, qa);
352 return search_terms (qa);
355 static struct ccl_rpn_node *find_spec (struct ccl_rpn_attr **qa)
357 struct ccl_rpn_node *p1, *p2, *pn;
358 if (!(p1 = search_elements (qa)))
366 p2 = search_elements (qa);
379 p2 = search_elements (qa);
392 p2 = search_elements (qa);
409 struct ccl_rpn_node *ccl_find (CCL_bibset abibset, struct ccl_token *list,
410 int *error, const char **pos)
412 struct ccl_rpn_node *p;
416 p = find_spec (NULL);
417 if (p && KIND != CCL_TOK_EOL)
419 if (KIND == CCL_TOK_RP)
420 ccl_error = CCL_ERR_BAD_RP;
422 ccl_error = CCL_ERR_OP_EXPECTED;
426 *pos = look_token->name;
434 struct ccl_rpn_node *ccl_find_str (CCL_bibset bibset, const char *str,
435 int *error, int *pos)
437 struct ccl_token *list, *li;
438 struct ccl_rpn_node *rpn;
439 const char *char_pos;
441 list = ccl_tokenize (str);
443 for (li = list; li; li = li->next)
444 printf ("kind=%d, str='%.*s'\n", li->kind, li->len, li->name);
446 rpn = ccl_find (bibset, list, error, &char_pos);
448 *pos = char_pos - str;