cleanup, creating a new legacy.c module, made sure make tests ran in

* Makefile.am: cleanup, creating a new legacy.c module,
  made sure make tests ran in reduced conditions
* SAX.c SAX2.c configure.in entities.c globals.c parser.c
  parserInternals.c tree.c valid.c xlink.c xmlIO.c xmlcatalog.c
  xmlmemory.c xpath.c xmlmemory.c include/libxml/xmlversion.h.in:
  increased the modularization, allow to configure out
  validation code and legacy code, added a configuration
  option --with-minimum compiling only the mandatory code
  which then shrink to 200KB.
Daniel
diff --git a/ChangeLog b/ChangeLog
index b2ea22b..0f4b2c9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+Sun Sep 28 20:53:17 CEST 2003 Daniel Veillard <daniel@veillard.com>
+
+	* Makefile.am: cleanup, creating a new legacy.c module,
+	  made sure make tests ran in reduced conditions
+	* SAX.c SAX2.c configure.in entities.c globals.c parser.c
+	  parserInternals.c tree.c valid.c xlink.c xmlIO.c xmlcatalog.c
+	  xmlmemory.c xpath.c xmlmemory.c include/libxml/xmlversion.h.in:
+	  increased the modularization, allow to configure out 
+	  validation code and legacy code, added a configuration
+	  option --with-minimum compiling only the mandatory code
+	  which then shrink to 200KB.
+
 Sun Sep 28 02:15:07 CEST 2003 Daniel Veillard <daniel@veillard.com>
 
 	* parser.c: fix a bug raised by the Mips compiler.
diff --git a/Makefile.am b/Makefile.am
index fd6fdf3..8fb810b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -26,7 +26,8 @@
 		xpointer.c xinclude.c nanohttp.c nanoftp.c DOCBparser.c \
 		catalog.c globals.c threads.c c14n.c \
 		xmlregexp.c xmlschemas.c xmlschemastypes.c xmlunicode.c \
-		triostr.c trio.c xmlreader.c relaxng.c dict.c SAX2.c
+		triostr.c trio.c xmlreader.c relaxng.c dict.c SAX2.c \
+		legacy.c
 else
 libxml2_la_SOURCES = SAX.c entities.c encoding.c error.c parserInternals.c  \
 		parser.c tree.c hash.c list.c xmlIO.c xmlmemory.c uri.c  \
@@ -34,7 +35,8 @@
 		xpointer.c xinclude.c nanohttp.c nanoftp.c DOCBparser.c \
 		catalog.c globals.c threads.c c14n.c \
 		xmlregexp.c xmlschemas.c xmlschemastypes.c xmlunicode.c \
-		xmlreader.c relaxng.c dict.c SAX2.c
+		xmlreader.c relaxng.c dict.c SAX2.c \
+		legacy.c
 endif
 
 DEPS = $(top_builddir)/libxml2.la
@@ -120,7 +122,7 @@
 
 testall : tests SVGtests SAXtests
 
-tests: XMLtests XMLenttests NStests Readertests SAXtests HTMLtests Validtests URItests XPathtests XPtrtests XIncludetests C14Ntests Scripttests Catatests @TEST_REGEXPS@ @TEST_SCHEMAS@ @TEST_THREADS@ Timingtests
+tests: XMLtests XMLenttests NStests Readertests SAXtests @TEST_HTML@ @TEST_VALID@ URItests @TEST_XPATH@ @TEST_XPTR@ @TEST_XINCLUDE@ @TEST_C14N@ @TEST_DEBUG@ @TEST_CATALOG@ @TEST_REGEXPS@ @TEST_SCHEMAS@ @TEST_THREADS@ Timingtests @TEST_VTIME@
 	@(if [ "@PYTHON_SUBDIR@" != "" ] ; then cd python ; $(MAKE) tests ; fi)
 
 valgrind:
@@ -720,7 +722,7 @@
 	@echo "## generating dba100000.xml"
 	@(dbgenattr.pl 100000 > $(srcdir)/dba100000.xml)
 
-Timingtests: $(srcdir)/dba100000.xml
+Timingtests: xmllint$(EXEEXT) $(srcdir)/dba100000.xml
 	@echo "##"
 	@echo "## Timing tests to try to detect performance"
 	@echo "## as well a memory usage breakage when streaming"
@@ -744,6 +746,8 @@
 	   if [ "$$MEM" != "" ] ; then echo Using $$MEM bytes ; fi ; \
 	   grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	   exit 0)
