xref: /freebsd/contrib/expat/examples/outline.c (revision 38f0b757fd84d17d0fc24739a7cda160c4516d81)
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  * Must be used with Expat compiled for UTF-8 output.
22  */
23 
24 
25 #include <stdio.h>
26 #include <expat.h>
27 
28 #if defined(__amigaos__) && defined(__USE_INLINE__)
29 #include <proto/expat.h>
30 #endif
31 
32 #ifdef XML_LARGE_SIZE
33 #if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400
34 #define XML_FMT_INT_MOD "I64"
35 #else
36 #define XML_FMT_INT_MOD "ll"
37 #endif
38 #else
39 #define XML_FMT_INT_MOD "l"
40 #endif
41 
42 #define BUFFSIZE        8192
43 
44 char Buff[BUFFSIZE];
45 
46 int Depth;
47 
48 static void XMLCALL
49 start(void *data, const char *el, const char **attr)
50 {
51   int i;
52 
53   for (i = 0; i < Depth; i++)
54     printf("  ");
55 
56   printf("%s", el);
57 
58   for (i = 0; attr[i]; i += 2) {
59     printf(" %s='%s'", attr[i], attr[i + 1]);
60   }
61 
62   printf("\n");
63   Depth++;
64 }
65 
66 static void XMLCALL
67 end(void *data, const char *el)
68 {
69   Depth--;
70 }
71 
72 int
73 main(int argc, char *argv[])
74 {
75   XML_Parser p = XML_ParserCreate(NULL);
76   if (! p) {
77     fprintf(stderr, "Couldn't allocate memory for parser\n");
78     exit(-1);
79   }
80 
81   XML_SetElementHandler(p, start, end);
82 
83   for (;;) {
84     int done;
85     int len;
86 
87     len = (int)fread(Buff, 1, BUFFSIZE, stdin);
88     if (ferror(stdin)) {
89       fprintf(stderr, "Read error\n");
90       exit(-1);
91     }
92     done = feof(stdin);
93 
94     if (XML_Parse(p, Buff, len, done) == XML_STATUS_ERROR) {
95       fprintf(stderr, "Parse error at line %" XML_FMT_INT_MOD "u:\n%s\n",
96               XML_GetCurrentLineNumber(p),
97               XML_ErrorString(XML_GetErrorCode(p)));
98       exit(-1);
99     }
100 
101     if (done)
102       break;
103   }
104   XML_ParserFree(p);
105   return 0;
106 }
107