xref: /freebsd/contrib/expat/examples/outline.c (revision 1e413cf93298b5b97441a21d9a50fdcd0ee9945e)
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 }
91