+ )
+ {
+ if (!is_phrase)
+ ccl_add_attr_numeric(p, attset, CCL_BIB1_STR, 2);
+ else
+ ccl_add_attr_numeric(p, attset, CCL_BIB1_STR, 1);
+ }
+ if (qual_val_type(qa, CCL_BIB1_TRU, CCL_BIB1_TRU_CAN_REGEX,
+ &attset))
+ {
+ if (is_ccl_masked)
+ regex_trunc = 1; /* regex trunc (102) allowed */
+ }
+ else if (qual_val_type(qa, CCL_BIB1_TRU, CCL_BIB1_TRU_CAN_Z3958,
+ &attset))
+ {
+ if (is_ccl_masked)
+ z3958_trunc = 1; /* Z39.58 trunc (CCL) trunc allowed */
+ }
+ /* make the RPN token */
+ p->u.t.term = (char *)xmalloc(term_len * 2 + 2);
+ ccl_assert(p->u.t.term);
+ p->u.t.term[0] = '\0';
+
+ for (i = 0; i < no; i++)
+ {
+ const char *src_str = lookahead->name;
+ size_t src_len = lookahead->len;
+
+ if (p->u.t.term[0] && lookahead->ws_prefix_len)
+ {
+ strxcat(p->u.t.term, lookahead->ws_prefix_buf,
+ lookahead->ws_prefix_len);
+ }
+ if (append_term(cclp, src_str, src_len, p->u.t.term, regex_trunc,
+ z3958_trunc, truncation_aliases, mask_aliases,
+ i == 0, i == no - 1,
+ &left_trunc, &right_trunc))
+ {
+ ccl_rpn_delete(p);
+ return NULL;
+ }
+ lookahead = lookahead->next;
+ }
+ if (left_trunc && right_trunc)
+ {
+ if (!qual_val_type(qa, CCL_BIB1_TRU, CCL_BIB1_TRU_CAN_BOTH,
+ &attset))
+ {
+ cclp->error_code = CCL_ERR_TRUNC_NOT_BOTH;
+ ccl_rpn_delete(p);
+ return NULL;
+ }
+ ccl_add_attr_numeric(p, attset, CCL_BIB1_TRU, 3);
+ }
+ else if (right_trunc)
+ {
+ if (!qual_val_type(qa, CCL_BIB1_TRU, CCL_BIB1_TRU_CAN_RIGHT,
+ &attset))
+ {
+ cclp->error_code = CCL_ERR_TRUNC_NOT_RIGHT;
+ ccl_rpn_delete(p);
+ return NULL;
+ }
+ ccl_add_attr_numeric(p, attset, CCL_BIB1_TRU, 1);
+ }
+ else if (left_trunc)
+ {
+ if (!qual_val_type(qa, CCL_BIB1_TRU, CCL_BIB1_TRU_CAN_LEFT,
+ &attset))
+ {
+ cclp->error_code = CCL_ERR_TRUNC_NOT_LEFT;
+ ccl_rpn_delete(p);
+ return NULL;
+ }
+ ccl_add_attr_numeric(p, attset, CCL_BIB1_TRU, 2);
+ }
+ else if (regex_trunc)
+ {
+ ccl_add_attr_numeric(p, attset, CCL_BIB1_TRU, 102);
+ }
+ else if (z3958_trunc)
+ {
+ ccl_add_attr_numeric(p, attset, CCL_BIB1_TRU, 104);
+ }
+ else
+ {
+ if (qual_val_type(qa, CCL_BIB1_TRU, CCL_BIB1_TRU_CAN_NONE,
+ &attset))
+ ccl_add_attr_numeric(p, attset, CCL_BIB1_TRU, 100);
+ }
+ return p;
+}
+
+static struct ccl_rpn_node *split_recur(CCL_parser cclp, ccl_qualifier_t *qa,
+ struct ccl_rpn_node *parent,
+ struct ccl_token **ar, size_t sz)
+{
+ size_t l;
+ struct ccl_rpn_node *p_top = 0;
+ assert(sz > 0);
+ for (l = 1; l <= sz; l++)
+ {
+ struct ccl_rpn_node *p1;
+ struct ccl_rpn_node *p2 = ccl_term_one_use(cclp, ar[0],
+ /* attr_use */0,
+ qa, l,
+ l > 1,
+ /* auto_group */0);
+ if (!p2)
+ return 0;
+ if (parent)
+ {
+ struct ccl_rpn_node *tmp = ccl_rpn_node_create(CCL_RPN_AND);
+ tmp->u.p[0] = l > 1 ? ccl_rpn_dup(parent) : parent;
+ tmp->u.p[1] = p2;
+ p2 = tmp;