added a new configure option --with-push, some cleanups, chased code size

* HTMLparser.c Makefile.am configure.in legacy.c parser.c
  parserInternals.c testHTML.c xmllint.c include/libxml/HTMLparser.h
  include/libxml/parser.h include/libxml/parserInternals.h
  include/libxml/xmlversion.h.in: added a new configure
  option --with-push, some cleanups, chased code size anomalies.
  Now a library configured --with-minimum is around 150KB,
  sounds good enough.
Daniel
diff --git a/ChangeLog b/ChangeLog
index b054bca..eedcb95 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+Tue Sep 30 14:30:47 CEST 2003 Daniel Veillard <daniel@veillard.com>
+
+	* HTMLparser.c Makefile.am configure.in legacy.c parser.c
+	  parserInternals.c testHTML.c xmllint.c include/libxml/HTMLparser.h
+	  include/libxml/parser.h include/libxml/parserInternals.h
+	  include/libxml/xmlversion.h.in: added a new configure
+	  option --with-push, some cleanups, chased code size anomalies.
+	  Now a library configured --with-minimum is around 150KB,
+	  sounds good enough.
+
 Tue Sep 30 12:31:00 AEST 2003 Malcolm Tredinnick <malcolm@commsecure.com.au>
 
 	* libxml-2.0-uninstalled.pc.in: New file for building against
diff --git a/HTMLparser.c b/HTMLparser.c
index 1606547..d9ef259 100644
--- a/HTMLparser.c
+++ b/HTMLparser.c
@@ -4271,6 +4271,7 @@
     return(ctxt);
 }
 
+#ifdef LIBXML_PUSH_ENABLED
 /************************************************************************
  *									*
  * 		Progressive parsing interfaces				*
@@ -5141,6 +5142,7 @@
     }
     return((xmlParserErrors) ctxt->errNo);	      
 }
+#endif /* LIBXML_PUSH_ENABLED */
 
 /************************************************************************
  *									*
diff --git a/Makefile.am b/Makefile.am
index 4e0cdda..0f60478 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -122,7 +122,7 @@
 
 testall : tests SVGtests SAXtests
 
-tests: XMLtests XMLenttests NStests Readertests @TEST_SAX@ @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@
+tests: XMLtests XMLenttests NStests @READER_TEST@ @TEST_SAX@ @TEST_PUSH@ @TEST_HTML@ @TEST_PHTML@  @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:
@@ -151,6 +151,8 @@
 	      diff result.$$name result2.$$name ; \
 	      rm result.$$name result2.$$name error.$$name ; \
 	  fi ; fi ; done)
+
+HTMLPushtests : testHTML$(EXEEXT)
 	@echo "##"
 	@echo "## Push HTML regression tests"
 	@echo "##"
@@ -230,6 +232,30 @@
 	      diff result.$$name result2.$$name ; \
 	      rm result.$$name result2.$$name ; \
 	  fi ; fi ; done)
+	@echo "##"
+	@echo "## XML regression tests on memory"
+	@echo "##"
+	@echo "## You should see two warnings on entity 'title.xml' for ent2"
+	@echo "##"
+	-@(for i in $(srcdir)/test/* ; do \
+	  name=`basename $$i`; \
+	  if [ ! -d $$i ] ; then \
+	  if [ ! -f $(srcdir)/result/$$name ] ; then \
+	      echo New test file $$name ; \
+	      $(CHECKER) $(top_builddir)/xmllint --memory $$i > $(srcdir)/result/$$name ; \
+	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"; \
+	  else \
+	      echo Testing $$name ; \
+	      $(CHECKER) $(top_builddir)/xmllint --memory $$i > result.$$name ; \
+	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
+	      diff $(srcdir)/result/$$name result.$$name ; \
+	      $(CHECKER) $(top_builddir)/xmllint --memory result.$$name > result2.$$name ; \
+	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"; \
+	      diff result.$$name result2.$$name ; \
+	      rm result.$$name result2.$$name ; \
+	  fi ; fi ; done)
+
+XMLPushtests: xmllint$(EXEEXT)
 	@(echo > .memdump)
 	@echo "##"
 	@echo "## XML push regression tests"
@@ -253,28 +279,6 @@
 	      diff result.$$name result2.$$name ; \
 	      rm result.$$name result2.$$name ; \
 	  fi ; fi ; done)
-	@echo "##"
-	@echo "## XML regression tests on memory"
-	@echo "##"
-	@echo "## You should see two warnings on entity 'title.xml' for ent2"
-	@echo "##"
-	-@(for i in $(srcdir)/test/* ; do \
-	  name=`basename $$i`; \
-	  if [ ! -d $$i ] ; then \
-	  if [ ! -f $(srcdir)/result/$$name ] ; then \
-	      echo New test file $$name ; \
-	      $(CHECKER) $(top_builddir)/xmllint --memory $$i > $(srcdir)/result/$$name ; \
-	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"; \
-	  else \
-	      echo Testing $$name ; \
-	      $(CHECKER) $(top_builddir)/xmllint --memory $$i > result.$$name ; \
-	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
-	      diff $(srcdir)/result/$$name result.$$name ; \
-	      $(CHECKER) $(top_builddir)/xmllint --memory result.$$name > result2.$$name ; \
-	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"; \
-	      diff result.$$name result2.$$name ; \
-	      rm result.$$name result2.$$name ; \
-	  fi ; fi ; done)
 
 NStests : xmllint$(EXEEXT)
 	@(echo > .memdump)
diff --git a/configure.in b/configure.in
index 6ebf1d0..57af8c4 100644
--- a/configure.in
+++ b/configure.in
@@ -589,26 +589,6 @@
 AC_SUBST(WITH_HTTP)
 AC_SUBST(HTTP_OBJ)
 
-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" = ""
@@ -632,10 +612,13 @@
 if test "$with_reader" = "no" ; then
     echo Disabling the xmlReader parsing interface
     WITH_READER=0
+    READER_TEST=
 else    
     WITH_READER=1
+    READER_TEST=Readertests
 fi
 AC_SUBST(WITH_READER)
+AC_SUBST(READER_TEST)
 
 AC_ARG_WITH(sax1,
 [  --with-sax1             add the older SAX1 interface (on)])
@@ -654,13 +637,56 @@
 AC_SUBST(WITH_SAX1)
 AC_SUBST(TEST_SAX)
 
+AC_ARG_WITH(push,
+[  --with-push             add the PUSH parser interfaces (on)])
+if test "$with_minimum" = "yes" -a "$with_push" = ""
+then
+    with_push=no
+fi
+if test "$with_push" = "no" ; then
+    echo Disabling the PUSH parser interfaces
+    WITH_PUSH=0
+    TEST_PUSH=
+else    
+    WITH_PUSH=1
+    TEST_PUSH="XMLPushtests"
+fi
+AC_SUBST(WITH_PUSH)
+AC_SUBST(TEST_PUSH)
+
+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
+    if "$with_push" != "no" ; then
+        TEST_PHTML=HTMLPushtests
+    else
+        TEST_PHTML=
+    fi
+fi
+AC_SUBST(WITH_HTML)
+AC_SUBST(HTML_OBJ)
+AC_SUBST(TEST_HTML)
+AC_SUBST(TEST_PHTML)
+
 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
+if test "$with_valid" = "no" ; then
     echo Disabling DTD validation support
     WITH_VALID=0
     TEST_VALID=
@@ -863,7 +889,7 @@
 AC_SUBST(WITH_ISO8859X)
 
 AC_ARG_WITH(schemas,
-[  --with-schemas          add experimental Schemas/RelaxNG support (on)])
+[  --with-schemas          add Relax-NG and experimental Schemas support (on)])
 if test "$with_minimum" = "yes" -a "$with_schemas" = ""
 then
     with_schemas=no
diff --git a/include/libxml/HTMLparser.h b/include/libxml/HTMLparser.h
index 66f2d80..6bab1a5 100644
--- a/include/libxml/HTMLparser.h
+++ b/include/libxml/HTMLparser.h
@@ -136,11 +136,10 @@
 XMLPUBFUN int XMLCALL			
 			htmlHandleOmittedElem(int val);
 
+#ifdef LIBXML_PUSH_ENABLED
 /**
  * Interfaces for the Push mode.
  */
