-/* $Id: d1_grs.c,v 1.2 2002-10-22 13:19:50 adam Exp $
- Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002
- Index Data Aps
+/* $Id: d1_grs.c,v 1.10 2007-01-15 15:10:14 adam Exp $
+ Copyright (C) 1995-2007
+ Index Data ApS
This file is part of the Zebra server.
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.
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
*/
/* converts data1 tree to GRS-1 record */
#include <yaz/proto.h>
#include <yaz/log.h>
-#include <data1.h>
+#include <d1_absyn.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));
odr_strdup(o, p->u.variant.value);
break;
default:
- yaz_log(LOG_WARN, "Unable to handle value for variant %s",
+ yaz_log(YLOG_WARN, "Unable to handle value for variant %s",
p->u.variant.type->name);
return 0;
}
D1_VARIANTARRAY);
else if (m->num_supportedVariants >= D1_VARIANTARRAY)
{
- yaz_log(LOG_WARN, "Too many variants (D1_VARIANTARRAY==%d)",
+ yaz_log(YLOG_WARN, "Too many variants (D1_VARIANTARRAY==%d)",
D1_VARIANTARRAY);
return -1;
}
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));
*len += oid_oidlen(res->u.oid) * sizeof(int);
break;
default:
- yaz_log(LOG_WARN, "Can't handle datatype.");
+ yaz_log(YLOG_WARN, "Can't handle datatype.");
return 0;
}
}
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))
}
else
{
- yaz_log(LOG_WARN, "Bad data.");
+ yaz_log(YLOG_WARN, "Bad data.");
return 0;
}
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(YLOG_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);
+}
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+