1 /* CCL find (to rpn conversion)
5 * Revision 1.2 1995/02/13 15:15:07 adam
6 * Added handling of qualifiers. Not finished yet.
8 * Revision 1.1 1995/02/13 12:35:20 adam
9 * First version of CCL. Qualifiers aren't handled yet.
20 static struct ccl_token *look_token;
22 static CCL_bibset bibset;
24 #define KIND (look_token->kind)
25 #define ADVANCE look_token = look_token->next
26 #define ADVX(x) x=(x)->next
28 static void strxcat (char *n, const char *src, int len)
37 static char *copy_token_name (struct ccl_token *tp)
39 char *str = malloc (tp->len + 1);
41 memcpy (str, tp->name, tp->len);
46 static struct ccl_rpn_node *mk_node (enum rpn_node_kind kind)
48 struct ccl_rpn_node *p;
49 p = malloc (sizeof(*p));
55 void ccl_rpn_delete (struct ccl_rpn_node *rpn)
57 struct ccl_rpn_attr *attr, *attr1;
65 ccl_rpn_delete (rpn->u.p[0]);
66 ccl_rpn_delete (rpn->u.p[1]);
70 for (attr = rpn->u.t.attr_list; attr; attr = attr1)
77 free (rpn->u.setname);
80 ccl_rpn_delete (rpn->u.p[0]);
81 ccl_rpn_delete (rpn->u.p[1]);
87 static struct ccl_rpn_node *find_spec (struct ccl_qualifier **qa);
88 static struct ccl_rpn_node *search_terms (struct ccl_qualifier **qa);
90 static void add_attr (struct ccl_rpn_node *p, int type, int value)
92 struct ccl_rpn_attr *n;
94 n = malloc (sizeof(*n));
98 n->next = p->u.t.attr_list;
102 static struct ccl_rpn_node *search_term (struct ccl_qualifier **qa)
104 struct ccl_rpn_node *p;
105 struct ccl_token *lookahead = look_token;
109 if (KIND != CCL_TOK_TERM)
111 ccl_error = CCL_ERR_TERM_EXPECTED;
114 while (lookahead->kind == CCL_TOK_TERM)
117 len += 1+lookahead->len;
118 lookahead = lookahead->next;
121 p->u.t.term = malloc (len);
122 p->u.t.attr_list = NULL;
123 p->u.t.term[0] = '\0';
124 assert (p->u.t.term);
125 strxcat (p->u.t.term, look_token->name, look_token->len);
127 while (KIND == CCL_TOK_TERM)
129 strcat (p->u.t.term, " ");
130 strxcat (p->u.t.term, look_token->name, look_token->len);
137 for (i=0; qa[i]; i++)
140 for (j=0; j<qa[i]->nuse; j++)
141 add_attr (p, 1, qa[i]->use[j]);
144 if (qa[0]->structure == 0)
151 else if (qa[0]->structure > 0)
152 add_attr (p, 4, qa[0]->structure);
157 static struct ccl_rpn_node *qualifiers (struct ccl_token *la,
158 struct ccl_qualifier **qa)
160 struct ccl_token *lookahead = look_token;
161 struct ccl_qualifier **ap;
167 ccl_error = CCL_ERR_DOBBLE_QUAL;
170 for (lookahead = look_token; lookahead != la; lookahead=lookahead->next)
172 ap = malloc (no * sizeof(*ap));
174 for (i=0; look_token != la; i++)
176 ap[i] = ccl_qual_search (bibset, lookahead->name);
179 ccl_error = CCL_ERR_UNKNOWN_QUAL;
184 if (KIND == CCL_TOK_COMMA)
188 if (ap[0]->relation != 0)
190 /* unordered relation */
191 struct ccl_rpn_node *p;
192 if (KIND != CCL_TOK_EQ)
194 ccl_error = CCL_ERR_EQ_EXPECTED;
199 if (KIND == CCL_TOK_LP)
202 if (!(p = find_spec (ap)))
207 if (KIND != CCL_TOK_RP)
209 ccl_error = CCL_ERR_RP_EXPECTED;
217 p = search_terms (ap);
221 /* ordered relation ... */
227 static struct ccl_rpn_node *search_terms (struct ccl_qualifier **qa)
229 struct ccl_rpn_node *p1, *p2, *pn;
230 p1 = search_term (qa);
235 if (KIND == CCL_TOK_PROX)
238 p2 = search_term (qa);
249 else if (KIND == CCL_TOK_TERM)
251 p2 = search_term (qa);
268 static struct ccl_rpn_node *search_elements (struct ccl_qualifier **qa)
270 struct ccl_rpn_node *p1;
271 struct ccl_token *lookahead;
272 if (KIND == CCL_TOK_LP)
278 if (KIND != CCL_TOK_RP)
280 ccl_error = CCL_ERR_RP_EXPECTED;
287 else if (KIND == CCL_TOK_SET)
290 if (KIND != CCL_TOK_TERM)
292 ccl_error = CCL_ERR_SETNAME_EXPECTED;
296 p1->u.setname = copy_token_name (look_token);
300 lookahead = look_token;
302 while (lookahead->kind==CCL_TOK_TERM || lookahead->kind==CCL_TOK_COMMA)
303 lookahead = lookahead->next;
304 if (lookahead->kind == CCL_TOK_REL || lookahead->kind == CCL_TOK_EQ)
305 return qualifiers (lookahead, qa);
306 return search_terms (qa);
309 static struct ccl_rpn_node *find_spec (struct ccl_qualifier **qa)
311 struct ccl_rpn_node *p1, *p2, *pn;
312 if (!(p1 = search_elements (qa)))
320 p2 = search_elements (qa);
333 p2 = search_elements (qa);
346 p2 = search_elements (qa);
363 struct ccl_rpn_node *ccl_find (CCL_bibset abibset, struct ccl_token *list,
364 int *error, const char **pos)
366 struct ccl_rpn_node *p;
370 p = find_spec (NULL);
371 if (p && KIND != CCL_TOK_EOL)
373 if (KIND == CCL_TOK_RP)
374 ccl_error = CCL_ERR_BAD_RP;
376 ccl_error = CCL_ERR_OP_EXPECTED;
380 *pos = look_token->name;
388 static void pr_tree (struct ccl_rpn_node *rpn)
394 printf ("\"%s\"", rpn->u.t.term);
395 if (rpn->u.t.attr_list)
397 struct ccl_rpn_attr *attr;
399 for (attr = rpn->u.t.attr_list; attr; attr = attr->next)
400 printf ("%d=%d ", attr->type, attr->value);
406 pr_tree (rpn->u.p[0]);
408 pr_tree (rpn->u.p[1]);
413 pr_tree (rpn->u.p[0]);
415 pr_tree (rpn->u.p[1]);
420 pr_tree (rpn->u.p[0]);
422 pr_tree (rpn->u.p[1]);
426 printf ("set=%s", rpn->u.setname);
430 pr_tree (rpn->u.p[0]);
432 pr_tree (rpn->u.p[1]);
440 struct ccl_rpn_node *ccl_find_str (CCL_bibset bibset, const char *str,
441 int *error, int *pos)
443 struct ccl_token *list, *li;
444 struct ccl_rpn_node *rpn;
445 const char *char_pos;
447 list = ccl_tokenize (str);
449 for (li = list; li; li = li->next)
450 printf ("kind=%d, str='%.*s'\n", li->kind, li->len, li->name);
452 rpn = ccl_find (bibset, list, error, &char_pos);
460 *pos = char_pos - str;