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