New source grs1disp.c
[yaz-moved-to-github.git] / retrieval / d1_prtree.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_prtree.c,v 1.11 2002-10-08 20:14:44 adam Exp $
7  */
8
9 #include <yaz/log.h>
10 #include <yaz/data1.h>
11
12 static void pr_string (FILE *out, const char *str, int len)
13 {
14     int i;
15     for (i = 0; i<len; i++)
16     {
17         int c = str[i];
18         if (c < 32 || c >126)
19             fprintf (out, "\\x%02x", c & 255);
20         else
21             fputc (c, out);
22     }
23 }
24
25 static void pr_tree (data1_handle dh, data1_node *n, FILE *out, int level)
26 {
27     fprintf (out, "%*s", level, "");
28     switch (n->which)
29     {
30     case DATA1N_root:
31         fprintf (out, "root abstract syntax=%s\n", n->u.root.type);
32         break;
33     case DATA1N_tag:
34         fprintf (out, "tag type=%s sel=%d\n", n->u.tag.tag,
35                  n->u.tag.node_selected);
36         if (n->u.tag.attributes)
37         {
38             data1_xattr *xattr = n->u.tag.attributes;
39             fprintf (out, "%*s attr", level, "");
40             for (; xattr; xattr = xattr->next)
41                 fprintf (out, " %s=%s ", xattr->name, xattr->value);
42             fprintf (out, "\n");
43         }
44         break;
45     case DATA1N_data:
46     case DATA1N_comment:
47         if (n->which == DATA1N_data)
48             fprintf (out, "data type=");
49         else
50             fprintf (out, "comment type=");
51         switch (n->u.data.what)
52         {
53         case DATA1I_inctxt:
54             fprintf (out, "inctxt\n");
55             break;
56         case DATA1I_incbin:
57             fprintf (out, "incbin\n");
58             break;
59         case DATA1I_text:
60             fprintf (out, "text '");
61             pr_string (out, n->u.data.data, n->u.data.len);
62             fprintf (out, "'\n");
63             break;
64         case DATA1I_num:
65             fprintf (out, "num '");
66             pr_string (out, n->u.data.data, n->u.data.len);
67             fprintf (out, "'\n");
68             break;
69         case DATA1I_oid:
70             fprintf (out, "oid '");
71             pr_string (out, n->u.data.data, n->u.data.len);
72             fprintf (out, "'\n");
73             break;
74         case DATA1I_xmltext:
75             fprintf (out, "xml text '");
76             pr_string (out, n->u.data.data, n->u.data.len);
77             fprintf (out, "'\n");
78             break;
79         default:
80             fprintf (out, "unknown(%d)\n", n->u.data.what);
81             break;
82         }
83         break;
84     case DATA1N_preprocess:
85         fprintf (out, "preprocess target=%s\n", n->u.preprocess.target);
86         if (n->u.preprocess.attributes)
87         {
88             data1_xattr *xattr = n->u.preprocess.attributes;
89             fprintf (out, "%*s attr", level, "");
90             for (; xattr; xattr = xattr->next)
91                 fprintf (out, " %s=%s ", xattr->name, xattr->value);
92             fprintf (out, "\n");
93         }
94         break;
95     case DATA1N_variant:
96         fprintf (out, "variant\n");
97 #if 0
98         if (n->u.variant.type->name)
99             fprintf (out, " class=%s type=%d value=%s\n",
100                      n->u.variant.type->name, n->u.variant.type->type,
101                      n->u.variant.value);
102 #endif
103         break;
104     default:
105         fprintf (out, "unknown(%d)\n", n->which);
106     }
107     if (n->child)
108         pr_tree (dh, n->child, out, level+4);
109     if (n->next)
110         pr_tree (dh, n->next, out, level);
111 }
112
113
114 void data1_pr_tree (data1_handle dh, data1_node *n, FILE *out)
115 {
116     pr_tree (dh, n, out, 0);
117 }