-/*
- * 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 <assert.h>
#include <stdlib.h>
#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));
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));
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;
{
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;
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;
*/
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))
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++;
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);
+}