+ while (*parms)
+ {
+ char parm[256];
+ char *pp;
+ const char *cpp;
+ int increasing = 0;
+ int i;
+ int offset = 0;
+ enum conf_sortkey_type type = Metadata_sortkey_string;
+ struct reclist_sortparms *new;
+
+ if (!(cpp = strchr(parms, ',')))
+ cpp = parms + strlen(parms);
+ strncpy(parm, parms, cpp - parms);
+ parm[cpp-parms] = '\0';
+
+ if ((pp = strchr(parm, ':')))
+ {
+ if (pp[1] == '1')
+ increasing = 1;
+ else if (pp[1] == '0')
+ increasing = 0;
+ else
+ {
+ yaz_log(YLOG_FATAL, "Bad sortkey modifier: %s", parm);
+ return 0;
+ }
+
+ if (pp[2])
+ {
+ if (pp[2] == 'p')
+ type = Metadata_sortkey_position;
+ else
+ yaz_log(YLOG_FATAL, "Bad sortkey modifier: %s", parm);
+ }
+ *pp = '\0';
+ }
+ if (type != Metadata_sortkey_position)
+ {
+ if (!strcmp(parm, "relevance"))
+ {
+ type = Metadata_sortkey_relevance;
+ }
+ else if (!strcmp(parm, "position"))
+ {
+ type = Metadata_sortkey_position;
+ }
+ else
+ {
+ for (i = 0; i < service->num_sortkeys; i++)
+ {
+ struct conf_sortkey *sk = &service->sortkeys[i];
+ if (!strcmp(sk->name, parm))
+ {
+ type = sk->type;
+ if (type == Metadata_sortkey_skiparticle)
+ type = Metadata_sortkey_string;
+ break;
+ }
+ }
+ if (i >= service->num_sortkeys)
+ {
+ yaz_log(YLOG_FATAL, "Sortkey not defined in service: %s",
+ parm);
+ return 0;
+ }
+ offset = i;
+ }
+ }
+ new = *rp = nmem_malloc(nmem, sizeof(struct reclist_sortparms));
+ new->next = 0;
+ new->offset = offset;
+ new->type = type;
+ new->increasing = increasing;
+ new->name = nmem_strdup(nmem, parm);
+ rp = &new->next;
+ if (*(parms = cpp))
+ parms++;
+ }
+ return res;