/* CCL find (to rpn conversion)
* Europagate, 1995
*
- * $Id: cclfind.c,v 1.30 2002-05-17 08:46:01 adam Exp $
+ * $Id: cclfind.c,v 1.33 2003-02-14 18:49:22 adam Exp $
*
* Old Europagate log:
*
*/
static char *copy_token_name (struct ccl_token *tp)
{
- char *str = (char *)malloc (tp->len + 1);
+ char *str = (char *)xmalloc (tp->len + 1);
ccl_assert (str);
memcpy (str, tp->name, tp->len);
str[tp->len] = '\0';
static struct ccl_rpn_node *mk_node (int kind)
{
struct ccl_rpn_node *p;
- p = (struct ccl_rpn_node *)malloc (sizeof(*p));
+ p = (struct ccl_rpn_node *)xmalloc (sizeof(*p));
ccl_assert (p);
p->kind = kind;
return p;
ccl_rpn_delete (rpn->u.p[1]);
break;
case CCL_RPN_TERM:
- free (rpn->u.t.term);
+ xfree (rpn->u.t.term);
for (attr = rpn->u.t.attr_list; attr; attr = attr1)
{
attr1 = attr->next;
if (attr->set)
- free (attr->set);
- free (attr);
+ xfree (attr->set);
+ xfree (attr);
}
break;
case CCL_RPN_SET:
- free (rpn->u.setname);
+ xfree (rpn->u.setname);
break;
case CCL_RPN_PROX:
ccl_rpn_delete (rpn->u.p[0]);
ccl_rpn_delete (rpn->u.p[1]);
break;
}
- free (rpn);
+ xfree (rpn);
}
static struct ccl_rpn_node *find_spec (CCL_parser cclp,
{
struct ccl_rpn_attr *n;
- n = (struct ccl_rpn_attr *)malloc (sizeof(*n));
+ n = (struct ccl_rpn_attr *)xmalloc (sizeof(*n));
ccl_assert (n);
if (set)
{
- n->set = (char*) malloc (strlen(set)+1);
+ n->set = (char*) xmalloc (strlen(set)+1);
strcpy (n->set, set);
}
else
}
/* make the RPN token */
- p->u.t.term = (char *)malloc (len);
+ p->u.t.term = (char *)xmalloc (len);
ccl_assert (p->u.t.term);
p->u.t.term[0] = '\0';
for (i = 0; i<no; i++)
if (qa)
for (i=0; qa[i]; i++)
no++;
- ap = (struct ccl_rpn_attr **)malloc ((no ? (no+1) : 2) * sizeof(*ap));
+ ap = (struct ccl_rpn_attr **)xmalloc ((no ? (no+1) : 2) * sizeof(*ap));
ccl_assert (ap);
field_str = ccl_qual_search_special(cclp->bibset, "field");
if (!node_sub)
{
ccl_rpn_delete (node);
- free (ap);
+ xfree (ap);
return 0;
}
if (node)
{
cclp->look_token = lookahead;
cclp->error_code = CCL_ERR_UNKNOWN_QUAL;
- free (ap);
+ xfree (ap);
return NULL;
}
lookahead = lookahead->next;
{
cclp->look_token = lookahead;
cclp->error_code = CCL_ERR_UNKNOWN_QUAL;
- free (ap);
+ xfree (ap);
return NULL;
}
lookahead = lookahead->next;
seq++;
}
}
- free (ap);
+ xfree (ap);
return node;
}
{
if (KIND == CCL_TOK_PROX)
{
+ struct ccl_rpn_node *p_prox = 0;
+ /* ! word order specified */
+ /* % word order not specified */
+ p_prox = mk_node(CCL_RPN_TERM);
+ p_prox->u.t.term = (char *) xmalloc(cclp->look_token->len);
+ memcpy(p_prox->u.t.term, cclp->look_token->name,
+ cclp->look_token->len);
+ p_prox->u.t.term[cclp->look_token->len] = 0;
+ p_prox->u.t.attr_list = 0;
+
ADVANCE;
p2 = search_term_x (cclp, qa, list, 1);
if (!p2)
pn = mk_node (CCL_RPN_PROX);
pn->u.p[0] = p1;
pn->u.p[1] = p2;
+ pn->u.p[2] = p_prox;
p1 = pn;
}
else if (is_term_ok(KIND, list))
pn = mk_node (CCL_RPN_PROX);
pn->u.p[0] = p1;
pn->u.p[1] = p2;
+ pn->u.p[2] = 0;
p1 = pn;
}
else
struct ccl_rpn_node *node_this = mk_node(CCL_RPN_OR);
node_this->u.p[0] = node;
node_this->u.p[1] = node_sub;
+ node_this->u.p[2] = 0;
node = node_this;
}
else
pn = mk_node (CCL_RPN_AND);
pn->u.p[0] = p1;
pn->u.p[1] = p2;
+ pn->u.p[2] = 0;
p1 = pn;
continue;
case CCL_TOK_OR:
pn = mk_node (CCL_RPN_OR);
pn->u.p[0] = p1;
pn->u.p[1] = p2;
+ pn->u.p[2] = 0;
p1 = pn;
continue;
case CCL_TOK_NOT:
pn = mk_node (CCL_RPN_NOT);
pn->u.p[0] = p1;
pn->u.p[1] = p2;
+ pn->u.p[2] = 0;
p1 = pn;
continue;
}