XML reader for data1 (EXPAT)
[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.8 2002-05-13 14:13:37 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 (n->u.tag.attributes)
36         {
37             data1_xattr *xattr = n->u.tag.attributes;
38             fprintf (out, "%*s attr", level, "");
39             for (; xattr; xattr = xattr->next)
40                 fprintf (out, " %s=%s ", xattr->name, xattr->value);
41             fprintf (out, "\n");
42         }
43         break;
44     case DATA1N_data:
45         fprintf (out, "data type=");
46         switch (n->u.data.what)
47         {
48         case DATA1I_inctxt:
49             fprintf (out, "inctxt\n");
50             break;
51         case DATA1I_incbin:
52             fprintf (out, "incbin\n");
53             break;
54         case DATA1I_text:
55             fprintf (out, "text '");
56             pr_string (out, n->u.data.data, n->u.data.len);
57             fprintf (out, "'\n");
58             break;
59         case DATA1I_num:
60             fprintf (out, "num '");
61             pr_string (out, n->u.data.data, n->u.data.len);
62             fprintf (out, "'\n");
63             break;
64         case DATA1I_oid:
65             fprintf (out, "oid '");
66             pr_string (out, n->u.data.data, n->u.data.len);
67             fprintf (out, "'\n");
68             break;
69         default:
70             fprintf (out, "unknown(%d)\n", n->u.data.what);
71             break;
72         }
73         break;
74     case DATA1N_variant:
75         fprintf (out, "variant\n");
76 #if 0
77         if (n->u.variant.type->name)
78             fprintf (out, " class=%s type=%d value=%s\n",
79                      n->u.variant.type->name, n->u.variant.type->type,
80                      n->u.variant.value);
81 #endif
82         break;
83     default:
84         fprintf (out, "unknown(%d)\n", n->which);
85     }
86     if (n->child)
87         pr_tree (dh, n->child, out, level+4);
88     if (n->next)
89         pr_tree (dh, n->next, out, level);
90 }
91
92
93 void data1_pr_tree (data1_handle dh, data1_node *n, FILE *out)
94 {
95     pr_tree (dh, n, out, 0);
96 }