factoring of more error handling code, serious size reduction and more

* parser.c include/libxml/xmlerror.h: factoring of more
  error handling code, serious size reduction and more lisibility
  of the resulting code.
* parserInternals.c parser.c include/libxml/parserInternals.h
  include/libxml/parser.h: changing the way VC:Proper Group/PE Nesting
  checks are done, use a counter for entities. Entities where freed and
  reallocated at the same address failing the check.
* tree.c: avoid a warning
* result/valid/* result/VC/*: this slightly changes some validation
  error messages.
Daniel
diff --git a/parser.c b/parser.c
index bf4e78a..a9b59c4 100644
--- a/parser.c
+++ b/parser.c
@@ -371,6 +371,9 @@
         case XML_ERR_EXTRA_CONTENT:
 	    errmsg = "extra content at the end of well balanced chunk\n";
 	    break;
+        case XML_ERR_VERSION_MISSING:
+	    errmsg = "Malformed declaration expecting version\n";
+	    break;
 #if 0
         case :
 	    errmsg = "\n";
@@ -390,6 +393,91 @@
         ctxt->disableSAX = 1;
 }
 
+/**
+ * xmlFatalErrMsg:
+ * @ctxt:  an XML parser context
+ * @error:  the error number
+ * @msg:  the error message
+ *
+ * Handle a fatal parser error, i.e. violating Well-Formedness constraints
+ */
+static void
+xmlFatalErrMsg(xmlParserCtxtPtr ctxt, xmlParserErrors error, const char *msg)
+{
+    if (ctxt == NULL) {
+	xmlGenericError(xmlGenericErrorContext,
+			"xmlFatalErr: no context !\n");
+	return;
+    }
+    ctxt->errNo = error;
+    if ((ctxt->sax == NULL) || (ctxt->sax->error == NULL))
+        return;
+    ctxt->sax->error(ctxt->userData, msg);
+    ctxt->wellFormed = 0;
+    if (ctxt->recovery == 0)
+        ctxt->disableSAX = 1;
+}
+
+/**
+ * xmlFatalErrMsgInt:
+ * @ctxt:  an XML parser context
+ * @error:  the error number
+ * @msg:  the error message
+ * @val:  an integer value
+ *
+ * Handle a fatal parser error, i.e. violating Well-Formedness constraints
+ */
+static void
+xmlFatalErrMsgInt(xmlParserCtxtPtr ctxt, xmlParserErrors error,
+		  const char *msg, int val)
+{
+    if (ctxt == NULL) {
+	xmlGenericError(xmlGenericErrorContext,
+			"xmlFatalErr: no context !\n");
+	return;
+    }
+    ctxt->errNo = error;
+    if ((ctxt->sax == NULL) || (ctxt->sax->error == NULL))
+        return;
+    ctxt->sax->error(ctxt->userData, msg, val);
+    ctxt->wellFormed = 0;
+    if (ctxt->recovery == 0)
+        ctxt->disableSAX = 1;
+}
+
+/**
+ * xmlNsErr:
+ * @ctxt:  an XML parser context
+ * @error:  the error number
+ * @msg:  the message
+ * @info1:  extra information string
+ * @info2:  extra information string
+ *
+ * Handle a fatal parser error, i.e. violating Well-Formedness constraints
+ */
+static void
+xmlNsErr(xmlParserCtxtPtr ctxt, xmlParserErrors error,
+         const char *msg,
+	 const xmlChar *info1, const xmlChar *info2, const xmlChar *info3)
+{
+    if (ctxt == NULL)
+	return;
+    if ((ctxt->sax == NULL) || (ctxt->sax->error == NULL))
+        return;
+
+    ctxt->errNo = error;
+    if (info1 == NULL) {
+        ctxt->sax->error(ctxt->userData, msg);
+    } else if (info2 == NULL) {
+        ctxt->sax->error(ctxt->userData, msg, info1);
+    } else if (info3 == NULL) {
+        ctxt->sax->error(ctxt->userData, msg, info1, info2);
+    } else {
+        ctxt->sax->error(ctxt->userData, msg, info1, info2, info3);
+    }
+    ctxt->nsWellFormed = 0;
+}
+
 /************************************************************************
  *									*
  * 		SAX2 defaulted attributes handling			*
@@ -729,13 +817,10 @@
     }
 #ifdef MAX_DEPTH
     if (ctxt->nodeNr > MAX_DEPTH) {
-	if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	    ctxt->sax->error(ctxt->userData, 
+	xmlFatalErrMsgInt(ctxt, XML_ERR_INTERNAL_ERROR,
 		 "Excessive depth in document: change MAX_DEPTH = %d\n",
-		             MAX_DEPTH);
-	ctxt->wellFormed = 0;
+			  MAX_DEPTH);
 	ctxt->instate = XML_PARSER_EOF;
-	if (ctxt->recovery == 0) ctxt->disableSAX = 1;
 	return(0);
     }
 #endif
@@ -1220,13 +1305,9 @@
     if (IS_CHAR(val)) {
         return(val);
     } else {
-	ctxt->errNo = XML_ERR_INVALID_CHAR;
-	if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	    ctxt->sax->error(ctxt->userData,
-                             "xmlParseCharRef: invalid xmlChar value %d\n",
-	                     val);
-	ctxt->wellFormed = 0;
-	if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+        xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR,
+                          "xmlParseCharRef: invalid xmlChar value %d\n",
+	                  val);
     }
     return(0);
 }
@@ -1308,12 +1389,9 @@
     if (IS_CHAR(val)) {
         return(val);
     } else {
-	ctxt->errNo = XML_ERR_INVALID_CHAR;
-	if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	    ctxt->sax->error(ctxt->userData,
-		             "xmlParseStringCharRef: invalid xmlChar value %d\n", val);
-	ctxt->wellFormed = 0;
-	if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+        xmlFatalErrMsgInt(ctxt, XML_ERR_INVALID_CHAR,
+			  "xmlParseStringCharRef: invalid xmlChar value %d\n",
+			  val);
     }
     return(0);
 }
@@ -2838,13 +2916,9 @@
 	    cur++;
 	    name = xmlParseStringName(ctxt, &cur);
             if ((name == NULL) || (*cur != ';')) {
-		ctxt->errNo = XML_ERR_ENTITY_CHAR_ERROR;
-		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		    ctxt->sax->error(ctxt->userData,
+		xmlFatalErrMsgInt(ctxt, XML_ERR_ENTITY_CHAR_ERROR,
 	    "EntityValue: '%c' forbidden except for entities references\n",
-	                             tmp);
-		ctxt->wellFormed = 0;
-		if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	                          tmp);
 	    }
 	    if ((tmp == '%') && (ctxt->inSubset == 1) &&
 		(ctxt->inputNr == 1)) {
@@ -3063,11 +3137,8 @@
     if (RAW == '<') {
 	xmlFatalErr(ctxt, XML_ERR_LT_IN_ATTRIBUTE, NULL);
     } else if (RAW != limit) {
-	ctxt->errNo = XML_ERR_ATTRIBUTE_NOT_FINISHED;
-	if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	    ctxt->sax->error(ctxt->userData, "AttValue: ' expected\n");
-	ctxt->wellFormed = 0;
-	if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+        xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED,
+	               "AttValue: ' expected\n");
     } else
 	NEXT;
     if (attlen != NULL) *attlen = len;
@@ -3474,12 +3545,8 @@
 	 (NXT(4) == 'E') && (NXT(5) == 'M')) {
         SKIP(6);
 	if (!IS_BLANK(CUR)) {
-	    ctxt->errNo = XML_ERR_SPACE_REQUIRED;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		ctxt->sax->error(ctxt->userData,
-		    "Space required after 'SYSTEM'\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
+	                   "Space required after 'SYSTEM'\n");
 	}
         SKIP_BLANKS;
 	URI = xmlParseSystemLiteral(ctxt);
@@ -3491,12 +3558,8 @@
 	       (NXT(4) == 'I') && (NXT(5) == 'C')) {
         SKIP(6);
 	if (!IS_BLANK(CUR)) {
-	    ctxt->errNo = XML_ERR_SPACE_REQUIRED;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		ctxt->sax->error(ctxt->userData,
+	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 		    "Space required after 'PUBLIC'\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
 	}
         SKIP_BLANKS;
 	*publicID = xmlParsePubidLiteral(ctxt);
@@ -3508,12 +3571,8 @@
 	     * We don't handle [83] so "S SystemLiteral" is required.
 	     */
 	    if (!IS_BLANK(CUR)) {
-		ctxt->errNo = XML_ERR_SPACE_REQUIRED;
-		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		    ctxt->sax->error(ctxt->userData,
+		xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 			"Space required after the Public Identifier\n");
-		ctxt->wellFormed = 0;
-		if (ctxt->recovery == 0) ctxt->disableSAX = 1;
 	    }
 	} else {
 	    /*
@@ -3628,12 +3687,8 @@
 	xmlFree(buf);
     } else {
 	if (input != ctxt->input) {
-	    ctxt->errNo = XML_ERR_ENTITY_BOUNDARY;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		ctxt->sax->error(ctxt->userData, 
-"Comment doesn't start and stop in the same entity\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	    xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY,
+		"Comment doesn't start and stop in the same entity\n");
 	}
         NEXT;
 	if ((ctxt->sax != NULL) && (ctxt->sax->comment != NULL) &&
@@ -3667,12 +3722,8 @@
 	int i;
 	if ((name[0] == 'x') && (name[1] == 'm') &&
 	    (name[2] == 'l') && (name[3] == 0)) {
-	    ctxt->errNo = XML_ERR_RESERVED_XML_NAME;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		ctxt->sax->error(ctxt->userData,
+	    xmlFatalErrMsg(ctxt, XML_ERR_RESERVED_XML_NAME,
 		 "XML declaration allowed only at the start of the document\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
 	    return(name);
 	} else if (name[3] == 0) {
 	    xmlFatalErr(ctxt, XML_ERR_RESERVED_XML_NAME, NULL);
@@ -3794,12 +3845,8 @@
 	if (target != NULL) {
 	    if ((RAW == '?') && (NXT(1) == '>')) {
 		if (input != ctxt->input) {
-		    ctxt->errNo = XML_ERR_ENTITY_BOUNDARY;
-		    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-			ctxt->sax->error(ctxt->userData, 
-    "PI declaration doesn't start and stop in the same entity\n");
-		    ctxt->wellFormed = 0;
-		    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+		    xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY,
+	    "PI declaration doesn't start and stop in the same entity\n");
 		}
 		SKIP(2);
 
@@ -3865,12 +3912,8 @@
 		if (ctxt->recovery == 0) ctxt->disableSAX = 1;
 	    } else {
 		if (input != ctxt->input) {
-		    ctxt->errNo = XML_ERR_ENTITY_BOUNDARY;
-		    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-			ctxt->sax->error(ctxt->userData, 
-    "PI declaration doesn't start and stop in the same entity\n");
-		    ctxt->wellFormed = 0;
-		    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+		    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
+	    "PI declaration doesn't start and stop in the same entity\n");
 		}
 		SKIP(2);
 
@@ -3933,12 +3976,8 @@
 	SHRINK;
 	SKIP(10);
 	if (!IS_BLANK(CUR)) {
-	    ctxt->errNo = XML_ERR_SPACE_REQUIRED;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		ctxt->sax->error(ctxt->userData,
-		                 "Space required after '<!NOTATION'\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
+			   "Space required after '<!NOTATION'\n");
 	    return;
 	}
 	SKIP_BLANKS;
@@ -3949,12 +3988,8 @@
 	    return;
 	}
 	if (!IS_BLANK(CUR)) {
-	    ctxt->errNo = XML_ERR_SPACE_REQUIRED;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		ctxt->sax->error(ctxt->userData, 
+	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 		     "Space required after the NOTATION name'\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
 	    return;
 	}
 	SKIP_BLANKS;
@@ -3967,12 +4002,8 @@
 
 	if (RAW == '>') {
 	    if (input != ctxt->input) {
-		ctxt->errNo = XML_ERR_ENTITY_BOUNDARY;
-		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		    ctxt->sax->error(ctxt->userData, 
-"Notation declaration doesn't start and stop in the same entity\n");
-		ctxt->wellFormed = 0;
-		if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+		xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
+	"Notation declaration doesn't start and stop in the same entity\n");
 	    }
 	    NEXT;
 	    if ((ctxt->sax != NULL) && (!ctxt->disableSAX) &&
@@ -4028,45 +4059,30 @@
 	SKIP(8);
 	skipped = SKIP_BLANKS;
 	if (skipped == 0) {
-	    ctxt->errNo = XML_ERR_SPACE_REQUIRED;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		ctxt->sax->error(ctxt->userData,
-		                 "Space required after '<!ENTITY'\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
+			   "Space required after '<!ENTITY'\n");
 	}
 
 	if (RAW == '%') {
 	    NEXT;
 	    skipped = SKIP_BLANKS;
 	    if (skipped == 0) {
-		ctxt->errNo = XML_ERR_SPACE_REQUIRED;
-		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		    ctxt->sax->error(ctxt->userData,
-		                     "Space required after '%'\n");
-		ctxt->wellFormed = 0;
-		if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+		xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
+			       "Space required after '%'\n");
 	    }
 	    isParameter = 1;
 	}
 
         name = xmlParseName(ctxt);
 	if (name == NULL) {
-	    ctxt->errNo = XML_ERR_NAME_REQUIRED;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	        ctxt->sax->error(ctxt->userData, "xmlParseEntityDecl: no name\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	    xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED,
+	                   "xmlParseEntityDecl: no name\n");
             return;
 	}
         skipped = SKIP_BLANKS;
 	if (skipped == 0) {
-	    ctxt->errNo = XML_ERR_SPACE_REQUIRED;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		ctxt->sax->error(ctxt->userData,
-		     "Space required after the entity name\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
+			   "Space required after the entity name\n");
 	}
 
 	ctxt->instate = XML_PARSER_ENTITY_DECL;
@@ -4179,12 +4195,8 @@
 		    }
 		}
 		if ((RAW != '>') && (!IS_BLANK(CUR))) {
-		    ctxt->errNo = XML_ERR_SPACE_REQUIRED;
-		    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-			ctxt->sax->error(ctxt->userData,
-			    "Space required before 'NDATA'\n");
-		    ctxt->wellFormed = 0;
-		    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+		    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
+				   "Space required before 'NDATA'\n");
 		}
 		SKIP_BLANKS;
 		if ((RAW == 'N') && (NXT(1) == 'D') &&
@@ -4192,12 +4204,8 @@
 		    (NXT(4) == 'A')) {
 		    SKIP(5);
 		    if (!IS_BLANK(CUR)) {
-			ctxt->errNo = XML_ERR_SPACE_REQUIRED;
-			if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-			    ctxt->sax->error(ctxt->userData,
-			        "Space required after 'NDATA'\n");
-			ctxt->wellFormed = 0;
-			if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+			xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
+				       "Space required after 'NDATA'\n");
 		    }
 		    SKIP_BLANKS;
 		    ndata = xmlParseName(ctxt);
@@ -4242,12 +4250,8 @@
 	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
 	} else {
 	    if (input != ctxt->input) {
-		ctxt->errNo = XML_ERR_ENTITY_BOUNDARY;
-		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		    ctxt->sax->error(ctxt->userData, 
-"Entity declaration doesn't start and stop in the same entity\n");
-		ctxt->wellFormed = 0;
-		if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+		xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY,
+	"Entity declaration doesn't start and stop in the same entity\n");
 	    }
 	    NEXT;
 	}
@@ -4340,23 +4344,16 @@
 	SKIP(6);
 	val = XML_ATTRIBUTE_FIXED;
 	if (!IS_BLANK(CUR)) {
-	    ctxt->errNo = XML_ERR_SPACE_REQUIRED;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	        ctxt->sax->error(ctxt->userData,
-		                 "Space required after '#FIXED'\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
+			   "Space required after '#FIXED'\n");
 	}
 	SKIP_BLANKS;
     }
     ret = xmlParseAttValue(ctxt);
     ctxt->instate = XML_PARSER_DTD;
     if (ret == NULL) {
-	if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	    ctxt->sax->error(ctxt->userData,
-	       "Attribute default value declaration error\n");
-	ctxt->wellFormed = 0;
-	if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	xmlFatalErrMsg(ctxt, ctxt->errNo,
+		       "Attribute default value declaration error\n");
     } else
         *value = ret;
     return(val);
@@ -4394,12 +4391,8 @@
 	SKIP_BLANKS;
         name = xmlParseName(ctxt);
 	if (name == NULL) {
-	    ctxt->errNo = XML_ERR_NAME_REQUIRED;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		ctxt->sax->error(ctxt->userData, 
-		                 "Name expected in NOTATION declaration\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	    xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED,
+			   "Name expected in NOTATION declaration\n");
 	    return(ret);
 	}
 	cur = xmlCreateEnumeration(name);
@@ -4495,12 +4488,8 @@
 	(NXT(6) == 'O') && (NXT(7) == 'N')) {
 	SKIP(8);
 	if (!IS_BLANK(CUR)) {
-	    ctxt->errNo = XML_ERR_SPACE_REQUIRED;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	        ctxt->sax->error(ctxt->userData,
-		                 "Space required after 'NOTATION'\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
+			   "Space required after 'NOTATION'\n");
 	    return(0);
 	}
         SKIP_BLANKS;
@@ -4632,22 +4621,14 @@
 
 	SKIP(9);
 	if (!IS_BLANK(CUR)) {
-	    ctxt->errNo = XML_ERR_SPACE_REQUIRED;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	        ctxt->sax->error(ctxt->userData,
+	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 		                 "Space required after '<!ATTLIST'\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
 	}
         SKIP_BLANKS;
         elemName = xmlParseName(ctxt);
 	if (elemName == NULL) {
-	    ctxt->errNo = XML_ERR_NAME_REQUIRED;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	        ctxt->sax->error(ctxt->userData,
-		                 "ATTLIST: no name for Element\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	    xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED,
+			   "ATTLIST: no name for Element\n");
 	    return;
 	}
 	SKIP_BLANKS;
@@ -4662,22 +4643,14 @@
             tree = NULL;
 	    attrName = xmlParseName(ctxt);
 	    if (attrName == NULL) {
-		ctxt->errNo = XML_ERR_NAME_REQUIRED;
-		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		    ctxt->sax->error(ctxt->userData,
-		                     "ATTLIST: no name for Attribute\n");
-		ctxt->wellFormed = 0;
-		if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+		xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED,
+			       "ATTLIST: no name for Attribute\n");
 		break;
 	    }
 	    GROW;
 	    if (!IS_BLANK(CUR)) {
-		ctxt->errNo = XML_ERR_SPACE_REQUIRED;
-		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		    ctxt->sax->error(ctxt->userData, 
+		xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 		        "Space required after the attribute name\n");
-		ctxt->wellFormed = 0;
-		if (ctxt->recovery == 0) ctxt->disableSAX = 1;
                 if (defaultValue != NULL)
 		    xmlFree(defaultValue);
 		break;
@@ -4693,12 +4666,8 @@
 
 	    GROW;
 	    if (!IS_BLANK(CUR)) {
-		ctxt->errNo = XML_ERR_SPACE_REQUIRED;
-		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		    ctxt->sax->error(ctxt->userData, 
-		        "Space required after the attribute type\n");
-		ctxt->wellFormed = 0;
-		if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+		xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
+			       "Space required after the attribute type\n");
                 if (defaultValue != NULL)
 		    xmlFree(defaultValue);
 	        if (tree != NULL)
@@ -4719,12 +4688,8 @@
 	    GROW;
             if (RAW != '>') {
 		if (!IS_BLANK(CUR)) {
-		    ctxt->errNo = XML_ERR_SPACE_REQUIRED;
-		    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-			ctxt->sax->error(ctxt->userData, 
+		    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
 			"Space required after the attribute default value\n");
-		    ctxt->wellFormed = 0;
-		    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
 		    if (defaultValue != NULL)
 			xmlFree(defaultValue);
 		    if (tree != NULL)
@@ -4763,12 +4728,8 @@
 	}
 	if (RAW == '>') {
 	    if (input != ctxt->input) {
-		ctxt->errNo = XML_ERR_ENTITY_BOUNDARY;
-		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		    ctxt->sax->error(ctxt->userData, 
-"Attribute list declaration doesn't start and stop in the same entity\n");
-		ctxt->wellFormed = 0;
-		if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+		xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY,
+    "Attribute list declaration doesn't start and stop in the same entity\n");
 	    }
 	    NEXT;
 	}
@@ -4795,7 +4756,7 @@
  * returns: the list of the xmlElementContentPtr describing the element choices
  */
 xmlElementContentPtr
-xmlParseElementMixedContentDecl(xmlParserCtxtPtr ctxt, xmlParserInputPtr inputchk) {
+xmlParseElementMixedContentDecl(xmlParserCtxtPtr ctxt, int inputchk) {
     xmlElementContentPtr ret = NULL, cur = NULL, n;
     const xmlChar *elem = NULL;
 
@@ -4808,7 +4769,7 @@
 	SKIP_BLANKS;
 	SHRINK;
 	if (RAW == ')') {
-	    if ((ctxt->validate) && (ctxt->input != inputchk)) {
+	    if ((ctxt->validate) && (ctxt->input->id != inputchk)) {
 		ctxt->errNo = XML_ERR_ENTITY_BOUNDARY;
 		if (ctxt->vctxt.error != NULL)
 		    ctxt->vctxt.error(ctxt->vctxt.userData, 
@@ -4850,12 +4811,8 @@
 	    SKIP_BLANKS;
 	    elem = xmlParseName(ctxt);
 	    if (elem == NULL) {
-		ctxt->errNo = XML_ERR_NAME_REQUIRED;
-		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		    ctxt->sax->error(ctxt->userData, 
+		xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED,
 			"xmlParseElementMixedContentDecl : Name expected\n");
-		ctxt->wellFormed = 0;
-		if (ctxt->recovery == 0) ctxt->disableSAX = 1;
 		xmlFreeElementContent(cur);
 		return(NULL);
 	    }
@@ -4870,7 +4827,7 @@
 		    cur->c2->parent = cur;
             }
 	    ret->ocur = XML_ELEMENT_CONTENT_MULT;
-	    if ((ctxt->validate) && (ctxt->input != inputchk)) {
+	    if ((ctxt->validate) && (ctxt->input->id != inputchk)) {
 		ctxt->errNo = XML_ERR_ENTITY_BOUNDARY;
 		if (ctxt->vctxt.error != NULL)
 		    ctxt->vctxt.error(ctxt->vctxt.userData, 
@@ -4922,8 +4879,7 @@
  *          hierarchy.
  */
 xmlElementContentPtr
-xmlParseElementChildrenContentDecl
-(xmlParserCtxtPtr ctxt, xmlParserInputPtr inputchk) {
+xmlParseElementChildrenContentDecl (xmlParserCtxtPtr ctxt, int inputchk) {
     xmlElementContentPtr ret = NULL, cur = NULL, last = NULL, op = NULL;
     const xmlChar *elem;
     xmlChar type = 0;
@@ -4931,12 +4887,12 @@
     SKIP_BLANKS;
     GROW;
     if (RAW == '(') {
-	xmlParserInputPtr input = ctxt->input;
+	int inputid = ctxt->input->id;
 
         /* Recurse on first child */
 	NEXT;
 	SKIP_BLANKS;
-        cur = ret = xmlParseElementChildrenContentDecl(ctxt, input);
+        cur = ret = xmlParseElementChildrenContentDecl(ctxt, inputid);
 	SKIP_BLANKS;
 	GROW;
     } else {
@@ -4978,13 +4934,9 @@
 	     * Detect "Name | Name , Name" error
 	     */
 	    else if (type != CUR) {
-		ctxt->errNo = XML_ERR_SEPARATOR_REQUIRED;
-		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		    ctxt->sax->error(ctxt->userData, 
+		xmlFatalErrMsgInt(ctxt, XML_ERR_SEPARATOR_REQUIRED,
 		    "xmlParseElementChildrenContentDecl : '%c' expected\n",
-		    type);
-		ctxt->wellFormed = 0;
-		if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+		                  type);
 		if ((last != NULL) && (last != ret))
 		    xmlFreeElementContent(last);
 		if (ret != NULL)
@@ -5022,13 +4974,9 @@
 	     * Detect "Name , Name | Name" error
 	     */
 	    else if (type != CUR) {
-		ctxt->errNo = XML_ERR_SEPARATOR_REQUIRED;
-		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		    ctxt->sax->error(ctxt->userData, 
+		xmlFatalErrMsgInt(ctxt, XML_ERR_SEPARATOR_REQUIRED,
 		    "xmlParseElementChildrenContentDecl : '%c' expected\n",
-		    type);
-		ctxt->wellFormed = 0;
-		if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+				  type);
 		if ((last != NULL) && (last != ret))
 		    xmlFreeElementContent(last);
 		if (ret != NULL)
@@ -5070,11 +5018,11 @@
 	SKIP_BLANKS;
 	GROW;
 	if (RAW == '(') {
-	    xmlParserInputPtr input = ctxt->input;
+	    int inputid = ctxt->input->id;
 	    /* Recurse on second child */
 	    NEXT;
 	    SKIP_BLANKS;
-	    last = xmlParseElementChildrenContentDecl(ctxt, input);
+	    last = xmlParseElementChildrenContentDecl(ctxt, inputid);
 	    SKIP_BLANKS;
 	} else {
 	    elem = xmlParseName(ctxt);
@@ -5106,7 +5054,7 @@
 	if (last != NULL)
 	    last->parent = cur;
     }
-    if ((ctxt->validate) && (ctxt->input != inputchk)) {
+    if ((ctxt->validate) && (ctxt->input->id != inputchk)) {
 	ctxt->errNo = XML_ERR_ENTITY_BOUNDARY;
 	if (ctxt->vctxt.error != NULL)
 	    ctxt->vctxt.error(ctxt->vctxt.userData, 
@@ -5191,7 +5139,7 @@
                            xmlElementContentPtr *result) {
 
     xmlElementContentPtr tree = NULL;
-    xmlParserInputPtr input = ctxt->input;
+    int inputid = ctxt->input->id;
     int res;
 
     *result = NULL;
@@ -5212,10 +5160,10 @@
         (NXT(2) == 'C') && (NXT(3) == 'D') &&
         (NXT(4) == 'A') && (NXT(5) == 'T') &&
         (NXT(6) == 'A')) {
-        tree = xmlParseElementMixedContentDecl(ctxt, input);
+        tree = xmlParseElementMixedContentDecl(ctxt, inputid);
 	res = XML_ELEMENT_TYPE_MIXED;
     } else {
-        tree = xmlParseElementChildrenContentDecl(ctxt, input);
+        tree = xmlParseElementChildrenContentDecl(ctxt, inputid);
 	res = XML_ELEMENT_TYPE_ELEMENT;
     }
     SKIP_BLANKS;
@@ -5252,33 +5200,21 @@
 
 	SKIP(9);
 	if (!IS_BLANK(CUR)) {
-	    ctxt->errNo = XML_ERR_SPACE_REQUIRED;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		ctxt->sax->error(ctxt->userData, 
-		    "Space required after 'ELEMENT'\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
+		           "Space required after 'ELEMENT'\n");
 	}
         SKIP_BLANKS;
         name = xmlParseName(ctxt);
 	if (name == NULL) {
-	    ctxt->errNo = XML_ERR_NAME_REQUIRED;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	        ctxt->sax->error(ctxt->userData,
-		   "xmlParseElementDecl: no name for Element\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	    xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED,
+			   "xmlParseElementDecl: no name for Element\n");
 	    return(-1);
 	}
 	while ((RAW == 0) && (ctxt->inputNr > 1))
 	    xmlPopInput(ctxt);
 	if (!IS_BLANK(CUR)) {
-	    ctxt->errNo = XML_ERR_SPACE_REQUIRED;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		ctxt->sax->error(ctxt->userData, 
-		    "Space required after the element name\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
+			   "Space required after the element name\n");
 	}
         SKIP_BLANKS;
 	if ((RAW == 'E') && (NXT(1) == 'M') &&
@@ -5304,15 +5240,18 @@
 	     */
 	    if ((RAW == '%') && (ctxt->external == 0) &&
 	        (ctxt->inputNr == 1)) {
-		xmlFatalErr(ctxt, XML_ERR_PEREF_IN_INT_SUBSET, NULL);
+		ctxt->errNo = XML_ERR_PEREF_IN_INT_SUBSET;
+		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
+		    ctxt->sax->error(ctxt->userData, 
+	  "PEReference: forbidden within markup decl in internal subset\n");
 	    } else {
 		ctxt->errNo = XML_ERR_ELEMCONTENT_NOT_STARTED;
 		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
 		    ctxt->sax->error(ctxt->userData, 
 		      "xmlParseElementDecl: 'EMPTY', 'ANY' or '(' expected\n");
-		ctxt->wellFormed = 0;
-		if (ctxt->recovery == 0) ctxt->disableSAX = 1;
             }
+	    ctxt->wellFormed = 0;
+	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
 	    return(-1);
 	}
 
@@ -5328,12 +5267,8 @@
 	    xmlFatalErr(ctxt, XML_ERR_GT_REQUIRED, NULL);
 	} else {
 	    if (input != ctxt->input) {
-		ctxt->errNo = XML_ERR_ENTITY_BOUNDARY;
-		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		    ctxt->sax->error(ctxt->userData, 
-"Element declaration doesn't start and stop in the same entity\n");
-		ctxt->wellFormed = 0;
-		if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+		xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY,
+    "Element declaration doesn't start and stop in the same entity\n");
 	    }
 		
 	    NEXT;
@@ -5567,12 +5502,8 @@
     }
 
     if (!IS_BLANK(CUR)) {
-	ctxt->errNo = XML_ERR_SPACE_REQUIRED;
-	if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	    ctxt->sax->error(ctxt->userData,
-	                     "Space needed after '<?xml'\n");
-	ctxt->wellFormed = 0;
-	if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
+		       "Space needed after '<?xml'\n");
     }
     SKIP_BLANKS;
 
@@ -5584,11 +5515,8 @@
 	version = xmlCharStrdup(XML_DEFAULT_VERSION);
     else {
 	if (!IS_BLANK(CUR)) {
-	    ctxt->errNo = XML_ERR_SPACE_REQUIRED;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		ctxt->sax->error(ctxt->userData, "Space needed here\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
+		           "Space needed here\n");
 	}
     }
     ctxt->input->version = version;
@@ -5999,12 +5927,8 @@
 			    return;
 			}
 			if (input->standalone == 1) {
-			    ctxt->errNo = XML_ERR_EXT_ENTITY_STANDALONE;
-			    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-				ctxt->sax->error(ctxt->userData,
-				"external parsed entities cannot be standalone\n");
-			    ctxt->wellFormed = 0;
-			    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+			    xmlFatalErr(ctxt, XML_ERR_EXT_ENTITY_STANDALONE,
+			                NULL);
 			}
 		    }
 		    return;
@@ -6062,12 +5986,8 @@
         NEXT;
         name = xmlParseName(ctxt);
 	if (name == NULL) {
-	    ctxt->errNo = XML_ERR_NAME_REQUIRED;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	        ctxt->sax->error(ctxt->userData,
-		                 "xmlParseEntityRef: no name\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	    xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED,
+			   "xmlParseEntityRef: no name\n");
 	} else {
 	    if (RAW == ';') {
 	        NEXT;
@@ -6200,12 +6120,7 @@
 		 */
 
 	    } else {
-		ctxt->errNo = XML_ERR_ENTITYREF_SEMICOL_MISSING;
-		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		    ctxt->sax->error(ctxt->userData,
-		                     "xmlParseEntityRef: expecting ';'\n");
-		ctxt->wellFormed = 0;
-		if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+		xmlFatalErr(ctxt, XML_ERR_ENTITYREF_SEMICOL_MISSING, NULL);
 	    }
 	}
     }
@@ -6259,12 +6174,8 @@
 	cur = *ptr;
         name = xmlParseStringName(ctxt, &ptr);
 	if (name == NULL) {
-	    ctxt->errNo = XML_ERR_NAME_REQUIRED;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	        ctxt->sax->error(ctxt->userData,
-		                 "xmlParseStringEntityRef: no name\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	    xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED,
+			   "xmlParseStringEntityRef: no name\n");
 	} else {
 	    if (*ptr == ';') {
 	        ptr++;
@@ -6394,12 +6305,7 @@
 		 */
 
 	    } else {
-		ctxt->errNo = XML_ERR_ENTITYREF_SEMICOL_MISSING;
-		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		    ctxt->sax->error(ctxt->userData,
-				 "xmlParseStringEntityRef: expecting ';'\n");
-		ctxt->wellFormed = 0;
-		if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+		xmlFatalErr(ctxt, XML_ERR_ENTITYREF_SEMICOL_MISSING, NULL);
 	    }
 	    xmlFree(name);
 	}
@@ -6447,12 +6353,8 @@
         NEXT;
         name = xmlParseName(ctxt);
 	if (name == NULL) {
-	    ctxt->errNo = XML_ERR_NAME_REQUIRED;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	        ctxt->sax->error(ctxt->userData,
-		                 "xmlParsePEReference: no name\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	    xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED,
+			   "xmlParsePEReference: no name\n");
 	} else {
 	    if (RAW == ';') {
 	        NEXT;
@@ -6531,12 +6433,7 @@
 		}
 		ctxt->hasPErefs = 1;
 	    } else {
-		ctxt->errNo = XML_ERR_ENTITYREF_SEMICOL_MISSING;
-		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		    ctxt->sax->error(ctxt->userData,
-		                     "xmlParsePEReference: expecting ';'\n");
-		ctxt->wellFormed = 0;
-		if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+		xmlFatalErr(ctxt, XML_ERR_ENTITYREF_SEMICOL_MISSING, NULL);
 	    }
 	}
     }
@@ -6588,12 +6485,8 @@
 	cur = *ptr;
         name = xmlParseStringName(ctxt, &ptr);
 	if (name == NULL) {
-	    ctxt->errNo = XML_ERR_NAME_REQUIRED;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	        ctxt->sax->error(ctxt->userData,
-		                 "xmlParseStringPEReference: no name\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	    xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED,
+			   "xmlParseStringPEReference: no name\n");
 	} else {
 	    cur = *ptr;
 	    if (cur == ';') {
@@ -6647,12 +6540,7 @@
 		}
 		ctxt->hasPErefs = 1;
 	    } else {
-		ctxt->errNo = XML_ERR_ENTITYREF_SEMICOL_MISSING;
-		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		    ctxt->sax->error(ctxt->userData,
-		                     "xmlParseStringPEReference: expecting ';'\n");
-		ctxt->wellFormed = 0;
-		if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+		xmlFatalErr(ctxt, XML_ERR_ENTITYREF_SEMICOL_MISSING, NULL);
 	    }
 	    xmlFree(name);
 	}
@@ -6693,12 +6581,8 @@
      */
     name = xmlParseName(ctxt);
     if (name == NULL) {
-	ctxt->errNo = XML_ERR_NAME_REQUIRED;
-	if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	    ctxt->sax->error(ctxt->userData, 
-	        "xmlParseDocTypeDecl : no DOCTYPE name !\n");
-	ctxt->wellFormed = 0;
-	if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED,
+		       "xmlParseDocTypeDecl : no DOCTYPE name !\n");
     }
     ctxt->intSubName = name;
 
@@ -6735,11 +6619,7 @@
      * We should be at the end of the DOCTYPE declaration.
      */
     if (RAW != '>') {
-	ctxt->errNo = XML_ERR_DOCTYPE_NOT_FINISHED;
-	if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	    ctxt->sax->error(ctxt->userData, "DOCTYPE improperly terminated\n");
-	ctxt->wellFormed = 0;
-	if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	xmlFatalErr(ctxt, XML_ERR_DOCTYPE_NOT_FINISHED, NULL);
     }
     NEXT;
 }
@@ -6781,12 +6661,8 @@
 		xmlPopInput(ctxt);
 
 	    if ((CUR_PTR == check) && (cons == ctxt->input->consumed)) {
-		ctxt->errNo = XML_ERR_INTERNAL_ERROR;
-		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		    ctxt->sax->error(ctxt->userData, 
+		xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR,
 	     "xmlParseInternalSubset: error detected in Markup declaration\n");
-		ctxt->wellFormed = 0;
-		if (ctxt->recovery == 0) ctxt->disableSAX = 1;
 		break;
 	    }
 	}
@@ -6800,11 +6676,7 @@
      * We should be at the end of the DOCTYPE declaration.
      */
     if (RAW != '>') {
-	ctxt->errNo = XML_ERR_DOCTYPE_NOT_FINISHED;
-	if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	    ctxt->sax->error(ctxt->userData, "DOCTYPE improperly terminated\n");
-	ctxt->wellFormed = 0;
-	if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	xmlFatalErr(ctxt, XML_ERR_DOCTYPE_NOT_FINISHED, NULL);
     }
     NEXT;
 }
@@ -6851,11 +6723,8 @@
     GROW;
     name = xmlParseName(ctxt);
     if (name == NULL) {
-	ctxt->errNo = XML_ERR_NAME_REQUIRED;
-	if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	    ctxt->sax->error(ctxt->userData, "error parsing attribute name\n");
-	ctxt->wellFormed = 0;
-	if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
+	               "error parsing attribute name\n");
         return(NULL);
     }
 
@@ -6957,12 +6826,8 @@
 
     name = xmlParseName(ctxt);
     if (name == NULL) {
-	ctxt->errNo = XML_ERR_NAME_REQUIRED;
-	if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	    ctxt->sax->error(ctxt->userData, 
+	xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED,
 	     "xmlParseStartTag: invalid element name\n");
-	ctxt->wellFormed = 0;
-	if (ctxt->recovery == 0) ctxt->disableSAX = 1;
         return(NULL);
     }
 
@@ -7040,22 +6905,14 @@
 	if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>'))))
 	    break;
 	if (!IS_BLANK(RAW)) {
-	    ctxt->errNo = XML_ERR_SPACE_REQUIRED;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		ctxt->sax->error(ctxt->userData,
-		    "attributes construct error\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
+			   "attributes construct error\n");
 	}
 	SKIP_BLANKS;
         if ((cons == ctxt->input->consumed) && (q == CUR_PTR) &&
             (attname == NULL) && (attvalue == NULL)) {
-	    ctxt->errNo = XML_ERR_INTERNAL_ERROR;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	        ctxt->sax->error(ctxt->userData, 
-	         "xmlParseStartTag: problem parsing attributes\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	    xmlFatalErrMsg(ctxt, XML_ERR_INTERNAL_ERROR,
+			   "xmlParseStartTag: problem parsing attributes\n");
 	    break;
 	}
 	SHRINK;
@@ -7103,12 +6960,8 @@
 
     GROW;
     if ((RAW != '<') || (NXT(1) != '/')) {
-	ctxt->errNo = XML_ERR_LTSLASH_REQUIRED;
-	if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	    ctxt->sax->error(ctxt->userData,
-	                     "xmlParseEndTag: '</' not found\n");
-	ctxt->wellFormed = 0;
-	if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
+		       "xmlParseEndTag: '</' not found\n");
 	return;
     }
     SKIP(2);
@@ -7314,12 +7167,8 @@
         if (CUR == ':') {
 	    l = xmlParseName(ctxt);
 	    if (l != NULL) {
-		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) {
-		    ctxt->sax->error(ctxt->userData, 
-			 "Failed to parse QName '%s'\n", l);
-		}
-		ctxt->nsWellFormed = 0;
-		ctxt->errNo = XML_NS_ERR_QNAME;
+	        xmlNsErr(ctxt, XML_NS_ERR_QNAME, 
+		         "Failed to parse QName '%s'\n", l, NULL, NULL);
 		*prefix = NULL;
 		return(l);
 	    }
@@ -7333,12 +7182,8 @@
 	if (l == NULL) {
 	    xmlChar *tmp;
 
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) {
-		ctxt->sax->error(ctxt->userData, 
-		     "Failed to parse QName '%s:'\n", p);
-	    }
-	    ctxt->nsWellFormed = 0;
-	    ctxt->errNo = XML_NS_ERR_QNAME;
+            xmlNsErr(ctxt, XML_NS_ERR_QNAME,
+	             "Failed to parse QName '%s:'\n", p, NULL, NULL);
 	    tmp = xmlBuildQName(BAD_CAST "", p, NULL, 0);
 	    p = xmlDictLookup(ctxt->dict, tmp, -1);
 	    if (tmp != NULL) xmlFree(tmp);
@@ -7348,12 +7193,8 @@
 	if (CUR == ':') {
 	    xmlChar *tmp;
 
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL)) {
-		ctxt->sax->error(ctxt->userData, 
-		     "Failed to parse QName '%s:%s:'\n", p, l);
-	    }
-	    ctxt->nsWellFormed = 0;
-	    ctxt->errNo = XML_NS_ERR_QNAME;
+            xmlNsErr(ctxt, XML_NS_ERR_QNAME,
+	             "Failed to parse QName '%s:%s:'\n", p, l, NULL);
 	    NEXT;
 	    tmp = (xmlChar *) xmlParseName(ctxt);
 	    if (tmp != NULL) {
@@ -7473,13 +7314,7 @@
     GROW;
     in = (xmlChar *) CUR_PTR;
     if (*in != '"' && *in != '\'') {
-        ctxt->errNo = XML_ERR_ATTRIBUTE_NOT_STARTED;
-        if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-            ctxt->sax->error(ctxt->userData,
-                             "AttValue: \" or ' expected\n");
-        ctxt->wellFormed = 0;
-        if (ctxt->recovery == 0)
-            ctxt->disableSAX = 1;
+        xmlFatalErr(ctxt, XML_ERR_ATTRIBUTE_NOT_STARTED, NULL);
         return (NULL);
     }
     ctxt->instate = XML_PARSER_ATTRIBUTE_VALUE;
@@ -7620,11 +7455,8 @@
     GROW;
     name = xmlParseQName(ctxt, prefix);
     if (name == NULL) {
-	ctxt->errNo = XML_ERR_NAME_REQUIRED;
-	if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	    ctxt->sax->error(ctxt->userData, "error parsing attribute name\n");
-	ctxt->wellFormed = 0;
-	if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED,
+	               "error parsing attribute name\n");
         return(NULL);
     }
 
