diff options
author | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2006-11-25 18:35:56 +0000 |
---|---|---|
committer | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2006-11-25 18:35:56 +0000 |
commit | 36af073de3f5895bef731e0a54857f779889848b (patch) | |
tree | 077cd724b37a2aaad9874fb33d3050cf17d7991f /lib/expat/examples/elements.c | |
parent | 6c10641009c16690a53ca884a06b9282646568ca (diff) |
Import expat 2.0.0. (yet another copy, yeah)
Diffstat (limited to 'lib/expat/examples/elements.c')
-rw-r--r-- | lib/expat/examples/elements.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/lib/expat/examples/elements.c b/lib/expat/examples/elements.c new file mode 100644 index 000000000..421a1ce77 --- /dev/null +++ b/lib/expat/examples/elements.c @@ -0,0 +1,67 @@ +/* This is simple demonstration of how to use expat. This program + reads an XML document from standard input and writes a line with + the name of each element to standard output indenting child + elements by one tab stop more than their parent element. + It must be used with Expat compiled for UTF-8 output. +*/ + +#include <stdio.h> +#include "expat.h" + +#ifdef XML_LARGE_SIZE +#if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400 +#define XML_FMT_INT_MOD "I64" +#else +#define XML_FMT_INT_MOD "ll" +#endif +#else +#define XML_FMT_INT_MOD "l" +#endif + +static void XMLCALL +startElement(void *userData, const char *name, const char **atts) +{ + int i; + int *depthPtr = (int *)userData; + for (i = 0; i < *depthPtr; i++) + putchar('\t'); + puts(name); + *depthPtr += 1; +} + +static void XMLCALL +endElement(void *userData, const char *name) +{ + int *depthPtr = (int *)userData; + *depthPtr -= 1; +} + +#ifdef AMIGA_SHARED_LIB +#include <proto/expat.h> +int +amiga_main(int argc, char *argv[]) +#else +int +main(int argc, char *argv[]) +#endif +{ + char buf[BUFSIZ]; + XML_Parser parser = XML_ParserCreate(NULL); + int done; + int depth = 0; + XML_SetUserData(parser, &depth); + XML_SetElementHandler(parser, startElement, endElement); + do { + size_t len = fread(buf, 1, sizeof(buf), stdin); + done = len < sizeof(buf); + if (XML_Parse(parser, buf, len, done) == XML_STATUS_ERROR) { + fprintf(stderr, + "%s at line %" XML_FMT_INT_MOD "u\n", + XML_ErrorString(XML_GetErrorCode(parser)), + XML_GetCurrentLineNumber(parser)); + return 1; + } + } while (!done); + XML_ParserFree(parser); + return 0; +} |