X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=data1%2Fd1_doespec.c;h=f321bac279079348c5d7cce715037123600a797c;hp=3623336c1c07d03ab5fc1b1ee0ccba15e990cf85;hb=250de4ed23a44f5eb3552db317eef0d0fbe3265c;hpb=89d3a004b7c651fd5673abfc192e1472dc4d4197 diff --git a/data1/d1_doespec.c b/data1/d1_doespec.c index 3623336..f321bac 100644 --- a/data1/d1_doespec.c +++ b/data1/d1_doespec.c @@ -1,8 +1,5 @@ -/* $Id: d1_doespec.c,v 1.12 2007-01-15 15:10:14 adam Exp $ - Copyright (C) 1995-2007 - Index Data ApS - -This file is part of the Zebra server. +/* This file is part of the Zebra server. + Copyright (C) 2004-2013 Index Data Zebra is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -20,12 +17,20 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +/** \file d1_doespec.c + * \brief handle Z39.50 variant-1 specs + * + * See http://www.loc.gov/z3950/agency/defns/variant1.html + */ +#if HAVE_CONFIG_H +#include +#endif #include #include #include -#include #include +#include #include static int match_children(data1_handle dh, data1_node *n, @@ -45,23 +50,18 @@ static int match_children_wildpath(data1_handle dh, data1_node *n, * set is the set to look for, universal set is the set that applies to a * triple with an unknown set. */ -static Z_Triple *find_triple(Z_Variant *var, oid_value universalset, - oid_value set, int zclass, int type) +static Z_Triple *find_triple(Z_Variant *var, const Odr_oid *universal_oid, + const Odr_oid *var_oid, int zclass, int type) { int i; - oident *defaultsetent = oid_getentbyoid(var->globalVariantSetId); - oid_value defaultset = defaultsetent ? defaultsetent->value : - universalset; for (i = 0; i < var->num_triples; i++) { - oident *cursetent = - oid_getentbyoid(var->triples[i]->variantSetId); - oid_value curset = cursetent ? cursetent->value : defaultset; - - if (set == curset && - *var->triples[i]->zclass == zclass && - *var->triples[i]->type == type) + const Odr_oid *cur_oid = var->triples[i]->variantSetId; + if (!cur_oid) + cur_oid = var->globalVariantSetId; + if (cur_oid && var_oid + && !oid_oidcmp(var_oid, cur_oid) && *var->triples[i]->type == type) return var->triples[i]; } return 0; @@ -106,9 +106,9 @@ static void mark_subtree(data1_node *n, int make_variantlist, int no_data, } -static void match_triple (data1_handle dh, Z_Variant *vreq, - oid_value defsetval, - oid_value var1, data1_node *n) +static void match_triple(data1_handle dh, Z_Variant *vreq, + const Odr_oid *def_oid, + const Odr_oid *var_oid, data1_node *n) { data1_node **c; @@ -121,13 +121,13 @@ static void match_triple (data1_handle dh, Z_Variant *vreq, { int remove_flag = 0; Z_Triple *r; - + assert ((*c)->which == DATA1N_variant); - + if ((*c)->u.variant.type->zclass->zclass == 4 && (*c)->u.variant.type->type == 1) { - if ((r = find_triple(vreq, defsetval, var1, 4, 1)) && + if ((r = find_triple(vreq, def_oid, var_oid, 4, 1)) && (r->which == Z_Triple_internationalString)) { const char *string_value = @@ -142,7 +142,7 @@ static void match_triple (data1_handle dh, Z_Variant *vreq, } else { - match_triple (dh, vreq, defsetval, var1, *c); + match_triple(dh, vreq, def_oid, var_oid, *c); c = &(*c)->next; } } @@ -160,7 +160,7 @@ static int match_node_and_attr (data1_node *c, const char *spec) data1_tag *tag = 0; if (c->u.tag.element) tag = c->u.tag.element->tag; - + *predicate = '\0'; sscanf(spec, "%63[^[]%c%63[^]]", elem, &dummy_ch, predicate); if (data1_matchstr(elem, tag ? tag->value.string : c->u.tag.tag)) @@ -190,7 +190,7 @@ static int match_node_and_attr (data1_node *c, const char *spec) } return 0; } - + static int match_children_here (data1_handle dh, data1_node *n, Z_Espec1 *e, int i, Z_ETagUnit **t, int num, @@ -237,7 +237,7 @@ static int match_children_here (data1_handle dh, data1_node *n, #if 1 if (!match_node_and_attr(c, str_val)) continue; -#else +#else if (data1_matchstr(str_val, tag ? tag->value.string : c->u.tag.tag)) continue; @@ -282,10 +282,8 @@ static int match_children_here (data1_handle dh, data1_node *n, Z_Variant *vreq = e->elements[i]->u.simpleElement->variantRequest; - oident *defset = oid_getentbyoid(e->defaultVariantSetId); - oid_value defsetval = defset ? defset->value : VAL_NONE; - oid_value var1 = oid_getvalbyname("Variant-1"); + const Odr_oid *var_oid = yaz_oid_varset_variant_1; if (!vreq) vreq = e->defaultVariantRequest; @@ -296,21 +294,25 @@ static int match_children_here (data1_handle dh, data1_node *n, /* * 6,5: meta-data requested, variant list. */ - if (find_triple(vreq, defsetval, var1, 6, 5)) + if (find_triple(vreq, e->defaultVariantSetId, + var_oid, 6, 5)) show_variantlist = 1; /* * 9,1: Miscellaneous, no data requested. */ - if (find_triple(vreq, defsetval, var1, 9, 1)) + if (find_triple(vreq, e->defaultVariantSetId, + var_oid, 9, 1)) no_data = 1; /* howmuch */ - if ((r = find_triple(vreq, defsetval, var1, 5, 5))) + if ((r = find_triple(vreq, e->defaultVariantSetId, + var_oid, 5, 5))) if (r->which == Z_Triple_integer) get_bytes = *r->value.integer; if (!show_variantlist) - match_triple (dh, vreq, defsetval, var1, c); + match_triple(dh, vreq, e->defaultVariantSetId, + var_oid, c); } mark_subtree(c, show_variantlist, no_data, get_bytes, vreq, select_flag); @@ -358,7 +360,7 @@ int data1_doespec1 (data1_handle dh, data1_node *n, Z_Espec1 *e) n = data1_get_root_tag (dh, n); if (n && n->which == DATA1N_tag) n->u.tag.node_selected = 1; - + for (i = 0; i < e->num_elements; i++) { if (e->elements[i]->which != Z_ERequest_simpleElement) @@ -373,6 +375,7 @@ int data1_doespec1 (data1_handle dh, data1_node *n, Z_Espec1 *e) /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab