1b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* This is simple demonstration of how to use expat. This program
2b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   reads an XML document from standard input and writes a line with
3b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   the name of each element to standard output indenting child
4b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   elements by one tab stop more than their parent element.
5b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   It must be used with Expat compiled for UTF-8 output.
6b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
7b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
8b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <stdio.h>
9b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "expat.h"
10b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
11d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#if defined(__amigaos__) && defined(__USE_INLINE__)
12d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#include <proto/expat.h>
13d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#endif
14d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes
15b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_LARGE_SIZE
16b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400
17b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XML_FMT_INT_MOD "I64"
18b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
19b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XML_FMT_INT_MOD "ll"
20b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
21b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
22b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XML_FMT_INT_MOD "l"
23b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
24b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
25b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void XMLCALL
26b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectstartElement(void *userData, const char *name, const char **atts)
27b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
28b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int i;
29b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int *depthPtr = (int *)userData;
30b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  for (i = 0; i < *depthPtr; i++)
31b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    putchar('\t');
32b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  puts(name);
33b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  *depthPtr += 1;
34b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
35b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
36b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void XMLCALL
37b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectendElement(void *userData, const char *name)
38b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
39b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int *depthPtr = (int *)userData;
40b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  *depthPtr -= 1;
41b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
42b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
43b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectint
44b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectmain(int argc, char *argv[])
45b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
46b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  char buf[BUFSIZ];
47b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_Parser parser = XML_ParserCreate(NULL);
48b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int done;
49b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  int depth = 0;
50b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_SetUserData(parser, &depth);
51b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_SetElementHandler(parser, startElement, endElement);
52b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  do {
53d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    int len = (int)fread(buf, 1, sizeof(buf), stdin);
54b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    done = len < sizeof(buf);
55b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, buf, len, done) == XML_STATUS_ERROR) {
56b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      fprintf(stderr,
57b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              "%s at line %" XML_FMT_INT_MOD "u\n",
58b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              XML_ErrorString(XML_GetErrorCode(parser)),
59b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project              XML_GetCurrentLineNumber(parser));
60b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project      return 1;
61b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
62b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  } while (!done);
63b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  XML_ParserFree(parser);
64b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project  return 0;
65b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
66