@@ -7761,12 +7593,8 @@
 
     localname = xmlParseQName(ctxt, &prefix);
     if (localname == NULL) {
-	ctxt->errNo = XML_ERR_NAME_REQUIRED;
-	if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	    ctxt->sax->error(ctxt->userData, 
-	     "xmlParseStartTag: invalid element name\n");
-	ctxt->wellFormed = 0;
-	if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED,
+		       "StartTag: invalid element name\n");
         return(NULL);
     }
 
@@ -7830,11 +7658,9 @@
 
                 if (attname == ctxt->str_xml) {
 		    if (URL != ctxt->str_xml_ns) {
-			if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-			    ctxt->sax->error(ctxt->userData, 
-				 "xml namespace prefix mapped to wrong URI\n");
-			ctxt->nsWellFormed = 0;
-			ctxt->errNo = XML_NS_ERR_XML_NAMESPACE;
+		        xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
+			         "xml namespace prefix mapped to wrong URI\n",
+			         NULL, NULL, NULL);
 		    }
 		    /*
 		     * Do not keep a namespace definition node
@@ -7910,22 +7736,14 @@
 	if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>'))))
 	    break;
 	if (!IS_BLANK(RAW)) {
-	    ctxt->errNo = XML_ERR_SPACE_REQUIRED;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		ctxt->sax->error(ctxt->userData,
-		    "attributes construct error\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
+			   "attributes construct error\n");
 	}
 	SKIP_BLANKS;
         if ((cons == ctxt->input->consumed) && (q == CUR_PTR) &&
             (attname == NULL) && (attvalue == NULL)) {
-	    ctxt->errNo = XML_ERR_INTERNAL_ERROR;
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	        ctxt->sax->error(ctxt->userData, 
+	    xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR,
 	         "xmlParseStartTag: problem parsing attributes\n");
-	    ctxt->wellFormed = 0;
-	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
 	    break;
 	}
         GROW;
@@ -7938,12 +7756,9 @@
     for (i = 0; i < nbatts;i += 5) {
         nsname = xmlGetNamespace(ctxt, atts[i + 1]);
 	if ((atts[i + 1] != NULL) && (nsname == NULL)) {
-	    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-		ctxt->sax->error(ctxt->userData, 
+	    xmlNsErr(ctxt, XML_NS_ERR_UNDEFINED_NAMESPACE,
 		 "Namespace prefix %s for %s on %s is not defined\n",
-		                 atts[i + 1], atts[i], localname);
-	    ctxt->nsWellFormed = 0;
-	    ctxt->errNo = XML_NS_ERR_UNDEFINED_NAMESPACE;
+		     atts[i + 1], atts[i], localname);
 	}
 	atts[i + 2] = nsname;
 	/*
@@ -7959,11 +7774,9 @@
 		    break;
 		}
 		if ((nsname != NULL) && (atts[j + 2] == nsname)) {
-		    ctxt->sax->error(ctxt->userData,
+		    xmlNsErr(ctxt, XML_NS_ERR_ATTRIBUTE_REDEFINED,
 			     "Namespaced Attribute %s in '%s' redefined\n",
-				     atts[i], nsname);
-		    ctxt->nsWellFormed = 0;
-		    ctxt->errNo = XML_NS_ERR_ATTRIBUTE_REDEFINED;
+			     atts[i], nsname, NULL);
 		    break;
 		}
 	    }
@@ -8048,11 +7861,9 @@
 
     nsname = xmlGetNamespace(ctxt, prefix);
     if ((prefix != NULL) && (nsname == NULL)) {
-	if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	    ctxt->sax->error(ctxt->userData, 
-	     "Namespace prefix %s on %s is not defined\n", prefix, localname);
-	ctxt->nsWellFormed = 0;
-	ctxt->errNo = XML_NS_ERR_UNDEFINED_NAMESPACE;
+	xmlNsErr(ctxt, XML_NS_ERR_UNDEFINED_NAMESPACE,
+	         "Namespace prefix %s on %s is not defined\n",
+		 prefix, localname, NULL);
     }
     *pref = prefix;
     *URI = nsname;
@@ -8120,12 +7931,7 @@
 
     GROW;
     if ((RAW != '<') || (NXT(1) != '/')) {
-	ctxt->errNo = XML_ERR_LTSLASH_REQUIRED;
-	if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	    ctxt->sax->error(ctxt->userData,
-	                     "xmlParseEndTag: '</' not found\n");
-	ctxt->wellFormed = 0;
-	if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	xmlFatalErr(ctxt, XML_ERR_LTSLASH_REQUIRED, NULL);
 	return;
     }
     SKIP(2);
@@ -8877,11 +8683,8 @@
     SKIP(5);
 
     if (!IS_BLANK(RAW)) {
-	ctxt->errNo = XML_ERR_SPACE_REQUIRED;
-	if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	    ctxt->sax->error(ctxt->userData, "Blank needed after '<?xml'\n");
-	ctxt->wellFormed = 0;
-	if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
+	               "Blank needed after '<?xml'\n");
     }
     SKIP_BLANKS;
 
@@ -8890,11 +8693,7 @@
      */
     version = xmlParseVersionInfo(ctxt);
     if (version == NULL) {
-	if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	    ctxt->sax->error(ctxt->userData,
-	    "Malformed declaration expecting version\n");
-	ctxt->wellFormed = 0;
-	if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	xmlFatalErr(ctxt, XML_ERR_VERSION_MISSING, NULL);
     } else {
 	if (!xmlStrEqual(version, (const xmlChar *) XML_DEFAULT_VERSION)) {
 	    /*
@@ -8917,11 +8716,7 @@
 	    SKIP(2);
 	    return;
 	}
-	ctxt->errNo = XML_ERR_SPACE_REQUIRED;
-	if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	    ctxt->sax->error(ctxt->userData, "Blank needed here\n");
-	ctxt->wellFormed = 0;
-	if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Blank needed here\n");
     }
     xmlParseEncodingDecl(ctxt);
     if (ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) {
@@ -8939,11 +8734,7 @@
 	    SKIP(2);
 	    return;
 	}
-	ctxt->errNo = XML_ERR_SPACE_REQUIRED;
-	if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	    ctxt->sax->error(ctxt->userData, "Blank needed here\n");
-	ctxt->wellFormed = 0;
-	if (ctxt->recovery == 0) ctxt->disableSAX = 1;
+	xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Blank needed here\n");
     }
     SKIP_BLANKS;
     ctxt->input->standalone = xmlParseSDDecl(ctxt);
@@ -9112,13 +8903,8 @@
      */
     GROW;
     if (RAW != '<') {
-	ctxt->errNo = XML_ERR_DOCUMENT_EMPTY;
-	if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-	    ctxt->sax->error(ctxt->userData,
-		    "Start tag expected, '<' not found\n");
-	ctxt->wellFormed = 0;
-	if (ctxt->recovery == 0) ctxt->disableSAX = 1;
-	ctxt->instate = XML_PARSER_EOF;
+	xmlFatalErrMsg(ctxt, XML_ERR_DOCUMENT_EMPTY,
+		       "Start tag expected, '<' not found\n");
     } else {
 	ctxt->instate = XML_PARSER_CONTENT;
 	xmlParseElement(ctxt);