698465973777325215acda4f5d1d54537ccb5e2d
[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.10 2002-09-24 13:58:13 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         default:
75             fprintf (out, "unknown(%d)\n", n->u.data.what);
76             break;
77         }
78         break;
79     case DATA1N_preprocess:
80         fprintf (out, "preprocess target=%s\n", n->u.preprocess.target);
81         if (n->u.preprocess.attributes)
82         {
83             data1_xattr *xattr = n->u.preprocess.attributes;
84             fprintf (out, "%*s attr", level, "");
85             for (; xattr; xattr = xattr->next)
86                 fprintf (out, " %s=%s ", xattr->name, xattr->value);
87             fprintf (out, "\n");
88         }
89         break;
90     case DATA1N_variant:
91         fprintf (out, "variant\n");
92 #if 0
93         if (n->u.variant.type->name)
94             fprintf (out, " class=%s type=%d value=%s\n",
95                      n->u.variant.type->name, n->u.variant.type->type,
96                      n->u.variant.value);
97 #endif
98         break;
99     default:
100         fprintf (out, "unknown(%d)\n", n->which);
101     }
102     if (n->child)
103         pr_tree (dh, n->child, out, level+4);
104     if (n->next)
105         pr_tree (dh, n->next, out, level);
106 }
107
108
109 void data1_pr_tree (data1_handle dh, data1_node *n, FILE *out)
110 {
111     pr_tree (dh, n, out, 0);
112 }