Old versions of GILS tables
[yaz-moved-to-github.git] / retrieval / d1_soif.c
1 /*
2  * Copyright (c) 1995, Index Data.
3  * See the file LICENSE for details.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: d1_soif.c,v $
7  * Revision 1.2  1997-04-30 08:52:11  quinn
8  * Null
9  *
10  * Revision 1.1  1996/10/08  10:43:20  quinn
11  * Added SOIF syntax.
12  *
13  *
14  */
15
16 #include <wrbuf.h>
17
18 #include <data1.h>
19
20 /*
21  * This module generates SOIF (Simple Object Interchange Format) records
22  * from d1-nodes. nested elements are flattened out, depth first, by
23  * concatenating the tag names at each level.
24  */
25
26 static int nodetoelement(data1_node *n, int select, char *prefix, WRBUF b)
27 {
28     data1_node *c;
29     char tmp[1024];
30
31     for (c = n->child; c; c = c->next)
32     {
33         char *tag;
34
35         if (c->which == DATA1N_tag)
36         {
37             if (select && !c->u.tag.node_selected)
38                 continue;
39             if (c->u.tag.element && c->u.tag.element->tag)
40                 tag = c->u.tag.element->tag->names->name; /* first name */
41             else
42             tag = c->u.tag.tag; /* local string tag */
43
44             if (*prefix)
45                 sprintf(tmp, "%s-%s", prefix, tag);
46             else
47                 strcpy(tmp, tag);
48
49             if (nodetoelement(c, select, tmp, b) < 0)
50                 return 0;
51         }
52         else if (c->which == DATA1N_data)
53         {
54             char *p = c->u.data.data;
55             int l = c->u.data.len;
56
57             wrbuf_write(b, prefix, strlen(prefix));
58
59             sprintf(tmp, "{%d}:\t", l);
60             wrbuf_write(b, tmp, strlen(tmp));
61             wrbuf_write(b, p, l);
62             wrbuf_putc(b, '\n');
63         }
64     }
65     return 0;
66 }
67
68 char *data1_nodetosoif(data1_node *n, int select, int *len)
69 {
70     static WRBUF b = 0;
71     char buf[128];
72
73     if (!b)
74         b = wrbuf_alloc();
75     else
76         wrbuf_rewind(b);
77     
78     if (n->which != DATA1N_root)
79         return 0;
80     sprintf(buf, "@%s{\n", n->u.root.type);
81     wrbuf_write(b, buf, strlen(buf));
82     if (nodetoelement(n, select, "", b))
83         return 0;
84     wrbuf_write(b, "}\n", 2);
85     *len = wrbuf_len(b);
86     return wrbuf_buf(b);
87 }