-XMLPUBFUN void XMLCALL			
-			htmlFreeParserCtxt	(htmlParserCtxtPtr ctxt);
 XMLPUBFUN htmlParserCtxtPtr XMLCALL	
 			htmlCreatePushParserCtxt(htmlSAXHandlerPtr sax,
 						 void *user_data,
@@ -153,6 +152,10 @@
 						 const char *chunk,
 						 int size,
 						 int terminate);
+#endif /* LIBXML_PUSH_ENABLED */
+
+XMLPUBFUN void XMLCALL			
+			htmlFreeParserCtxt	(htmlParserCtxtPtr ctxt);
 
 /*
  * New set of simpler/more flexible APIs
diff --git a/include/libxml/parser.h b/include/libxml/parser.h
index b76a7c4..11bf648 100644
--- a/include/libxml/parser.h
+++ b/include/libxml/parser.h
@@ -1000,6 +1000,7 @@
 					 const char *name,
 					 void *value);
 
+#ifdef LIBXML_PUSH_ENABLED
 /*
  * Interfaces for the Push mode.
  */
@@ -1014,6 +1015,7 @@
 					 const char *chunk,
 					 int size,
 					 int terminate);
+#endif /* LIBXML_PUSH_ENABLED */
 
 /*
  * Special I/O mode.
diff --git a/include/libxml/parserInternals.h b/include/libxml/parserInternals.h
index 6e6f08c..080b728 100644
--- a/include/libxml/parserInternals.h
+++ b/include/libxml/parserInternals.h
@@ -40,6 +40,18 @@
  *									*
  ************************************************************************/
 /**
+ * IS_BYTE_CHAR:
+ * @c:  an byte value (int)
+ *
+ * Macro to check the following production in the XML spec:
+ *
+ * [2] Char ::= #x9 | #xA | #xD | [#x20...]
+ * any byte character in the accepted range
+ */
+#define IS_BYTE_CHAR(c)							\
+    (((c) >= 0x20) || ((c) == 0x09) || ((c) == 0x0A) || ((c) == 0x0D))
+
+/**
  * IS_CHAR:
  * @c:  an UNICODE value (int)
  *
diff --git a/include/libxml/xmlversion.h.in b/include/libxml/xmlversion.h.in
index ee09346..e1cd434 100644
--- a/include/libxml/xmlversion.h.in
+++ b/include/libxml/xmlversion.h.in
@@ -102,6 +102,15 @@
 #endif
 
 /**
+ * LIBXML_PUSH_ENABLED:
+ *
+ * Whether the push parsing interfaces are configured in
+ */
+#if @WITH_PUSH@
+#define LIBXML_PUSH_ENABLED
+#endif
+
+/**
  * LIBXML_READER_ENABLED:
  *
  * Whether the xmlReader parsing interface is configured in
diff --git a/legacy.c b/legacy.c
index 83bfe3d..3d29c98 100644
--- a/legacy.c
+++ b/legacy.c
@@ -24,6 +24,288 @@
  *									*
  ************************************************************************/
 
