Added copy operations for node/tree/documents, Daniel.
diff --git a/entities.c b/entities.c
index 28a3582..30506cb 100644
--- a/entities.c
+++ b/entities.c
@@ -31,6 +31,9 @@
 
 /*
  * A buffer used for converting entities to their equivalent and back.
+ *
+ * TODO: remove this, this helps performances but forbid reentrancy in a 
+ *       stupid way.
  */
 static int buffer_size = 0;
 static CHAR *buffer = NULL;
@@ -47,7 +50,6 @@
 /*
  * xmlFreeEntity : clean-up an entity record.
  */
-
 void xmlFreeEntity(xmlEntityPtr entity) {
     if (entity == NULL) return;
 
@@ -63,12 +65,13 @@
 }
 
 /*
- * xmlAddDocEntity : register a new entity for an entities table.
+ * xmlAddEntity : register a new entity for an entities table.
  *
  * TODO !!! We should check here that the combination of type
  *          ExternalID and SystemID is valid.
  */
-static void xmlAddEntity(xmlEntitiesTablePtr table, const CHAR *name, int type,
+static void
+xmlAddEntity(xmlEntitiesTablePtr table, const CHAR *name, int type,
               const CHAR *ExternalID, const CHAR *SystemID, CHAR *content) {
     int i;
     xmlEntityPtr cur;
@@ -116,8 +119,10 @@
     table->nb_entities++;
 }
 
-/*
- * Set up xmlPredefinedEntities from xmlPredefinedEntityValues.
+/**
+ * xmlInitializePredefinedEntities:
+ *
+ * Set up the predefined entities.
  */
 void xmlInitializePredefinedEntities(void) {
     int i;
@@ -165,12 +170,19 @@
     return(NULL);
 }
 
-
-
-/*
- * xmlAddDtdEntity : register a new entity for this DTD.
+/**
+ * xmlAddDtdEntity:
+ * @doc:  the document
+ * @name:  the entity name
+ * @type:  the entity type XML_xxx_yyy_ENTITY
+ * @ExternalID:  the entity external ID if available
+ * @SystemID:  the entity system ID if available
+ * @content:  the entity content
+ *
+ * Register a new entity for this document DTD.
  */
-void xmlAddDtdEntity(xmlDocPtr doc, const CHAR *name, int type,
+void
+xmlAddDtdEntity(xmlDocPtr doc, const CHAR *name, int type,
               const CHAR *ExternalID, const CHAR *SystemID, CHAR *content) {
     xmlEntitiesTablePtr table;
 
@@ -186,10 +198,19 @@
     xmlAddEntity(table, name, type, ExternalID, SystemID, content);
 }
 
-/*
- * xmlAddDocEntity : register a new entity for this document.
+/**
+ * xmlAddDocEntity:
+ * @doc:  the document
+ * @name:  the entity name
+ * @type:  the entity type XML_xxx_yyy_ENTITY
+ * @ExternalID:  the entity external ID if available
+ * @SystemID:  the entity system ID if available
+ * @content:  the entity content
+ *
+ * Register a new entity for this document.
  */
-void xmlAddDocEntity(xmlDocPtr doc, const CHAR *name, int type,
+void
+xmlAddDocEntity(xmlDocPtr doc, const CHAR *name, int type,
               const CHAR *ExternalID, const CHAR *SystemID, CHAR *content) {
     xmlEntitiesTablePtr table;
 
@@ -201,11 +222,18 @@
     xmlAddEntity(doc->entities, name, type, ExternalID, SystemID, content);
 }
 
-/*
- * xmlGetDtdEntity : do an entity lookup in the Dtd entity hash table and
- *       returns the corrsponding entity, if found, NULL otherwise.
+/**
+ * xmlGetDtdEntity:
+ * @doc:  the document referencing the entity
+ * @name:  the entity name
+ *
+ * Do an entity lookup in the Dtd entity hash table and
+ * returns the corresponding entity, if found.
+ * 
+ * return values: A pointer to the entity structure or NULL if not found.
  */
-xmlEntityPtr xmlGetDtdEntity(xmlDocPtr doc, const CHAR *name) {
+xmlEntityPtr
+xmlGetDtdEntity(xmlDocPtr doc, const CHAR *name) {
     int i;
     xmlEntityPtr cur;
     xmlEntitiesTablePtr table;
@@ -220,12 +248,19 @@
     return(NULL);
 }
 
-/*
- * xmlGetDocEntity : do an entity lookup in the document entity hash table and
- *       returns the corrsponding entity, otherwise a lookup is done
- *       in the predefined entities too.
+/**
+ * xmlGetDocEntity:
+ * @doc:  the document referencing the entity
+ * @name:  the entity name
+ *
+ * Do an entity lookup in the document entity hash table and
+ * returns the corrsponding entity, otherwise a lookup is done
+ * in the predefined entities too.
+ * 
+ * return values: A pointer to the entity structure or NULL if not found.
  */
-xmlEntityPtr xmlGetDocEntity(xmlDocPtr doc, const CHAR *name) {
+xmlEntityPtr
+xmlGetDocEntity(xmlDocPtr doc, const CHAR *name) {
     int i;
     xmlEntityPtr cur;
     xmlEntitiesTablePtr table;
@@ -257,15 +292,24 @@
     (((c) == 0x09) || ((c) == 0x0a) || ((c) == 0x0d) ||			\
      (((c) >= 0x20) && ((c) != 0xFFFE) && ((c) != 0xFFFF)))
 
-/*
- * xmlEncodeEntities : do a global encoding of a string, replacing the
- *                     predefined entities and non ASCII values with their
- *                     entities and CharRef counterparts.
+/**
+ * xmlEncodeEntities:
+ * @doc:  the document containing the string
+ * @input:  A string to convert to XML.
+ *
+ * Do a global encoding of a string, replacing the predefined entities
+ * and non ASCII values with their entities and CharRef counterparts.
+ *
  * TODO !!!! 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.
+ * 
+ * return values: A newly allocated string with the substitution done.
  */
-
-CHAR *xmlEncodeEntities(xmlDocPtr doc, const CHAR *input) {
+CHAR *
+xmlEncodeEntities(xmlDocPtr doc, const CHAR *input) {
     const CHAR *cur = input;
     CHAR *out = buffer;
 
@@ -363,10 +407,15 @@
     return(buffer);
 }
 
-/*
- * xmlCreateEntitiesTable : create and initialize an enmpty hash table
+/**
+ * xmlCreateEntitiesTable:
+ *
+ * create and initialize an empty entities hash table.
+ *
+ * return values: the xmlEntitiesTablePtr just created or NULL in case of error.
  */
-xmlEntitiesTablePtr xmlCreateEntitiesTable(void) {
+xmlEntitiesTablePtr
+xmlCreateEntitiesTable(void) {
     xmlEntitiesTablePtr ret;
 
     ret = (xmlEntitiesTablePtr) 
@@ -389,10 +438,14 @@
     return(ret);
 }
 
-/*
- * xmlFreeEntitiesTable : clean up and free an entities hash table.
+/**
+ * xmlFreeEntitiesTable:
+ * @table:  An entity table
+ *
+ * Deallocate the memory used by an entities hash table.
  */
-void xmlFreeEntitiesTable(xmlEntitiesTablePtr table) {
+void
+xmlFreeEntitiesTable(xmlEntitiesTablePtr table) {
     int i;
 
     if (table == NULL) return;
@@ -404,10 +457,70 @@
     free(table);
 }
 
-/*
- * Dump the content of an entity table to the document output.
+/**
+ * xmlCopyEntitiesTable:
+ * @table:  An entity table
+ *
+ * Build a copy of an entity table.
+ * 
+ * return values: the new xmlEntitiesTablePtr or NULL in case of error.
  */
-void xmlDumpEntitiesTable(xmlEntitiesTablePtr table) {
+xmlEntitiesTablePtr
+xmlCopyEntitiesTable(xmlEntitiesTablePtr table) {
+    xmlEntitiesTablePtr ret;
+    xmlEntityPtr cur, ent;
+    int i;
+
+    ret = (xmlEntitiesTablePtr) malloc(sizeof(xmlEntitiesTable));
+    if (ret == NULL) {
+        fprintf(stderr, "xmlCopyEntitiesTable: out of memory !\n");
+	return(NULL);
+    }
+    ret->table = (xmlEntityPtr) malloc(table->max_entities *
+                                         sizeof(xmlEntity));
+    if (ret->table == NULL) {
+        fprintf(stderr, "xmlCopyEntitiesTable: out of memory !\n");
+	free(ret);
+	return(NULL);
+    }
+    ret->max_entities = table->max_entities;
+    ret->nb_entities = table->nb_entities;
+    for (i = 0;i < ret->nb_entities;i++) {
+	cur = &ret->table[i];
+	ent = &table->table[i];
+	cur->len = ent->len;
+	cur->type = ent->type;
+	if (ent->name != NULL)
+	    cur->name = xmlStrdup(ent->name);
+	else
+	    cur->name = NULL;
+	if (ent->ExternalID != NULL)
+	    cur->ExternalID = xmlStrdup(ent->ExternalID);
+	else
+	    cur->ExternalID = NULL;
+	if (ent->SystemID != NULL)
+	    cur->SystemID = xmlStrdup(ent->SystemID);
+	else
+	    cur->SystemID = NULL;
+	if (ent->content != NULL)
+	    cur->content = xmlStrdup(ent->content);
+	else
+	    cur->content = NULL;
+    }
+    return(ret);
+}
+
+/**
+ * xmlDumpEntitiesTable:
+ * @table:  An entity table
+ *
+ * This will dump the content of the entity table as an XML DTD definition
+ *
+ * NOTE: TODO an extra parameter allowing a reentant implementation will
+ *       be added.
+ */
+void
+xmlDumpEntitiesTable(xmlEntitiesTablePtr table) {
     int i;
     xmlEntityPtr cur;