+
+VTimingtests: xmllint$(EXEEXT)
 	-@(xmllint --noout --timing --valid --repeat $(srcdir)/test/valid/REC-xml-19980210.xml; \
 	   MEM=`cat .memdump | grep "MEMORY ALLOCATED" | awk '{ print $$7}'`;\
 	   if [ "$$MEM" != "" ] ; then echo Using $$MEM bytes ; fi ; \
diff --git a/SAX.c b/SAX.c
index 417e450..b4a1aac 100644
--- a/SAX.c
+++ b/SAX.c
@@ -28,589 +28,6 @@
 #include <libxml/globals.h>
 #include <libxml/SAX2.h>
 
-/* #define DEBUG_SAX */
-/* #define DEBUG_SAX_TREE */
-
-static int deprecated_msg = 0;
-
-#define DEPRECATED(n)						\
-    if (deprecated_msg == 0)					\
-	xmlGenericError(xmlGenericErrorContext,			\
-	  "Use of deprecated SAXv1 function %s\n", n);		\
-    deprecated_msg++;
-
-/**
- * getPublicId:
- * @ctx: the user data (XML parser context)
- *
- * Provides the public ID e.g. "-//SGMLSOURCE//DTD DEMO//EN"
- * DEPRECATED: use xmlSAX2GetPublicId()
- *
- * Returns a xmlChar *
- */
-const xmlChar *
-getPublicId(void *ctx)
-{
-    DEPRECATED("getPublicId")
-    return(xmlSAX2GetPublicId(ctx));
-}
-
-/**
- * getSystemId:
- * @ctx: the user data (XML parser context)
- *
- * Provides the system ID, basically URL or filename e.g.
- * http://www.sgmlsource.com/dtds/memo.dtd
- * DEPRECATED: use xmlSAX2GetSystemId()
- *
- * Returns a xmlChar *
- */
-const xmlChar *
-getSystemId(void *ctx)
-{
-    DEPRECATED("getSystemId")
-    return(xmlSAX2GetSystemId(ctx)); 
-}
-
-/**
- * getLineNumber:
- * @ctx: the user data (XML parser context)
- *
- * Provide the line number of the current parsing point.
- * DEPRECATED: use xmlSAX2GetLineNumber()
- *
- * Returns an int
- */
-int
-getLineNumber(void *ctx)
-{
-    DEPRECATED("getLineNumber")
-    return(xmlSAX2GetLineNumber(ctx));
-}
-
-/**
- * getColumnNumber:
- * @ctx: the user data (XML parser context)
- *
- * Provide the column number of the current parsing point.
- * DEPRECATED: use xmlSAX2GetColumnNumber()
- *
- * Returns an int
- */
-int
-getColumnNumber(void *ctx)
-{
-    DEPRECATED("getColumnNumber")
-    return(xmlSAX2GetColumnNumber(ctx));
-}
-
-/**
- * isStandalone:
- * @ctx: the user data (XML parser context)
- *
- * Is this document tagged standalone ?
- * DEPRECATED: use xmlSAX2IsStandalone()
- *
- * Returns 1 if true
- */
-int
-isStandalone(void *ctx)
-{
-    DEPRECATED("isStandalone")
-    return(xmlSAX2IsStandalone(ctx));
-}
-
-/**
- * hasInternalSubset:
- * @ctx: the user data (XML parser context)
- *
- * Does this document has an internal subset
- * DEPRECATED: use xmlSAX2HasInternalSubset()
- *
- * Returns 1 if true
- */
-int
-hasInternalSubset(void *ctx)
-{
-    DEPRECATED("hasInternalSubset")
-    return(xmlSAX2HasInternalSubset(ctx));
-}
-
-/**
- * hasExternalSubset:
- * @ctx: the user data (XML parser context)
- *
- * Does this document has an external subset
- * DEPRECATED: use xmlSAX2HasExternalSubset()
- *
- * Returns 1 if true
- */
-int
-hasExternalSubset(void *ctx)
-{
-    DEPRECATED("hasExternalSubset")
-    return(xmlSAX2HasExternalSubset(ctx));
-}
-
-/**
- * internalSubset:
- * @ctx:  the user data (XML parser context)
- * @name:  the root element name
- * @ExternalID:  the external ID
- * @SystemID:  the SYSTEM ID (e.g. filename or URL)
- *
- * Callback on internal subset declaration.
- * DEPRECATED: use xmlSAX2InternalSubset()
- */
-void
-internalSubset(void *ctx, const xmlChar *name,
-	       const xmlChar *ExternalID, const xmlChar *SystemID)
-{
-    DEPRECATED("internalSubset")
-    xmlSAX2InternalSubset(ctx, name, ExternalID, SystemID);
-}
-
-/**
- * externalSubset:
- * @ctx: the user data (XML parser context)
- * @name:  the root element name
- * @ExternalID:  the external ID
- * @SystemID:  the SYSTEM ID (e.g. filename or URL)
- *
- * Callback on external subset declaration.
- * DEPRECATED: use xmlSAX2ExternalSubset()
- */
-void
-externalSubset(void *ctx, const xmlChar *name,
-	       const xmlChar *ExternalID, const xmlChar *SystemID)
-{
-    DEPRECATED("externalSubset")
-    xmlSAX2ExternalSubset(ctx, name, ExternalID, SystemID);
-}
-
-/**
- * resolveEntity:
- * @ctx: the user data (XML parser context)
- * @publicId: The public ID of the entity
- * @systemId: The system ID of the entity
- *
- * The entity loader, to control the loading of external entities,
- * the application can either:
- *    - override this resolveEntity() callback in the SAX block
- *    - or better use the xmlSetExternalEntityLoader() function to
- *      set up it's own entity resolution routine
- * DEPRECATED: use xmlSAX2ResolveEntity()
- *
- * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
- */
-xmlParserInputPtr
-resolveEntity(void *ctx, const xmlChar *publicId, const xmlChar *systemId)
-{
-    DEPRECATED("resolveEntity")
-    return(xmlSAX2ResolveEntity(ctx, publicId, systemId));
-}
-
-/**
- * getEntity:
- * @ctx: the user data (XML parser context)
- * @name: The entity name
- *
- * Get an entity by name
- * DEPRECATED: use xmlSAX2GetEntity()
- *
- * Returns the xmlEntityPtr if found.
- */
-xmlEntityPtr
-getEntity(void *ctx, const xmlChar *name)
-{
-    DEPRECATED("getEntity")
-    return(xmlSAX2GetEntity(ctx, name));
-}
-
-/**
- * getParameterEntity:
- * @ctx: the user data (XML parser context)
- * @name: The entity name
- *
- * Get a parameter entity by name
- * DEPRECATED: use xmlSAX2GetParameterEntity()
- *
- * Returns the xmlEntityPtr if found.
- */
-xmlEntityPtr
-getParameterEntity(void *ctx, const xmlChar *name)
-{
-    DEPRECATED("getParameterEntity")
-    return(xmlSAX2GetParameterEntity(ctx, name));
-}
-
-
-/**
- * entityDecl:
- * @ctx: the user data (XML parser context)
- * @name:  the entity name 
- * @type:  the entity type 
- * @publicId: The public ID of the entity
- * @systemId: The system ID of the entity
- * @content: the entity value (without processing).
- *
- * An entity definition has been parsed
- * DEPRECATED: use xmlSAX2EntityDecl()
- */
-void
-entityDecl(void *ctx, const xmlChar *name, int type,
-          const xmlChar *publicId, const xmlChar *systemId, xmlChar *content)
-{
-    DEPRECATED("entityDecl")
-    xmlSAX2EntityDecl(ctx, name, type, publicId, systemId, content);
-}
-
-/**
- * attributeDecl:
- * @ctx: the user data (XML parser context)
- * @elem:  the name of the element
- * @fullname:  the attribute name 
- * @type:  the attribute type 
- * @def:  the type of default value
- * @defaultValue: the attribute default value
- * @tree:  the tree of enumerated value set
- *
- * An attribute definition has been parsed
- * DEPRECATED: use xmlSAX2AttributeDecl()
- */
-void
-attributeDecl(void *ctx, const xmlChar *elem, const xmlChar *fullname,
-              int type, int def, const xmlChar *defaultValue,
-	      xmlEnumerationPtr tree)
-{
-    DEPRECATED("attributeDecl")
-    xmlSAX2AttributeDecl(ctx, elem, fullname, type, def, defaultValue, tree);
-}
-
-/**
- * elementDecl:
- * @ctx: the user data (XML parser context)
- * @name:  the element name 
- * @type:  the element type 
- * @content: the element value tree
- *
- * An element definition has been parsed
- * DEPRECATED: use xmlSAX2ElementDecl()
- */
-void
-elementDecl(void *ctx, const xmlChar * name, int type,
-            xmlElementContentPtr content)
-{
-    DEPRECATED("elementDecl")
-    xmlSAX2ElementDecl(ctx, name, type, content);
-}
-
-/**
- * notationDecl:
- * @ctx: the user data (XML parser context)
- * @name: The name of the notation
- * @publicId: The public ID of the entity
- * @systemId: The system ID of the entity
- *
- * What to do when a notation declaration has been parsed.
- * DEPRECATED: use xmlSAX2NotationDecl()
- */
-void
-notationDecl(void *ctx, const xmlChar *name,
-	     const xmlChar *publicId, const xmlChar *systemId)
-{
-    DEPRECATED("notationDecl")
-    xmlSAX2NotationDecl(ctx, name, publicId, systemId);
-}
-
-/**
- * unparsedEntityDecl:
- * @ctx: the user data (XML parser context)
- * @name: The name of the entity
- * @publicId: The public ID of the entity
- * @systemId: The system ID of the entity
- * @notationName: the name of the notation
- *
- * What to do when an unparsed entity declaration is parsed
- * DEPRECATED: use xmlSAX2UnparsedEntityDecl()
- */
-void
-unparsedEntityDecl(void *ctx, const xmlChar *name,
-		   const xmlChar *publicId, const xmlChar *systemId,
-		   const xmlChar *notationName)
-{
-    DEPRECATED("unparsedEntityDecl")
-    xmlSAX2UnparsedEntityDecl(ctx, name, publicId, systemId, notationName);
-}
-
-/**
- * setDocumentLocator:
- * @ctx: the user data (XML parser context)
- * @loc: A SAX Locator
- *
- * Receive the document locator at startup, actually xmlDefaultSAXLocator
- * Everything is available on the context, so this is useless in our case.
- * DEPRECATED
- */
-void
-setDocumentLocator(void *ctx ATTRIBUTE_UNUSED, xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED)
-{
-    DEPRECATED("setDocumentLocator")
-}
-
-/**
- * startDocument:
- * @ctx: the user data (XML parser context)
- *
- * called when the document start being processed.
- * DEPRECATED: use xmlSAX2StartDocument()
- */
-void
-startDocument(void *ctx)
-{
-    DEPRECATED("startDocument")
-    xmlSAX2StartDocument(ctx);
-}
-
-/**
- * endDocument:
- * @ctx: the user data (XML parser context)
- *
- * called when the document end has been detected.
- * DEPRECATED: use xmlSAX2EndDocument()
- */
-void
-endDocument(void *ctx)
-{
-    DEPRECATED("endDocument")
-    xmlSAX2EndDocument(ctx);
-}
-
-/**
- * attribute:
- * @ctx: the user data (XML parser context)
- * @fullname:  The attribute name, including namespace prefix
- * @value:  The attribute value
- *
- * Handle an attribute that has been read by the parser.
- * The default handling is to convert the attribute into an
- * DOM subtree and past it in a new xmlAttr element added to
- * the element.
- * DEPRECATED: use xmlSAX2Attribute()
- */
-void
-attribute(void *ctx ATTRIBUTE_UNUSED, const xmlChar *fullname ATTRIBUTE_UNUSED, const xmlChar *value ATTRIBUTE_UNUSED)
-{
-    DEPRECATED("attribute")
-}
-
-/**
- * startElement:
- * @ctx: the user data (XML parser context)
- * @fullname:  The element name, including namespace prefix
- * @atts:  An array of name/value attributes pairs, NULL terminated
- *
- * called when an opening tag has been processed.
- * DEPRECATED: use xmlSAX2StartElement()
- */
-void
-startElement(void *ctx, const xmlChar *fullname, const xmlChar **atts)
-{
-    DEPRECATED("startElement")
-    xmlSAX2StartElement(ctx, fullname, atts);
-}
-
-/**
- * endElement:
- * @ctx: the user data (XML parser context)
- * @name:  The element name
- *
- * called when the end of an element has been detected.
- * DEPRECATED: use xmlSAX2EndElement()
- */
-void
-endElement(void *ctx, const xmlChar *name ATTRIBUTE_UNUSED)
-{
-    DEPRECATED("endElement")
-    xmlSAX2EndElement(ctx, name);
-}
-
-/**
- * reference:
- * @ctx: the user data (XML parser context)
- * @name:  The entity name
- *
- * called when an entity reference is detected. 
- * DEPRECATED: use xmlSAX2Reference()
- */
-void
-reference(void *ctx, const xmlChar *name)
-{
-    DEPRECATED("reference")
-    xmlSAX2Reference(ctx, name);
-}
-
-/**
- * characters:
- * @ctx: the user data (XML parser context)
- * @ch:  a xmlChar string
- * @len: the number of xmlChar
- *
- * receiving some chars from the parser.
- * DEPRECATED: use xmlSAX2Characters()
- */
-void
-characters(void *ctx, const xmlChar *ch, int len)
-{
-    DEPRECATED("characters")
-    xmlSAX2Characters(ctx, ch, len);
-}
-
-/**
- * ignorableWhitespace:
- * @ctx: the user data (XML parser context)
- * @ch:  a xmlChar string
- * @len: the number of xmlChar
- *
- * receiving some ignorable whitespaces from the parser.
- * UNUSED: by default the DOM building will use characters
- * DEPRECATED: use xmlSAX2IgnorableWhitespace()
- */
-void
-ignorableWhitespace(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch ATTRIBUTE_UNUSED, int len ATTRIBUTE_UNUSED)
-{
-    DEPRECATED("ignorableWhitespace")
-}
-
-/**
- * processingInstruction:
- * @ctx: the user data (XML parser context)
- * @target:  the target name
- * @data: the PI data's
- *
- * A processing instruction has been parsed.
- * DEPRECATED: use xmlSAX2ProcessingInstruction()
- */
-void
-processingInstruction(void *ctx, const xmlChar *target,
-                      const xmlChar *data)
-{
-    DEPRECATED("processingInstruction")
-    xmlSAX2ProcessingInstruction(ctx, target, data);
-}
-
-/**
- * globalNamespace:
- * @ctx: the user data (XML parser context)
- * @href:  the namespace associated URN
- * @prefix: the namespace prefix
- *
- * An old global namespace has been parsed.
- * DEPRECATED
- */
-void
-globalNamespace(void *ctx ATTRIBUTE_UNUSED, const xmlChar *href ATTRIBUTE_UNUSED, const xmlChar *prefix ATTRIBUTE_UNUSED)
-{
-    DEPRECATED("globalNamespace")
-}
-
-/**
- * setNamespace:
- * @ctx: the user data (XML parser context)
- * @name:  the namespace prefix
- *
- * Set the current element namespace.
- * DEPRECATED
- */
-
-void
-setNamespace(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name ATTRIBUTE_UNUSED)
-{
-    DEPRECATED("setNamespace")
-}
-
-/**
- * getNamespace:
- * @ctx: the user data (XML parser context)
- *
- * Get the current element namespace.
- * DEPRECATED
- *
- * Returns the xmlNsPtr or NULL if none
- */
-
-xmlNsPtr
-getNamespace(void *ctx ATTRIBUTE_UNUSED)
-{
-    DEPRECATED("getNamespace")
-    return(NULL);
-}
-
-/**
- * checkNamespace:
- * @ctx: the user data (XML parser context)
- * @namespace: the namespace to check against
- *
- * Check that the current element namespace is the same as the
- * one read upon parsing.
- * DEPRECATED
- *
- * Returns 1 if true 0 otherwise
- */
-
-int
-checkNamespace(void *ctx ATTRIBUTE_UNUSED, xmlChar *namespace ATTRIBUTE_UNUSED)
-{
-    DEPRECATED("checkNamespace")
-    return(0);
-}
-
-/**
- * namespaceDecl:
- * @ctx: the user data (XML parser context)
- * @href:  the namespace associated URN
- * @prefix: the namespace prefix
- *
- * A namespace has been parsed.
- * DEPRECATED
- */
-void
-namespaceDecl(void *ctx ATTRIBUTE_UNUSED, const xmlChar *href ATTRIBUTE_UNUSED, const xmlChar *prefix ATTRIBUTE_UNUSED)
-{
-    DEPRECATED("namespaceDecl")
-}
-
-/**
- * comment:
- * @ctx: the user data (XML parser context)
- * @value:  the comment content
- *
- * A comment has been parsed.
- * DEPRECATED: use xmlSAX2Comment()
- */
-void
-comment(void *ctx, const xmlChar *value)
-{
-    DEPRECATED("comment")
-    xmlSAX2Comment(ctx, value);
-}
-
-/**
- * cdataBlock:
- * @ctx: the user data (XML parser context)
- * @value:  The pcdata content
- * @len:  the block length
- *
- * called when a pcdata block has been parsed
- * DEPRECATED: use xmlSAX2CDataBlock()
- */
-void
-cdataBlock(void *ctx, const xmlChar *value, int len)
-{
-    DEPRECATED("cdataBlock")
-    xmlSAX2CDataBlock(ctx, value, len);
-}
-
 /**
  * initxmlDefaultSAXHandler:
  * @hdlr:  the SAX handler
diff --git a/SAX2.c b/SAX2.c
index 0625b8a..261842f 100644
--- a/SAX2.c
+++ b/SAX2.c
@@ -560,12 +560,14 @@
 	xmlFreeEnumeration(tree);
 	return;
     }
+#ifdef LIBXML_VALID_ENABLED
     if (ctxt->vctxt.valid == 0)
 	ctxt->valid = 0;
     if ((attr != NULL) && (ctxt->validate) && (ctxt->wellFormed) &&
         (ctxt->myDoc != NULL) && (ctxt->myDoc->intSubset != NULL))
 	ctxt->valid &= xmlValidateAttributeDecl(&ctxt->vctxt, ctxt->myDoc,
 	                                        attr);
+#endif /* LIBXML_VALID_ENABLED */
     if (prefix != NULL)
 	xmlFree(prefix);
     if (name != NULL)
@@ -606,12 +608,14 @@
                              name);
         return;
     }
+#ifdef LIBXML_VALID_ENABLED
     if (elem == NULL)
         ctxt->valid = 0;
     if (ctxt->validate && ctxt->wellFormed &&
         ctxt->myDoc && ctxt->myDoc->intSubset)
         ctxt->valid &=
             xmlValidateElementDecl(&ctxt->vctxt, ctxt->myDoc, elem);
+#endif /* LIBXML_VALID_ENABLED */
 }
 
 /**
@@ -654,11 +658,13 @@
 	     "SAX.xmlSAX2NotationDecl(%s) called while not in subset\n", name);
 	return;
     }
+#ifdef LIBXML_VALID_ENABLED
     if (nota == NULL) ctxt->valid = 0;
     if (ctxt->validate && ctxt->wellFormed &&
         ctxt->myDoc && ctxt->myDoc->intSubset)
 	ctxt->valid &= xmlValidateNotationDecl(&ctxt->vctxt, ctxt->myDoc,
 	                                       nota);
+#endif /* LIBXML_VALID_ENABLED */
 }
 
 /**
@@ -827,9 +833,11 @@
     xmlGenericError(xmlGenericErrorContext,
 	    "SAX.xmlSAX2EndDocument()\n");
 #endif
+#ifdef LIBXML_VALID_ENABLED
     if (ctxt->validate && ctxt->wellFormed &&
         ctxt->myDoc && ctxt->myDoc->intSubset)
 	ctxt->valid &= xmlValidateDocumentFinal(&ctxt->vctxt, ctxt->myDoc);
+#endif /* LIBXML_VALID_ENABLED */
 
     /*
      * Grab the encoding if it was added on-the-fly
@@ -904,6 +912,7 @@
 	return;
     }
 
+#ifdef LIBXML_VALID_ENABLED
     /*
      * Do the last stage of the attribute normalization
      * Needed for HTML too:
@@ -918,6 +927,9 @@
     }
     if (nval != NULL)
 	value = nval;
+#else
+    nval = NULL;
+#endif /* LIBXML_VALID_ENABLED */
 
     /*
      * Check whether it's a namespace definition
@@ -958,6 +970,7 @@
 	/* a default namespace definition */
 	nsret = xmlNewNs(ctxt->node, val, NULL);
 
