data1 part of zebra
[idzebra-moved-to-github.git] / data1 / d1_soif.c
1 /*
2  * Copyright (c) 1995-2002, Index Data.
3  * See the file LICENSE for details.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Id: d1_soif.c,v 1.1 2002-10-22 12:53:33 adam Exp $
7  */
8
9 #include <yaz/wrbuf.h>
10 #include <data1.h>
11
12 /*
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.
16  */
17
18 static int nodetoelement(data1_node *n, int select, char *prefix, WRBUF b)
19 {
20     data1_node *c;
21     char tmp[1024];
22
23     for (c = n->child; c; c = c->next)
24     {
25         char *tag;
26
27         if (c->which == DATA1N_tag)
28         {
29             if (select && !c->u.tag.node_selected)
30                 continue;
31             if (c->u.tag.element && c->u.tag.element->tag)
32                 tag = c->u.tag.element->tag->names->name; /* first name */
33             else
34             tag = c->u.tag.tag; /* local string tag */
35
36             if (*prefix)
37                 sprintf(tmp, "%s-%s", prefix, tag);
38             else
39                 strcpy(tmp, tag);
40
41             if (nodetoelement(c, select, tmp, b) < 0)
42                 return 0;
43         }
44         else if (c->which == DATA1N_data)
45         {
46             char *p = c->u.data.data;
47             int l = c->u.data.len;
48
49             wrbuf_write(b, prefix, strlen(prefix));
50
51             sprintf(tmp, "{%d}:\t", l);
52             wrbuf_write(b, tmp, strlen(tmp));
53             wrbuf_write(b, p, l);
54             wrbuf_putc(b, '\n');
55         }
56     }
57     return 0;
58 }
59
60 char *data1_nodetosoif (data1_handle dh, data1_node *n, int select, int *len)
61 {
62     WRBUF b = data1_get_wrbuf (dh);
63     char buf[128];
64
65     wrbuf_rewind(b);
66     
67     if (n->which != DATA1N_root)
68         return 0;
69     sprintf(buf, "@%s{\n", n->u.root.type);
70     wrbuf_write(b, buf, strlen(buf));
71     if (nodetoelement(n, select, "", b))
72         return 0;
73     wrbuf_write(b, "}\n", 2);
74     *len = wrbuf_len(b);
75     return wrbuf_buf(b);
76 }