summaryrefslogtreecommitdiff
path: root/examples/elements.c
diff options
context:
space:
mode:
Diffstat (limited to 'examples/elements.c')
-rw-r--r--examples/elements.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/examples/elements.c b/examples/elements.c
new file mode 100644
index 0000000..9a20c34
--- /dev/null
+++ b/examples/elements.c
@@ -0,0 +1,49 @@
+/* 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. */
+
+#include <stdio.h>
+#include "expat.h"
+
+static void
+startElement(void *userData, const char *name, const char **atts)
+{
+ int i;
+ int *depthPtr = userData;
+ for (i = 0; i < *depthPtr; i++)
+ putchar('\t');
+ puts(name);
+ *depthPtr += 1;
+}
+
+static void
+endElement(void *userData, const char *name)
+{
+ int *depthPtr = 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 {
+ size_t len = fread(buf, 1, sizeof(buf), stdin);
+ done = len < sizeof(buf);
+ if (!XML_Parse(parser, buf, len, done)) {
+ fprintf(stderr,
+ "%s at line %d\n",
+ XML_ErrorString(XML_GetErrorCode(parser)),
+ XML_GetCurrentLineNumber(parser));
+ return 1;
+ }
+ } while (!done);
+ XML_ParserFree(parser);
+ return 0;
+}