-/*
- * Copyright (C) 1995-2005, Index Data ApS
+/* This file is part of the YAZ toolkit.
+ * Copyright (C) 1995-2010 Index Data
* See the file LICENSE for details.
- *
- * $Id: sortspec.c,v 1.4 2005-01-15 19:47:14 adam Exp $
*/
/**
* \file sortspec.c
#include <stdlib.h>
#include <yaz/proto.h>
-#include <yaz/oid.h>
#include <yaz/sortspec.h>
+#include <yaz/oid_db.h>
Z_SortKeySpecList *yaz_sort_spec (ODR out, const char *arg)
{
- char sort_string_buf[32], sort_flags[32];
+ char sort_string_buf[64], sort_flags[64];
Z_SortKeySpecList *sksl = (Z_SortKeySpecList *)
odr_malloc (out, sizeof(*sksl));
int off;
sksl->num_specs = 0;
sksl->specs = (Z_SortKeySpec **)odr_malloc (out, sizeof(sksl->specs) * 20);
- while ((sscanf (arg, "%31s %31s%n", sort_string_buf,
- sort_flags, &off)) == 2 && off > 1)
+ while ((sscanf (arg, "%63s %63s%n", sort_string_buf,
+ sort_flags, &off)) == 2 && off > 1)
{
int i;
char *sort_string_sep;
- char *sort_string = sort_string_buf;
+ char *sort_string = sort_string_buf;
Z_SortKeySpec *sks = (Z_SortKeySpec *)odr_malloc (out, sizeof(*sks));
Z_SortKey *sk = (Z_SortKey *)odr_malloc (out, sizeof(*sk));
-
+
arg += off;
sksl->specs[sksl->num_specs++] = sks;
sks->sortElement = (Z_SortElement *)
- odr_malloc (out, sizeof(*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, '=')))
{
- int i = 0;
+ int i = 0;
sk->which = Z_SortKey_sortAttributes;
sk->u.sortAttributes = (Z_SortAttributes *)
- odr_malloc (out, sizeof(*sk->u.sortAttributes));
- sk->u.sortAttributes->id =
- yaz_oidval_to_z3950oid(out, CLASS_ATTSET, VAL_BIB1);
+ odr_malloc (out, sizeof(*sk->u.sortAttributes));
+ sk->u.sortAttributes->id = odr_oiddup(out, yaz_oid_attset_bib_1);
sk->u.sortAttributes->list = (Z_AttributeList *)
- odr_malloc (out, sizeof(*sk->u.sortAttributes->list));
+ odr_malloc (out, sizeof(*sk->u.sortAttributes->list));
sk->u.sortAttributes->list->attributes = (Z_AttributeElement **)
- odr_malloc (out, 10 *
- sizeof(*sk->u.sortAttributes->list->attributes));
- while (i < 10 && sort_string && sort_string_sep)
- {
- Z_AttributeElement *el = (Z_AttributeElement *)
- odr_malloc (out, sizeof(*el));
- sk->u.sortAttributes->list->attributes[i] = el;
- el->attributeSet = 0;
- el->attributeType = odr_intdup (out, atoi (sort_string));
- el->which = Z_AttributeValue_numeric;
- el->value.numeric =
- odr_intdup (out, atoi (sort_string_sep + 1));
- i++;
- sort_string = strchr(sort_string, ',');
- if (sort_string)
- {
- sort_string++;
- sort_string_sep = strchr (sort_string, '=');
- }
- }
+ odr_malloc (out, 10 *
+ sizeof(*sk->u.sortAttributes->list->attributes));
+ while (i < 10 && sort_string && sort_string_sep)
+ {
+ Z_AttributeElement *el = (Z_AttributeElement *)
+ odr_malloc (out, sizeof(*el));
+ sk->u.sortAttributes->list->attributes[i] = el;
+ el->attributeSet = 0;
+ el->attributeType = odr_intdup (out, atoi (sort_string));
+ el->which = Z_AttributeValue_numeric;
+ el->value.numeric =
+ odr_intdup (out, atoi (sort_string_sep + 1));
+ i++;
+ sort_string = strchr(sort_string, ',');
+ if (sort_string)
+ {
+ sort_string++;
+ sort_string_sep = strchr (sort_string, '=');
+ }
+ }
sk->u.sortAttributes->list->num_attributes = i;
}
else
sks->which = Z_SortKeySpec_null;
sks->u.null = odr_nullval ();
-
+
for (i = 0; sort_flags[i]; i++)
{
switch (sort_flags[i])
case 's':
*sks->caseSensitivity = Z_SortKeySpec_caseSensitive;
break;
+ case '!':
+ sks->which = Z_SortKeySpec_abort;
+ sks->u.abort = odr_nullval();
+ break;
+ case '=':
+ sks->which = Z_SortKeySpec_missingValueData;
+ sks->u.missingValueData = (Odr_oct*)
+ odr_malloc(out, sizeof(Odr_oct));
+ i++;
+ sks->u.missingValueData->len = strlen(sort_flags+i);
+ sks->u.missingValueData->size = sks->u.missingValueData->len;
+ sks->u.missingValueData->buf = (unsigned char*)
+ odr_strdup(out, sort_flags+i);
+ i += strlen(sort_flags+i);
}
}
}
if (!sksl->num_specs)
- return 0;
+ return 0;
return sksl;
}
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+