+static const char *xmlFeaturesList[] = {
+    "validate",
+    "load subset",
+    "keep blanks",
+    "disable SAX",
+    "fetch external entities",
+    "substitute entities",
+    "gather line info",
+    "user data",
+    "is html",
+    "is standalone",
+    "stop parser",
+    "document",
+    "is well formed",
+    "is valid",
+    "SAX block",
+    "SAX function internalSubset",
+    "SAX function isStandalone",
+    "SAX function hasInternalSubset",
+    "SAX function hasExternalSubset",
+    "SAX function resolveEntity",
+    "SAX function getEntity",
+    "SAX function entityDecl",
+    "SAX function notationDecl",
+    "SAX function attributeDecl",
+    "SAX function elementDecl",
+    "SAX function unparsedEntityDecl",
+    "SAX function setDocumentLocator",
+    "SAX function startDocument",
+    "SAX function endDocument",
+    "SAX function startElement",
+    "SAX function endElement",
+    "SAX function reference",
+    "SAX function characters",
+    "SAX function ignorableWhitespace",
+    "SAX function processingInstruction",
+    "SAX function comment",
+    "SAX function warning",
+    "SAX function error",
+    "SAX function fatalError",
+    "SAX function getParameterEntity",
+    "SAX function cdataBlock",
+    "SAX function externalSubset",
+};
+
+/**
+ * xmlGetFeaturesList:
+ * @len:  the length of the features name array (input/output)
+ * @result:  an array of string to be filled with the features name.
+ *
+ * Copy at most *@len feature names into the @result array
+ *
+ * Returns -1 in case or error, or the total number of features,
+ *            len is updated with the number of strings copied,
+ *            strings must not be deallocated
+ */
+int
+xmlGetFeaturesList(int *len, const char **result) {
+    int ret, i;
+
+    ret = sizeof(xmlFeaturesList)/sizeof(xmlFeaturesList[0]);
+    if ((len == NULL) || (result == NULL))
+	return(ret);
+    if ((*len < 0) || (*len >= 1000))
+	return(-1);
+    if (*len > ret)
+	*len = ret;
+    for (i = 0;i < *len;i++)
+	result[i] = xmlFeaturesList[i];
+    return(ret);
+}
+
+/**
+ * xmlGetFeature:
+ * @ctxt:  an XML/HTML parser context
+ * @name:  the feature name
+ * @result:  location to store the result
+ *
+ * Read the current value of one feature of this parser instance
+ *
+ * Returns -1 in case or error, 0 otherwise
+ */
+int
+xmlGetFeature(xmlParserCtxtPtr ctxt, const char *name, void *result) {
+    if ((ctxt == NULL) || (name == NULL) || (result == NULL))
+	return(-1);
+
+    if (!strcmp(name, "validate")) {
+	*((int *) result) = ctxt->validate;
+    } else if (!strcmp(name, "keep blanks")) {
+	*((int *) result) = ctxt->keepBlanks;
+    } else if (!strcmp(name, "disable SAX")) {
+	*((int *) result) = ctxt->disableSAX;
+    } else if (!strcmp(name, "fetch external entities")) {
+	*((int *) result) = ctxt->loadsubset;
+    } else if (!strcmp(name, "substitute entities")) {
+	*((int *) result) = ctxt->replaceEntities;
+    } else if (!strcmp(name, "gather line info")) {
+	*((int *) result) = ctxt->record_info;
+    } else if (!strcmp(name, "user data")) {
+	*((void **)result) = ctxt->userData;
+    } else if (!strcmp(name, "is html")) {
+	*((int *) result) = ctxt->html;
+    } else if (!strcmp(name, "is standalone")) {
+	*((int *) result) = ctxt->standalone;
+    } else if (!strcmp(name, "document")) {
+	*((xmlDocPtr *) result) = ctxt->myDoc;
+    } else if (!strcmp(name, "is well formed")) {
+	*((int *) result) = ctxt->wellFormed;
+    } else if (!strcmp(name, "is valid")) {
+	*((int *) result) = ctxt->valid;
+    } else if (!strcmp(name, "SAX block")) {
+	*((xmlSAXHandlerPtr *) result) = ctxt->sax;
+    } else if (!strcmp(name, "SAX function internalSubset")) {
+        *((internalSubsetSAXFunc *) result) = ctxt->sax->internalSubset;
+    } else if (!strcmp(name, "SAX function isStandalone")) {
+        *((isStandaloneSAXFunc *) result) = ctxt->sax->isStandalone;
+    } else if (!strcmp(name, "SAX function hasInternalSubset")) {
+        *((hasInternalSubsetSAXFunc *) result) = ctxt->sax->hasInternalSubset;
+    } else if (!strcmp(name, "SAX function hasExternalSubset")) {
+        *((hasExternalSubsetSAXFunc *) result) = ctxt->sax->hasExternalSubset;
+    } else if (!strcmp(name, "SAX function resolveEntity")) {
+        *((resolveEntitySAXFunc *) result) = ctxt->sax->resolveEntity;
+    } else if (!strcmp(name, "SAX function getEntity")) {
+        *((getEntitySAXFunc *) result) = ctxt->sax->getEntity;
+    } else if (!strcmp(name, "SAX function entityDecl")) {
+        *((entityDeclSAXFunc *) result) = ctxt->sax->entityDecl;
+    } else if (!strcmp(name, "SAX function notationDecl")) {
+        *((notationDeclSAXFunc *) result) = ctxt->sax->notationDecl;
+    } else if (!strcmp(name, "SAX function attributeDecl")) {
+        *((attributeDeclSAXFunc *) result) = ctxt->sax->attributeDecl;
+    } else if (!strcmp(name, "SAX function elementDecl")) {
+        *((elementDeclSAXFunc *) result) = ctxt->sax->elementDecl;
+    } else if (!strcmp(name, "SAX function unparsedEntityDecl")) {
+        *((unparsedEntityDeclSAXFunc *) result) = ctxt->sax->unparsedEntityDecl;
+    } else if (!strcmp(name, "SAX function setDocumentLocator")) {
+        *((setDocumentLocatorSAXFunc *) result) = ctxt->sax->setDocumentLocator;
+    } else if (!strcmp(name, "SAX function startDocument")) {
+        *((startDocumentSAXFunc *) result) = ctxt->sax->startDocument;
+    } else if (!strcmp(name, "SAX function endDocument")) {
+        *((endDocumentSAXFunc *) result) = ctxt->sax->endDocument;
+    } else if (!strcmp(name, "SAX function startElement")) {
+        *((startElementSAXFunc *) result) = ctxt->sax->startElement;
+    } else if (!strcmp(name, "SAX function endElement")) {
+        *((endElementSAXFunc *) result) = ctxt->sax->endElement;
+    } else if (!strcmp(name, "SAX function reference")) {
+        *((referenceSAXFunc *) result) = ctxt->sax->reference;
+    } else if (!strcmp(name, "SAX function characters")) {
+        *((charactersSAXFunc *) result) = ctxt->sax->characters;
+    } else if (!strcmp(name, "SAX function ignorableWhitespace")) {
+        *((ignorableWhitespaceSAXFunc *) result) = ctxt->sax->ignorableWhitespace;
+    } else if (!strcmp(name, "SAX function processingInstruction")) {
+        *((processingInstructionSAXFunc *) result) = ctxt->sax->processingInstruction;
+    } else if (!strcmp(name, "SAX function comment")) {
+        *((commentSAXFunc *) result) = ctxt->sax->comment;
+    } else if (!strcmp(name, "SAX function warning")) {
+        *((warningSAXFunc *) result) = ctxt->sax->warning;
+    } else if (!strcmp(name, "SAX function error")) {
+        *((errorSAXFunc *) result) = ctxt->sax->error;
+    } else if (!strcmp(name, "SAX function fatalError")) {
+        *((fatalErrorSAXFunc *) result) = ctxt->sax->fatalError;
+    } else if (!strcmp(name, "SAX function getParameterEntity")) {
+        *((getParameterEntitySAXFunc *) result) = ctxt->sax->getParameterEntity;
+    } else if (!strcmp(name, "SAX function cdataBlock")) {
+        *((cdataBlockSAXFunc *) result) = ctxt->sax->cdataBlock;
+    } else if (!strcmp(name, "SAX function externalSubset")) {
+        *((externalSubsetSAXFunc *) result) = ctxt->sax->externalSubset;
+    } else {
+	return(-1);
+    }
+    return(0);
+}
+
+/**
+ * xmlSetFeature:
+ * @ctxt:  an XML/HTML parser context
+ * @name:  the feature name
+ * @value:  pointer to the location of the new value
+ *
+ * Change the current value of one feature of this parser instance
+ *
+ * Returns -1 in case or error, 0 otherwise
+ */
+int	
+xmlSetFeature(xmlParserCtxtPtr ctxt, const char *name, void *value) {
+    if ((ctxt == NULL) || (name == NULL) || (value == NULL))
+	return(-1);
+
+    if (!strcmp(name, "validate")) {
+	int newvalidate = *((int *) value);
+	if ((!ctxt->validate) && (newvalidate != 0)) {
+	    if (ctxt->vctxt.warning == NULL)
+		ctxt->vctxt.warning = xmlParserValidityWarning;
+	    if (ctxt->vctxt.error == NULL)
+		ctxt->vctxt.error = xmlParserValidityError;
+	    ctxt->vctxt.nodeMax = 0;
+	}
+        ctxt->validate = newvalidate;
+    } else if (!strcmp(name, "keep blanks")) {
+        ctxt->keepBlanks = *((int *) value);
+    } else if (!strcmp(name, "disable SAX")) {
+        ctxt->disableSAX = *((int *) value);
+    } else if (!strcmp(name, "fetch external entities")) {
+	ctxt->loadsubset = *((int *) value);
+    } else if (!strcmp(name, "substitute entities")) {
+        ctxt->replaceEntities = *((int *) value);
+    } else if (!strcmp(name, "gather line info")) {
+        ctxt->record_info = *((int *) value);
+    } else if (!strcmp(name, "user data")) {
+        ctxt->userData = *((void **)value);
+    } else if (!strcmp(name, "is html")) {
+        ctxt->html = *((int *) value);
+    } else if (!strcmp(name, "is standalone")) {
+        ctxt->standalone = *((int *) value);
+    } else if (!strcmp(name, "document")) {
+        ctxt->myDoc = *((xmlDocPtr *) value);
+    } else if (!strcmp(name, "is well formed")) {
+        ctxt->wellFormed = *((int *) value);
+    } else if (!strcmp(name, "is valid")) {
+        ctxt->valid = *((int *) value);
+    } else if (!strcmp(name, "SAX block")) {
+        ctxt->sax = *((xmlSAXHandlerPtr *) value);
+    } else if (!strcmp(name, "SAX function internalSubset")) {
+        ctxt->sax->internalSubset = *((internalSubsetSAXFunc *) value);
+    } else if (!strcmp(name, "SAX function isStandalone")) {
+        ctxt->sax->isStandalone = *((isStandaloneSAXFunc *) value);
+    } else if (!strcmp(name, "SAX function hasInternalSubset")) {
+        ctxt->sax->hasInternalSubset = *((hasInternalSubsetSAXFunc *) value);
+    } else if (!strcmp(name, "SAX function hasExternalSubset")) {
+        ctxt->sax->hasExternalSubset = *((hasExternalSubsetSAXFunc *) value);
+    } else if (!strcmp(name, "SAX function resolveEntity")) {
+        ctxt->sax->resolveEntity = *((resolveEntitySAXFunc *) value);
+    } else if (!strcmp(name, "SAX function getEntity")) {
+        ctxt->sax->getEntity = *((getEntitySAXFunc *) value);
+    } else if (!strcmp(name, "SAX function entityDecl")) {
+        ctxt->sax->entityDecl = *((entityDeclSAXFunc *) value);
+    } else if (!strcmp(name, "SAX function notationDecl")) {
+        ctxt->sax->notationDecl = *((notationDeclSAXFunc *) value);
+    } else if (!strcmp(name, "SAX function attributeDecl")) {
+        ctxt->sax->attributeDecl = *((attributeDeclSAXFunc *) value);
+    } else if (!strcmp(name, "SAX function elementDecl")) {
+        ctxt->sax->elementDecl = *((elementDeclSAXFunc *) value);
+    } else if (!strcmp(name, "SAX function unparsedEntityDecl")) {
+        ctxt->sax->unparsedEntityDecl = *((unparsedEntityDeclSAXFunc *) value);
+    } else if (!strcmp(name, "SAX function setDocumentLocator")) {
+        ctxt->sax->setDocumentLocator = *((setDocumentLocatorSAXFunc *) value);
+    } else if (!strcmp(name, "SAX function startDocument")) {
+        ctxt->sax->startDocument = *((startDocumentSAXFunc *) value);
+    } else if (!strcmp(name, "SAX function endDocument")) {
+        ctxt->sax->endDocument = *((endDocumentSAXFunc *) value);
+    } else if (!strcmp(name, "SAX function startElement")) {
+        ctxt->sax->startElement = *((startElementSAXFunc *) value);
+    } else if (!strcmp(name, "SAX function endElement")) {
+        ctxt->sax->endElement = *((endElementSAXFunc *) value);
+    } else if (!strcmp(name, "SAX function reference")) {
+        ctxt->sax->reference = *((referenceSAXFunc *) value);
+    } else if (!strcmp(name, "SAX function characters")) {
+        ctxt->sax->characters = *((charactersSAXFunc *) value);
+    } else if (!strcmp(name, "SAX function ignorableWhitespace")) {
+        ctxt->sax->ignorableWhitespace = *((ignorableWhitespaceSAXFunc *) value);
+    } else if (!strcmp(name, "SAX function processingInstruction")) {
+        ctxt->sax->processingInstruction = *((processingInstructionSAXFunc *) value);
+    } else if (!strcmp(name, "SAX function comment")) {
+        ctxt->sax->comment = *((commentSAXFunc *) value);
+    } else if (!strcmp(name, "SAX function warning")) {
+        ctxt->sax->warning = *((warningSAXFunc *) value);
+    } else if (!strcmp(name, "SAX function error")) {
+        ctxt->sax->error = *((errorSAXFunc *) value);
+    } else if (!strcmp(name, "SAX function fatalError")) {
+        ctxt->sax->fatalError = *((fatalErrorSAXFunc *) value);
+    } else if (!strcmp(name, "SAX function getParameterEntity")) {
+        ctxt->sax->getParameterEntity = *((getParameterEntitySAXFunc *) value);
+    } else if (!strcmp(name, "SAX function cdataBlock")) {
+        ctxt->sax->cdataBlock = *((cdataBlockSAXFunc *) value);
+    } else if (!strcmp(name, "SAX function externalSubset")) {
+        ctxt->sax->externalSubset = *((externalSubsetSAXFunc *) value);
+    } else {
+	return(-1);
+    }
+    return(0);
+}
+
 /**
  * xmlDecodeEntities:
  * @ctxt:  the parser context
diff --git a/parser.c b/parser.c
index 9e34792..a018692 100644
--- a/parser.c
+++ b/parser.c
@@ -1419,7 +1419,7 @@
      * Characters referred to using character references must match the
      * production for Char. 
      */
