Added SOIF syntax.
authorSebastian Hammer <quinn@indexdata.com>
Tue, 8 Oct 1996 10:43:20 +0000 (10:43 +0000)
committerSebastian Hammer <quinn@indexdata.com>
Tue, 8 Oct 1996 10:43:20 +0000 (10:43 +0000)
retrieval/d1_soif.c [new file with mode: 0644]

diff --git a/retrieval/d1_soif.c b/retrieval/d1_soif.c
new file mode 100644 (file)
index 0000000..8b68fd0
--- /dev/null
@@ -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 <wrbuf.h>
+
+#include <data1.h>
+
+/*
+ * 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);
+}