Index: hash.c
===================================================================
RCS file: /cvs/gnome/gnome-xml/hash.c,v
retrieving revision 1.30
diff -u -r1.30 hash.c
--- hash.c	29 Oct 2003 11:18:37 -0000	1.30
+++ hash.c	24 Feb 2004 17:18:42 -0000
@@ -26,6 +26,7 @@
 #include <libxml/xmlmemory.h>
 #include <libxml/xmlerror.h>
 #include <libxml/globals.h>
+#include <libxml/dict.h>
 
 #define MAX_HASH_LEN 8
 
@@ -38,9 +39,9 @@
 typedef xmlHashEntry *xmlHashEntryPtr;
 struct _xmlHashEntry {
     struct _xmlHashEntry *next;
-    xmlChar *name;
-    xmlChar *name2;
-    xmlChar *name3;
+    const xmlChar *name;
+    const xmlChar *name2;
+    const xmlChar *name3;
     void *payload;
     int valid;
 };
@@ -52,6 +53,7 @@
     struct _xmlHashEntry *table;
     int size;
     int nbElems;
+    xmlDictPtr dict;
 };
 
 /*
@@ -143,12 +145,16 @@
 xmlHashTablePtr
 xmlHashCreate(int size) {
     xmlHashTablePtr table;
+    xmlDictPtr dict;
   
     if (size <= 0)
         size = 256;
   
+    dict = xmlDictCreate();
+    if (dict == NULL) return(NULL);
     table = xmlMalloc(sizeof(xmlHashTable));
     if (table) {
+        table->dict = dict;
         table->size = size;
 	table->nbElems = 0;
         table->table = xmlMalloc(size * sizeof(xmlHashEntry));
@@ -158,6 +164,7 @@
         }
         xmlFree(table);
     }
+    xmlDictFree(dict);
     return(NULL);
 }
 
@@ -282,12 +289,6 @@
 		next = iter->next;
 		if ((f != NULL) && (iter->payload != NULL))
 		    f(iter->payload, iter->name);
-		if (iter->name)
-		    xmlFree(iter->name);
-		if (iter->name2)
-		    xmlFree(iter->name2);
-		if (iter->name3)
-		    xmlFree(iter->name3);
 		iter->payload = NULL;
 		if (!inside_table)
 		    xmlFree(iter);
@@ -299,6 +300,7 @@
 	}
 	xmlFree(table->table);
     }
+    xmlDictFree(table->dict);
     xmlFree(table);
 }
 
@@ -465,6 +467,9 @@
 
     if ((table == NULL) || name == NULL)
 	return(-1);
+    if (name) name = xmlDictLookup(table->dict, name, -1);
+    if (name2) name2 = xmlDictLookup(table->dict, name2, -1);
+    if (name3) name3 = xmlDictLookup(table->dict, name3, -1);
 
     /*
      * Check for duplicate and insertion location.
@@ -475,15 +480,15 @@
     } else {
 	for (insert = &(table->table[key]); insert->next != NULL;
 	     insert = insert->next) {
-	    if ((xmlStrEqual(insert->name, name)) &&
-		(xmlStrEqual(insert->name2, name2)) &&
-		(xmlStrEqual(insert->name3, name3)))
+	    if ((insert->name == name) &&
+		(insert->name2 == name2) &&
+		(insert->name3 == name3))
 		return(-1);
 	    len++;
 	}
-	if ((xmlStrEqual(insert->name, name)) &&
-	    (xmlStrEqual(insert->name2, name2)) &&
-	    (xmlStrEqual(insert->name3, name3)))
+	if ((insert->name == name) &&
+	    (insert->name2 == name2) &&
+	    (insert->name3 == name3))
 	    return(-1);
     }
 
@@ -495,9 +500,9 @@
 	     return(-1);
     }
 
-    entry->name = xmlStrdup(name);
-    entry->name2 = xmlStrdup(name2);
-    entry->name3 = xmlStrdup(name3);
+    entry->name = name;
+    entry->name2 = name2;
+    entry->name3 = name3;
     entry->payload = userdata;
     entry->next = NULL;
     entry->valid = 1;
@@ -539,6 +544,9 @@
 
     if ((table == NULL) || name == NULL)
 	return(-1);
+    if (name) name = xmlDictLookup(table->dict, name, -1);
+    if (name2) name2 = xmlDictLookup(table->dict, name2, -1);
+    if (name3) name3 = xmlDictLookup(table->dict, name3, -1);
 
     /*
      * Check for duplicate and insertion location.
@@ -549,18 +557,18 @@
     } else {
 	for (insert = &(table->table[key]); insert->next != NULL;
 	     insert = insert->next) {
-	    if ((xmlStrEqual(insert->name, name)) &&
-		(xmlStrEqual(insert->name2, name2)) &&
-		(xmlStrEqual(insert->name3, name3))) {
+	    if ((insert->name == name) &&
+		(insert->name2 == name2) &&
+		(insert->name3 == name3)) {
 		if (f)
 		    f(insert->payload, insert->name);
 		insert->payload = userdata;
 		return(0);
 	    }
 	}
-	if ((xmlStrEqual(insert->name, name)) &&
-	    (xmlStrEqual(insert->name2, name2)) &&
-	    (xmlStrEqual(insert->name3, name3))) {
+	if ((insert->name == name) &&
+	    (insert->name2 == name2) &&
+	    (insert->name3 == name3)) {
 	    if (f)
 		f(insert->payload, insert->name);
 	    insert->payload = userdata;
@@ -576,9 +584,9 @@
 	     return(-1);
     }
 
-    entry->name = xmlStrdup(name);
-    entry->name2 = xmlStrdup(name2);
-    entry->name3 = xmlStrdup(name3);
+    entry->name = name;
+    entry->name2 = name2;
+    entry->name3 = name3;
     entry->payload = userdata;
     entry->next = NULL;
     entry->valid = 1;
@@ -615,10 +623,13 @@
     key = xmlHashComputeKey(table, name, name2, name3);
     if (table->table[key].valid == 0)
 	return(NULL);
+    if (name) name = xmlDictLookup(table->dict, name, -1);
+    if (name2) name2 = xmlDictLookup(table->dict, name2, -1);
+    if (name3) name3 = xmlDictLookup(table->dict, name3, -1);
     for (entry = &(table->table[key]); entry != NULL; entry = entry->next) {
-	if ((xmlStrEqual(entry->name, name)) &&
-	    (xmlStrEqual(entry->name2, name2)) &&
-	    (xmlStrEqual(entry->name3, name3)))
+	if ((entry->name == name) &&
+	    (entry->name2 == name2) &&
+	    (entry->name3 == name3))
 	    return(entry->payload);
     }
     return(NULL);
@@ -774,6 +785,9 @@
     if (f == NULL)
 	return;
 
+    if (name) name = xmlDictLookup(table->dict, name, -1);
+    if (name2) name2 = xmlDictLookup(table->dict, name2, -1);
+    if (name3) name3 = xmlDictLookup(table->dict, name3, -1);
     if (table->table) {
 	for(i = 0; i < table->size; i++) {
 	    if (table->table[i].valid == 0)
@@ -781,9 +795,9 @@
 	    iter = &(table->table[i]);
 	    while (iter) {
 		next = iter->next;
-		if (((name == NULL) || (xmlStrEqual(name, iter->name))) &&
-		    ((name2 == NULL) || (xmlStrEqual(name2, iter->name2))) &&
-		    ((name3 == NULL) || (xmlStrEqual(name3, iter->name3))) &&
+		if (((name == NULL) || (name == iter->name)) &&
+		    ((name2 == NULL) || (name2 == iter->name2)) &&
+		    ((name3 == NULL) || (name3 == iter->name3)) &&
 		    (iter->payload != NULL)) {
 		    f(iter->payload, data, iter->name,
 		      iter->name2, iter->name3);
@@ -913,19 +927,16 @@
     if (table->table[key].valid == 0) {
         return(-1);
     } else {
+	if (name) name = xmlDictLookup(table->dict, name, -1);
+	if (name2) name2 = xmlDictLookup(table->dict, name2, -1);
+	if (name3) name3 = xmlDictLookup(table->dict, name3, -1);
         for (entry = &(table->table[key]); entry != NULL; entry = entry->next) {
-            if (xmlStrEqual(entry->name, name) &&
-                    xmlStrEqual(entry->name2, name2) &&
-                    xmlStrEqual(entry->name3, name3)) {
+            if ((entry->name == name) &&
+		(entry->name2 == name2) &&
+		(entry->name3 == name3)) {
                 if ((f != NULL) && (entry->payload != NULL))
                     f(entry->payload, entry->name);
                 entry->payload = NULL;
-                if(entry->name)
-                    xmlFree(entry->name);
-                if(entry->name2)
-                    xmlFree(entry->name2);
-                if(entry->name3)
-                    xmlFree(entry->name3);
                 if(prev) {
                     prev->next = entry->next;
 		    xmlFree(entry);
Index: include/libxml/hash.h
===================================================================
RCS file: /cvs/gnome/gnome-xml/include/libxml/hash.h,v
retrieving revision 1.15
diff -u -r1.15 hash.h
--- include/libxml/hash.h	20 Nov 2003 11:59:07 -0000	1.15
+++ include/libxml/hash.h	24 Feb 2004 17:18:42 -0000
@@ -42,7 +42,7 @@
  *
  * Callback to free data from a hash.
  */
-typedef void (*xmlHashDeallocator)(void *payload, xmlChar *name);
+typedef void (*xmlHashDeallocator)(void *payload, const xmlChar *name);
 /**
  * xmlHashCopier:
  * @payload:  the data in the hash
