outline.c revision 104349
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
29char Buff[BUFFSIZE];
30
31int Depth;
32
33static void
34start(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
51static void
52end(void *data, const char *el)
53{
54  Depth--;
55}
56
57int
58main(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