]> granicus.if.org Git - yasm/commitdiff
Fix two bugs in HAMT:
authorPeter Johnson <peter@tortall.net>
Tue, 31 Jul 2007 04:53:22 +0000 (04:53 -0000)
committerPeter Johnson <peter@tortall.net>
Tue, 31 Jul 2007 04:53:22 +0000 (04:53 -0000)
 - HAMT_search() wasn't doing a full string comparison on the key before
   returning success.
 - HAMT_insert()'s check for the above was always doing a case-sensitive
   check; fixed to use case-insensitive when the HAMT is supposed to be
   case-insensitive (and likewise for HAMT_search).

svn path=/trunk/yasm/; revision=1903

libyasm/hamt.c

index dd28c544b081d55e1ae7bebf75031089f025e896..033a48acb8cb3ac4bc3eccd6a639a4fa75bc5af1 100644 (file)
@@ -56,6 +56,7 @@ struct HAMT {
                                     const char *message);
     unsigned long (*HashKey) (const char *key);
     unsigned long (*ReHashKey) (const char *key, int Level);
+    int (*CmpKey) (const char *s1, const char *s2);
 };
 
 /* XXX make a portable version of this.  This depends on the pointer being
@@ -132,9 +133,11 @@ HAMT_create(int nocase, /*@exits@*/ void (*error_func)
     if (nocase) {
         hamt->HashKey = HashKey_nocase;
         hamt->ReHashKey = ReHashKey_nocase;
+        hamt->CmpKey = strcasecmp;
     } else {
         hamt->HashKey = HashKey;
         hamt->ReHashKey = ReHashKey;
+        hamt->CmpKey = strcmp;
     }
 
     return hamt;
@@ -244,7 +247,8 @@ HAMT_insert(HAMT *hamt, const char *str, void *data, int *replace,
     for (;;) {
         if (!(IsSubTrie(node))) {
             if (node->BitMapKey == key
-                && strcmp(((HAMTEntry *)(node->BaseValue))->str, str) == 0) {
+                && hamt->CmpKey(((HAMTEntry *)(node->BaseValue))->str,
+                                str) == 0) {
                 /*@-branchstate@*/
                 if (*replace) {
                     deletefunc(((HAMTEntry *)(node->BaseValue))->data);
@@ -384,7 +388,9 @@ HAMT_search(HAMT *hamt, const char *str)
 
     for (;;) {
         if (!(IsSubTrie(node))) {
-            if (node->BitMapKey == key)
+            if (node->BitMapKey == key
+                && hamt->CmpKey(((HAMTEntry *)(node->BaseValue))->str,
+                                str) == 0)
                 return ((HAMTEntry *)(node->BaseValue))->data;
             else
                 return NULL;