- case 'u':
- case 'U':
- type = CCL_BIB1_USE;
- break;
- case 'r':
- case 'R':
- type = CCL_BIB1_REL;
- if (!ccl_stricmp (qual_value, "o"))
- value = CCL_BIB1_REL_ORDER;
- break;
- case 'p':
- case 'P':
- type = CCL_BIB1_POS;
- break;
- case 's':
- case 'S':
- type = CCL_BIB1_STR;
- if (!ccl_stricmp (qual_value, "pw"))
- value = CCL_BIB1_STR_WP;
- if (!ccl_stricmp (qual_value, "al"))
- value = CCL_BIB1_STR_AND_LIST;
- if (!ccl_stricmp (qual_value, "ol"))
- value = CCL_BIB1_STR_OR_LIST;
- break;
- case 't':
- case 'T':
- type = CCL_BIB1_TRU;
- if (!ccl_stricmp (qual_value, "l"))
- value = CCL_BIB1_TRU_CAN_LEFT;
- else if (!ccl_stricmp (qual_value, "r"))
- value = CCL_BIB1_TRU_CAN_RIGHT;
- else if (!ccl_stricmp (qual_value, "b"))
- value = CCL_BIB1_TRU_CAN_BOTH;
- else if (!ccl_stricmp (qual_value, "n"))
- value = CCL_BIB1_TRU_CAN_NONE;
- break;
- case 'c':
- case 'C':
- type = CCL_BIB1_COM;
- break;
- default:
- type = atoi (qual_type);
+ if (i < sizeof(qlist)/sizeof(*qlist)-1)
+ qlist[i++] = xstrdup(yaz_tok_parse_string(tp));
+ }
+ qlist[i] = 0;
+ yaz_tok_parse_destroy(tp);
+ ccl_qual_add_combi (bibset, qual_name, (const char **) qlist);
+ for (i = 0; qlist[i]; i++)
+ xfree(qlist[i]);
+ return 0;
+ }
+ while (1) /* comma separated attribute value list */
+ {
+ t = yaz_tok_move(tp);
+ /* must have a value now */
+ if (t != YAZ_TOK_STRING)
+ {
+ *addinfo = "value token expected";
+ goto out;
+ }
+ value_str = yaz_tok_parse_string(tp);
+
+ if (sscanf(type_str, "%d", &type) == 1)
+ ;
+ else if (strlen(type_str) != 1)
+ {
+ *addinfo = "bad attribute type";
+ goto out;
+ }
+ else
+ {
+ switch (*type_str)
+ {
+ case 'u':
+ case 'U':
+ type = CCL_BIB1_USE;
+ break;
+ case 'r':
+ case 'R':
+ type = CCL_BIB1_REL;
+ if (!ccl_stricmp (value_str, "o"))
+ value = CCL_BIB1_REL_ORDER;
+ else if (!ccl_stricmp (value_str, "r"))
+ value = CCL_BIB1_REL_PORDER;
+ break;
+ case 'p':
+ case 'P':
+ type = CCL_BIB1_POS;
+ break;
+ case 's':
+ case 'S':
+ type = CCL_BIB1_STR;
+ if (!ccl_stricmp (value_str, "pw"))
+ value = CCL_BIB1_STR_WP;
+ if (!ccl_stricmp (value_str, "al"))
+ value = CCL_BIB1_STR_AND_LIST;
+ if (!ccl_stricmp (value_str, "ol"))
+ value = CCL_BIB1_STR_OR_LIST;
+ break;
+ case 't':
+ case 'T':
+ type = CCL_BIB1_TRU;
+ if (!ccl_stricmp (value_str, "l"))
+ value = CCL_BIB1_TRU_CAN_LEFT;
+ else if (!ccl_stricmp (value_str, "r"))
+ value = CCL_BIB1_TRU_CAN_RIGHT;
+ else if (!ccl_stricmp (value_str, "b"))
+ value = CCL_BIB1_TRU_CAN_BOTH;
+ else if (!ccl_stricmp (value_str, "n"))
+ value = CCL_BIB1_TRU_CAN_NONE;
+ break;
+ case 'c':
+ case 'C':
+ type = CCL_BIB1_COM;
+ break;
+ }
+ }
+ if (type == 0)
+ {
+ /* type was not set in switch above */
+ *addinfo = "bad attribute type";
+ goto out;