+#ifdef LIBXML_VALID_ENABLED
 	/*
 	 * Validate also for namespace decls, they are attributes from
 	 * an XML-1.0 perspective
@@ -966,6 +979,7 @@
 	    ctxt->myDoc && ctxt->myDoc->intSubset)
 	    ctxt->valid &= xmlValidateOneNamespace(&ctxt->vctxt, ctxt->myDoc,
 					   ctxt->node, prefix, nsret, val);
+#endif /* LIBXML_VALID_ENABLED */
 	if (name != NULL) 
 	    xmlFree(name);
 	if (nval != NULL)
@@ -1027,6 +1041,7 @@
 	/* a standard namespace definition */
 	nsret = xmlNewNs(ctxt->node, val, name);
 	xmlFree(ns);
+#ifdef LIBXML_VALID_ENABLED
 	/*
 	 * Validate also for namespace decls, they are attributes from
 	 * an XML-1.0 perspective
@@ -1035,6 +1050,7 @@
 	    ctxt->myDoc && ctxt->myDoc->intSubset)
 	    ctxt->valid &= xmlValidateOneNamespace(&ctxt->vctxt, ctxt->myDoc,
 					   ctxt->node, prefix, nsret, value);
+#endif /* LIBXML_VALID_ENABLED */
 	if (name != NULL) 
 	    xmlFree(name);
 	if (nval != NULL)
@@ -1099,6 +1115,7 @@
 	}
     }
 
+#ifdef LIBXML_VALID_ENABLED
     if ((!ctxt->html) && ctxt->validate && ctxt->wellFormed &&
         ctxt->myDoc && ctxt->myDoc->intSubset) {
 	
@@ -1140,7 +1157,9 @@
 	    ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt, ctxt->myDoc,
 					       ctxt->node, ret, value);
 	}
-    } else if (((ctxt->loadsubset & XML_SKIP_IDS) == 0) &&
+    } else
+#endif /* LIBXML_VALID_ENABLED */
+           if (((ctxt->loadsubset & XML_SKIP_IDS) == 0) &&
 	       (((ctxt->replaceEntities == 0) && (ctxt->external != 2)) ||
 	        ((ctxt->replaceEntities != 0) && (ctxt->inSubset == 0)))) {
         /*
@@ -1500,6 +1519,7 @@
 	}
     }
 
+#ifdef LIBXML_VALID_ENABLED
     /*
      * If it's the Document root, finish the DTD validation and
      * check the document root element for validity
@@ -1515,6 +1535,7 @@
 	ctxt->valid &= xmlValidateRoot(&ctxt->vctxt, ctxt->myDoc);
 	ctxt->vctxt.finishDtd = 1;
     }
+#endif /* LIBXML_VALID_ENABLED */
 
     if (prefix != NULL)
 	xmlFree(prefix);
@@ -1551,10 +1572,12 @@
     }
     ctxt->nodemem = -1;
 
+#ifdef LIBXML_VALID_ENABLED
     if (ctxt->validate && ctxt->wellFormed &&
         ctxt->myDoc && ctxt->myDoc->intSubset)
         ctxt->valid &= xmlValidateOneElement(&ctxt->vctxt, ctxt->myDoc,
 					     cur);
+#endif /* LIBXML_VALID_ENABLED */
 
     
     /*
@@ -1636,6 +1659,7 @@
     return(ret);
 }
 
+#ifdef LIBXML_VALID_ENABLED
 /*
  * xmlSAX2DecodeAttrEntities:
  * @ctxt:  the parser context
@@ -1664,6 +1688,7 @@
     ctxt->depth--;
     return(ret);
 }
+#endif /* LIBXML_VALID_ENABLED */
 
 /**
  * xmlSAX2AttributeNs:
@@ -1781,6 +1806,7 @@
 	}
     }
 
+#ifdef LIBXML_VALID_ENABLED
     if ((!ctxt->html) && ctxt->validate && ctxt->wellFormed &&
         ctxt->myDoc && ctxt->myDoc->intSubset) {
 	/*
@@ -1848,7 +1874,9 @@
 	    ctxt->valid &= xmlValidateOneAttribute(&ctxt->vctxt,
 	                             ctxt->myDoc, ctxt->node, ret, dup);
 	}
-    } else if (((ctxt->loadsubset & XML_SKIP_IDS) == 0) &&
+    } else
+#endif /* LIBXML_VALID_ENABLED */
+           if (((ctxt->loadsubset & XML_SKIP_IDS) == 0) &&
 	       (((ctxt->replaceEntities == 0) && (ctxt->external != 2)) ||
 	        ((ctxt->replaceEntities != 0) && (ctxt->inSubset == 0)))) {
         /*
@@ -1985,11 +2013,13 @@
 	    ctxt->disableSAX = 1;
 	    return;
 	}
+#ifdef LIBXML_VALID_ENABLED
 	if ((!ctxt->html) && ctxt->validate && ctxt->wellFormed &&
 	    ctxt->myDoc && ctxt->myDoc->intSubset) {
 	    ctxt->valid &= xmlValidateOneNamespace(&ctxt->vctxt, ctxt->myDoc,
 	                                           ret, prefix, ns, uri);
 	}
+#endif /* LIBXML_VALID_ENABLED */
     }
     ctxt->nodemem = -1;
 
@@ -2039,6 +2069,7 @@
 	}
     }
 
