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