aboutsummaryrefslogtreecommitdiff
path: root/expat/examples/elements.c
diff options
context:
space:
mode:
Diffstat (limited to 'expat/examples/elements.c')
-rw-r--r--expat/examples/elements.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/expat/examples/elements.c b/expat/examples/elements.c
new file mode 100644
index 000000000..6b8f85501
--- /dev/null
+++ b/expat/examples/elements.c
@@ -0,0 +1,65 @@
+/* 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"
+
+#if defined(__amigaos__) && defined(__USE_INLINE__)
+#include <proto/expat.h>
+#endif
+
+#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;
+}
+
+int
+main(int argc, char *argv[])
+{
+ char buf[BUFSIZ];
+ XML_Parser parser = XML_ParserCreate(NULL);
+ int done;
+ int depth = 0;
+ XML_SetUserData(parser, &depth);
+ XML_SetElementHandler(parser, startElement, endElement);
+ do {
+ int len = (int)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;
+}