-    if (IS_CHAR(val)) {
+    if (xmlIsChar(val)) {
         return(val);
     } else {
         xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR,
@@ -1503,7 +1503,7 @@
      * Characters referred to using character references must match the
      * production for Char. 
      */
-    if (IS_CHAR(val)) {
+    if (xmlIsChar(val)) {
         return(val);
     } else {
         xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR,
@@ -2754,11 +2754,11 @@
     }
 
     while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */
-	   ((IS_LETTER(c)) || (IS_DIGIT(c)) ||
+	   ((xmlIsLetter(c)) || (xmlIsDigit(c)) ||
             (c == '.') || (c == '-') ||
 	    (c == '_') || (c == ':') || 
-	    (IS_COMBINING(c)) ||
-	    (IS_EXTENDER(c)))) {
+	    (xmlIsCombining(c)) ||
+	    (xmlIsExtender(c)))) {
 	if (count++ > 100) {
 	    count = 0;
 	    GROW;
@@ -2796,16 +2796,16 @@
     int c;
 
     c = CUR_SCHAR(cur, l);
-    if (!IS_LETTER(c) && (c != '_') &&
+    if (!xmlIsLetter(c) && (c != '_') &&
         (c != ':')) {
 	return(NULL);
     }
 
-    while ((IS_LETTER(c)) || (IS_DIGIT(c)) || /* test bigentname.xml */
+    while ((xmlIsLetter(c)) || (xmlIsDigit(c)) || /* test bigentname.xml */
            (c == '.') || (c == '-') ||
 	   (c == '_') || (c == ':') || 
-	   (IS_COMBINING(c)) ||
-	   (IS_EXTENDER(c))) {
+	   (xmlIsCombining(c)) ||
+	   (xmlIsExtender(c))) {
 	COPY_BUF(l,buf,len,c);
 	cur += l;
 	c = CUR_SCHAR(cur, l);
@@ -2823,11 +2823,12 @@
 		return(NULL);
 	    }
 	    memcpy(buffer, buf, len);
-	    while ((IS_LETTER(c)) || (IS_DIGIT(c)) || /* test bigentname.xml */
+	    while ((xmlIsLetter(c)) || (xmlIsDigit(c)) ||
+	             /* test bigentname.xml */
 		   (c == '.') || (c == '-') ||
 		   (c == '_') || (c == ':') || 
-		   (IS_COMBINING(c)) ||
-		   (IS_EXTENDER(c))) {
+		   (xmlIsCombining(c)) ||
+		   (xmlIsExtender(c))) {
 		if (len + 10 > max) {
 		    max *= 2;
 		    buffer = (xmlChar *) xmlRealloc(buffer,
@@ -2873,11 +2874,11 @@
     GROW;
     c = CUR_CHAR(l);
 
-    while ((IS_LETTER(c)) || (IS_DIGIT(c)) || /* test bigtoken.xml */
+    while ((xmlIsLetter(c)) || (xmlIsDigit(c)) || /* test bigtoken.xml */
            (c == '.') || (c == '-') ||
 	   (c == '_') || (c == ':') || 
-	   (IS_COMBINING(c)) ||
-	   (IS_EXTENDER(c))) {
+	   (xmlIsCombining(c)) ||
+	   (xmlIsExtender(c))) {
 	if (count++ > 100) {
 	    count = 0;
 	    GROW;
@@ -2899,11 +2900,11 @@
 		return(NULL);
 	    }
 	    memcpy(buffer, buf, len);
-	    while ((IS_LETTER(c)) || (IS_DIGIT(c)) || /* test bigtoken.xml */
+	    while ((xmlIsLetter(c)) || (xmlIsDigit(c)) || /* test bigtoken.xml */
 		   (c == '.') || (c == '-') ||
 		   (c == '_') || (c == ':') || 
-		   (IS_COMBINING(c)) ||
-		   (IS_EXTENDER(c))) {
+		   (xmlIsCombining(c)) ||
+		   (xmlIsExtender(c))) {
 		if (count++ > 100) {
 		    count = 0;
 		    GROW;
@@ -2984,7 +2985,7 @@
      * In practice it means we stop the loop only when back at parsing
      * the initial entity and the quote is found
      */
-    while ((IS_CHAR(c)) && ((c != stop) || /* checked */
+    while ((xmlIsChar(c)) && ((c != stop) || /* checked */
 	   (ctxt->input != input))) {
 	if (len + 5 >= size) {
 	    size *= 2;
@@ -3336,7 +3337,7 @@
     }
     ctxt->instate = XML_PARSER_SYSTEM_LITERAL;
     cur = CUR_CHAR(l);
-    while ((IS_CHAR(cur)) && (cur != stop)) { /* checked */
+    while ((xmlIsChar(cur)) && (cur != stop)) { /* checked */
 	if (len + 5 >= size) {
 	    size *= 2;
 	    buf = (xmlChar *) xmlRealloc(buf, size * sizeof(xmlChar));
@@ -3362,7 +3363,7 @@
     }
     buf[len] = 0;
     ctxt->instate = (xmlParserInputState) state;
-    if (!IS_CHAR(cur)) {
+    if (!xmlIsChar(cur)) {
 	xmlFatalErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, NULL);
     } else {
 	NEXT;
@@ -3570,7 +3571,7 @@
     cur = CUR_CHAR(l);
     while ((cur != '<') && /* checked */
            (cur != '&') && 
-	   (IS_CHAR(cur))) /* test also done in xmlCurrentChar() */ {
+	   (xmlIsChar(cur))) /* test also done in xmlCurrentChar() */ {
 	if ((cur == ']') && (NXT(1) == ']') &&
 	    (NXT(2) == '>')) {
 	    if (cdata) break;
@@ -3753,7 +3754,7 @@
     NEXTL(rl);
     cur = CUR_CHAR(l);
     len = 0;
-    while (IS_CHAR(cur) && /* checked */
+    while (xmlIsChar(cur) && /* checked */
            ((cur != '>') ||
 	    (r != '-') || (q != '-'))) {
 	if ((r == '-') && (q == '-')) {
@@ -3788,7 +3789,7 @@
 	}
     }
     buf[len] = 0;
-    if (!IS_CHAR(cur)) {
+    if (!xmlIsChar(cur)) {
 	xmlFatalErrMsgStr(ctxt, XML_ERR_COMMENT_NOT_FINISHED,
 	                     "Comment not terminated \n<!--%.50s\n", buf);
 	xmlFree(buf);
@@ -3980,7 +3981,7 @@
 	    }
             SKIP_BLANKS;
 	    cur = CUR_CHAR(l);
-	    while (IS_CHAR(cur) && /* checked */
+	    while (xmlIsChar(cur) && /* checked */
 		   ((cur != '?') || (NXT(1) != '>'))) {
 		if (len + 5 >= size) {
 		    size *= 2;
@@ -6901,7 +6902,7 @@
 
     while ((RAW != '>') && 
 	   ((RAW != '/') || (NXT(1) != '>')) &&
-	   (IS_CHAR((unsigned int) RAW))) {
+	   (IS_BYTE_CHAR(RAW))) {
 	const xmlChar *q = CUR_PTR;
 	unsigned int cons = ctxt->input->consumed;
 
@@ -7033,7 +7034,7 @@
      */
     GROW;
     SKIP_BLANKS;
-    if ((!IS_CHAR((unsigned int) RAW)) || (RAW != '>')) {
+    if ((!IS_BYTE_CHAR(RAW)) || (RAW != '>')) {
 	xmlFatalErr(ctxt, XML_ERR_GT_REQUIRED, NULL);
     } else
 	NEXT1;
@@ -7115,10 +7116,10 @@
     }
 
     while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */
-	   ((IS_LETTER(c)) || (IS_DIGIT(c)) ||
+	   ((xmlIsLetter(c)) || (xmlIsDigit(c)) ||
             (c == '.') || (c == '-') || (c == '_') ||
-	    (IS_COMBINING(c)) ||
-	    (IS_EXTENDER(c)))) {
+	    (xmlIsCombining(c)) ||
+	    (xmlIsExtender(c)))) {
 	if (count++ > 100) {
 	    count = 0;
 	    GROW;
@@ -7662,7 +7663,7 @@
 
     while ((RAW != '>') && 
 	   ((RAW != '/') || (NXT(1) != '>')) &&
-	   (IS_CHAR((unsigned int) RAW))) {
+	   (IS_BYTE_CHAR(RAW))) {
 	const xmlChar *q = CUR_PTR;
 	unsigned int cons = ctxt->input->consumed;
 	int len = -1, alloc = 0;
@@ -7996,7 +7997,7 @@
      */
     GROW;
     SKIP_BLANKS;
-    if ((!IS_CHAR((unsigned int) RAW)) || (RAW != '>')) {
+    if ((!IS_BYTE_CHAR(RAW)) || (RAW != '>')) {
 	xmlFatalErr(ctxt, XML_ERR_GT_REQUIRED, NULL);
     } else
 	NEXT1;
@@ -8072,14 +8073,14 @@
 
     ctxt->instate = XML_PARSER_CDATA_SECTION;
     r = CUR_CHAR(rl);
-    if (!IS_CHAR(r)) {
+    if (!xmlIsChar(r)) {
 	xmlFatalErr(ctxt, XML_ERR_CDATA_NOT_FINISHED, NULL);
 	ctxt->instate = XML_PARSER_CONTENT;
         return;
     }
     NEXTL(rl);
     s = CUR_CHAR(sl);
-    if (!IS_CHAR(s)) {
+    if (!xmlIsChar(s)) {
 	xmlFatalErr(ctxt, XML_ERR_CDATA_NOT_FINISHED, NULL);
 	ctxt->instate = XML_PARSER_CONTENT;
         return;
@@ -8091,7 +8092,7 @@
 	xmlErrMemory(ctxt, NULL);
 	return;
     }
-    while (IS_CHAR(cur) &&
+    while (xmlIsChar(cur) &&
            ((r != ']') || (s != ']') || (cur != '>'))) {
 	if (len + 5 >= size) {
 	    size *= 2;
@@ -8350,7 +8351,7 @@
      * Parse the content of the element:
      */
     xmlParseContent(ctxt);
-    if (!IS_CHAR((unsigned int) RAW)) {
+    if (!IS_BYTE_CHAR(RAW)) {
 	ctxt->errNo = XML_ERR_TAG_NOT_FINISHED;
 	if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
 	    ctxt->sax->error(ctxt->userData,
@@ -9099,6 +9100,7 @@
     return(0);
 }
 
+#ifdef LIBXML_PUSH_ENABLED
 /************************************************************************
  *									*
  * 		Progressive parsing interfaces				*
@@ -10274,6 +10276,7 @@
 
     return(ctxt);
 }
+#endif /* LIBXML_PUSH_ENABLED */
 
 /**
  * xmlCreateIOParserCtxt:
diff --git a/parserInternals.c b/parserInternals.c
index b767ed5..7b2270c 100644
--- a/parserInternals.c
+++ b/parserInternals.c
@@ -86,289 +86,6 @@
     }
 }
 
-
-static const char *xmlFeaturesList[] = {
-    "validate",
-    "load subset",
-    "keep blanks",
-    "disable SAX",
-    "fetch external entities",
-    "substitute entities",
-    "gather line info",
-    "user data",
-    "is html",
-    "is standalone",
-    "stop parser",
-    "document",
-    "is well formed",
-    "is valid",
-    "SAX block",
-    "SAX function internalSubset",
-    "SAX function isStandalone",
-    "SAX function hasInternalSubset",
-    "SAX function hasExternalSubset",
-    "SAX function resolveEntity",
-    "SAX function getEntity",
-    "SAX function entityDecl",
-    "SAX function notationDecl",
-    "SAX function attributeDecl",
-    "SAX function elementDecl",
-    "SAX function unparsedEntityDecl",
-    "SAX function setDocumentLocator",
-    "SAX function startDocument",
-    "SAX function endDocument",
-    "SAX function startElement",
-    "SAX function endElement",
-    "SAX function reference",
-    "SAX function characters",
-    "SAX function ignorableWhitespace",
-    "SAX function processingInstruction",
-    "SAX function comment",
-    "SAX function warning",
-    "SAX function error",
-    "SAX function fatalError",
-    "SAX function getParameterEntity",
-    "SAX function cdataBlock",
-    "SAX function externalSubset",
-};
-
-/**
- * xmlGetFeaturesList:
- * @len:  the length of the features name array (input/output)
- * @result:  an array of string to be filled with the features name.
- *
- * Copy at most *@len feature names into the @result array
- *
- * Returns -1 in case or error, or the total number of features,
- *            len is updated with the number of strings copied,
- *            strings must not be deallocated
- */
-int
-xmlGetFeaturesList(int *len, const char **result) {
-    int ret, i;
-
-    ret = sizeof(xmlFeaturesList)/sizeof(xmlFeaturesList[0]);
-    if ((len == NULL) || (result == NULL))
-	return(ret);
-    if ((*len < 0) || (*len >= 1000))
-	return(-1);
-    if (*len > ret)
-	*len = ret;
-    for (i = 0;i < *len;i++)
-	result[i] = xmlFeaturesList[i];
-    return(ret);
-}
-
-/**
- * xmlGetFeature:
- * @ctxt:  an XML/HTML parser context
- * @name:  the feature name
- * @result:  location to store the result
- *
- * Read the current value of one feature of this parser instance
- *
- * Returns -1 in case or error, 0 otherwise
- */
-int
-xmlGetFeature(xmlParserCtxtPtr ctxt, const char *name, void *result) {
-    if ((ctxt == NULL) || (name == NULL) || (result == NULL))
-	return(-1);
-
-    if (!strcmp(name, "validate")) {
-	*((int *) result) = ctxt->validate;
-    } else if (!strcmp(name, "keep blanks")) {
-	*((int *) result) = ctxt->keepBlanks;
-    } else if (!strcmp(name, "disable SAX")) {
-	*((int *) result) = ctxt->disableSAX;
-    } else if (!strcmp(name, "fetch external entities")) {
-	*((int *) result) = ctxt->loadsubset;
-    } else if (!strcmp(name, "substitute entities")) {
-	*((int *) result) = ctxt->replaceEntities;
-    } else if (!strcmp(name, "gather line info")) {
-	*((int *) result) = ctxt->record_info;
-    } else if (!strcmp(name, "user data")) {
-	*((void **)result) = ctxt->userData;
-    } else if (!strcmp(name, "is html")) {
-	*((int *) result) = ctxt->html;
-    } else if (!strcmp(name, "is standalone")) {
-	*((int *) result) = ctxt->standalone;
-    } else if (!strcmp(name, "document")) {
-	*((xmlDocPtr *) result) = ctxt->myDoc;
-    } else if (!strcmp(name, "is well formed")) {
-	*((int *) result) = ctxt->wellFormed;
-    } else if (!strcmp(name, "is valid")) {
-	*((int *) result) = ctxt->valid;
-    } else if (!strcmp(name, "SAX block")) {
-	*((xmlSAXHandlerPtr *) result) = ctxt->sax;
-    } else if (!strcmp(name, "SAX function internalSubset")) {
-        *((internalSubsetSAXFunc *) result) = ctxt->sax->internalSubset;
-    } else if (!strcmp(name, "SAX function isStandalone")) {
-        *((isStandaloneSAXFunc *) result) = ctxt->sax->isStandalone;
-    } else if (!strcmp(name, "SAX function hasInternalSubset")) {
-        *((hasInternalSubsetSAXFunc *) result) = ctxt->sax->hasInternalSubset;
-    } else if (!strcmp(name, "SAX function hasExternalSubset")) {
-        *((hasExternalSubsetSAXFunc *) result) = ctxt->sax->hasExternalSubset;
-    } else if (!strcmp(name, "SAX function resolveEntity")) {
-        *((resolveEntitySAXFunc *) result) = ctxt->sax->resolveEntity;
-    } else if (!strcmp(name, "SAX function getEntity")) {
-        *((getEntitySAXFunc *) result) = ctxt->sax->getEntity;
-    } else if (!strcmp(name, "SAX function entityDecl")) {
-        *((entityDeclSAXFunc *) result) = ctxt->sax->entityDecl;
-    } else if (!strcmp(name, "SAX function notationDecl")) {
-        *((notationDeclSAXFunc *) result) = ctxt->sax->notationDecl;
-    } else if (!strcmp(name, "SAX function attributeDecl")) {
-        *((attributeDeclSAXFunc *) result) = ctxt->sax->attributeDecl;
-    } else if (!strcmp(name, "SAX function elementDecl")) {
-        *((elementDeclSAXFunc *) result) = ctxt->sax->elementDecl;
-    } else if (!strcmp(name, "SAX function unparsedEntityDecl")) {
-        *((unparsedEntityDeclSAXFunc *) result) = ctxt->sax->unparsedEntityDecl;
-    } else if (!strcmp(name, "SAX function setDocumentLocator")) {
-        *((setDocumentLocatorSAXFunc *) result) = ctxt->sax->setDocumentLocator;
-    } else if (!strcmp(name, "SAX function startDocument")) {
-        *((startDocumentSAXFunc *) result) = ctxt->sax->startDocument;
-    } else if (!strcmp(name, "SAX function endDocument")) {
-        *((endDocumentSAXFunc *) result) = ctxt->sax->endDocument;
-    } else if (!strcmp(name, "SAX function startElement")) {
-        *((startElementSAXFunc *) result) = ctxt->sax->startElement;
-    } else if (!strcmp(name, "SAX function endElement")) {
-        *((endElementSAXFunc *) result) = ctxt->sax->endElement;
-    } else if (!strcmp(name, "SAX function reference")) {
-        *((referenceSAXFunc *) result) = ctxt->sax->reference;
-    } else if (!strcmp(name, "SAX function characters")) {
-        *((charactersSAXFunc *) result) = ctxt->sax->characters;
-    } else if (!strcmp(name, "SAX function ignorableWhitespace")) {
-        *((ignorableWhitespaceSAXFunc *) result) = ctxt->sax->ignorableWhitespace;
-    } else if (!strcmp(name, "SAX function processingInstruction")) {
-        *((processingInstructionSAXFunc *) result) = ctxt->sax->processingInstruction;
-    } else if (!strcmp(name, "SAX function comment")) {
-        *((commentSAXFunc *) result) = ctxt->sax->comment;
-    } else if (!strcmp(name, "SAX function warning")) {
-        *((warningSAXFunc *) result) = ctxt->sax->warning;
-    } else if (!strcmp(name, "SAX function error")) {
-        *((errorSAXFunc *) result) = ctxt->sax->error;
-    } else if (!strcmp(name, "SAX function fatalError")) {
-        *((fatalErrorSAXFunc *) result) = ctxt->sax->fatalError;
-    } else if (!strcmp(name, "SAX function getParameterEntity")) {
-        *((getParameterEntitySAXFunc *) result) = ctxt->sax->getParameterEntity;
-    } else if (!strcmp(name, "SAX function cdataBlock")) {
-        *((cdataBlockSAXFunc *) result) = ctxt->sax->cdataBlock;
-    } else if (!strcmp(name, "SAX function externalSubset")) {
-        *((externalSubsetSAXFunc *) result) = ctxt->sax->externalSubset;
-    } else {
-	return(-1);
-    }
-    return(0);
-}
-
-/**
- * xmlSetFeature:
- * @ctxt:  an XML/HTML parser context
- * @name:  the feature name
- * @value:  pointer to the location of the new value
- *
- * Change the current value of one feature of this parser instance
- *
- * Returns -1 in case or error, 0 otherwise
- */
-int	
-xmlSetFeature(xmlParserCtxtPtr ctxt, const char *name, void *value) {
-    if ((ctxt == NULL) || (name == NULL) || (value == NULL))
-	return(-1);
-
-    if (!strcmp(name, "validate")) {
-	int newvalidate = *((int *) value);
-	if ((!ctxt->validate) && (newvalidate != 0)) {
-	    if (ctxt->vctxt.warning == NULL)
-		ctxt->vctxt.warning = xmlParserValidityWarning;
-	    if (ctxt->vctxt.error == NULL)
-		ctxt->vctxt.error = xmlParserValidityError;
-	    ctxt->vctxt.nodeMax = 0;
-	}
-        ctxt->validate = newvalidate;
-    } else if (!strcmp(name, "keep blanks")) {
-        ctxt->keepBlanks = *((int *) value);
-    } else if (!strcmp(name, "disable SAX")) {
-        ctxt->disableSAX = *((int *) value);
-    } else if (!strcmp(name, "fetch external entities")) {
-	ctxt->loadsubset = *((int *) value);
-    } else if (!strcmp(name, "substitute entities")) {
-        ctxt->replaceEntities = *((int *) value);
-    } else if (!strcmp(name, "gather line info")) {
-        ctxt->record_info = *((int *) value);
-    } else if (!strcmp(name, "user data")) {
-        ctxt->userData = *((void **)value);
-    } else if (!strcmp(name, "is html")) {
-        ctxt->html = *((int *) value);
-    } else if (!strcmp(name, "is standalone")) {
-        ctxt->standalone = *((int *) value);
-    } else if (!strcmp(name, "document")) {
-        ctxt->myDoc = *((xmlDocPtr *) value);
-    } else if (!strcmp(name, "is well formed")) {
-        ctxt->wellFormed = *((int *) value);
-    } else if (!strcmp(name, "is valid")) {
-        ctxt->valid = *((int *) value);
-    } else if (!strcmp(name, "SAX block")) {
-        ctxt->sax = *((xmlSAXHandlerPtr *) value);
-    } else if (!strcmp(name, "SAX function internalSubset")) {
-        ctxt->sax->internalSubset = *((internalSubsetSAXFunc *) value);
-    } else if (!strcmp(name, "SAX function isStandalone")) {
-        ctxt->sax->isStandalone = *((isStandaloneSAXFunc *) value);
-    } else if (!strcmp(name, "SAX function hasInternalSubset")) {
-        ctxt->sax->hasInternalSubset = *((hasInternalSubsetSAXFunc *) value);
-    } else if (!strcmp(name, "SAX function hasExternalSubset")) {
-        ctxt->sax->hasExternalSubset = *((hasExternalSubsetSAXFunc *) value);
-    } else if (!strcmp(name, "SAX function resolveEntity")) {
-        ctxt->sax->resolveEntity = *((resolveEntitySAXFunc *) value);
-    } else if (!strcmp(name, "SAX function getEntity")) {
-        ctxt->sax->getEntity = *((getEntitySAXFunc *) value);
-    } else if (!strcmp(name, "SAX function entityDecl")) {
-        ctxt->sax->entityDecl = *((entityDeclSAXFunc *) value);
-    } else if (!strcmp(name, "SAX function notationDecl")) {
-        ctxt->sax->notationDecl = *((notationDeclSAXFunc *) value);
-    } else if (!strcmp(name, "SAX function attributeDecl")) {
-        ctxt->sax->attributeDecl = *((attributeDeclSAXFunc *) value);
-    } else if (!strcmp(name, "SAX function elementDecl")) {
-        ctxt->sax->elementDecl = *((elementDeclSAXFunc *) value);
-    } else if (!strcmp(name, "SAX function unparsedEntityDecl")) {
-        ctxt->sax->unparsedEntityDecl = *((unparsedEntityDeclSAXFunc *) value);
-    } else if (!strcmp(name, "SAX function setDocumentLocator")) {
-        ctxt->sax->setDocumentLocator = *((setDocumentLocatorSAXFunc *) value);
-    } else if (!strcmp(name, "SAX function startDocument")) {
-        ctxt->sax->startDocument = *((startDocumentSAXFunc *) value);
-    } else if (!strcmp(name, "SAX function endDocument")) {
-        ctxt->sax->endDocument = *((endDocumentSAXFunc *) value);
-    } else if (!strcmp(name, "SAX function startElement")) {
-        ctxt->sax->startElement = *((startElementSAXFunc *) value);
-    } else if (!strcmp(name, "SAX function endElement")) {
-        ctxt->sax->endElement = *((endElementSAXFunc *) value);
-    } else if (!strcmp(name, "SAX function reference")) {
-        ctxt->sax->reference = *((referenceSAXFunc *) value);
-    } else if (!strcmp(name, "SAX function characters")) {
-        ctxt->sax->characters = *((charactersSAXFunc *) value);
-    } else if (!strcmp(name, "SAX function ignorableWhitespace")) {
-        ctxt->sax->ignorableWhitespace = *((ignorableWhitespaceSAXFunc *) value);
-    } else if (!strcmp(name, "SAX function processingInstruction")) {
-        ctxt->sax->processingInstruction = *((processingInstructionSAXFunc *) value);
-    } else if (!strcmp(name, "SAX function comment")) {
-        ctxt->sax->comment = *((commentSAXFunc *) value);
-    } else if (!strcmp(name, "SAX function warning")) {
-        ctxt->sax->warning = *((warningSAXFunc *) value);
-    } else if (!strcmp(name, "SAX function error")) {
-        ctxt->sax->error = *((errorSAXFunc *) value);
-    } else if (!strcmp(name, "SAX function fatalError")) {
-        ctxt->sax->fatalError = *((fatalErrorSAXFunc *) value);
-    } else if (!strcmp(name, "SAX function getParameterEntity")) {
-        ctxt->sax->getParameterEntity = *((getParameterEntitySAXFunc *) value);
-    } else if (!strcmp(name, "SAX function cdataBlock")) {
-        ctxt->sax->cdataBlock = *((cdataBlockSAXFunc *) value);
-    } else if (!strcmp(name, "SAX function externalSubset")) {
-        ctxt->sax->externalSubset = *((externalSubsetSAXFunc *) value);
-    } else {
-	return(-1);
-    }
-    return(0);
-}
-
 /************************************************************************
  *									*
  * 		Some functions to avoid too large macros		*
@@ -446,10 +163,8 @@
  */
 int
 xmlIsBaseChar(int c) {
-    return(
-      (((c) < 0x0100) ? xmlBaseArray[c] :
-      (	/* accelerator */
-      (((c) >= 0x0100) && ((c) <= 0x0131)) ||
+    if (c < 0x0100) return(xmlBaseArray[c]);
+    return((((c) >= 0x0100) && ((c) <= 0x0131)) ||
       (((c) >= 0x0134) && ((c) <= 0x013E)) ||
       (((c) >= 0x0141) && ((c) <= 0x0148)) ||
       (((c) >= 0x014A) && ((c) <= 0x017E)) ||
@@ -647,7 +362,8 @@
       (((c) >= 0x3041) && ((c) <= 0x3094)) ||
       (((c) >= 0x30A1) && ((c) <= 0x30FA)) ||
       (((c) >= 0x3105) && ((c) <= 0x312C)) ||
-      (((c) >= 0xAC00) && ((c) <= 0xD7A3))) /* accelerators */ ))))));
+      (((c) >= 0xAC00) && ((c) <= 0xD7A3))) /* accelerators */
+      ))));
 }
 
 /**
diff --git a/testHTML.c b/testHTML.c
index 4067fd4..4a6074a 100644
--- a/testHTML.c
+++ b/testHTML.c
@@ -44,7 +44,9 @@
 static int sax = 0;
 static int repeat = 0;
 static int noout = 0;
+#ifdef LIBXML_PUSH_ENABLED
 static int push = 0;
+#endif /* LIBXML_PUSH_ENABLED */
 static char *encoding = NULL;
 static int options = 0;
 
@@ -619,6 +621,7 @@
     /*
      * Empty callbacks for checking
      */
+#ifdef LIBXML_PUSH_ENABLED
     if (push) {
 	FILE *f;
 
@@ -675,6 +678,7 @@
 	    }
 	}
     } else {	
+#endif /* LIBXML_PUSH_ENABLED */
 	doc = htmlSAXParseFile(filename, NULL, emptySAXHandler, NULL);
 	if (doc != NULL) {
 	    fprintf(stdout, "htmlSAXParseFile returned non-NULL\n");
@@ -691,7 +695,9 @@
 		xmlFreeDoc(doc);
 	    }
 	}
+#ifdef LIBXML_PUSH_ENABLED
     }
+#endif /* LIBXML_PUSH_ENABLED */
 }
 
 static void
@@ -782,8 +788,10 @@
 #endif
 	    if ((!strcmp(argv[i], "-copy")) || (!strcmp(argv[i], "--copy")))
 	    copy++;
+#ifdef LIBXML_PUSH_ENABLED
 	else if ((!strcmp(argv[i], "-push")) || (!strcmp(argv[i], "--push")))
 	    push++;
+#endif /* LIBXML_PUSH_ENABLED */
 	else if ((!strcmp(argv[i], "-sax")) || (!strcmp(argv[i], "--sax")))
 	    sax++;
 	else if ((!strcmp(argv[i], "-noout")) || (!strcmp(argv[i], "--noout")))
@@ -831,7 +839,9 @@
 	printf("\t--sax : debug the sequence of SAX callbacks\n");
 	printf("\t--repeat : parse the file 100 times, for timing\n");
 	printf("\t--noout : do not print the result\n");
+#ifdef LIBXML_PUSH_ENABLED
 	printf("\t--push : use the push mode parser\n");
+#endif /* LIBXML_PUSH_ENABLED */
 	printf("\t--encode encoding : output in the given encoding\n");
     }
     xmlCleanupParser();
diff --git a/xmllint.c b/xmllint.c
index fad050a..7249b92 100644
--- a/xmllint.c
+++ b/xmllint.c
@@ -130,7 +130,9 @@
 static int html = 0;
 #endif
 static int htmlout = 0;
+#ifdef LIBXML_PUSH_ENABLED
 static int push = 0;
+#endif /* LIBXML_PUSH_ENABLED */
 #ifdef HAVE_SYS_MMAN_H
 static int memory = 0;
 #endif
@@ -763,6 +765,7 @@
     }
 #endif /* LIBXML_TREE_ENABLED */
 #ifdef LIBXML_HTML_ENABLED
+#ifdef LIBXML_PUSH_ENABLED
     else if ((html) && (push)) {
         FILE *f;
 
@@ -788,11 +791,13 @@
             fclose(f);
         }
     }
+#endif /* LIBXML_PUSH_ENABLED */
     else if (html) {
 	doc = htmlReadFile(filename, NULL, options);
     }
 #endif /* LIBXML_HTML_ENABLED */
     else {
+#ifdef LIBXML_PUSH_ENABLED
 	/*
 	 * build an XML tree from a string;
 	 */
@@ -829,7 +834,9 @@
 		    }
 	        }
 	    }
-	} else if (testIO) {
+	} else
+#endif /* LIBXML_PUSH_ENABLED */
+        if (testIO) {
 	    if ((filename[0] == '-') && (filename[1] == 0)) {
 	        doc = xmlReadFd(0, NULL, NULL, options);
 	    } else {
@@ -1339,7 +1346,9 @@
 #ifdef LIBXML_HTML_ENABLED
     printf("\t--html : use the HTML parser\n");
 #endif
+#ifdef LIBXML_PUSH_ENABLED
     printf("\t--push : use the push mode of the parser\n");
+#endif /* LIBXML_PUSH_ENABLED */
 #ifdef HAVE_SYS_MMAN_H
     printf("\t--memory : parse from memory\n");
 #endif
@@ -1516,9 +1525,12 @@
 	        repeat *= 10;
 	    else
 	        repeat = 100;
-	} else if ((!strcmp(argv[i], "-push")) ||
+	}
+#ifdef LIBXML_PUSH_ENABLED
+	else if ((!strcmp(argv[i], "-push")) ||
 	         (!strcmp(argv[i], "--push")))
 	    push++;
+#endif /* LIBXML_PUSH_ENABLED */
 #ifdef HAVE_SYS_MMAN_H
 	else if ((!strcmp(argv[i], "-memory")) ||
 	         (!strcmp(argv[i], "--memory")))