|
1 /***************************************************************** |
|
2 * outline.c |
|
3 * |
|
4 * Copyright 1999, Clark Cooper |
|
5 * All rights reserved. |
|
6 * |
|
7 * This program is free software; you can redistribute it and/or |
|
8 * modify it under the terms of the license contained in the |
|
9 * COPYING file that comes with the expat distribution. |
|
10 * |
|
11 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
|
12 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|
13 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
|
14 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY |
|
15 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
|
16 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
|
17 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
|
18 * |
|
19 * Read an XML document from standard input and print an element |
|
20 * outline on standard output. |
|
21 */ |
|
22 |
|
23 |
|
24 #include <stdio.h> |
|
25 #include <expat.h> |
|
26 |
|
27 #define BUFFSIZE 8192 |
|
28 |
|
29 char Buff[BUFFSIZE]; |
|
30 |
|
31 int Depth; |
|
32 |
|
33 static void |
|
34 start(void *data, const char *el, const char **attr) |
|
35 { |
|
36 int i; |
|
37 |
|
38 for (i = 0; i < Depth; i++) |
|
39 printf(" "); |
|
40 |
|
41 printf("%s", el); |
|
42 |
|
43 for (i = 0; attr[i]; i += 2) { |
|
44 printf(" %s='%s'", attr[i], attr[i + 1]); |
|
45 } |
|
46 |
|
47 printf("\n"); |
|
48 Depth++; |
|
49 } |
|
50 |
|
51 static void |
|
52 end(void *data, const char *el) |
|
53 { |
|
54 Depth--; |
|
55 } |
|
56 |
|
57 int |
|
58 main(int argc, char *argv[]) |
|
59 { |
|
60 XML_Parser p = XML_ParserCreate(NULL); |
|
61 if (! p) { |
|
62 fprintf(stderr, "Couldn't allocate memory for parser\n"); |
|
63 exit(-1); |
|
64 } |
|
65 |
|
66 XML_SetElementHandler(p, start, end); |
|
67 |
|
68 for (;;) { |
|
69 int done; |
|
70 int len; |
|
71 |
|
72 len = fread(Buff, 1, BUFFSIZE, stdin); |
|
73 if (ferror(stdin)) { |
|
74 fprintf(stderr, "Read error\n"); |
|
75 exit(-1); |
|
76 } |
|
77 done = feof(stdin); |
|
78 |
|
79 if (XML_Parse(p, Buff, len, done) == XML_STATUS_ERROR) { |
|
80 fprintf(stderr, "Parse error at line %d:\n%s\n", |
|
81 XML_GetCurrentLineNumber(p), |
|
82 XML_ErrorString(XML_GetErrorCode(p))); |
|
83 exit(-1); |
|
84 } |
|
85 |
|
86 if (done) |
|
87 break; |
|
88 } |
|
89 return 0; |
|
90 } |