applied Peter Jacobi encoding cleanup patch, and also avoided a possible

* parser.c parserInternals.c tree.c: applied Peter Jacobi encoding
  cleanup patch, and also avoided a possible memory leak
Daniel
diff --git a/ChangeLog b/ChangeLog
index f959896..05d90f9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Tue Jul 29 12:46:08 EDT 2003 Daniel Veillard <daniel@veillard.com>
+
+	* parser.c parserInternals.c tree.c: applied Peter Jacobi encoding
+	  cleanup patch, and also avoided a possible memory leak
+
 Tue Jul 29 09:28:09 EDT 2003 Daniel Veillard <daniel@veillard.com>
 
 	* encoding.c: fix the previous commit
diff --git a/parser.c b/parser.c
index 7d93c33..ede62d8 100644
--- a/parser.c
+++ b/parser.c
@@ -7575,38 +7575,21 @@
 	    if (ctxt->recovery == 0) ctxt->disableSAX = 1;
 	}
 	if (encoding != NULL) {
-	    xmlCharEncoding enc;
 	    xmlCharEncodingHandlerPtr handler;
 
 	    if (ctxt->input->encoding != NULL)
 		xmlFree((xmlChar *) ctxt->input->encoding);
 	    ctxt->input->encoding = encoding;
 
-	    enc = xmlParseCharEncoding((const char *) encoding);
-	    /*
-	     * registered set of known encodings
-	     */
-	    if (enc != XML_CHAR_ENCODING_ERROR) {
-		xmlSwitchEncoding(ctxt, enc);
-		if (ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) {
-		    ctxt->input->encoding = NULL;
-		    xmlFree(encoding);
-		    return(NULL);
-		}
+            handler = xmlFindCharEncodingHandler((const char *) encoding);
+	    if (handler != NULL) {
+		xmlSwitchToEncoding(ctxt, handler);
 	    } else {
-	        /*
-		 * fallback for unknown encodings
-		 */
-                handler = xmlFindCharEncodingHandler((const char *) encoding);
-		if (handler != NULL) {
-		    xmlSwitchToEncoding(ctxt, handler);
-		} else {
-		    ctxt->errNo = XML_ERR_UNSUPPORTED_ENCODING;
-		    if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
-			ctxt->sax->error(ctxt->userData,
-			     "Unsupported encoding %s\n", encoding);
-		    return(NULL);
-		}
+		ctxt->errNo = XML_ERR_UNSUPPORTED_ENCODING;
+		if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
+		    ctxt->sax->error(ctxt->userData,
+			"Unsupported encoding %s\n", encoding);
+		return(NULL);
 	    }
 	}
     }
diff --git a/parserInternals.c b/parserInternals.c
index 9c71570..84d6eef 100644
--- a/parserInternals.c
+++ b/parserInternals.c
@@ -1780,13 +1780,13 @@
 
 		    /*
 		     * "UTF-16" can be used for both LE and BE
-		     */
 		    if ((!xmlStrncmp(BAD_CAST ctxt->input->buf->encoder->name,
 				     BAD_CAST "UTF-16", 6)) &&
 		        (!xmlStrncmp(BAD_CAST handler->name,
 				     BAD_CAST "UTF-16", 6))) {
 			return(0);
 		    }
+		     */
 
 		    /*
 		     * Note: this is a bit dangerous, but that's what it
diff --git a/tree.c b/tree.c
index c38d0b5..114989e 100644
--- a/tree.c
+++ b/tree.c
@@ -961,6 +961,11 @@
     cur->standalone = -1;
     cur->compression = -1; /* not initialized */
     cur->doc = cur;
+    /*
+     * The in memory encoding is always UTF8
+     * This field will never change and would
+     * be obsolete if not for binary compatibility.
+     */
     cur->charset = XML_CHAR_ENCODING_UTF8;
 
     if ((__xmlRegisterCallbacks) && (xmlRegisterNodeDefaultValue))
@@ -7830,7 +7835,6 @@
 		int format) {
     int                         dummy = 0;
 
-    xmlCharEncoding             doc_charset;
     xmlOutputBufferPtr          out_buff = NULL;
     xmlCharEncodingHandlerPtr   conv_hdlr = NULL;
 
@@ -7863,16 +7867,6 @@
     if (txt_encoding == NULL)
 	txt_encoding = (const char *) out_doc->encoding;
     if (txt_encoding != NULL) {
-        doc_charset = xmlParseCharEncoding(txt_encoding);
-
-        if (out_doc->charset != XML_CHAR_ENCODING_UTF8) {
-            xmlGenericError(xmlGenericErrorContext,
-                    "xmlDocDumpFormatMemoryEnc: Source document not in UTF8\n");
-            return;
-
-        } else if (doc_charset != XML_CHAR_ENCODING_UTF8) {
-	    conv_hdlr = xmlGetCharEncodingHandler(doc_charset);
-	    if (conv_hdlr == NULL)
 		conv_hdlr = xmlFindCharEncodingHandler(txt_encoding);
             if ( conv_hdlr == NULL ) {
                 xmlGenericError(xmlGenericErrorContext,
@@ -7884,7 +7878,6 @@
                 return;
             }
         }
-    }
 
     if ((out_buff = xmlAllocOutputBuffer(conv_hdlr)) == NULL ) {
         xmlGenericError(xmlGenericErrorContext,
@@ -8048,25 +8041,12 @@
     encoding = (const char *) cur->encoding;
 
     if (encoding != NULL) {
-	xmlCharEncoding enc;
-
-	enc = xmlParseCharEncoding(encoding);
-
-	if (cur->charset != XML_CHAR_ENCODING_UTF8) {
-	    xmlGenericError(xmlGenericErrorContext,
-		    "xmlDocDump: document not in UTF8\n");
-	    return(-1);
-	}
-	if (enc != XML_CHAR_ENCODING_UTF8) {
-	    handler = xmlGetCharEncodingHandler(enc);
-	    if (handler == NULL)
 		handler = xmlFindCharEncodingHandler(encoding);
 	    if (handler == NULL) {
 		xmlFree((char *) cur->encoding);
 		cur->encoding = NULL;
 	    }
 	}
-    }
     buf = xmlOutputBufferCreateFile(f, handler);
     if (buf == NULL) return(-1);
     xmlDocContentDumpOutput(buf, cur, NULL, format);
@@ -8150,7 +8130,6 @@
 			const char * encoding, int format ) {
     xmlOutputBufferPtr buf;
     xmlCharEncodingHandlerPtr handler = NULL;
-    xmlCharEncoding enc;
     int ret;
 
     if (cur == NULL)
@@ -8161,17 +8140,9 @@
 
     if (encoding != NULL) {
 
-	enc = xmlParseCharEncoding(encoding);
-	if (cur->charset != XML_CHAR_ENCODING_UTF8) {
-	    xmlGenericError(xmlGenericErrorContext,
-		    "xmlSaveFormatFileEnc: document not in UTF8\n");
-	    return(-1);
-	}
-	if (enc != XML_CHAR_ENCODING_UTF8) {
 	    handler = xmlFindCharEncodingHandler(encoding);
 	    if (handler == NULL)
 		return(-1);
-	}
     }
 
 #ifdef HAVE_ZLIB_H