+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#undef XML_NONVALIDATING
+
+#ifdef XML_USE_NODECACHE
+#include "xml_cache.h"
+#else
+void *cacheGet(void *);
+#endif
+
+enum
+{
+ XML_NO_ERROR = 0,
+ XML_OUT_OF_MEMORY,
+ XML_FILE_NOT_FOUND,
+ XML_INVALID_NODE_NAME,
+ XML_UNEXPECTED_EOF,
+ XML_TRUNCATE_RESULT,
+ XML_INVALID_COMMENT,
+ XML_INVALID_INFO_BLOCK,
+ XML_ELEMENT_NO_OPENING_TAG,
+ XML_ELEMENT_NO_CLOSING_TAG,
+ XML_ATTRIB_NO_OPENING_QUOTE,
+ XML_ATTRIB_NO_CLOSING_QUOTE,
+ XML_MAX_ERROR
+};
+
+#ifdef WIN32
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+typedef struct
+{
+ HANDLE m;
+ void *p;
+} SIMPLE_UNMMAP;
+#endif
+
+#ifndef XML_NONVALIDATING
+struct _xml_error
+{
+ char *pos;
+ int err_no;
+};
+#endif
+
+/*
+ * It is required for both the rood node and the normal xml nodes to both
+ * have 'char *name' defined as the first entry. The code tests whether
+ * name == 0 to detect the root node.
+ */
+struct _root_id
+{
+ char *name;
+ char *start;
+ size_t len;
+ int fd;
+#ifdef XML_USE_NODECACHE
+ void *node;
+#endif
+#ifndef XML_NONVALIDATING
+ struct _xml_error *info;
+#endif
+#ifdef WIN32
+ SIMPLE_UNMMAP un;
+#endif
+};
+
+struct _xml_id
+{
+ char *name;
+ char *start;
+ size_t len;
+ size_t name_len;
+#ifndef XML_NONVALIDATING
+ struct _root_id *root;
+#endif
+#ifdef XML_USE_NODECACHE
+ void *node;
+#endif
+};
+
+
+