summaryrefslogtreecommitdiff
path: root/lib/expat/examples/elements.c
diff options
context:
space:
mode:
authorMatthieu Herrb <matthieu@cvs.openbsd.org>2006-11-25 18:35:56 +0000
committerMatthieu Herrb <matthieu@cvs.openbsd.org>2006-11-25 18:35:56 +0000
commit36af073de3f5895bef731e0a54857f779889848b (patch)
tree077cd724b37a2aaad9874fb33d3050cf17d7991f /lib/expat/examples/elements.c
parent6c10641009c16690a53ca884a06b9282646568ca (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.c67
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;
+}