+#ifdef LIBXML_VALID_ENABLED
     /*
      * If it's the Document root, finish the DTD validation and
      * check the document root element for validity
@@ -2054,6 +2085,7 @@
 	ctxt->valid &= xmlValidateRoot(&ctxt->vctxt, ctxt->myDoc);
 	ctxt->vctxt.finishDtd = 1;
     }
+#endif /* LIBXML_VALID_ENABLED */
 }
 
 /**
@@ -2085,9 +2117,11 @@
     }
     ctxt->nodemem = -1;
 
+#ifdef LIBXML_VALID_ENABLED
     if (ctxt->validate && ctxt->wellFormed &&
         ctxt->myDoc && ctxt->myDoc->intSubset)
         ctxt->valid &= xmlValidateOneElement(&ctxt->vctxt, ctxt->myDoc, cur);
+#endif /* LIBXML_VALID_ENABLED */
 
     /*
      * end of parsing of this node.
diff --git a/configure.in b/configure.in
index 320784d..57bafa0 100644
--- a/configure.in
+++ b/configure.in
@@ -43,6 +43,15 @@
 
 AM_MAINTAINER_MODE
 
+dnl
+dnl option to build a minimal libxml2 library
+dnl
+AC_ARG_WITH(minimum, [  --with-minimum          build a minimally sized library (off)])
+if test "$with_minimum" = "yes"
+then
+    echo "Configuring for a minimal library"
+fi
+
 dnl Checks for zlib library.
 _cppflags="${CPPFLAGS}"
 _ldflags="${LDFLAGS}"
@@ -56,6 +65,10 @@
     LDFLAGS="${LDFLAGS} -L$withval/lib"
   fi
 ])
+if test "$with_minimum" = "yes" -a "$with_zlib" = ""
+then
+    with_zlib=no
+fi
 if test "$with_zlib" = "no"; then
     echo "Disabling compression support"
 else
@@ -197,6 +210,10 @@
 
 AC_MSG_CHECKING([whether to enable IPv6])
 AC_ARG_ENABLE(ipv6, [ --enable-ipv6=[yes/no] enables compilation of IPv6 code],, enable_ipv6=yes)
+if test "$with_minimum" = "yes"
+then
+    enable_ipv6=no
+fi
 if test $enable_ipv6 = yes; then
   have_ipv6=no
   AC_TRY_COMPILE([
@@ -247,6 +264,10 @@
 
 AC_ARG_WITH(fexceptions,
 [  --with-fexceptions      add GCC flag -fexceptions for C++ exceptions (off)])
+if test "$with_minimum" = "yes" -a "$with_fexceptions" = ""
+then
+    with_fexceptions=no
+fi
 dnl
 dnl Workaround for native compilers
 dnl  HP  : http://bugs.gnome.org/db/31/3163.html
@@ -305,6 +326,10 @@
 pythondir=
 AC_ARG_WITH(python,
 [  --with-python[[=DIR]]     build Python bindings if found])
+if test "$with_minimum" = "yes" -a "$with_python" = ""
+then
+    with_python=no
+fi
 if test "$with_python" != "no" ; then
     if test -x "$with_python/bin/python"
     then
@@ -382,17 +407,24 @@
     LDFLAGS="${LDFLAGS} -L$withval/lib"
   fi
 ])
+if test "$with_minimum" = "yes" -a "$with_readline" = ""
+then
+    with_readline=no
+fi
 
 dnl
 dnl specific tests to setup DV's devel environment with debug etc ...
 dnl (-Wunreachable-code)
 dnl
 if test "${LOGNAME}" = "veillard" -a "`pwd`" = "/u/veillard/XML" ; then
-    if test "${with_mem_debug}" = "" ; then
-        with_mem_debug="yes"
-    fi
-    if test "${with_docbook}" = "" ; then
-        with_docbook="yes"
+    if test "$with_minimum" != "yes"
+    then
+	if test "${with_mem_debug}" = "" ; then
+	    with_mem_debug="yes"
+	fi
+	if test "${with_docbook}" = "" ; then
+	    with_docbook="yes"
+	fi
     fi
     CFLAGS="-g -O -pedantic -W -Wunused -Wimplicit -Wreturn-type -Wswitch -Wcomment -Wtrigraphs -Wformat -Wchar-subscripts -Wuninitialized -Wparentheses -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wredundant-decls "
     STATIC_BINARIES="-static"
@@ -426,6 +458,10 @@
 
 AC_ARG_WITH(threads,
 [  --with-threads          add multithread support(on)])
+if test "$with_minimum" = "yes" -a "$with_threads" = ""
+then
+    with_threads=no
+fi
 if test "$with_threads" = "no" ; then
     echo Disabling multithreaded support
 else
@@ -445,6 +481,10 @@
 fi
 AC_ARG_WITH(thread-alloc,
 [  --with-thread-alloc     add per-thread memory(off)])
+if test "$with_minimum" = "yes" -a "$with_thread_alloc" = ""
+then
+    with_thread_alloc=no
+fi
 if test "$with_threads_alloc" = "yes" -a "$WITH_THREADS" = "1" ; then
     THREAD_CFLAGS="$THREAD_CFLAGS -DLIBXML_THREAD_ALLOC_ENABLED"
 fi
@@ -456,6 +496,10 @@
 
 AC_ARG_WITH(history,
 [  --with-history          add history support to xmllint shell(off)])
+if test "$with_minimum" = "yes" -a "$with_history" = ""
+then
+    with_history=no
+fi
 if test "$with_history" = "yes" ; then
     echo Enabling xmllint shell history
     dnl check for terminal library. this is a very cool solution
@@ -487,6 +531,10 @@
 AC_SUBST(FTP_OBJ)
 AC_ARG_WITH(ftp,
 [  --with-ftp              add the FTP support (on)])
+if test "$with_minimum" = "yes" -a "$with_ftp" = ""
+then
+    with_ftp=no
+fi
 if test "$with_ftp" = "no" ; then
     echo Disabling FTP support
     WITH_FTP=0
@@ -500,6 +548,10 @@
 
 AC_ARG_WITH(http,
 [  --with-http             add the HTTP support (on)])
+if test "$with_minimum" = "yes" -a "$with_http" = ""
+then
+    with_http=no
+fi
 if test "$with_http" = "no" ; then
     echo Disabling HTTP support
     WITH_HTTP=0
@@ -513,32 +565,84 @@
 
 AC_ARG_WITH(html,
 [  --with-html             add the HTML support (on)])
+if test "$with_minimum" = "yes" -a "$with_html" = ""
+then
+    with_html=no
+fi
 if test "$with_html" = "no" ; then
     echo Disabling HTML support
     WITH_HTML=0
     HTML_OBJ=
+    TEST_HTML=
 else    
     WITH_HTML=1
     HTML_OBJ="HTMLparser.o HTMLtree.o"
+    TEST_HTML=HTMLtests
 fi
 AC_SUBST(WITH_HTML)
 AC_SUBST(HTML_OBJ)
+AC_SUBST(TEST_HTML)
+
+AC_ARG_WITH(legacy,
+[  --with-legacy             add deprecated APIs for compatibility (on)])
+if test "$with_minimum" = "yes" -a "$with_legacy" = ""
+then
+    with_legacy=no
+fi
+if test "$with_legacy" = "no" ; then
+    echo Disabling deprecated APIs
+    WITH_LEGACY=0
+else    
+    WITH_LEGACY=1
+fi
+AC_SUBST(WITH_LEGACY)
+
+AC_ARG_WITH(valid,
+[  --with-valid            add the DTD validation support (on)])
+if test "$with_minimum" = "yes" -a "$with_valid" = ""
+then
+    with_valid=no
+fi
+if test "$with_html" = "no" ; then
+    echo Disabling DTD validation support
+    WITH_VALID=0
+    TEST_VALID=
+    TEST_VTIME=
+else    
+    WITH_VALID=1
+    TEST_VALID=Validtests
+    TEST_VTIME=VTimingtests
+fi
+AC_SUBST(WITH_VALID)
+AC_SUBST(TEST_VALID)
+AC_SUBST(TEST_VTIME)
 
 AC_ARG_WITH(catalog,
 [  --with-catalog          add the Catalog support (on)])
+if test "$with_minimum" = "yes" -a "$with_catalog" = ""
+then
+    with_catalog=no
+fi
 if test "$with_catalog" = "no" ; then
     echo Disabling Catalog support
     WITH_CATALOG=0
     CATALOG_OBJ=
+    TEST_CATALOG=
 else    
     WITH_CATALOG=1
     CATALOG_OBJ="catalog.o"
+    TEST_CATALOG=Catatests
 fi
 AC_SUBST(WITH_CATALOG)
 AC_SUBST(CATALOG_OBJ)
+AC_SUBST(TEST_CATALOG)
 
 AC_ARG_WITH(docbook,
 [  --with-docbook          add Docbook SGML support (on)])
+if test "$with_minimum" = "yes" -a "$with_docbook" = ""
+then
+    with_docbook=no
+fi
 if test "$with_docbook" = "no" ; then
     echo Disabling Docbook support
     WITH_DOCB=0
@@ -553,6 +657,10 @@
 
 AC_ARG_WITH(xpath,
 [  --with-xpath            add the XPATH support (on)])
+if test "$with_minimum" = "yes" -a "$with_xpath" = ""
+then
+    with_xpath=no
+fi
 if test "$with_xpath" = "no" ; then
     echo Disabling XPATH support
     with_xptr="no"
@@ -560,56 +668,84 @@
     with_xinclude="no"
     WITH_XPATH=0
     XPATH_OBJ=
+    TEST_XPATH=
 else    
     WITH_XPATH=1
     XPATH_OBJ=xpath.o
+    TEST_XPATH=XPathtests
 fi
 AC_SUBST(WITH_XPATH)
 AC_SUBST(XPATH_OBJ)
+AC_SUBST(TEST_XPATH)
 
 AC_ARG_WITH(xptr,
 [  --with-xptr             add the XPointer support (on)])
+if test "$with_minimum" = "yes" -a "$with_xptr" = ""
+then
+    with_xptr=no
+fi
 if test "$with_xptr" = "no" ; then
     echo Disabling XPointer support
     WITH_XPTR=0
     XPTR_OBJ=
+    TEST_XPTR=
 else    
     WITH_XPTR=1
     XPTR_OBJ=xpointer.o
+    TEST_XPTR=XPtrtests
 fi
 AC_SUBST(WITH_XPTR)
 AC_SUBST(XPTR_OBJ)
+AC_SUBST(TEST_XPTR)
 
 AC_ARG_WITH(c14n,
 [  --with-c14n             add the Canonicalization support (on)])
+if test "$with_minimum" = "yes" -a "$with_c14n" = ""
+then
+    with_c14n=no
+fi
 if test "$with_c14n" = "no" ; then
     echo Disabling C14N support
     WITH_C14N=0
     C14N_OBJ=
+    TEST_C14N=
 else    
     WITH_C14N=1
     C14N_OBJ="c14n.c"
+    TEST_C14N=C14Ntests
 fi
 AC_SUBST(WITH_C14N)
 AC_SUBST(C14N_OBJ)
+AC_SUBST(TEST_C14N)
 
 AC_ARG_WITH(xinclude,
 [  --with-xinclude         add the XInclude support (on)])
+if test "$with_minimum" = "yes" -a "$with_xinclude" = ""
+then
+    with_xinclude=no
+fi
 if test "$with_xinclude" = "no" ; then
     echo Disabling XInclude support
     WITH_XINCLUDE=0
     XINCLUDE_OBJ=
     with_xinclude="no"
+    TEST_XINCLUDE=
 else    
     WITH_XINCLUDE=1
     XINCLUDE_OBJ=xinclude.o
+    TEST_XINCLUDE=XIncludetests
 fi
 AC_SUBST(WITH_XINCLUDE)
 AC_SUBST(XINCLUDE_OBJ)
+AC_SUBST(TEST_XINCLUDE)
 
 WITH_ICONV=0
 AC_ARG_WITH(iconv,
 [  --with-iconv[[=DIR]]      add ICONV support (on)])
+if test "$with_minimum" = "yes" -a "$with_iconv" = ""
+then
+    with_iconv=no
+fi
 if test "$with_iconv" = "no" ; then
     echo Disabling ICONV support
 else
@@ -657,6 +793,10 @@
 WITH_ISO8859X=1
 AC_ARG_WITH(iso8859x,
 [  --with-iso8859x         add ISO8859X support if no iconv (on)])
+if test "$with_minimum" = "yes" -a "$with_iso8859x" = ""
+then
+    with_iso8859x=no
+fi
 if test "$WITH_ICONV" != "1" ; then
 if test "$with_iso8859x" = "no" ; then
     echo Disabling ISO8859X support
@@ -667,6 +807,10 @@
 
 AC_ARG_WITH(schemas,
 [  --with-schemas          add experimental Schemas/RelaxNG support (on)])
+if test "$with_minimum" = "yes" -a "$with_schemas" = ""
+then
+    with_schemas=no
+fi
 if test "$with_schemas" = "no" ; then
     echo "Disabled Schemas/Relax-NG support"
     WITH_SCHEMAS=0
@@ -682,6 +826,10 @@
 
 AC_ARG_WITH(regexps,
 [  --with-regexps          add Regular Expressions support (on)])
+if test "$with_minimum" = "yes" -a "$with_regexps" = ""
+then
+    with_regexps=no
+fi
 if test "$with_regexps" = "no" ; then
     echo Disabling Regexps support
     WITH_REGEXPS=0
@@ -695,19 +843,30 @@
 
 AC_ARG_WITH(debug,
 [  --with-debug            add the debugging module (on)])
+if test "$with_minimum" = "yes" -a "$with_debug" = ""
+then
+    with_debug=no
+fi
 if test "$with_debug" = "no" ; then
     echo Disabling DEBUG support
     WITH_DEBUG=0
     DEBUG_OBJ=
+    TEST_DEBUG=
 else    
     WITH_DEBUG=1
     DEBUG_OBJ=debugXML.o
+    TEST_DEBUG=Scripttests
 fi
 AC_SUBST(WITH_DEBUG)
 AC_SUBST(DEBUG_OBJ)
+AC_SUBST(TEST_DEBUG)
 
 AC_ARG_WITH(mem_debug,
 [  --with-mem-debug        add the memory debugging module (off)])
+if test "$with_minimum" = "yes" -a "$with_mem_debug" = ""
+then
+    with_mem_debug=no
+fi
 if test "$with_mem_debug" = "yes" ; then
     echo Enabling memory debug support
     WITH_MEM_DEBUG=1
diff --git a/doc/libxml2-api.xml b/doc/libxml2-api.xml
index b120ac3..402fcd8 100644
--- a/doc/libxml2-api.xml
+++ b/doc/libxml2-api.xml
@@ -1380,6 +1380,7 @@
      <exports symbol='xmlTextReaderNodeType'/>
      <exports symbol='xmlTextReaderNormalization'/>
      <exports symbol='xmlTextReaderPrefix'/>
+     <exports symbol='xmlTextReaderPreserve'/>
      <exports symbol='xmlTextReaderPtr'/>
      <exports symbol='xmlTextReaderQuoteChar'/>
      <exports symbol='xmlTextReaderRead'/>
@@ -7012,7 +7013,7 @@
       <arg name='publicID' type='const xmlChar *' info='the public identifier'/>
     </function>
     <function name='xmlKeepBlanksDefault' file='parser'>
-      <info>Set and return the previous value for default blanks text nodes support. The 1.x version of the parser used an heuristic to try to detect ignorable white spaces. As a result the SAX callback was generating ignorableWhitespace() callbacks instead of characters() one, and when using the DOM output text nodes containing those blanks were not generated. The 2.x and later version will switch to the XML standard way and ignorableWhitespace() are only generated when running the parser in validating mode and when the current element doesn&apos;t allow CDATA or mixed content. This function is provided as a way to force the standard behavior on 1.X libs and to switch back to the old mode for compatibility when running 1.X client code on 2.X . Upgrade of 1.X code should be done by using xmlIsBlankNode() commodity function to detect the &quot;empty&quot; nodes generated. This value also affect autogeneration of indentation when saving code if blanks sections are kept, indentation is not generated.</info>
+      <info>Set and return the previous value for default blanks text nodes support. The 1.x version of the parser used an heuristic to try to detect ignorable white spaces. As a result the SAX callback was generating xmlSAX2IgnorableWhitespace() callbacks instead of characters() one, and when using the DOM output text nodes containing those blanks were not generated. The 2.x and later version will switch to the XML standard way and ignorableWhitespace() are only generated when running the parser in validating mode and when the current element doesn&apos;t allow CDATA or mixed content. This function is provided as a way to force the standard behavior on 1.X libs and to switch back to the old mode for compatibility when running 1.X client code on 2.X . Upgrade of 1.X code should be done by using xmlIsBlankNode() commodity function to detect the &quot;empty&quot; nodes generated. This value also affect autogeneration of indentation when saving code if blanks sections are kept, indentation is not generated.</info>
       <return type='int' info='the last value for 0 for no substitution, 1 for substitution.'/>
       <arg name='val' type='int' info='int 0 or 1'/>
     </function>
@@ -10064,6 +10065,11 @@
       <return type='xmlChar *' info='the prefix or NULL if not available'/>
       <arg name='reader' type='xmlTextReaderPtr' info='the xmlTextReaderPtr used'/>
     </function>
+    <function name='xmlTextReaderPreserve' file='xmlreader'>
+      <info>current node being accessed by the xmlTextReader. This is dangerous because the underlying node may be destroyed on the next Reads.</info>
+      <return type='xmlNodePtr' info='the xmlNodePtr or NULL in case of error.'/>
+      <arg name='reader' type='xmlTextReaderPtr' info='the xmlTextReaderPtr used'/>
+    </function>
     <function name='xmlTextReaderQuoteChar' file='xmlreader'>
       <info>The quotation mark character used to enclose the value of an attribute.</info>
       <return type='int' info='&quot; or &apos; and -1 in case of error'/>
diff --git a/entities.c b/entities.c
index 1ab70bd..ae6fe48 100644
--- a/entities.c
+++ b/entities.c
@@ -413,150 +413,6 @@
      (((c) >= 0x20) && ((c) != 0xFFFE) && ((c) != 0xFFFF)))
 
 /*
- * A buffer used for converting entities to their equivalent and back.
- */
-static int static_buffer_size = 0;
-static xmlChar *static_buffer = NULL;
-
-static int growBuffer(void) {
-    static_buffer_size *= 2;
-    static_buffer = (xmlChar *) xmlRealloc(static_buffer,
-	                                static_buffer_size * sizeof(xmlChar));
-    if (static_buffer == NULL) {
-        xmlGenericError(xmlGenericErrorContext, "malloc failed\n");
-	return(-1);
-    }
-    return(0);
-}
-
-
-/**
- * xmlEncodeEntities:
- * @doc:  the document containing the string
- * @input:  A string to convert to XML.
- *
- * Do a global encoding of a string, replacing the predefined entities
- * and non ASCII values with their entities and CharRef counterparts.
- *
- * TODO: remove xmlEncodeEntities, once we are not afraid of breaking binary
- *       compatibility
- *
- * People must migrate their code to xmlEncodeEntitiesReentrant !
- * This routine will issue a warning when encountered.
- * 
- * Returns A newly allocated string with the substitution done.
- */
-const xmlChar *
-xmlEncodeEntities(xmlDocPtr doc, const xmlChar *input) {
-    const xmlChar *cur = input;
-    xmlChar *out = static_buffer;
-    static int warning = 1;
-    int html = 0;
-
-
-    if (warning) {
-    xmlGenericError(xmlGenericErrorContext,
-	    "Deprecated API xmlEncodeEntities() used\n");
-    xmlGenericError(xmlGenericErrorContext,
-	    "   change code to use xmlEncodeEntitiesReentrant()\n");
-    warning = 0;
-    }
-
-    if (input == NULL) return(NULL);
-    if (doc != NULL)
-        html = (doc->type == XML_HTML_DOCUMENT_NODE);
-
-    if (static_buffer == NULL) {
-        static_buffer_size = 1000;
-        static_buffer = (xmlChar *)
-	    xmlMalloc(static_buffer_size * sizeof(xmlChar));
-	if (static_buffer == NULL) {
-	    xmlGenericError(xmlGenericErrorContext, "malloc failed\n");
-            return(NULL);
-	}
-	out = static_buffer;
-    }
-    while (*cur != '\0') {
-        if (out - static_buffer > static_buffer_size - 100) {
-	    int indx = out - static_buffer;
-
-	    growBuffer();
-	    out = &static_buffer[indx];
-	}
-
-	/*
-	 * By default one have to encode at least '<', '>', '"' and '&' !
-	 */
-	if (*cur == '<') {
-	    *out++ = '&';
-	    *out++ = 'l';
-	    *out++ = 't';
-	    *out++ = ';';
-	} else if (*cur == '>') {
-	    *out++ = '&';
-	    *out++ = 'g';
-	    *out++ = 't';
-	    *out++ = ';';
-	} else if (*cur == '&') {
-	    *out++ = '&';
-	    *out++ = 'a';
-	    *out++ = 'm';
-	    *out++ = 'p';
-	    *out++ = ';';
-	} else if (*cur == '"') {
-	    *out++ = '&';
-	    *out++ = 'q';
-	    *out++ = 'u';
-	    *out++ = 'o';
-	    *out++ = 't';
-	    *out++ = ';';
-	} else if ((*cur == '\'') && (!html)) {
-	    *out++ = '&';
-	    *out++ = 'a';
-	    *out++ = 'p';
-	    *out++ = 'o';
-	    *out++ = 's';
-	    *out++ = ';';
-	} else if (((*cur >= 0x20) && (*cur < 0x80)) ||
-	    (*cur == '\n') || (*cur == '\r') || (*cur == '\t')) {
-	    /*
-	     * default case, just copy !
-	     */
-	    *out++ = *cur;
-#ifndef USE_UTF_8
-	} else if ((sizeof(xmlChar) == 1) && (*cur >= 0x80)) {
-	    char buf[10], *ptr;
-
-	    snprintf(buf, sizeof(buf), "&#%d;", *cur);
-            buf[sizeof(buf) - 1] = 0;
-            ptr = buf;
-	    while (*ptr != 0) *out++ = *ptr++;
-#endif
-	} else if (IS_CHAR((unsigned int) *cur)) {
-	    char buf[10], *ptr;
-
-	    snprintf(buf, sizeof(buf), "&#%d;", *cur);
-            buf[sizeof(buf) - 1] = 0;
-            ptr = buf;
-	    while (*ptr != 0) *out++ = *ptr++;
-	}
-#if 0
-	else {
-	    /*
-	     * default case, this is not a valid char !
-	     * Skip it...
-	     */
-	    xmlGenericError(xmlGenericErrorContext,
-		    "xmlEncodeEntities: invalid char %d\n", (int) *cur);
-	}
-#endif
-	cur++;
-    }
-    *out++ = 0;
-    return(static_buffer);
-}
-
-/*
  * Macro used to grow the current buffer.
  */
 #define growBufferReentrant() {						\
