added xmlHashScannerFull, xmlHashScanFull and xmlHashScannFull3 to get


        * hash.c include/libxml/hash.h: added xmlHashScannerFull,
          xmlHashScanFull and xmlHashScannFull3 to get passed the
          three keys as arguments to the callback function
diff --git a/hash.c b/hash.c
index ab01352..ed10394 100644
--- a/hash.c
+++ b/hash.c
@@ -510,6 +510,19 @@
  */
 void
 xmlHashScan(xmlHashTablePtr table, xmlHashScanner f, void *data) {
+    xmlHashScanFull (table, (xmlHashScannerFull) f, data);
+}
+
+/**
+ * xmlHashScanFull:
+ * @table: the hash table
+ * @f:  the scanner function for items in the hash
+ * @data:  extra data passed to f
+ *
+ * Scan the hash table and applied f to each value.
+ */
+void
+xmlHashScanFull(xmlHashTablePtr table, xmlHashScannerFull f, void *data) {
     int i;
     xmlHashEntryPtr iter;
     xmlHashEntryPtr next;
@@ -525,7 +538,8 @@
 	    while (iter) {
 		next = iter->next;
 		if (f)
-		    f(iter->payload, data, iter->name);
+		    f(iter->payload, data, iter->name,
+		      iter->name2, iter->name3);
 		iter = next;
 	    }
 	}
@@ -549,6 +563,27 @@
 xmlHashScan3(xmlHashTablePtr table, const xmlChar *name, 
 	     const xmlChar *name2, const xmlChar *name3,
 	     xmlHashScanner f, void *data) {
+    xmlHashScanFull3 (table, name, name2, name3,
+		      (xmlHashScannerFull) f, data);
+}
+
+/**
+ * xmlHashScanFull3:
+ * @table: the hash table
+ * @name: the name of the userdata or NULL
+ * @name2: a second name of the userdata or NULL
+ * @name3: a third name of the userdata or NULL
+ * @f:  the scanner function for items in the hash
+ * @data:  extra data passed to f
+ *
+ * Scan the hash table and applied f to each value matching
+ * (name, name2, name3) tuple. If one of the names is null,
+ * the comparison is considered to match.
+ */
+void
+xmlHashScanFull3(xmlHashTablePtr table, const xmlChar *name, 
+		 const xmlChar *name2, const xmlChar *name3,
+		 xmlHashScannerFull f, void *data) {
     int i;
     xmlHashEntryPtr iter;
     xmlHashEntryPtr next;
@@ -566,7 +601,8 @@
 		if (((name == NULL) || (xmlStrEqual(name, iter->name))) &&
 		    ((name2 == NULL) || (xmlStrEqual(name2, iter->name2))) &&
 		    ((name3 == NULL) || (xmlStrEqual(name3, iter->name3)))) {
-		    f(iter->payload, data, iter->name);
+		    f(iter->payload, data, iter->name,
+		      iter->name2, iter->name3);
 		}
 		iter = next;
 	    }