Release of libxml-1.1, Daniel.
diff --git a/entities.c b/entities.c
index 88f2661..c61f81d 100644
--- a/entities.c
+++ b/entities.c
@@ -30,23 +30,18 @@
 xmlEntitiesTablePtr xmlPredefinedEntities = NULL;
 
 /*
- * A buffer used for converting entities to their equivalent and back.
- *
- * TODO: remove this, this helps performances but forbid reentrancy in a 
- *       stupid way.
+ * Macro used to grow the current buffer.
  */
-static int buffer_size = 0;
-static CHAR *buffer = NULL;
-
-void growBuffer(void) {
-    buffer_size *= 2;
-    buffer = (CHAR *) realloc(buffer, buffer_size * sizeof(CHAR));
-    if (buffer == NULL) {
-	perror("realloc failed");
-	exit(1);
-    }
+#define growBuffer() {							\
+    buffer_size *= 2;							\
+    buffer = (CHAR *) realloc(buffer, buffer_size * sizeof(CHAR));	\
+    if (buffer == NULL) {						\
+	perror("realloc failed");					\
+	exit(1);							\
+    }									\
 }
 
+
 /*
  * xmlFreeEntity : clean-up an entity record.
  */
@@ -61,6 +56,8 @@
         free((char *) entity->SystemID);
     if (entity->content != NULL)
         free((char *) entity->content);
+    if (entity->orig != NULL)
+        free((char *) entity->orig);
     memset(entity, -1, sizeof(xmlEntity));
 }
 
@@ -116,6 +113,7 @@
 	cur->content = xmlStrdup(content);
     else
         cur->content = NULL;
+    cur->orig = NULL;
     table->nb_entities++;
 }
 
@@ -314,26 +312,28 @@
  * TODO !!!! Once moved to UTF-8 internal encoding, the encoding of non-ascii
  *           get erroneous.
  *