@@ -632,22 +488,6 @@
 	    *out++ = 'm';
 	    *out++ = 'p';
 	    *out++ = ';';
-#if 0
-	} else if (*cur == '"') {
-	    *out++ = '&';
-	    *out++ = 'q';
-	    *out++ = 'u';
-	    *out++ = 'o';
-	    *out++ = 't';
-	    *out++ = ';';
-	} else if ((*cur == '\'') && (!html)) {
-	    *out++ = '&';
-	    *out++ = 'a';
-	    *out++ = 'p';
-	    *out++ = 'o';
-	    *out++ = 's';
-	    *out++ = ';';
-#endif
 	} else if (((*cur >= 0x20) && (*cur < 0x80)) ||
 	    (*cur == '\n') || (*cur == '\t') || ((html) && (*cur == '\r'))) {
 	    /*
@@ -739,16 +579,6 @@
             ptr = buf;
 	    while (*ptr != 0) *out++ = *ptr++;
 	}
-#if 0
-	else {
-	    /*
-	     * default case, this is not a valid char !
-	     * Skip it...
-	     */
-	    xmlGenericError(xmlGenericErrorContext,
-		    "xmlEncodeEntities: invalid char %d\n", (int) *cur);
-	}
-#endif
 	cur++;
     }
     *out++ = 0;
@@ -771,12 +601,6 @@
     xmlChar *buffer = NULL;
     xmlChar *out = NULL;
     int buffer_size = 0;
-#if 0
-    int html = 0;
-
-    if (doc != NULL)
-        html = (doc->type == XML_HTML_DOCUMENT_NODE);
-#endif
     if (input == NULL) return(NULL);
 
     /*
diff --git a/globals.c b/globals.c
index bdbbc37..070c1e4 100644
--- a/globals.c
+++ b/globals.c
@@ -484,10 +484,10 @@
     gs->xmlBufferAllocScheme = xmlBufferAllocSchemeThrDef;
     gs->xmlDefaultBufferSize = xmlDefaultBufferSizeThrDef;
     initxmlDefaultSAXHandler(&gs->xmlDefaultSAXHandler, 1);
-    gs->xmlDefaultSAXLocator.getPublicId = getPublicId;
-    gs->xmlDefaultSAXLocator.getSystemId = getSystemId;
-    gs->xmlDefaultSAXLocator.getLineNumber = getLineNumber;
-    gs->xmlDefaultSAXLocator.getColumnNumber = getColumnNumber;
+    gs->xmlDefaultSAXLocator.getPublicId = xmlSAX2GetPublicId;
+    gs->xmlDefaultSAXLocator.getSystemId = xmlSAX2GetSystemId;
+    gs->xmlDefaultSAXLocator.getLineNumber = xmlSAX2GetLineNumber;
+    gs->xmlDefaultSAXLocator.getColumnNumber = xmlSAX2GetColumnNumber;
     gs->xmlDoValidityCheckingDefaultValue = 
          xmlDoValidityCheckingDefaultValueThrDef;
 #if defined(DEBUG_MEMORY_LOCATION) | defined(DEBUG_MEMORY)
diff --git a/include/libxml/xmlversion.h.in b/include/libxml/xmlversion.h.in
index e5ecc19..ef1a335 100644
--- a/include/libxml/xmlversion.h.in
+++ b/include/libxml/xmlversion.h.in
@@ -102,6 +102,15 @@
 #endif
 
 /**
+ * LIBXML_VALID_ENABLED:
+ *
+ * Whether the DTD validation support is configured in
+ */
+#if @WITH_VALID@
+#define LIBXML_VALID_ENABLED
+#endif
+
+/**
  * LIBXML_HTML_ENABLED:
  *
  * Whether the HTML support is configured in
@@ -111,6 +120,15 @@
 #endif
 
 /**
+ * LIBXML_LEGACY_ENABLED:
+ *
+ * Whether the deprecated APIs are compiled in for compatibility
+ */
+#if @WITH_LEGACY@
+#define LIBXML_LEGACY_ENABLED
+#endif
+
+/**
  * LIBXML_C14N_ENABLED:
  *
  * Whether the Canonicalization support is configured in
diff --git a/parser.c b/parser.c
index b7082ab..746d2b0 100644
--- a/parser.c
+++ b/parser.c
@@ -657,6 +657,78 @@
     return;
 }
 
+/**
+ * xmlCheckLanguageID:
+ * @lang:  pointer to the string value
+ *
+ * Checks that the value conforms to the LanguageID production:
+ *
+ * NOTE: this is somewhat deprecated, those productions were removed from
+ *       the XML Second edition.
+ *
+ * [33] LanguageID ::= Langcode ('-' Subcode)*
+ * [34] Langcode ::= ISO639Code |  IanaCode |  UserCode
+ * [35] ISO639Code ::= ([a-z] | [A-Z]) ([a-z] | [A-Z])
+ * [36] IanaCode ::= ('i' | 'I') '-' ([a-z] | [A-Z])+
+ * [37] UserCode ::= ('x' | 'X') '-' ([a-z] | [A-Z])+
+ * [38] Subcode ::= ([a-z] | [A-Z])+
+ *
+ * Returns 1 if correct 0 otherwise
+ **/
+int
+xmlCheckLanguageID(const xmlChar * lang)
+{
+    const xmlChar *cur = lang;
+
+    if (cur == NULL)
+        return (0);
+    if (((cur[0] == 'i') && (cur[1] == '-')) ||
+        ((cur[0] == 'I') && (cur[1] == '-'))) {
+        /*
+         * IANA code
+         */
+        cur += 2;
+        while (((cur[0] >= 'A') && (cur[0] <= 'Z')) ||  /* non input consuming */
+               ((cur[0] >= 'a') && (cur[0] <= 'z')))
+            cur++;
+    } else if (((cur[0] == 'x') && (cur[1] == '-')) ||
+               ((cur[0] == 'X') && (cur[1] == '-'))) {
+        /*
+         * User code
+         */
+        cur += 2;
+        while (((cur[0] >= 'A') && (cur[0] <= 'Z')) ||  /* non input consuming */
+               ((cur[0] >= 'a') && (cur[0] <= 'z')))
+            cur++;
+    } else if (((cur[0] >= 'A') && (cur[0] <= 'Z')) ||
+               ((cur[0] >= 'a') && (cur[0] <= 'z'))) {
+        /*
+         * ISO639
+         */
+        cur++;
+        if (((cur[0] >= 'A') && (cur[0] <= 'Z')) ||
+            ((cur[0] >= 'a') && (cur[0] <= 'z')))
+            cur++;
+        else
+            return (0);
+    } else
+        return (0);
+    while (cur[0] != 0) {       /* non input consuming */
+        if (cur[0] != '-')
+            return (0);
+        cur++;
+        if (((cur[0] >= 'A') && (cur[0] <= 'Z')) ||
+            ((cur[0] >= 'a') && (cur[0] <= 'z')))
+            cur++;
+        else
+            return (0);
+        while (((cur[0] >= 'A') && (cur[0] <= 'Z')) ||  /* non input consuming */
+               ((cur[0] >= 'a') && (cur[0] <= 'z')))
+            cur++;
+    }
+    return (1);
+}
+
 /************************************************************************
  *									*
  * 		Parser stacks related functions and macros		*
@@ -8185,6 +8257,7 @@
     namePush(ctxt, name);
     ret = ctxt->node;
 
+#ifdef LIBXML_VALID_ENABLED
     /*
      * [ VC: Root Element Type ]
      * The Name in the document type declaration must match the element
@@ -8193,6 +8266,7 @@
     if (ctxt->validate && ctxt->wellFormed && ctxt->myDoc &&
         ctxt->node && (ctxt->node == ctxt->myDoc->children))
         ctxt->valid &= xmlValidateRoot(&ctxt->vctxt, ctxt->myDoc);
+#endif /* LIBXML_VALID_ENABLED */
 
     /*
      * Check for an Empty Element.
@@ -9406,6 +9480,7 @@
 			ctxt->sax->endDocument(ctxt->userData);
 		    goto done;
 		}
+#ifdef LIBXML_VALID_ENABLED
 		/*
 		 * [ VC: Root Element Type ]
 		 * The Name in the document type declaration must match
@@ -9414,6 +9489,7 @@
 		if (ctxt->validate && ctxt->wellFormed && ctxt->myDoc &&
 		    ctxt->node && (ctxt->node == ctxt->myDoc->children))
 		    ctxt->valid &= xmlValidateRoot(&ctxt->vctxt, ctxt->myDoc);
+#endif /* LIBXML_VALID_ENABLED */
 
 		/*
 		 * Check for an Empty Element.
@@ -10219,6 +10295,7 @@
     return(ctxt);
 }
 
+#ifdef LIBXML_VALID_ENABLED
 /************************************************************************
  *									*
  * 		Front ends when parsing a DTD				*
@@ -10437,6 +10514,7 @@
     return(ret);
 }
 
+
 /**
  * xmlParseDTD:
  * @ExternalID:  a NAME* containing the External ID of the DTD
@@ -10451,6 +10529,7 @@
 xmlParseDTD(const xmlChar *ExternalID, const xmlChar *SystemID) {
     return(xmlSAXParseDTD(NULL, ExternalID, SystemID));
 }
+#endif /* LIBXML_VALID_ENABLED */
 
 /************************************************************************
  *									*
@@ -10985,11 +11064,13 @@
 	cur = ctxt->myDoc->children->children;
 	*lst = cur;
 	while (cur != NULL) {
+#ifdef LIBXML_VALID_ENABLED
 	    if (oldctxt->validate && oldctxt->wellFormed &&
 		oldctxt->myDoc && oldctxt->myDoc->intSubset) {
 		oldctxt->valid &= xmlValidateElement(&oldctxt->vctxt,
 			oldctxt->myDoc, cur);
 	    }
+#endif /* LIBXML_VALID_ENABLED */
 	    cur->parent = NULL;
 	    cur = cur->next;
 	}
