char **attset)
{
int i;
-
if (!qa)
return 0;
for (i = 0; qa[i]; i++)
{
+ int got_type = 0;
struct ccl_rpn_attr *q = ccl_qual_get_attr(qa[i]);
- while (q)
+ for (; q; q = q->next)
{
- if (q->type == type && q->kind == CCL_RPN_ATTR_NUMERIC &&
- q->value.numeric == value)
+ if (q->type == type && q->kind == CCL_RPN_ATTR_NUMERIC)
{
- if (attset)
- *attset = q->set;
- return 1;
+ got_type = 1;
+ if (q->value.numeric == value)
+ {
+ if (attset)
+ *attset = q->set;
+ return 1;
+ }
}
- q = q->next;
}
+ if (got_type)
+ return 0;
}
return 0;
}
n->value.numeric = value;
}
+void ccl_set_attr_numeric(struct ccl_rpn_node *p, const char *set,
+ int type, int value)
+{
+ struct ccl_rpn_attr *n;
+ for (n = p->u.t.attr_list; n; n = n->next)
+ if (n->type == type)
+ {
+ xfree(n->set);
+ n->set = set ? xstrdup(set) : 0;
+ if (n->kind == CCL_RPN_ATTR_STRING)
+ xfree(n->value.str);
+ n->kind = CCL_RPN_ATTR_NUMERIC;
+ n->value.numeric = value;
+ return;
+ }
+ ccl_add_attr_numeric(p, set, type, value);
+}
+
void ccl_add_attr_string(struct ccl_rpn_node *p, const char *set,
int type, char *value)
{
{
struct ccl_rpn_node *p;
size_t i;
- int relation_value = -1;
- int position_value = -1;
int structure_value = -1;
- int truncation_value = -1;
- int completeness_value = -1;
int left_trunc = 0;
int right_trunc = 0;
{
struct ccl_rpn_attr *attr;
for (attr = ccl_qual_get_attr(qa[i]); attr; attr = attr->next)
- if (attr->type != 1 || !attr_use || attr == attr_use)
+ if (attr->type == 1 && attr_use && attr != attr_use)
+ continue;
+ else
{
switch (attr->kind)
{
{ /* deal only with REAL attributes (positive) */
switch (attr->type)
{
- case CCL_BIB1_REL:
- if (relation_value != -1)
- continue;
- relation_value = attr->value.numeric;
- break;
- case CCL_BIB1_POS:
- if (position_value != -1)
- continue;
- position_value = attr->value.numeric;
- break;
case CCL_BIB1_STR:
if (structure_value != -1)
continue;
structure_value = attr->value.numeric;
break;
- case CCL_BIB1_TRU:
- if (truncation_value != -1)
- continue;
- truncation_value = attr->value.numeric;
- break;
- case CCL_BIB1_COM:
- if (completeness_value != -1)
- continue;
- completeness_value = attr->value.numeric;
- break;
}
ccl_add_attr_numeric(p, attr->set, attr->type,
attr->value.numeric);
}
p = ccl_rpn_node_create(CCL_RPN_AND);
p->u.p[0] = p1;
- ccl_add_attr_numeric(p1, attset, CCL_BIB1_REL, 4);
+ ccl_set_attr_numeric(p1, attset, CCL_BIB1_REL, 4);
p->u.p[1] = p2;
- ccl_add_attr_numeric(p2, attset, CCL_BIB1_REL, 2);
+ ccl_set_attr_numeric(p2, attset, CCL_BIB1_REL, 2);
return p;
}
else /* = term - */
{
- ccl_add_attr_numeric(p1, attset, CCL_BIB1_REL, 4);
+ ccl_set_attr_numeric(p1, attset, CCL_BIB1_REL, 4);
return p1;
}
}
ADVANCE;
if (!(p = search_term(cclp, ap)))
return NULL;
- ccl_add_attr_numeric(p, attset, CCL_BIB1_REL, 2);
+ ccl_set_attr_numeric(p, attset, CCL_BIB1_REL, 2);
return p;
}
else
return NULL;
if (rel != 3 ||
!qual_val_type(ap, CCL_BIB1_REL, CCL_BIB1_REL_OMIT_EQUALS, 0))
- ccl_add_attr_numeric(p, attset, CCL_BIB1_REL, rel);
+ ccl_set_attr_numeric(p, attset, CCL_BIB1_REL, rel);
return p;
}
return NULL;