- * TODO This routine is not reentrant and this will be changed, the interface
- *      should not be modified though.
- * 
  * Returns A newly allocated string with the substitution done.
  */
 CHAR *
 xmlEncodeEntities(xmlDocPtr doc, const CHAR *input) {
     const CHAR *cur = input;
-    CHAR *out = buffer;
+    CHAR *buffer = NULL;
+    CHAR *out = NULL;
+    int buffer_size = 0;
 
     if (input == NULL) return(NULL);
+
+    /*
+     * allocate an translation buffer.
+     */
+    buffer_size = 1000;
+    buffer = (CHAR *) malloc(buffer_size * sizeof(CHAR));
     if (buffer == NULL) {
-        buffer_size = 1000;
-        buffer = (CHAR *) malloc(buffer_size * sizeof(CHAR));
-	if (buffer == NULL) {
-	    perror("malloc failed");
-            exit(1);
-	}
-	out = buffer;
+	perror("malloc failed");
+	exit(1);
     }
+    out = buffer;
+
     while (*cur != '\0') {
         if (out - buffer > buffer_size - 100) {
 	    int index = out - buffer;
@@ -517,6 +517,10 @@
 	    cur->content = xmlStrdup(ent->content);
 	else
 	    cur->content = NULL;
+	if (ent->orig != NULL)
+	    cur->orig = xmlStrdup(ent->orig);
+	else
+	    cur->orig = NULL;
     }
     return(ret);
 }
@@ -541,23 +545,24 @@
 	    case XML_INTERNAL_GENERAL_ENTITY:
 	        xmlBufferWriteChar(buf, "<!ENTITY ");
 		xmlBufferWriteCHAR(buf, cur->name);
-		xmlBufferWriteChar(buf, " \"");
-		xmlBufferWriteCHAR(buf, cur->content);
-		xmlBufferWriteChar(buf, "\">\n");
+		xmlBufferWriteChar(buf, " ");
+		if (cur->orig != NULL)
+		    xmlBufferWriteQuotedString(buf, cur->orig);
+		else
+		    xmlBufferWriteQuotedString(buf, cur->content);
+		xmlBufferWriteChar(buf, ">\n");
 	        break;
 	    case XML_EXTERNAL_GENERAL_PARSED_ENTITY:
 	        xmlBufferWriteChar(buf, "<!ENTITY ");
 		xmlBufferWriteCHAR(buf, cur->name);
 		if (cur->ExternalID != NULL) {
-		     xmlBufferWriteChar(buf, " PUBLIC \"");
-		     xmlBufferWriteCHAR(buf, cur->ExternalID);
-		     xmlBufferWriteChar(buf, "\" \"");
-		     xmlBufferWriteCHAR(buf, cur->SystemID);
-		     xmlBufferWriteChar(buf, "\"");
+		     xmlBufferWriteChar(buf, " PUBLIC ");
+		     xmlBufferWriteQuotedString(buf, cur->ExternalID);
+		     xmlBufferWriteChar(buf, " ");
+		     xmlBufferWriteQuotedString(buf, cur->SystemID);
 		} else {
-		     xmlBufferWriteChar(buf, " SYSTEM \"");
-		     xmlBufferWriteCHAR(buf, cur->SystemID);
-		     xmlBufferWriteChar(buf, "\"");
+		     xmlBufferWriteChar(buf, " SYSTEM ");
+		     xmlBufferWriteQuotedString(buf, cur->SystemID);
 		}
 		xmlBufferWriteChar(buf, ">\n");
 	        break;
@@ -565,42 +570,44 @@
 	        xmlBufferWriteChar(buf, "<!ENTITY ");
 		xmlBufferWriteCHAR(buf, cur->name);
 		if (cur->ExternalID != NULL) {
-		     xmlBufferWriteChar(buf, " PUBLIC \"");
-		     xmlBufferWriteCHAR(buf, cur->ExternalID);
-		     xmlBufferWriteChar(buf, "\" \"");
-		     xmlBufferWriteCHAR(buf, cur->SystemID);
-		     xmlBufferWriteChar(buf, "\"");
+		     xmlBufferWriteChar(buf, " PUBLIC ");
+		     xmlBufferWriteQuotedString(buf, cur->ExternalID);
+		     xmlBufferWriteChar(buf, " ");
+		     xmlBufferWriteQuotedString(buf, cur->SystemID);
 		} else {
-		     xmlBufferWriteChar(buf, " SYSTEM \"");
-		     xmlBufferWriteCHAR(buf, cur->SystemID);
-		     xmlBufferWriteChar(buf, "\"");
+		     xmlBufferWriteChar(buf, " SYSTEM ");
+		     xmlBufferWriteQuotedString(buf, cur->SystemID);
 		}
 		if (cur->content != NULL) { /* Should be true ! */
 		    xmlBufferWriteChar(buf, " NDATA ");
-		    xmlBufferWriteCHAR(buf, cur->content);
+		    if (cur->orig != NULL)
+			xmlBufferWriteCHAR(buf, cur->orig);
+		    else
+			xmlBufferWriteCHAR(buf, cur->content);
 		}
 		xmlBufferWriteChar(buf, ">\n");
 	        break;
 	    case XML_INTERNAL_PARAMETER_ENTITY:
 	        xmlBufferWriteChar(buf, "<!ENTITY % ");
 		xmlBufferWriteCHAR(buf, cur->name);
-		xmlBufferWriteChar(buf, " \"");
-		xmlBufferWriteCHAR(buf, cur->content);
-		xmlBufferWriteChar(buf, "\">\n");
+		xmlBufferWriteChar(buf, " ");
+		if (cur->orig == NULL)
+		    xmlBufferWriteQuotedString(buf, cur->content);
+		else
+		    xmlBufferWriteQuotedString(buf, cur->orig);
+		xmlBufferWriteChar(buf, ">\n");
 	        break;
 	    case XML_EXTERNAL_PARAMETER_ENTITY:
 	        xmlBufferWriteChar(buf, "<!ENTITY % ");
 		xmlBufferWriteCHAR(buf, cur->name);
 		if (cur->ExternalID != NULL) {
-		     xmlBufferWriteChar(buf, " PUBLIC \"");
-		     xmlBufferWriteCHAR(buf, cur->ExternalID);
-		     xmlBufferWriteChar(buf, "\" \"");
-		     xmlBufferWriteCHAR(buf, cur->SystemID);
-		     xmlBufferWriteChar(buf, "\"");
+		     xmlBufferWriteChar(buf, " PUBLIC ");
+		     xmlBufferWriteQuotedString(buf, cur->ExternalID);
+		     xmlBufferWriteChar(buf, " ");
+		     xmlBufferWriteQuotedString(buf, cur->SystemID);
 		} else {
-		     xmlBufferWriteChar(buf, " SYSTEM \"");
-		     xmlBufferWriteCHAR(buf, cur->SystemID);
-		     xmlBufferWriteChar(buf, "\"");
+		     xmlBufferWriteChar(buf, " SYSTEM ");
+		     xmlBufferWriteQuotedString(buf, cur->SystemID);
 		}
 		xmlBufferWriteChar(buf, ">\n");
 	        break;