Fix leak for show raw
[pazpar2-moved-to-github.git] / src / marchash.c
index 6de22de..58e8192 100644 (file)
@@ -21,6 +21,10 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     \brief MARC MAP utilities (hash lookup etc)
 */
 
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
@@ -30,25 +34,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #include <libxml/parser.h>
 #include <yaz/nmem.h>
 
+#include "jenkins_hash.h"
 #include <marchash.h>
 
-// Jenkins one-at-a-time hash (from pp2 reclists.c, wikipedia)
-static unsigned int hash(const unsigned char *key)
-{
-    unsigned int hash = 0;
-
-    while (*key)
-    {
-        hash += *(key++);
-        hash += (hash << 10);
-        hash ^= (hash >> 6);
-    }
-    hash += (hash << 3);
-    hash ^= (hash >> 11);
-    hash += (hash << 15);
-    return hash;
-}
-
 inline void strtrimcat(char *dest, const char *src)
 {
     const char *in;
@@ -144,7 +132,7 @@ struct marcfield *marchash_add_field(struct marchash *marchash,
     struct marcfield *new;
     struct marcfield *last;
     
-    slot = hash((const unsigned char *) key) & MARCHASH_MASK;
+    slot = jenkins_hash((const unsigned char *) key) & MARCHASH_MASK;
     new = marchash->table[slot];
     last = NULL;
     
@@ -211,7 +199,7 @@ struct marcfield *marchash_get_field (struct marchash *marchash,
     if (last)
         cur = last->next;
     else 
-        cur = marchash->table[hash((const unsigned char *)key) & MARCHASH_MASK];
+        cur = marchash->table[jenkins_hash((const unsigned char *)key) & MARCHASH_MASK];
     while (cur)
     {
         if (!strcmp(cur->key, key))