2 * Copyright (c) 1995-2001, Index Data.
3 * See the file LICENSE for details.
5 * $Id: sortspec.c,v 1.2 2001-08-10 12:50:40 adam Exp $
12 #include <yaz/proto.h>
14 #include <yaz/sortspec.h>
16 Z_SortKeySpecList *yaz_sort_spec (ODR out, const char *arg)
20 char sort_string_buf[32], sort_flags[32];
21 Z_SortKeySpecList *sksl = (Z_SortKeySpecList *)
22 odr_malloc (out, sizeof(*sksl));
26 sksl->specs = (Z_SortKeySpec **)odr_malloc (out, sizeof(sksl->specs) * 20);
28 bib1.proto = PROTO_Z3950;
29 bib1.oclass = CLASS_ATTSET;
30 bib1.value = VAL_BIB1;
31 while ((sscanf (arg, "%31s %31s%n", sort_string_buf,
32 sort_flags, &off)) == 2 && off > 1)
35 char *sort_string_sep;
36 char *sort_string = sort_string_buf;
37 Z_SortKeySpec *sks = (Z_SortKeySpec *)odr_malloc (out, sizeof(*sks));
38 Z_SortKey *sk = (Z_SortKey *)odr_malloc (out, sizeof(*sk));
41 sksl->specs[sksl->num_specs++] = sks;
42 sks->sortElement = (Z_SortElement *)
43 odr_malloc (out, sizeof(*sks->sortElement));
44 sks->sortElement->which = Z_SortElement_generic;
45 sks->sortElement->u.generic = sk;
47 if ((sort_string_sep = strchr (sort_string, '=')))
50 sk->which = Z_SortKey_sortAttributes;
51 sk->u.sortAttributes = (Z_SortAttributes *)
52 odr_malloc (out, sizeof(*sk->u.sortAttributes));
53 sk->u.sortAttributes->id = oid_ent_to_oid(&bib1, oid);
54 sk->u.sortAttributes->list = (Z_AttributeList *)
55 odr_malloc (out, sizeof(*sk->u.sortAttributes->list));
56 sk->u.sortAttributes->list->attributes = (Z_AttributeElement **)
58 sizeof(*sk->u.sortAttributes->list->attributes));
59 while (i < 10 && sort_string && sort_string_sep)
61 Z_AttributeElement *el = (Z_AttributeElement *)
62 odr_malloc (out, sizeof(*el));
63 sk->u.sortAttributes->list->attributes[i] = el;
65 el->attributeType = odr_intdup (out, atoi (sort_string));
66 el->which = Z_AttributeValue_numeric;
68 odr_intdup (out, atoi (sort_string_sep + 1));
70 sort_string = strchr(sort_string, ',');
74 sort_string_sep = strchr (sort_string, '=');
77 sk->u.sortAttributes->list->num_attributes = i;
81 sk->which = Z_SortKey_sortField;
82 sk->u.sortField = odr_strdup (out, sort_string);
84 sks->sortRelation = odr_intdup (out, Z_SortRelation_ascending);
85 sks->caseSensitivity = odr_intdup (out, Z_SortCase_caseSensitive);
88 sks->which = Z_SortKeySpec_null;
89 sks->u.null = odr_nullval ();
91 sks->missingValueAction = NULL;
94 for (i = 0; sort_flags[i]; i++)
96 switch (sort_flags[i])
101 *sks->sortRelation = Z_SortRelation_descending;
106 *sks->sortRelation = Z_SortRelation_ascending;
110 *sks->caseSensitivity = Z_SortCase_caseInsensitive;
114 *sks->caseSensitivity = Z_SortCase_caseSensitive;
119 if (!sksl->num_specs)