@@ -12024,8 +12105,10 @@
         ctxt->attsSpecial = NULL;
     }
 
+#ifdef LIBXML_CATALOG_ENABLED
     if (ctxt->catalogs != NULL)
 	xmlCatalogFreeLocal(ctxt->catalogs);
+#endif
 }
 
 /**
diff --git a/parserInternals.c b/parserInternals.c
index c2d88f7..0ab1c81 100644
--- a/parserInternals.c
+++ b/parserInternals.c
@@ -54,8 +54,6 @@
 #endif
 #include <libxml/globals.h>
 
-void xmlUpgradeOldNs(xmlDocPtr doc);
-
 /*
  * Various global defaults for parsing
  */
@@ -2713,405 +2711,3 @@
     return(old);
 }
 
-/************************************************************************
- *									*
- *		Deprecated functions kept for compatibility		*
- *									*
- ************************************************************************/
-
-/**
- * xmlCheckLanguageID:
- * @lang:  pointer to the string value
- *
- * Checks that the value conforms to the LanguageID production:
- *
- * NOTE: this is somewhat deprecated, those productions were removed from
- *       the XML Second edition.
- *
- * [33] LanguageID ::= Langcode ('-' Subcode)*
- * [34] Langcode ::= ISO639Code |  IanaCode |  UserCode
- * [35] ISO639Code ::= ([a-z] | [A-Z]) ([a-z] | [A-Z])
- * [36] IanaCode ::= ('i' | 'I') '-' ([a-z] | [A-Z])+
- * [37] UserCode ::= ('x' | 'X') '-' ([a-z] | [A-Z])+
- * [38] Subcode ::= ([a-z] | [A-Z])+
- *
- * Returns 1 if correct 0 otherwise
- **/
-int
-xmlCheckLanguageID(const xmlChar * lang)
-{
-    const xmlChar *cur = lang;
-
-    if (cur == NULL)
-        return (0);
-    if (((cur[0] == 'i') && (cur[1] == '-')) ||
-        ((cur[0] == 'I') && (cur[1] == '-'))) {
-        /*
-         * IANA code
-         */
-        cur += 2;
-        while (((cur[0] >= 'A') && (cur[0] <= 'Z')) ||  /* non input consuming */
-               ((cur[0] >= 'a') && (cur[0] <= 'z')))
-            cur++;
-    } else if (((cur[0] == 'x') && (cur[1] == '-')) ||
-               ((cur[0] == 'X') && (cur[1] == '-'))) {
-        /*
-         * User code
-         */
-        cur += 2;
-        while (((cur[0] >= 'A') && (cur[0] <= 'Z')) ||  /* non input consuming */
-               ((cur[0] >= 'a') && (cur[0] <= 'z')))
-            cur++;
-    } else if (((cur[0] >= 'A') && (cur[0] <= 'Z')) ||
-               ((cur[0] >= 'a') && (cur[0] <= 'z'))) {
-        /*
-         * ISO639
-         */
-        cur++;
-        if (((cur[0] >= 'A') && (cur[0] <= 'Z')) ||
-            ((cur[0] >= 'a') && (cur[0] <= 'z')))
-            cur++;
-        else
-            return (0);
-    } else
-        return (0);
-    while (cur[0] != 0) {       /* non input consuming */
-        if (cur[0] != '-')
-            return (0);
-        cur++;
-        if (((cur[0] >= 'A') && (cur[0] <= 'Z')) ||
-            ((cur[0] >= 'a') && (cur[0] <= 'z')))
-            cur++;
-        else
-            return (0);
-        while (((cur[0] >= 'A') && (cur[0] <= 'Z')) ||  /* non input consuming */
-               ((cur[0] >= 'a') && (cur[0] <= 'z')))
-            cur++;
-    }
-    return (1);
-}
-
-/**
- * xmlDecodeEntities:
- * @ctxt:  the parser context
- * @len:  the len to decode (in bytes !), -1 for no size limit
- * @what:  combination of XML_SUBSTITUTE_REF and XML_SUBSTITUTE_PEREF
- * @end:  an end marker xmlChar, 0 if none
- * @end2:  an end marker xmlChar, 0 if none
- * @end3:  an end marker xmlChar, 0 if none
- * 
- * This function is deprecated, we now always process entities content
- * through xmlStringDecodeEntities
- *
- * TODO: remove it in next major release.
- *
- * [67] Reference ::= EntityRef | CharRef
- *
- * [69] PEReference ::= '%' Name ';'
- *
- * Returns A newly allocated string with the substitution done. The caller
- *      must deallocate it !
- */
-xmlChar *
-xmlDecodeEntities(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED,
-                  int len ATTRIBUTE_UNUSED, int what ATTRIBUTE_UNUSED,
-                  xmlChar end ATTRIBUTE_UNUSED,
-                  xmlChar end2 ATTRIBUTE_UNUSED,
-                  xmlChar end3 ATTRIBUTE_UNUSED)
-{
-    static int deprecated = 0;
-
-    if (!deprecated) {
-        xmlGenericError(xmlGenericErrorContext,
-                        "xmlDecodeEntities() deprecated function reached\n");
-        deprecated = 1;
-    }
-    return (NULL);
-}
-
-/**
- * xmlNamespaceParseNCName:
- * @ctxt:  an XML parser context
- *
- * parse an XML namespace name.
- *
- * TODO: this seems not in use anymore, the namespace handling is done on
- *       top of the SAX interfaces, i.e. not on raw input.
- *
- * [NS 3] NCName ::= (Letter | '_') (NCNameChar)*
- *
- * [NS 4] NCNameChar ::= Letter | Digit | '.' | '-' | '_' |
- *                       CombiningChar | Extender
- *
- * Returns the namespace name or NULL
- */
-
-xmlChar *
-xmlNamespaceParseNCName(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED)
-{
-    static int deprecated = 0;
-
-    if (!deprecated) {
-        xmlGenericError(xmlGenericErrorContext,
-                        "xmlNamespaceParseNCName() deprecated function reached\n");
-        deprecated = 1;
-    }
-    return (NULL);
-}
-
-/**
- * xmlNamespaceParseQName:
- * @ctxt:  an XML parser context
- * @prefix:  a xmlChar ** 
- *
- * TODO: this seems not in use anymore, the namespace handling is done on
- *       top of the SAX interfaces, i.e. not on raw input.
- *
- * parse an XML qualified name
- *
- * [NS 5] QName ::= (Prefix ':')? LocalPart
- *
- * [NS 6] Prefix ::= NCName
- *
- * [NS 7] LocalPart ::= NCName
- *
- * Returns the local part, and prefix is updated
- *   to get the Prefix if any.
- */
-
-xmlChar *
-xmlNamespaceParseQName(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED,
-                       xmlChar ** prefix ATTRIBUTE_UNUSED)
-{
-
-    static int deprecated = 0;
-
-    if (!deprecated) {
-        xmlGenericError(xmlGenericErrorContext,
-                        "xmlNamespaceParseQName() deprecated function reached\n");
-        deprecated = 1;
-    }
-    return (NULL);
-}
-
-/**
- * xmlNamespaceParseNSDef:
- * @ctxt:  an XML parser context
- *
- * parse a namespace prefix declaration
- *
- * TODO: this seems not in use anymore, the namespace handling is done on
- *       top of the SAX interfaces, i.e. not on raw input.
- *
- * [NS 1] NSDef ::= PrefixDef Eq SystemLiteral
- *
- * [NS 2] PrefixDef ::= 'xmlns' (':' NCName)?
- *
- * Returns the namespace name
- */
-
-xmlChar *
-xmlNamespaceParseNSDef(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED)
-{
-    static int deprecated = 0;
-
-    if (!deprecated) {
-        xmlGenericError(xmlGenericErrorContext,
-                        "xmlNamespaceParseNSDef() deprecated function reached\n");
-        deprecated = 1;
-    }
-    return (NULL);
-}
-
-/**
- * xmlParseQuotedString:
- * @ctxt:  an XML parser context
- *
- * Parse and return a string between quotes or doublequotes
- *
- * TODO: Deprecated, to  be removed at next drop of binary compatibility
- *
- * Returns the string parser or NULL.
- */
-xmlChar *
-xmlParseQuotedString(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED)
-{
-    static int deprecated = 0;
-
-    if (!deprecated) {
-        xmlGenericError(xmlGenericErrorContext,
-                        "xmlParseQuotedString() deprecated function reached\n");
-        deprecated = 1;
-    }
-    return (NULL);
-}
-
-/**
- * xmlParseNamespace:
- * @ctxt:  an XML parser context
- *
- * xmlParseNamespace: parse specific PI '<?namespace ...' constructs.
- *
- * This is what the older xml-name Working Draft specified, a bunch of
- * other stuff may still rely on it, so support is still here as
- * if it was declared on the root of the Tree:-(
- *
- * TODO: remove from library
- *
- * To be removed at next drop of binary compatibility
- */
-
-void
-xmlParseNamespace(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED)
-{
-    static int deprecated = 0;
-
-    if (!deprecated) {
-        xmlGenericError(xmlGenericErrorContext,
-                        "xmlParseNamespace() deprecated function reached\n");
-        deprecated = 1;
-    }
-}
-
-/**
- * xmlScanName:
- * @ctxt:  an XML parser context
- *
- * Trickery: parse an XML name but without consuming the input flow
- * Needed for rollback cases. Used only when parsing entities references.
- *
- * TODO: seems deprecated now, only used in the default part of
- *       xmlParserHandleReference
- *
- * [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' |
- *                  CombiningChar | Extender
- *
- * [5] Name ::= (Letter | '_' | ':') (NameChar)*
- *
- * [6] Names ::= Name (S Name)*
- *
- * Returns the Name parsed or NULL
- */
-
-xmlChar *
-xmlScanName(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED)
-{
-    static int deprecated = 0;
-
-    if (!deprecated) {
-        xmlGenericError(xmlGenericErrorContext,
-                        "xmlScanName() deprecated function reached\n");
-        deprecated = 1;
-    }
-    return (NULL);
-}
-
-/**
- * xmlParserHandleReference:
- * @ctxt:  the parser context
- * 
- * TODO: Remove, now deprecated ... the test is done directly in the
- *       content parsing
- * routines.
- *
- * [67] Reference ::= EntityRef | CharRef
- *
- * [68] EntityRef ::= '&' Name ';'
- *
- * [ WFC: Entity Declared ]
- * the Name given in the entity reference must match that in an entity
- * declaration, except that well-formed documents need not declare any
- * of the following entities: amp, lt, gt, apos, quot. 
- *
- * [ WFC: Parsed Entity ]
- * An entity reference must not contain the name of an unparsed entity
- *
- * [66] CharRef ::= '&#' [0-9]+ ';' |
- *                  '&#x' [0-9a-fA-F]+ ';'
- *
- * A PEReference may have been detected in the current input stream
- * the handling is done accordingly to 
- *      http://www.w3.org/TR/REC-xml#entproc
- */
-void
-xmlParserHandleReference(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED)
-{
-    static int deprecated = 0;
-
-    if (!deprecated) {
-        xmlGenericError(xmlGenericErrorContext,
-                        "xmlParserHandleReference() deprecated function reached\n");
-        deprecated = 1;
-    }
-
-    return;
-}
-
-/**
- * xmlHandleEntity:
- * @ctxt:  an XML parser context
- * @entity:  an XML entity pointer.
- *
- * Default handling of defined entities, when should we define a new input
- * stream ? When do we just handle that as a set of chars ?
- *
- * OBSOLETE: to be removed at some point.
- */
-
-void
-xmlHandleEntity(xmlParserCtxtPtr ctxt ATTRIBUTE_UNUSED,
-                xmlEntityPtr entity ATTRIBUTE_UNUSED)
-{
-    static int deprecated = 0;
-
-    if (!deprecated) {
-        xmlGenericError(xmlGenericErrorContext,
-                        "xmlHandleEntity() deprecated function reached\n");
-        deprecated = 1;
-    }
-}
-
-/**
- * xmlNewGlobalNs:
- * @doc:  the document carrying the namespace
- * @href:  the URI associated
- * @prefix:  the prefix for the namespace
- *
- * Creation of a Namespace, the old way using PI and without scoping
- *   DEPRECATED !!!
- * It now create a namespace on the root element of the document if found.
- * Returns NULL this functionality had been removed
- */
-xmlNsPtr
-xmlNewGlobalNs(xmlDocPtr doc ATTRIBUTE_UNUSED,
-               const xmlChar * href ATTRIBUTE_UNUSED,
-               const xmlChar * prefix ATTRIBUTE_UNUSED)
-{
-    static int deprecated = 0;
-
-    if (!deprecated) {
-        xmlGenericError(xmlGenericErrorContext,
-                        "xmlNewGlobalNs() deprecated function reached\n");
-        deprecated = 1;
-    }
-    return (NULL);
-}
-
-/**
- * xmlUpgradeOldNs:
- * @doc:  a document pointer
- * 
- * Upgrade old style Namespaces (PI) and move them to the root of the document.
- * DEPRECATED
- */
-void
-xmlUpgradeOldNs(xmlDocPtr doc ATTRIBUTE_UNUSED)
-{
-    static int deprecated = 0;
-
-    if (!deprecated) {
-        xmlGenericError(xmlGenericErrorContext,
-                        "xmlUpgradeOldNs() deprecated function reached\n");
-        deprecated = 1;
-    }
-}
diff --git a/python/libxml2class.txt b/python/libxml2class.txt
index 7214e36..0d1cd4b 100644
--- a/python/libxml2class.txt
+++ b/python/libxml2class.txt
@@ -693,6 +693,7 @@
     NodeType()
     Normalization()
     Prefix()
