X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=data1%2Fd1_grs.c;h=b09be776818c80d81a60cfe6306beb0c4705720e;hb=f280b4adca76b5b447dae9d6a01ff1f9067c08b9;hp=8343063476958fca77612358f03bc15d1384e13e;hpb=519fefb91135ad52134b9fc4e82b3874f5525a2b;p=idzebra-moved-to-github.git diff --git a/data1/d1_grs.c b/data1/d1_grs.c index 8343063..b09be77 100644 --- a/data1/d1_grs.c +++ b/data1/d1_grs.c @@ -1,11 +1,26 @@ -/* - * Copyright (c) 1995-2002, Index Data. - * See the file LICENSE for details. - * Sebastian Hammer, Adam Dickmeiss - * - * $Id: d1_grs.c,v 1.1 2002-10-22 12:53:33 adam Exp $ - * - */ +/* $Id: d1_grs.c,v 1.3 2003-03-27 21:57:01 adam Exp $ + Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 + Index Data Aps + +This file is part of the Zebra server. + +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 +Software Foundation; either version 2, or (at your option) any later +version. + +Zebra is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with Zebra; see the file LICENSE.zebra. If not, write to the +Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA +02111-1307, USA. +*/ + +/* converts data1 tree to GRS-1 record */ #include #include @@ -16,6 +31,10 @@ #define D1_VARIANTARRAY 20 /* fixed max length on sup'd variant-list. Lazy me */ +static Z_GenericRecord *data1_nodetogr_r(data1_handle dh, data1_node *n, + int select, ODR o, int *len, + data1_tag *wellknown_tag); + static Z_ElementMetaData *get_ElementMetaData(ODR o) { Z_ElementMetaData *r = (Z_ElementMetaData *)odr_malloc(o, sizeof(*r)); @@ -155,7 +174,8 @@ static char *get_data(data1_node *n, int *len) static Z_ElementData *nodetoelementdata(data1_handle dh, data1_node *n, int select, int leaf, - ODR o, int *len) + ODR o, int *len, + data1_tag *wellknown_tag) { Z_ElementData *res = (Z_ElementData *)odr_malloc(o, sizeof(*res)); @@ -205,7 +225,8 @@ static Z_ElementData *nodetoelementdata(data1_handle dh, data1_node *n, else { res->which = Z_ElementData_subtree; - if (!(res->u.subtree = data1_nodetogr (dh, n->parent, select, o, len))) + if (!(res->u.subtree = data1_nodetogr_r (dh, n->parent, select, o, len, + wellknown_tag ))) return 0; } return res; @@ -218,7 +239,7 @@ static int is_empty_data (data1_node *n) { int i = n->u.data.len; - while (i > 0 && strchr("\n ", n->u.data.data[i-1])) + while (i > 0 && d1_isspace(n->u.data.data[i-1])) i--; if (i == 0) return 1; @@ -229,7 +250,8 @@ static int is_empty_data (data1_node *n) static Z_TaggedElement *nodetotaggedelement(data1_handle dh, data1_node *n, int select, ODR o, - int *len) + int *len, + data1_tag *wellknown_tag) { Z_TaggedElement *res = (Z_TaggedElement *)odr_malloc(o, sizeof(*res)); data1_tag *tag = 0; @@ -262,13 +284,9 @@ static Z_TaggedElement *nodetotaggedelement(data1_handle dh, data1_node *n, */ else if (n->which == DATA1N_data || n->which == DATA1N_variant) { - if (n->root->u.root.absyn && - !(tag = data1_gettagbyname (dh, n->root->u.root.absyn->tagset, - "wellKnown"))) - { - yaz_log(LOG_WARN, "Unable to locate tag for 'wellKnown'"); - return 0; - } + tag = wellknown_tag; + if (!tag) + return 0; data = n; leaf = 1; if (is_empty_data(data)) @@ -329,22 +347,20 @@ static Z_TaggedElement *nodetotaggedelement(data1_handle dh, data1_node *n, res->content->u.noDataRequested = odr_nullval(); } else if (!(res->content = nodetoelementdata (dh, data, select, leaf, - o, len))) + o, len, wellknown_tag))) return 0; *len += 10; return res; } -Z_GenericRecord *data1_nodetogr(data1_handle dh, data1_node *n, - int select, ODR o, int *len) +static Z_GenericRecord *data1_nodetogr_r(data1_handle dh, data1_node *n, + int select, ODR o, int *len, + data1_tag *wellknown_tag) { Z_GenericRecord *res = (Z_GenericRecord *)odr_malloc(o, sizeof(*res)); data1_node *c; int num_children = 0; - if (n->which == DATA1N_root) - n = data1_get_root_tag (dh, n); - for (c = n->child; c; c = c->next) num_children++; @@ -356,8 +372,34 @@ Z_GenericRecord *data1_nodetogr(data1_handle dh, data1_node *n, if (c->which == DATA1N_tag && select && !c->u.tag.node_selected) continue; if ((res->elements[res->num_elements] = - nodetotaggedelement (dh, c, select, o, len))) + nodetotaggedelement (dh, c, select, o, len, wellknown_tag))) res->num_elements++; } return res; } + +Z_GenericRecord *data1_nodetogr(data1_handle dh, data1_node *n, + int select, ODR o, int *len) + +{ + data1_tag *wellknown_tag = 0; + + if (n->which == DATA1N_root) + n = data1_get_root_tag (dh, n); + + if (n->root->u.root.absyn && + !(wellknown_tag = + data1_gettagbyname (dh, n->root->u.root.absyn->tagset, + "wellKnown"))) + { + yaz_log(LOG_WARN, "Unable to locate tag for 'wellKnown'"); + wellknown_tag = odr_malloc(o, sizeof(*wellknown_tag)); + wellknown_tag->which = DATA1T_numeric; + wellknown_tag->value.numeric = 19; + wellknown_tag->next = 0; + wellknown_tag->tagset = odr_malloc(o, sizeof(*wellknown_tag->tagset)); + wellknown_tag->tagset->type = 1; + wellknown_tag->kind = DATA1K_string; + } + return data1_nodetogr_r(dh, n, select, o, len, wellknown_tag); +}