]> git.mxchange.org Git - flightgear.git/blob - utils/xmlgrep/printtree.c
Fix a bug in xmlGetString and honour the index attribtute 'n'
[flightgear.git] / utils / xmlgrep / printtree.c
1
2 #include <stdio.h>
3 #include <malloc.h>
4
5 #include "xml.h"
6
7 void print_xml(void *, char *, unsigned int);
8
9 int main(int argc, char **argv)
10 {
11   if (argc < 1)
12   {
13     printf("usage: printtree <filename>\n\n");
14   }
15   else
16   {
17     void *rid;
18
19     rid = xmlOpen(argv[1]);
20     if (xmlErrorGetNo(rid, 0) != XML_NO_ERROR)
21     {
22        printf("%s\n", xmlErrorGetString(rid, 1));
23     }
24     else if (rid)
25     {
26       unsigned int i, num;
27       void *xid;
28  
29       xid = xmlMarkId(rid);
30       num = xmlNodeGetNum(xid, "*");
31       for (i=0; i<num; i++)
32       {
33         if (xmlNodeGetPos(rid, xid, "*", i) != 0)
34         {
35           char name[4096] = "";
36           print_xml(xid, (char *)&name, 0);
37         }
38       }
39       free(xid);
40
41       xmlClose(rid);
42     }
43     else
44     {
45       printf("Error while opening file for reading: '%s'\n", argv[1]);
46     }
47   }
48 }
49
50 void print_xml(void *id, char *name, unsigned int len)
51 {
52   void *xid = xmlMarkId(id);
53   unsigned int i, num;
54   
55   num = xmlNodeGetNum(xid, "*");
56   if (num == 0)
57   {
58     char *s;
59     s = xmlGetString(xid);
60     if (s)
61     {
62       printf("%s = %s\n", name, s);
63       free(s);
64     }
65   }
66   else
67   {
68     unsigned int i, q;
69
70     name[len++] = '/';
71     for (i=0; i<num; i++)
72     {
73       if (xmlNodeGetPos(id, xid, "*", i) != 0)
74       {
75         unsigned int res, i = 4096 - len;
76         res = xmlNodeCopyName(xid, (char *)&name[len], i);
77         if (res)
78         {
79           unsigned int index = xmlAttributeGetInt(xid, "n");
80           if (index)
81           {
82             unsigned int pos = len+res;
83
84             name[pos++] = '[';
85             i = snprintf((char *)&name[pos], 4096-pos, "%i", index);
86             name[pos+i] = ']';
87             res += i+2;
88           }
89         }
90         print_xml(xid, name, len+res);
91       }
92       else printf("error\n");
93     }
94   }
95 }