+    Preserve()
     QuoteChar()
     Read()
     ReadAttributeValue()
diff --git a/python/tests/reader2.py b/python/tests/reader2.py
index e325227..d122dca 100755
--- a/python/tests/reader2.py
+++ b/python/tests/reader2.py
@@ -229,7 +229,7 @@
 err=""
 
 input = libxml2.inputBuffer(StringIO.StringIO(s))
-reader = input.newTextReader("test4")
+reader = input.newTextReader("test5")
 reader.SetParserProp(libxml2.PARSER_VALIDATE,1)
 while reader.Read() == 1:
     res = res + "%s %s %d\n" % (reader.NodeType(),reader.Name(),reader.Depth())
diff --git a/tree.c b/tree.c
index 4b7ef5e..b372e43 100644
--- a/tree.c
+++ b/tree.c
@@ -7062,9 +7062,11 @@
  *									*
  ************************************************************************/
 
+#ifdef LIBXML_HTML_ENABLED
 static void
 xhtmlNodeDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur,
             int level, int format, const char *encoding);
+#endif
 static void
 xmlNodeListDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur,
                   int level, int format, const char *encoding);
diff --git a/valid.c b/valid.c
index 470f912..b1555a8 100644
--- a/valid.c
+++ b/valid.c
@@ -25,6 +25,10 @@
 #include <libxml/list.h>
 #include <libxml/globals.h>
 
+static xmlElementPtr xmlGetDtdElementDesc2(xmlDtdPtr dtd, const xmlChar *name,
+	                           int create);
+#ifdef LIBXML_VALID_ENABLED
+
 /* #define DEBUG_VALID_ALGO */
 /* #define DEBUG_REGEXP_ALGO */
 
@@ -449,8 +453,6 @@
    else if ((doc->intSubset == NULL) &&				\
 	    (doc->extSubset == NULL)) return(0)
 
-static xmlElementPtr xmlGetDtdElementDesc2(xmlDtdPtr dtd, const xmlChar *name,
-	                           int create);
 xmlAttributePtr xmlScanAttributeDecl(xmlDtdPtr dtd, const xmlChar *elem);
 
 #ifdef LIBXML_REGEXP_ENABLED
@@ -709,6 +711,8 @@
     xmlFree(cur);
 }
 
+#endif /* LIBXML_VALID_ENABLED */
+
 /**
  * xmlNewElementContent:
  * @name:  the subelement name or NULL
@@ -1160,10 +1164,12 @@
     ret = xmlHashLookup2(table, name, ns);
     if (ret != NULL) {
 	if (ret->etype != XML_ELEMENT_TYPE_UNDEFINED) {
+#ifdef LIBXML_VALID_ENABLED
 	    /*
 	     * The element is already defined in this DTD.
 	     */
 	    VERROR(ctxt->userData, "Redefinition of element %s\n", name);
+#endif /* LIBXML_VALID_ENABLED */
 	    if (uqname != NULL)
 		xmlFree(uqname);
             if (ns != NULL)
@@ -1205,10 +1211,12 @@
 	 * Insertion must not fail
 	 */
 	if (xmlHashAddEntry2(table, name, ns, ret)) {
+#ifdef LIBXML_VALID_ENABLED
 	    /*
 	     * The element is already defined in this DTD.
 	     */
 	    VERROR(ctxt->userData, "Redefinition of element %s\n", name);
+#endif /* LIBXML_VALID_ENABLED */
 	    xmlFreeElement(ret);
 	    if (uqname != NULL)
 		xmlFree(uqname);
@@ -1472,6 +1480,7 @@
     return(xmlHashCreate(0));
 }
 
+#ifdef LIBXML_VALID_ENABLED
 /**
  * xmlScanAttributeDeclCallback:
  * @attr:  the attribute decl
@@ -1552,6 +1561,7 @@
     }
     return(ret);
 }
+#endif /* LIBXML_VALID_ENABLED */
 
 /**
  * xmlFreeAttribute:
@@ -1622,6 +1632,7 @@
 	return(NULL);
     }
 
+#ifdef LIBXML_VALID_ENABLED
     /*
      * Check the type and possibly the default value.
      */
@@ -1659,6 +1670,7 @@
 	defaultValue = NULL;
 	ctxt->valid = 0;
     }
+#endif /* LIBXML_VALID_ENABLED */
 
     /*
      * Check first that an attribute defined in the external subset wasn't
@@ -1713,12 +1725,14 @@
      * Search the DTD for previous declarations of the ATTLIST
      */
     if (xmlHashAddEntry3(table, name, ns, elem, ret) < 0) {
+#ifdef LIBXML_VALID_ENABLED
 	/*
 	 * The attribute is already defined in this DTD.
 	 */
 	VWARNING(ctxt->userData,
 		 "Attribute %s of element %s: already defined\n",
 		 name, elem);
+#endif /* LIBXML_VALID_ENABLED */
 	xmlFreeAttribute(ret);
 	return(NULL);
     }
@@ -1730,6 +1744,7 @@
     elemDef = xmlGetDtdElementDesc2(dtd, elem, 1);
     if (elemDef != NULL) {
 
+#ifdef LIBXML_VALID_ENABLED
         if ((type == XML_ATTRIBUTE_ID) &&
 	    (xmlScanIDAttributeDecl(NULL, elemDef) != 0)) {
 	    VERROR(ctxt->userData, 
@@ -1737,6 +1752,7 @@
 		   elem, name);
 	    ctxt->valid = 0;
 	}
+#endif /* LIBXML_VALID_ENABLED */
 
 	/*
 	 * Insert namespace default def first they need to be
@@ -2040,8 +2056,10 @@
      * Check the DTD for previous declarations of the ATTLIST
      */
     if (xmlHashAddEntry(table, name, ret)) {
+#ifdef LIBXML_VALID_ENABLED
 	xmlGenericError(xmlGenericErrorContext,
 		"xmlAddNotationDecl: %s already defined\n", name);
+#endif /* LIBXML_VALID_ENABLED */
 	xmlFreeNotation(ret);
 	return(NULL);
     }
@@ -2246,6 +2264,7 @@
     ret->lineno = xmlGetLineNo(attr->parent);
 
     if (xmlHashAddEntry(table, value, ret) < 0) {
+#ifdef LIBXML_VALID_ENABLED
 	/*
 	 * The id is already defined in this DTD.
 	 */
@@ -2253,6 +2272,7 @@
 	    VECTXT(ctxt, attr->parent);
 	    VERROR(ctxt->userData, "ID %s already defined\n", value);
 	}
+#endif /* LIBXML_VALID_ENABLED */
 	xmlFreeID(ret);
 	return(NULL);
     }
@@ -2920,6 +2940,7 @@
     return(xmlHashLookup(table, name));
 }
 
+#ifdef LIBXML_VALID_ENABLED
 /**
  * xmlValidateNotationUse:
  * @ctxt:  the validation context
@@ -2949,6 +2970,7 @@
     }
     return(1);
 }
+#endif /* LIBXML_VALID_ENABLED */
 
 /**
  * xmlIsMixedElement:
@@ -2988,6 +3010,7 @@
     return(1);
 }
 
+#ifdef LIBXML_VALID_ENABLED
 /**
  * xmlValidateNameValue:
  * @value:  an Name value
@@ -6295,7 +6318,6 @@
     return(ret);
 }
 
-
 /************************************************************************
  *									*
  *		Routines for dynamic validation editing			*
@@ -6473,3 +6495,5 @@
 
     return(nb_valid_elements);
 }
+#endif /* LIBXML_VALID_ENABLED */
+
diff --git a/win32/libxml2.def.src b/win32/libxml2.def.src
index c1a1bd4..3864d9a 100644
--- a/win32/libxml2.def.src
+++ b/win32/libxml2.def.src
@@ -1597,6 +1597,7 @@
 xmlTextReaderNodeType
 xmlTextReaderNormalization
 xmlTextReaderPrefix
+xmlTextReaderPreserve
 xmlTextReaderQuoteChar
 xmlTextReaderRead
 xmlTextReaderReadAttributeValue
diff --git a/xlink.c b/xlink.c
index d7fc602..4454d17 100644
--- a/xlink.c
+++ b/xlink.c
@@ -11,6 +11,7 @@
 #define IN_LIBXML
 #include "libxml.h"
 
+#ifdef LIBXML_XPTR_ENABLED
 #include <string.h> /* for memset() only */
 #ifdef HAVE_CTYPE_H
 #include <ctype.h>
@@ -177,3 +178,4 @@
     if (role != NULL) xmlFree(role);
     return(ret);
 }
+#endif /* LIBXML_XPTR_ENABLED */
diff --git a/xmlIO.c b/xmlIO.c
index af8a44e..7992f18 100644
--- a/xmlIO.c
+++ b/xmlIO.c
@@ -1794,7 +1794,9 @@
     void *context = NULL;
     char *unescaped;
 
