+ if (regex_trunc && strchr(REGEX_CHARS, src_str[j]))
+ strcat(dst_term, "\\");
+ else if (z3958_trunc && strchr(CCL_CHARS, src_str[j]))
+ strcat(dst_term, "\\");
+ strxcat(dst_term, src_str + j, 1);
+ }
+ }
+ return 0;
+}
+
+
+static struct ccl_rpn_node *ccl_term_one_use(CCL_parser cclp,
+ struct ccl_rpn_attr *attr_use,
+ ccl_qualifier_t *qa,
+ size_t no, int term_len,
+ const char **truncation_aliases,
+ const char **mask_aliases,
+ int is_phrase,
+ int is_ccl_masked,
+ int auto_group)
+{
+ 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;
+ int regex_trunc = 0;
+ int z3958_trunc = 0;
+ char *attset;
+ struct ccl_token *lookahead = cclp->look_token;
+
+ p = ccl_rpn_node_create(CCL_RPN_TERM);
+ p->u.t.attr_list = NULL;
+ p->u.t.term = NULL;
+ if (qa && qa[0])
+ {
+ const char *n = ccl_qual_get_name(qa[0]);
+ if (n)
+ p->u.t.qual = xstrdup(n);
+ }
+ /* go through all attributes and add them to the attribute list */
+ for (i = 0; qa && qa[i]; i++)
+ {
+ struct ccl_rpn_attr *attr;
+ for (attr = ccl_qual_get_attr(qa[i]); attr; attr = attr->next)
+ if (attr->type != 1 || attr == attr_use)
+ {
+ switch (attr->kind)