* Added support for XML_LARGE_SIZE.
[mirror-ossqm-expat.git] / examples / outline.c
blob807ddb89e0353b6e730426e6147b1ae8e03df1cd
1 /*****************************************************************
2 * outline.c
4 * Copyright 1999, Clark Cooper
5 * All rights reserved.
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.
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.
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.
25 #include <stdio.h>
26 #include <expat.h>
28 #ifdef XML_LARGE_SIZE
29 #if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400
30 #define XML_FMT_INT_MOD "I64"
31 #else
32 #define XML_FMT_INT_MOD "ll"
33 #endif
34 #else
35 #define XML_FMT_INT_MOD "l"
36 #endif
38 #define BUFFSIZE 8192
40 char Buff[BUFFSIZE];
42 int Depth;
44 static void XMLCALL
45 start(void *data, const char *el, const char **attr)
47 int i;
49 for (i = 0; i < Depth; i++)
50 printf(" ");
52 printf("%s", el);
54 for (i = 0; attr[i]; i += 2) {
55 printf(" %s='%s'", attr[i], attr[i + 1]);
58 printf("\n");
59 Depth++;
62 static void XMLCALL
63 end(void *data, const char *el)
65 Depth--;
68 #ifdef AMIGA_SHARED_LIB
69 #include <proto/expat.h>
70 int
71 amiga_main(int argc, char *argv[])
72 #else
73 int
74 main(int argc, char *argv[])
75 #endif
77 XML_Parser p = XML_ParserCreate(NULL);
78 if (! p) {
79 fprintf(stderr, "Couldn't allocate memory for parser\n");
80 exit(-1);
83 XML_SetElementHandler(p, start, end);
85 for (;;) {
86 int done;
87 int len;
89 len = fread(Buff, 1, BUFFSIZE, stdin);
90 if (ferror(stdin)) {
91 fprintf(stderr, "Read error\n");
92 exit(-1);
94 done = feof(stdin);
96 if (XML_Parse(p, Buff, len, done) == XML_STATUS_ERROR) {
97 fprintf(stderr, "Parse error at line %" XML_FMT_INT_MOD "u:\n%s\n",
98 XML_GetCurrentLineNumber(p),
99 XML_ErrorString(XML_GetErrorCode(p)));
100 exit(-1);
103 if (done)
104 break;
106 return 0;