1 /* CCL find (to rpn conversion)
5 * Revision 1.1 1995/02/13 12:35:20 adam
6 * First version of CCL. Qualifiers aren't handled yet.
17 static struct ccl_token *look_token;
20 #define KIND (look_token->kind)
21 #define ADVANCE look_token = look_token->next
22 #define ADVX(x) x=(x)->next
24 static void strxcat (char *n, const char *src, int len)
33 static char *copy_token_name (struct ccl_token *tp)
35 char *str = malloc (tp->len + 1);
36 memcpy (str, tp->name, tp->len);
41 static struct ccl_rpn_node *mk_node (enum rpn_node_kind kind)
43 struct ccl_rpn_node *p;
44 p = malloc (sizeof(*p));
50 void ccl_rpn_delete (struct ccl_rpn_node *rpn)
59 ccl_rpn_delete (rpn->u.p[0]);
60 ccl_rpn_delete (rpn->u.p[1]);
67 free (rpn->u.setname);
70 ccl_rpn_delete (rpn->u.p[0]);
71 ccl_rpn_delete (rpn->u.p[1]);
77 static struct ccl_rpn_node *find_spec (void);
79 static struct ccl_rpn_node *search_term (void)
81 struct ccl_rpn_node *p;
82 struct ccl_token *lookahead = look_token;
85 if (KIND != CCL_TOK_TERM)
87 ccl_error = CCL_ERR_TERM_EXPECTED;
90 while (lookahead->kind == CCL_TOK_TERM)
92 len += 1+lookahead->len;
93 lookahead = lookahead->next;
96 p->u.t.term = malloc (len);
97 p->u.t.attr_list = NULL;
98 p->u.t.term[0] = '\0';
100 strxcat (p->u.t.term, look_token->name, look_token->len);
102 while (KIND == CCL_TOK_TERM)
104 strcat (p->u.t.term, " ");
105 strxcat (p->u.t.term, look_token->name, look_token->len);
111 static struct ccl_rpn_node *qualifiers (struct ccl_token *la)
117 static struct ccl_rpn_node *search_terms (void)
119 struct ccl_rpn_node *p1, *p2, *pn;
125 if (KIND == CCL_TOK_PROX)
139 else if (KIND == CCL_TOK_TERM)
158 static struct ccl_rpn_node *search_elements (void)
160 struct ccl_rpn_node *p1;
161 struct ccl_token *lookahead;
162 if (KIND == CCL_TOK_LP)
168 if (KIND != CCL_TOK_RP)
170 ccl_error = CCL_ERR_RP_EXPECTED;
177 else if (KIND == CCL_TOK_SET)
180 if (KIND != CCL_TOK_TERM)
182 ccl_error = CCL_ERR_SETNAME_EXPECTED;
186 p1->u.setname = copy_token_name (look_token);
190 lookahead = look_token;
192 while (lookahead->kind==CCL_TOK_TERM || lookahead->kind==CCL_TOK_COMMA)
193 lookahead = lookahead->next;
194 if (lookahead->kind == CCL_TOK_REL || lookahead->kind == CCL_TOK_EQ)
195 return qualifiers (lookahead);
196 return search_terms ();
199 static struct ccl_rpn_node *find_spec (void)
201 struct ccl_rpn_node *p1, *p2, *pn;
202 if (!(p1 = search_elements ()))
210 p2 = search_elements ();
223 p2 = search_elements ();
236 p2 = search_elements ();
253 struct ccl_rpn_node *ccl_find (struct ccl_token *list,
254 int *error, const char **pos)
256 struct ccl_rpn_node *p;
260 if (p && KIND != CCL_TOK_EOL)
262 if (KIND == CCL_TOK_RP)
263 ccl_error = CCL_ERR_BAD_RP;
265 ccl_error = CCL_ERR_OP_EXPECTED;
269 *pos = look_token->name;
277 static void pr_tree (struct ccl_rpn_node *rpn)
282 printf ("\"%s\"", rpn->u.t.term);
286 pr_tree (rpn->u.p[0]);
288 pr_tree (rpn->u.p[1]);
293 pr_tree (rpn->u.p[0]);
295 pr_tree (rpn->u.p[1]);
300 pr_tree (rpn->u.p[0]);
302 pr_tree (rpn->u.p[1]);
306 printf ("set=%s", rpn->u.setname);
310 pr_tree (rpn->u.p[0]);
312 pr_tree (rpn->u.p[1]);
320 void ccl_find_str (const char *str, int *error, int *pos)
322 struct ccl_token *list, *li;
323 struct ccl_rpn_node *rpn;
324 const char *char_pos;
326 list = ccl_tokenize (str);
328 for (li = list; li; li = li->next)
329 printf ("kind=%d, str='%.*s'\n", li->kind, li->len, li->name);
331 rpn = ccl_find (list, error, &char_pos);
339 *pos = char_pos - str;