e5df6fe57f46c93728bbf938c8dc5ab0522203ea
[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.7 2002-01-26 19:20:25 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);
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\n", n->u.tag.tag);
35 #if DATA1_USING_XATTR
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 #endif
45         break;
46     case DATA1N_data:
47         fprintf (out, "data type=");
48         switch (n->u.data.what)
49         {
50         case DATA1I_inctxt:
51             fprintf (out, "inctxt\n");
52             break;
53         case DATA1I_incbin:
54             fprintf (out, "incbin\n");
55             break;
56         case DATA1I_text:
57             fprintf (out, "text '");
58             pr_string (out, n->u.data.data, n->u.data.len);
59             fprintf (out, "'\n");
60             break;
61         case DATA1I_num:
62             fprintf (out, "num '");
63             pr_string (out, n->u.data.data, n->u.data.len);
64             fprintf (out, "'\n");
65             break;
66         case DATA1I_oid:
67             fprintf (out, "oid '");
68             pr_string (out, n->u.data.data, n->u.data.len);
69             fprintf (out, "'\n");
70             break;
71         default:
72             fprintf (out, "unknown(%d)\n", n->u.data.what);
73             break;
74         }
75         break;
76     case DATA1N_variant:
77         fprintf (out, "variant\n");
78 #if 0
79         if (n->u.variant.type->name)
80             fprintf (out, " class=%s type=%d value=%s\n",
81                      n->u.variant.type->name, n->u.variant.type->type,
82                      n->u.variant.value);
83 #endif
84         break;
85     default:
86         fprintf (out, "unknown(%d)\n", n->which);
87     }
88     if (n->child)
89         pr_tree (dh, n->child, out, level+4);
90     if (n->next)
91         pr_tree (dh, n->next, out, level);
92 }
93
94
95 void data1_pr_tree (data1_handle dh, data1_node *n, FILE *out)
96 {
97     pr_tree (dh, n, out, 0);
98 }