Release 0.2, 80% rewrite, nothing left intact ... Daniel
diff --git a/include/libxml/entities.h b/include/libxml/entities.h
new file mode 100644
index 0000000..0065245
--- /dev/null
+++ b/include/libxml/entities.h
@@ -0,0 +1,70 @@
+/*
+ * entities.h : interface for the XML entities handking
+ *
+ * See Copyright for the status of this software.
+ *
+ * $Id$
+ */
+
+#ifndef __XML_ENTITIES_H__
+#define __XML_ENTITIES_H__
+#include "parser.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define XML_INTERNAL_GENERAL_ENTITY		1
+#define XML_EXTERNAL_GENERAL_PARSED_ENTITY	2
+#define XML_EXTERNAL_GENERAL_UNPARSED_ENTITY	3
+#define XML_INTERNAL_PARAMETER_ENTITY		4
+#define XML_EXTERNAL_PARAMETER_ENTITY		5
+
+/*
+ * An unit of storage for an entity, contains the string, the value
+ * and the linkind data needed for the linking in the hash table.
+ */
+
+typedef struct xmlEntity {
+    int type;			/* The entity type */
+    int len;			/* The lenght of the name */
+    const CHAR    *name;	/* Name of the entity */
+    const CHAR    *ExternalID;	/* External identifier for PUBLIC Entity */
+    const CHAR    *SystemID;	/* URI for a SYSTEM or PUBLIC Entity */
+    CHAR *content;		/* The entity content or ndata if unparsed */
+} xmlEntity, *xmlEntityPtr;
+
+/*
+ * ALl entities are stored in a table there is one table per DTD
+ * and one extra per document.
+ */
+
+#define XML_MIN_ENTITIES_TABLE	32
+
+typedef struct xmlEntitiesTable {
+    int nb_entities;		/* number of elements stored */
+    int max_entities;		/* maximum number of elements */
+    xmlEntityPtr table;		/* the table of entities */
+} xmlEntitiesTable, *xmlEntitiesTablePtr;
+
+/*
+ * External functions :
+ */
+
+extern void xmlAddDocEntity(xmlDocPtr doc, const CHAR *name, int type,
+              const CHAR *ExternalID, const CHAR *SystemID, CHAR *content);
+extern void xmlAddDtdEntity(xmlDocPtr doc, const CHAR *name, int type,
+              const CHAR *ExternalID, const CHAR *SystemID, CHAR *content);
+extern xmlEntityPtr xmlGetDocEntity(xmlDocPtr doc, const CHAR *name);
+extern xmlEntityPtr xmlGetDtdEntity(xmlDocPtr doc, const CHAR *name);
+extern CHAR *xmlEncodeEntities(xmlDocPtr doc, const CHAR *input);
+extern xmlEntitiesTablePtr xmlCreateEntitiesTable(void);
+extern void xmlFreeEntitiesTable(xmlEntitiesTablePtr table);
+extern void xmlDumpEntitiesTable(xmlEntitiesTablePtr table);
+
+#ifdef __cplusplus
+}
+#endif
+
+# endif /* __XML_ENTITIES_H__ */
diff --git a/include/libxml/parser.h b/include/libxml/parser.h
new file mode 100644
index 0000000..a25e70a
--- /dev/null
+++ b/include/libxml/parser.h
@@ -0,0 +1,168 @@
+/*
+ * parser.h : constants and stuff related to the XML parser.
+ *
+ * See Copyright for the status of this software.
+ *
+ * $Id$
+ */
+
+#ifndef __XML_PARSER_H__
+#define __XML_PARSER_H__
+
+#include "tree.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Constants.
+ */
+#define XML_DEFAULT_VERSION	"1.0"
+
+typedef struct xmlParserInput {
+    const char *filename;             /* The file analyzed, if any */
+    const CHAR *base;                 /* Base of the array to parse */
+    const CHAR *cur;                  /* Current char being parsed */
+    int line;                         /* Current line */
+    int col;                          /* Current column */
+} xmlParserInput, *xmlParserInputPtr;
+
+typedef struct xmlParserNodeInfo {
+  const struct xmlNode* node;
+  /* Position & line # that text that created the node begins & ends on */
+  unsigned long begin_pos;
+  unsigned long begin_line;
+  unsigned long end_pos;
+  unsigned long end_line;
+} xmlParserNodeInfo;
+
+typedef struct xmlParserNodeInfoSeq {
+  unsigned long maximum;
+  unsigned long length;
+  xmlParserNodeInfo* buffer;
+} xmlParserNodeInfoSeq, *xmlParserNodeInfoSeqPtr;
+
+typedef struct xmlParserCtxt {
+    struct xmlSAXHandler *sax;        /* The SAX handler */
+    xmlDocPtr doc;                    /* the document being built */
+
+    /* Input stream stack */
+    xmlParserInputPtr  input;         /* Current input stream */
+    int                inputNr;       /* Number of current input streams */
+    int                inputMax;      /* Max number of input streams */
+    xmlParserInputPtr *inputTab;      /* stack of inputs */
+
+    /* Node analysis stack */
+    xmlNodePtr         node;          /* Current parsed Node */
+    int                nodeNr;        /* Depth of the parsing stack */
+    int                nodeMax;       /* Max depth of the parsing stack */
+    xmlNodePtr        *nodeTab;       /* array of nodes */
+
+    int record_info;                  /* Whether node info should be kept */
+    xmlParserNodeInfoSeq node_seq;    /* info about each node parsed */
+} xmlParserCtxt, *xmlParserCtxtPtr;
+
+/*
+ * a SAX Locator.
+ */
+
+typedef struct xmlSAXLocator {
+    const CHAR *(*getPublicId)(xmlParserCtxtPtr ctxt);
+    const CHAR *(*getSystemId)(xmlParserCtxtPtr ctxt);
+    int (*getLineNumber)(xmlParserCtxtPtr ctxt);
+    int (*getColumnNumber)(xmlParserCtxtPtr ctxt);
+} xmlSAXLocator, *xmlSAXLocatorPtr;
+
+/*
+ * a SAX Exception.
+ */
+
+typedef xmlParserInputPtr (*resolveEntitySAXFunc) (xmlParserCtxtPtr ctxt,
+			    const CHAR *publicId, const CHAR *systemId);
+typedef void (*notationDeclSAXFunc)(xmlParserCtxtPtr ctxt, const CHAR *name,
+			    const CHAR *publicId, const CHAR *systemId);
+typedef void (*unparsedEntityDeclSAXFunc)(xmlParserCtxtPtr ctxt,
+                            const CHAR *name, const CHAR *publicId,
+			    const CHAR *systemId, const CHAR *notationName);
+typedef void (*setDocumentLocatorSAXFunc) (xmlParserCtxtPtr ctxt,
+                            xmlSAXLocatorPtr loc);
+typedef void (*startDocumentSAXFunc) (xmlParserCtxtPtr ctxt);
+typedef void (*endDocumentSAXFunc) (xmlParserCtxtPtr ctxt);
+typedef void (*startElementSAXFunc) (xmlParserCtxtPtr ctxt, const CHAR *name);
+typedef void (*endElementSAXFunc) (xmlParserCtxtPtr ctxt, const CHAR *name);
+typedef void (*charactersSAXFunc) (xmlParserCtxtPtr ctxt, const CHAR *ch,
+		            int start, int len);
+typedef void (*ignorableWhitespaceSAXFunc) (xmlParserCtxtPtr ctxt,
+			    const CHAR *ch, int start, int len);
+typedef void (*processingInstructionSAXFunc) (xmlParserCtxtPtr ctxt,
+                            const CHAR *target, const CHAR *data);
+typedef void (*warningSAXFunc) (xmlParserCtxtPtr ctxt, const char *msg, ...);
+typedef void (*errorSAXFunc) (xmlParserCtxtPtr ctxt, const char *msg, ...);
+typedef void (*fatalErrorSAXFunc) (xmlParserCtxtPtr ctxt, const char *msg, ...);
+
+typedef struct xmlSAXHandler {
+    resolveEntitySAXFunc resolveEntity;
+    notationDeclSAXFunc notationDecl;
+    unparsedEntityDeclSAXFunc unparsedEntityDecl;
+    setDocumentLocatorSAXFunc setDocumentLocator;
+    startDocumentSAXFunc startDocument;
+    endDocumentSAXFunc endDocument;
+    startElementSAXFunc startElement;
+    endElementSAXFunc endElement;
+    charactersSAXFunc characters;
+    ignorableWhitespaceSAXFunc ignorableWhitespace;
+    processingInstructionSAXFunc processingInstruction;
+    warningSAXFunc warning;
+    errorSAXFunc error;
+    fatalErrorSAXFunc fatalError;
+} xmlSAXHandler, *xmlSAXHandlerPtr;
+
+/*
+ * Global variables: just the SAX interface tables we are looking for full
+ *      reentrancy of the code !
+ */
+xmlSAXLocator xmlDefaultSAXLocator;
+xmlSAXHandler xmlDefaultSAXHandler;
+
+/*
+ * Interfaces
+ */
+extern int xmlParseDocument(xmlParserCtxtPtr ctxt);
+extern xmlDocPtr xmlParseDoc(CHAR *cur);
+extern xmlDocPtr xmlParseMemory(char *buffer, int size);
+extern xmlDocPtr xmlParseFile(const char *filename);
+extern CHAR *xmlStrdup(const CHAR *input);
+extern CHAR *xmlStrndup(const CHAR *input, int n);
+extern CHAR *xmlStrchr(const CHAR *str, CHAR val);
+extern int xmlStrcmp(const CHAR *str1, const CHAR *str2);
+extern int xmlStrncmp(const CHAR *str1, const CHAR *str2, int len);
+extern int xmlStrlen(const CHAR *str);
+extern CHAR *xmlStrcat(CHAR *cur, const CHAR *add);
+extern CHAR *xmlStrncat(CHAR *cur, const CHAR *add, int len);
+
+extern void xmlInitParserCtxt(xmlParserCtxtPtr ctx);
+extern void xmlClearParserCtxt(xmlParserCtxtPtr ctx);
+extern void xmlSetupParserForBuffer(xmlParserCtxtPtr ctx, const CHAR* buffer,
+                                    const char* filename);
+
+extern void xmlParserError(xmlParserCtxtPtr ctxt, const char *msg, ...);
+
+extern const xmlParserNodeInfo* xmlParserFindNodeInfo(const xmlParserCtxt* c,
+                                                      const xmlNode* node);
+extern void xmlInitNodeInfoSeq(xmlParserNodeInfoSeqPtr seq);
+extern void xmlClearNodeInfoSeq(xmlParserNodeInfoSeqPtr seq);
+unsigned long xmlParserFindNodeInfoIndex(const xmlParserNodeInfoSeq* seq,
+                                         const xmlNode* node);
+extern void xmlParserAddNodeInfo(xmlParserCtxtPtr ctx,
+                                 const xmlParserNodeInfo* info);
+
+extern void xmlParserWarning(xmlParserCtxtPtr ctxt, const char *msg, ...);
+extern void xmlParserError(xmlParserCtxtPtr ctxt, const char *msg, ...);
+extern void xmlDefaultSAXHandlerInit(void);
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __XML_PARSER_H__ */
+
diff --git a/include/libxml/tree.h b/include/libxml/tree.h
new file mode 100644
index 0000000..7a48a9b
--- /dev/null
+++ b/include/libxml/tree.h
@@ -0,0 +1,180 @@
+/*
+ * tree.h : describes the structures found in an tree resulting
+ *          from an XML parsing.
+ *
+ * See Copyright for the status of this software.
+ *
+ * $Id$
+ */
+
+#ifndef __XML_TREE_H__
+#define __XML_TREE_H__
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Type definitions
+ */
+#ifdef UNICODE
+typedef unsigned short CHAR;
+#else
+typedef unsigned char CHAR;
+#endif
+
+/*
+ * a DTD Notation definition
+ * TODO !!!!
+ */
+
+/*
+ * a DTD Attribute definition
+ * TODO !!!!
+ */
+
+/*
+ * a DTD Element definition.
+ */
+#define XML_ELEMENT_TYPE_EMPTY		1
+#define XML_ELEMENT_TYPE_ANY		2
+#define XML_ELEMENT_TYPE_MIXED		3
+#define XML_ELEMENT_TYPE_ELEMENT	4
+
+typedef struct xmlElement {
+    const CHAR    *name;	/* Element name */
+    int            type;	/* type (too simple, to extend ...) */
+    /* TODO !!! more needed */
+} xmlElement, *xmlElementPtr;
+
+/*
+ * An XML namespace.
+ * Note that prefix == NULL is valid, it defines the default namespace
+ * within the subtree (until overriden).
+ */
+
+#define XML_GLOBAL_NAMESPACE		1 /* old style global namespace */
+#define XML_LOCAL_NAMESPACE		2 /* new style local scoping */
+
+typedef struct xmlNs {
+    struct xmlNs  *next;	/* next Ns link for this node  */
+    int            type;	/* global or local */
+    const CHAR    *href;	/* URL for the namespace */
+    const CHAR    *prefix;	/* prefix for the namespace */
+} xmlNs, *xmlNsPtr;
+
+/*
+ * An XML DtD, as defined by <!DOCTYPE.
+ */
+typedef struct xmlDtd {
+    const CHAR    *name;	/* Name of the DTD */
+    const CHAR    *ExternalID;	/* External identifier for PUBLIC DTD */
+    const CHAR    *SystemID;	/* URI for a SYSTEM or PUBLIC DTD */
+    void          *elements;    /* Hash table for elements if any */
+    void          *entities;    /* Hash table for entities if any */
+    /* struct xmlDtd *next;	 * next  link for this document  */
+} xmlDtd, *xmlDtdPtr;
+
+/*
+ * A attribute of an XML node.
+ */
+typedef struct xmlAttr {
+    struct xmlNode *node;	/* attr->node link */
+    struct xmlAttr *next;	/* parent->childs link */
+    const CHAR     *name;       /* the name of the property */
+    const CHAR     *value;      /* the value of the property */
+} xmlAttr, *xmlAttrPtr;
+
+/*
+ * A node in an XML tree.
+ */
+#define XML_TYPE_TEXT		1
+#define XML_TYPE_COMMENT	2
+#define XML_TYPE_ENTITY		3
+
+typedef struct xmlNode {
+    struct xmlNode *parent;	/* child->parent link */
+    struct xmlNode *next;	/* next sibling link  */
+    struct xmlNode *childs;	/* parent->childs link */
+    struct xmlAttr *properties;	/* properties list */
+    int             type;	/* type number in the DTD */
+    const CHAR     *name;       /* the name of the node, or the entity */
+    xmlNs          *ns;         /* pointer to the associated namespace */
+    xmlNs          *nsDef;      /* namespace definitions on this node */
+    CHAR           *content;    /* the content */
+} xmlNode, *xmlNodePtr;
+
+/*
+ * An XML document.
+ */
+typedef struct xmlDoc {
+    char           *name;	/* name/filename/URI of the document */
+    const CHAR     *version;	/* the XML version string */
+    const CHAR     *encoding;   /* encoding, if any */
+    int             standalone; /* standalone document (no external refs) */
+    struct xmlDtd  *dtd;	/* the document DTD if available */
+    struct xmlNs   *oldNs;	/* Global namespace, the old way */
+    void          *entities;    /* Hash table for general entities if any */
+    struct xmlNode *root;	/* the document tree */
+} xmlDoc, *xmlDocPtr;
+
+/*
+ * Variables.
+ */
+extern xmlNsPtr baseDTD;
+extern int oldXMLWDcompatibility;/* maintain compatibility with old WD */
+extern int xmlIndentTreeOutput;  /* try to indent the tree dumps */
+
+/*
+ * Functions.
+ */
+extern xmlDtdPtr xmlNewDtd(xmlDocPtr doc, const CHAR *name,
+                    const CHAR *ExternalID, const CHAR *SystemID);
+extern void xmlFreeDtd(xmlDtdPtr cur);
+extern xmlNsPtr xmlNewGlobalNs(xmlDocPtr doc, const CHAR *href, const CHAR *AS);
+extern xmlNsPtr xmlNewNs(xmlNodePtr node, const CHAR *href, const CHAR *AS);
+extern void xmlFreeNs(xmlNsPtr cur);
+extern xmlDocPtr xmlNewDoc(const CHAR *version);
+extern void xmlFreeDoc(xmlDocPtr cur);
+extern xmlAttrPtr xmlNewProp(xmlNodePtr node, const CHAR *name,
+                             const CHAR *value);
+extern xmlAttrPtr xmlSetProp(xmlNodePtr node, const CHAR *name,
+                             const CHAR *value);
+extern const CHAR *xmlGetProp(xmlNodePtr node, const CHAR *name);
+extern void xmlFreePropList(xmlAttrPtr cur);
+extern void xmlFreeProp(xmlAttrPtr cur);
+extern xmlNodePtr xmlNewNode(xmlNsPtr ns, const CHAR *name, CHAR *content);
+extern xmlNodePtr xmlNewText(const CHAR *content);
+extern xmlNodePtr xmlNewTextLen(const CHAR *content, int len);
+extern xmlNodePtr xmlNewComment(CHAR *content);
+extern xmlNodePtr xmlAddChild(xmlNodePtr parent, xmlNodePtr cur);
+extern xmlNodePtr xmlGetLastChild(xmlNodePtr node);
+extern int xmlNodeIsText(xmlNodePtr node);
+extern void xmlTextConcat(xmlNodePtr node, const CHAR *content, int len);
+extern void xmlFreeNodeList(xmlNodePtr cur);
+extern void xmlFreeNode(xmlNodePtr cur);
+extern void xmlNodeSetContent(xmlNodePtr cur, const CHAR *content);
+extern void xmlNodeSetContentLen(xmlNodePtr cur, const CHAR *content, int len);
+extern void xmlNodeAddContent(xmlNodePtr cur, const CHAR *content);
+extern void xmlNodeAddContentLen(xmlNodePtr cur, const CHAR *content, int len);
+extern xmlNsPtr xmlSearchNs(xmlDocPtr doc, xmlNodePtr node,
+                            const CHAR *nameSpace);
+extern xmlNsPtr xmlSearchNsByHref(xmlDocPtr doc, xmlNodePtr node,
+                                  const CHAR *href);
+extern void xmlSetNs(xmlNodePtr node, xmlNsPtr ns);
+extern xmlNodePtr xmlNewChild(xmlNodePtr parent, xmlNsPtr ns,
+                              const CHAR *name, CHAR *content);
+
+extern void xmlDocDumpMemory(xmlDocPtr cur, CHAR**mem, int *size);
+extern void xmlDocDump(FILE *f, xmlDocPtr doc);
+extern void xmlBufferWriteCHAR(const CHAR *string);
+extern void xmlBufferWriteChar(const char *string);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __XML_TREE_H__ */
+