From: Sebastian Hammer Date: Tue, 8 Oct 1996 10:43:20 +0000 (+0000) Subject: Added SOIF syntax. X-Git-Tag: YAZ.1.8~704 X-Git-Url: http://sru.miketaylor.org.uk/cgi-bin?a=commitdiff_plain;h=180d06f2b91d0197c8ac7548f0e90f91b8427068;p=yaz-moved-to-github.git Added SOIF syntax. --- diff --git a/retrieval/d1_soif.c b/retrieval/d1_soif.c new file mode 100644 index 0000000..8b68fd0 --- /dev/null +++ b/retrieval/d1_soif.c @@ -0,0 +1,84 @@ +/* + * Copyright (c) 1995, Index Data. + * See the file LICENSE for details. + * Sebastian Hammer, Adam Dickmeiss + * + * $Log: d1_soif.c,v $ + * Revision 1.1 1996-10-08 10:43:20 quinn + * Added SOIF syntax. + * + * + */ + +#include + +#include + +/* + * This module generates SOIF (Simple Object Interchange Format) records + * from d1-nodes. nested elements are flattened out, depth first, by + * concatenating the tag names at each level. + */ + +static int nodetoelement(data1_node *n, int select, char *prefix, WRBUF b) +{ + data1_node *c; + char tmp[1024]; + + for (c = n->child; c; c = c->next) + { + char *tag; + + if (c->which == DATA1N_tag) + { + if (select && !c->u.tag.node_selected) + continue; + if (c->u.tag.element && c->u.tag.element->tag) + tag = c->u.tag.element->tag->names->name; /* first name */ + else + tag = c->u.tag.tag; /* local string tag */ + + if (*prefix) + sprintf(tmp, "%s-%s", prefix, tag); + else + strcpy(tmp, tag); + + if (nodetoelement(c, select, tmp, b) < 0) + return 0; + } + else if (c->which == DATA1N_data) + { + char *p = c->u.data.data; + int l = c->u.data.len; + + wrbuf_write(b, prefix, strlen(prefix)); + + sprintf(tmp, "{%d}:\t", l); + wrbuf_write(b, tmp, strlen(tmp)); + wrbuf_write(b, p, l); + wrbuf_putc(b, '\n'); + } + } + return 0; +} + +char *data1_nodetosoif(data1_node *n, int select, int *len) +{ + static WRBUF b = 0; + char buf[128]; + + if (!b) + b = wrbuf_alloc(); + else + wrbuf_rewind(b); + + if (n->which != DATA1N_root) + return 0; + sprintf(buf, "@%s{\n", n->u.root.type); + wrbuf_write(b, buf, strlen(buf)); + if (nodetoelement(n, select, "", b)) + return 0; + wrbuf_write(b, "}\n", 2); + *len = wrbuf_len(b); + return wrbuf_buf(b); +}