+int send_sortrequest(char *arg, int newset)
+{
+ Z_APDU *apdu = zget_APDU(out, Z_APDU_sortRequest);
+ Z_SortRequest *req = apdu->u.sortRequest;
+ Z_SortKeySpecList *sksl = odr_malloc (out, sizeof(*sksl));
+ char setstring[32];
+ char sort_string[32], sort_flags[32];
+ int off;
+ int oid[OID_SIZE];
+ oident bib1;
+
+ if (setnumber >= 0)
+ sprintf (setstring, "%d", setnumber);
+ else
+ sprintf (setstring, "default");
+
+ req->inputResultSetNames =
+ odr_malloc (out, sizeof(*req->inputResultSetNames));
+ req->inputResultSetNames->num_strings = 1;
+ req->inputResultSetNames->strings =
+ odr_malloc (out, sizeof(*req->inputResultSetNames->strings));
+ req->inputResultSetNames->strings[0] =
+ odr_malloc (out, strlen(setstring)+1);
+ strcpy (req->inputResultSetNames->strings[0], setstring);
+
+ if (newset && setnumber >= 0)
+ sprintf (setstring, "%d", ++setnumber);
+
+ req->sortedResultSetName = odr_malloc (out, strlen(setstring)+1);
+ strcpy (req->sortedResultSetName, setstring);
+
+ req->sortSequence = sksl;
+ sksl->num_specs = 0;
+ sksl->specs = odr_malloc (out, sizeof(sksl->specs) * 20);
+
+ bib1.proto = protocol;
+ bib1.oclass = CLASS_ATTSET;
+ bib1.value = VAL_BIB1;
+ while ((sscanf (arg, "%31s %31s%n", sort_string, sort_flags, &off)) == 2
+ && off > 1)
+ {
+ int i;
+ char *sort_string_sep;
+ Z_SortKeySpec *sks = odr_malloc (out, sizeof(*sks));
+ Z_SortKey *sk = odr_malloc (out, sizeof(*sk));
+
+ arg += off;
+ sksl->specs[sksl->num_specs++] = sks;
+ sks->sortElement = odr_malloc (out, sizeof(*sks->sortElement));
+ sks->sortElement->which = Z_SortElement_generic;
+ sks->sortElement->u.generic = sk;
+
+ if ((sort_string_sep = strchr (sort_string, '=')))
+ {
+ Z_AttributeElement *el = odr_malloc (out, sizeof(*el));
+ sk->which = Z_SortKey_sortAttributes;
+ sk->u.sortAttributes =
+ odr_malloc (out, sizeof(*sk->u.sortAttributes));
+ sk->u.sortAttributes->id = oid_ent_to_oid(&bib1, oid);
+ sk->u.sortAttributes->list =
+ odr_malloc (out, sizeof(*sk->u.sortAttributes->list));
+ sk->u.sortAttributes->list->num_attributes = 1;
+ sk->u.sortAttributes->list->attributes =
+ odr_malloc (out,
+ sizeof(*sk->u.sortAttributes->list->attributes));
+ sk->u.sortAttributes->list->attributes[0] = el;
+ el->attributeSet = 0;
+ el->attributeType = odr_malloc (out, sizeof(*el->attributeType));
+ *el->attributeType = atoi (sort_string);
+ el->which = Z_AttributeValue_numeric;
+ el->value.numeric = odr_malloc (out, sizeof(*el->value.numeric));
+ *el->value.numeric = atoi (sort_string_sep + 1);
+ }
+ else
+ {
+ sk->which = Z_SortKey_sortField;
+ sk->u.sortField = odr_malloc (out, strlen(sort_string)+1);
+ strcpy (sk->u.sortField, sort_string);
+ }
+ sks->sortRelation = odr_malloc (out, sizeof(*sks->sortRelation));
+ *sks->sortRelation = Z_SortRelation_ascending;
+ sks->caseSensitivity = odr_malloc (out, sizeof(*sks->caseSensitivity));
+ *sks->caseSensitivity = Z_SortCase_caseSensitive;
+
+ sks->missingValueAction = NULL;
+
+ for (i = 0; sort_flags[i]; i++)
+ {
+ switch (sort_flags[i])
+ {
+ case 'a':
+ case 'A':
+ case '>':
+ *sks->sortRelation = Z_SortRelation_ascending;
+ break;
+ case 'd':
+ case 'D':
+ case '<':
+ *sks->sortRelation = Z_SortRelation_descending;
+ break;
+ case 'i':
+ case 'I':
+ *sks->caseSensitivity = Z_SortCase_caseInsensitive;
+ break;
+ case 'S':
+ case 's':
+ *sks->caseSensitivity = Z_SortCase_caseSensitive;
+ break;
+ }
+ }
+ }
+ if (!sksl->num_specs)
+ {
+ printf ("Missing sort specifications\n");
+ return -1;
+ }
+ send_apdu(apdu);
+ return 2;
+}
+