2 * Copyright (c) 1995-2001, Index Data.
3 * See the file LICENSE for details.
5 * $Id: sortspec.c,v 1.1 2003-10-27 12:21:35 adam Exp $
12 #include <yaz/proto.h>
14 #include <yaz/sortspec.h>
16 Z_SortKeySpecList *yaz_sort_spec (ODR out, const char *arg)
18 char sort_string_buf[32], sort_flags[32];
19 Z_SortKeySpecList *sksl = (Z_SortKeySpecList *)
20 odr_malloc (out, sizeof(*sksl));
24 sksl->specs = (Z_SortKeySpec **)odr_malloc (out, sizeof(sksl->specs) * 20);
26 while ((sscanf (arg, "%31s %31s%n", sort_string_buf,
27 sort_flags, &off)) == 2 && off > 1)
30 char *sort_string_sep;
31 char *sort_string = sort_string_buf;
32 Z_SortKeySpec *sks = (Z_SortKeySpec *)odr_malloc (out, sizeof(*sks));
33 Z_SortKey *sk = (Z_SortKey *)odr_malloc (out, sizeof(*sk));
36 sksl->specs[sksl->num_specs++] = sks;
37 sks->sortElement = (Z_SortElement *)
38 odr_malloc (out, sizeof(*sks->sortElement));
39 sks->sortElement->which = Z_SortElement_generic;
40 sks->sortElement->u.generic = sk;
42 if ((sort_string_sep = strchr (sort_string, '=')))
45 sk->which = Z_SortKey_sortAttributes;
46 sk->u.sortAttributes = (Z_SortAttributes *)
47 odr_malloc (out, sizeof(*sk->u.sortAttributes));
48 sk->u.sortAttributes->id =
49 yaz_oidval_to_z3950oid(out, CLASS_ATTSET, VAL_BIB1);
50 sk->u.sortAttributes->list = (Z_AttributeList *)
51 odr_malloc (out, sizeof(*sk->u.sortAttributes->list));
52 sk->u.sortAttributes->list->attributes = (Z_AttributeElement **)
54 sizeof(*sk->u.sortAttributes->list->attributes));
55 while (i < 10 && sort_string && sort_string_sep)
57 Z_AttributeElement *el = (Z_AttributeElement *)
58 odr_malloc (out, sizeof(*el));
59 sk->u.sortAttributes->list->attributes[i] = el;
61 el->attributeType = odr_intdup (out, atoi (sort_string));
62 el->which = Z_AttributeValue_numeric;
64 odr_intdup (out, atoi (sort_string_sep + 1));
66 sort_string = strchr(sort_string, ',');
70 sort_string_sep = strchr (sort_string, '=');
73 sk->u.sortAttributes->list->num_attributes = i;
77 sk->which = Z_SortKey_sortField;
78 sk->u.sortField = odr_strdup (out, sort_string);
80 sks->sortRelation = odr_intdup (out, Z_SortRelation_ascending);
81 sks->caseSensitivity = odr_intdup (out, Z_SortCase_caseSensitive);
83 sks->which = Z_SortKeySpec_null;
84 sks->u.null = odr_nullval ();
86 for (i = 0; sort_flags[i]; i++)
88 switch (sort_flags[i])
93 *sks->sortRelation = Z_SortRelation_descending;
98 *sks->sortRelation = Z_SortRelation_ascending;
102 *sks->caseSensitivity = Z_SortCase_caseInsensitive;
106 *sks->caseSensitivity = Z_SortCase_caseSensitive;
111 if (!sksl->num_specs)