2 * Copyright (c) 1995-2002, Index Data.
3 * See the file LICENSE for details.
4 * Sebastian Hammer, Adam Dickmeiss
6 * $Id: d1_soif.c,v 1.1 2002-10-22 12:53:33 adam Exp $
13 * This module generates SOIF (Simple Object Interchange Format) records
14 * from d1-nodes. nested elements are flattened out, depth first, by
15 * concatenating the tag names at each level.
18 static int nodetoelement(data1_node *n, int select, char *prefix, WRBUF b)
23 for (c = n->child; c; c = c->next)
27 if (c->which == DATA1N_tag)
29 if (select && !c->u.tag.node_selected)
31 if (c->u.tag.element && c->u.tag.element->tag)
32 tag = c->u.tag.element->tag->names->name; /* first name */
34 tag = c->u.tag.tag; /* local string tag */
37 sprintf(tmp, "%s-%s", prefix, tag);
41 if (nodetoelement(c, select, tmp, b) < 0)
44 else if (c->which == DATA1N_data)
46 char *p = c->u.data.data;
47 int l = c->u.data.len;
49 wrbuf_write(b, prefix, strlen(prefix));
51 sprintf(tmp, "{%d}:\t", l);
52 wrbuf_write(b, tmp, strlen(tmp));
60 char *data1_nodetosoif (data1_handle dh, data1_node *n, int select, int *len)
62 WRBUF b = data1_get_wrbuf (dh);
67 if (n->which != DATA1N_root)
69 sprintf(buf, "@%s{\n", n->u.root.type);
70 wrbuf_write(b, buf, strlen(buf));
71 if (nodetoelement(n, select, "", b))
73 wrbuf_write(b, "}\n", 2);