core/expat-2.0.1/examples/elements.c
changeset 300 b6d834208d33
parent 296 ea3dbc023c80
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/expat-2.0.1/examples/elements.c	Tue Feb 02 21:49:24 2016 +0000
@@ -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;
+}