+#ifdef LIBXML_HTTP_ENABLED
     int is_http_uri = 0;	/*   Can't change if HTTP disabled  */
+#endif
 
     if (xmlOutputCallbackInitialized == 0)
 	xmlRegisterDefaultOutputCallbacks();
diff --git a/xmlcatalog.c b/xmlcatalog.c
index 0e320fe..44c8e63 100644
--- a/xmlcatalog.c
+++ b/xmlcatalog.c
@@ -29,6 +29,7 @@
 #include <libxml/parser.h>
 #include <libxml/globals.h>
 
+#ifdef LIBXML_CATALOG_ENABLED
 static int shell = 0;
 static int sgml = 0;
 static int noout = 0;
@@ -39,7 +40,6 @@
 static int verbose = 0;
 static char *filename;
 
-#ifdef LIBXML_CATALOG_ENABLED
 
 #ifndef XML_SGML_DEFAULT_CATALOG
 #define XML_SGML_DEFAULT_CATALOG "/etc/sgml/catalog"
diff --git a/xmllint.c b/xmllint.c
index 77d6cd2..92d5547 100644
--- a/xmllint.c
+++ b/xmllint.c
@@ -104,10 +104,12 @@
 static int noent = 0;
 static int noout = 0;
 static int nowrap = 0;
+#ifdef LIBXML_VALID_ENABLED
 static int valid = 0;
 static int postvalid = 0;
 static char * dtdvalid = NULL;
 static char * dtdvalidfpi = NULL;
+#endif
 #ifdef LIBXML_SCHEMAS_ENABLED
 static char * relaxng = NULL;
 static xmlRelaxNGPtr relaxngschemas = NULL;
@@ -117,7 +119,9 @@
 static int repeat = 0;
 static int insert = 0;
 static int compress = 0;
+#ifdef  LIBXML_HTML_ENABLED
 static int html = 0;
+#endif
 static int htmlout = 0;
 static int push = 0;
 #ifdef HAVE_SYS_MMAN_H
@@ -633,9 +637,11 @@
 	reader = xmlNewTextReaderFilename(filename);
 
     if (reader != NULL) {
+#ifdef LIBXML_VALID_ENABLED
 	if (valid)
 	    xmlTextReaderSetParserProp(reader, XML_PARSER_VALIDATE, 1);
 	else
+#endif /* LIBXML_VALID_ENABLED */
 	    xmlTextReaderSetParserProp(reader, XML_PARSER_LOADDTD, 1);
 #ifdef LIBXML_SCHEMAS_ENABLED
 	if (relaxng != NULL) {
@@ -670,13 +676,16 @@
 #ifdef LIBXML_SCHEMAS_ENABLED
 	    if ((valid) || (relaxng != NULL))
 #else
+#ifdef LIBXML_VALID_ENABLED
 	    if (valid)
-#endif
 		endTimer("Parsing and validating");
 	    else
+#endif /* LIBXML_VALID_ENABLED */
+#endif
 		endTimer("Parsing");
 	}
 
+#ifdef LIBXML_VALID_ENABLED
 	if (valid) {
 	    if (xmlTextReaderIsValid(reader) != 1) {
 		xmlGenericError(xmlGenericErrorContext,
@@ -684,6 +693,7 @@
 		progresult = 3;
 	    }
 	}
+#endif /* LIBXML_VALID_ENABLED */
 #ifdef LIBXML_SCHEMAS_ENABLED
 	if (relaxng != NULL) {
 	    if (xmlTextReaderIsValid(reader) != 1) {
@@ -866,6 +876,7 @@
 	        
 	    munmap((char *) base, info.st_size);
 #endif
+#ifdef LIBXML_VALID_ENABLED
 	} else if (valid) {
 	    xmlParserCtxtPtr ctxt = NULL;
 
@@ -883,6 +894,7 @@
 		if (rectxt == NULL)
 		    xmlFreeParserCtxt(ctxt);
 	    }
+#endif /* LIBXML_VALID_ENABLED */
 	} else {
 	    if (rectxt != NULL)
 	        doc = xmlCtxtReadFile(rectxt, filename, NULL, options);
@@ -945,6 +957,7 @@
 	xmlFreeDoc(tmp);
     }
 
+#ifdef LIBXML_VALID_ENABLED
     if ((insert) && (!html)) {
         const xmlChar* list[256];
 	int nb, i;
@@ -968,7 +981,9 @@
 		}
 	    }
 	}    
-    }else if (noout == 0) {
+    }else
+#endif /* LIBXML_VALID_ENABLED */
+    if (noout == 0) {
 	/*
 	 * print it.
 	 */
@@ -1048,6 +1063,7 @@
 #endif
     }
 
+#ifdef LIBXML_VALID_ENABLED
     /*
      * A posteriori validation test
      */
@@ -1128,8 +1144,10 @@
 	    endTimer("Validating");
 	}
 	xmlFreeValidCtxt(cvp);
+    }
+#endif /* LIBXML_VALID_ENABLED */
 #ifdef LIBXML_SCHEMAS_ENABLED
-    } else if (relaxngschemas != NULL) {
+    if (relaxngschemas != NULL) {
 	xmlRelaxNGValidCtxtPtr ctxt;
 	int ret;
 
@@ -1181,8 +1199,8 @@
 	if ((timing) && (!repeat)) {
 	    endTimer("Validating");
 	}
-#endif
     }
+#endif
 
 #ifdef LIBXML_DEBUG_ENABLED
     if ((debugent) && (!html))
@@ -1210,6 +1228,9 @@
 static void showVersion(const char *name) {
     fprintf(stderr, "%s: using libxml version %s\n", name, xmlParserVersion);
     fprintf(stderr, "   compiled with: ");
+#ifdef LIBXML_VALID_ENABLED
+    fprintf(stderr, "DTDValid ");
+#endif
 #ifdef LIBXML_FTP_ENABLED
     fprintf(stderr, "FTP ");
 #endif
@@ -1273,10 +1294,12 @@
     printf("\t--nonet : refuse to fetch DTDs or entities over network\n");
     printf("\t--htmlout : output results as HTML\n");
     printf("\t--nowrap : do not put HTML doc wrapper\n");
+#ifdef LIBXML_VALID_ENABLED
     printf("\t--valid : validate the document in addition to std well-formed check\n");
     printf("\t--postvalid : do a posteriori validation, i.e after parsing\n");
     printf("\t--dtdvalid URL : do a posteriori validation against a given DTD\n");
     printf("\t--dtdvalidfpi FPI : same but name the DTD with a Public Identifier\n");
+#endif /* LIBXML_VALID_ENABLED */
     printf("\t--timing : print some timings\n");
     printf("\t--output file or -o file: save to a given file\n");
     printf("\t--repeat : repeat 100 times, for timing or profiling\n");
@@ -1415,7 +1438,9 @@
 	    loaddtd++;
 	    dtdattrs++;
 	    options |= XML_PARSE_DTDATTR;
-	} else if ((!strcmp(argv[i], "-valid")) ||
+	}
+#ifdef LIBXML_VALID_ENABLED
+	else if ((!strcmp(argv[i], "-valid")) ||
 	         (!strcmp(argv[i], "--valid"))) {
 	    valid++;
 	    options |= XML_PARSE_DTDVALID;
@@ -1434,6 +1459,7 @@
 	    dtdvalidfpi = argv[i];
 	    loaddtd++;
         }
+#endif /* LIBXML_VALID_ENABLED */
 	else if ((!strcmp(argv[i], "-dropdtd")) ||
 	         (!strcmp(argv[i], "--dropdtd")))
 	    dropdtd++;
@@ -1596,7 +1622,9 @@
     if (dtdattrs)
 	xmlLoadExtDtdDefaultValue |= XML_COMPLETE_ATTRS;
     if (noent != 0) xmlSubstituteEntitiesDefault(1);
+#ifdef LIBXML_VALID_ENABLED
     if (valid != 0) xmlDoValidityCheckingDefaultValue = 1;
+#endif /* LIBXML_VALID_ENABLED */
     if ((htmlout) && (!nowrap)) {
 	xmlGenericError(xmlGenericErrorContext,
          "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"\n");
@@ -1669,6 +1697,7 @@
             i++;
 	    continue;
         }
+#ifdef LIBXML_VALID_ENABLED
 	if ((!strcmp(argv[i], "-dtdvalid")) ||
 	         (!strcmp(argv[i], "--dtdvalid"))) {
 	    i++;
@@ -1679,6 +1708,7 @@
 	    i++;
 	    continue;
         }
+#endif /* LIBXML_VALID_ENABLED */
 	if ((!strcmp(argv[i], "-relaxng")) ||
 	         (!strcmp(argv[i], "--relaxng"))) {
 	    i++;
diff --git a/xmlmemory.c b/xmlmemory.c
index b4651fe..e20f721 100644
--- a/xmlmemory.c
+++ b/xmlmemory.c
@@ -29,6 +29,7 @@
 #include <ctype.h>
 #endif
 
+
 /**
  * MEM_LIST:
  *
@@ -43,6 +44,9 @@
 #include <libxml/globals.h>
 #include <libxml/xmlerror.h>
 
+static int xmlMemInitialized = 0;
+
+#ifdef DEBUG_MEMORY_LOCATION
 void xmlMallocBreakpoint(void);
 
 /************************************************************************
@@ -108,7 +112,6 @@
 static int block=0;
 static int xmlMemStopAtBlock = 0;
 static void *xmlMemTraceBlockAt = NULL;
-static int xmlMemInitialized = 0;
 #ifdef MEM_LIST
 static MEMHDR *memlist = NULL;
 #endif
@@ -712,6 +715,7 @@
 
 static FILE *xmlMemoryDumpFile = NULL;
 
+#endif /* DEBUG_MEMORY_LOCATION */
 
 /**
  * xmlMemoryDump:
@@ -722,6 +726,7 @@
 void
 xmlMemoryDump(void)
 {
+#ifdef DEBUG_MEMORY_LOCATION
     FILE *dump;
 
     if (debugMaxMemSize == 0)
@@ -734,6 +739,7 @@
     xmlMemDisplay(xmlMemoryDumpFile);
 
     if (dump != NULL) fclose(dump);
+#endif /* DEBUG_MEMORY_LOCATION */
 }
 
 
@@ -755,14 +761,15 @@
 int
 xmlInitMemory(void)
 {
-     int ret;
-     
+#ifdef DEBUG_MEMORY_LOCATION
 #ifdef HAVE_STDLIB_H
      char *breakpoint;
 #endif     
+#endif
 
      if (xmlInitMemoryDone) return(-1);
 
+#ifdef DEBUG_MEMORY_LOCATION
 #ifdef HAVE_STDLIB_H
      breakpoint = getenv("XML_MEM_BREAKPOINT");
      if (breakpoint != NULL) {
@@ -775,6 +782,7 @@
          sscanf(breakpoint, "%p", &xmlMemTraceBlockAt);
      }
 #endif     
+#endif /* DEBUG_MEMORY_LOCATION */
     
 #ifdef DEBUG_MEMORY
      xmlGenericError(xmlGenericErrorContext,
@@ -783,8 +791,7 @@
      xmlMemInitialized = 1;
      xmlInitMemoryDone = 1;
 
-     ret = 0;
-     return(ret);
+     return(0);
 }
 
 /**
diff --git a/xpath.c b/xpath.c
index 7946fd6..65ca180 100644
--- a/xpath.c
+++ b/xpath.c
@@ -52,6 +52,7 @@
 #include <libxml/threads.h>
 #include <libxml/globals.h>
 
+#if defined(LIBXML_SCHEMAS_ENABLED) || defined(LIBXML_XPATH_ENABLED)
 /************************************************************************
  * 									*
  * 			Floating point stuff				*
@@ -119,6 +120,8 @@
     return(trio_isinf(val));
 }
 
+#endif /* SCHEMAS or XPATH */
+#ifdef LIBXML_XPATH_ENABLED
 /**
  * xmlXPathGetSign:
  * @val:  a double value
@@ -135,7 +138,6 @@
 }
 
 
-#ifdef LIBXML_XPATH_ENABLED
 /*
  * TODO: when compatibility allows remove all "fake node libxslt" strings
  *       the test should just be name[0] = ' '