]> andersk Git - moira.git/blobdiff - lib/hash.c
Forgot a ;
[moira.git] / lib / hash.c
index f34824645c8d8db4cd852b41fb9b289263c3b8f8..e34e289f0ece9464103987abf83d19fe7570427d 100644 (file)
@@ -9,9 +9,13 @@
 
 #include <mit-copyright.h>
 #include <ctype.h>
-#include "sms_app.h"
-#define NULL 0
+#include <moira.h>
+#include <string.h>
+
+extern char *malloc();
 
+#define NULL 0
+#define hash_func(h, key) (key >= 0 ? (key % h->size) : (-key % h->size))
 
 /* Create a hash table.  The size is just a hint, not a maximum. */
 
@@ -21,9 +25,15 @@ int size;
     struct hash *h;
 
     h = (struct hash *) malloc(sizeof(struct hash));
+    if (h == (struct hash *) NULL)
+      return((struct hash *) NULL);
     h->size = size;
     h->data = (struct bucket **) malloc(size * sizeof(char *));
-    bzero(h->data, size * sizeof(char *));
+    if (h->data == (struct bucket **) NULL) {
+       free(h);
+       return((struct hash *) NULL);
+    }
+    memset(h->data, 0, size * sizeof(char *));
     return(h);
 }
 
@@ -37,7 +47,7 @@ register int key;
 {
     register struct bucket *b;
 
-    b = h->data[key % h->size];
+    b = h->data[hash_func(h, key)];
     while (b && b->key != key)
       b = b->next;
     if (b && b->key == key)
@@ -58,7 +68,7 @@ char *value;
 {
     register struct bucket *b;
 
-    b = h->data[key % h->size];
+    b = h->data[hash_func(h, key)];
     while (b && b->key != key)
       b = b->next;
     if (b && b->key == key) {
@@ -70,7 +80,7 @@ char *value;
 
 
 /* Store an item in the hash table.  Returns 0 if the key was not previously
- * there, or 1 if it was.
+ * there, 1 if it was, or -1 if we ran out of memory.
  */
 
 int hash_store(h, key, value)
@@ -80,9 +90,11 @@ char *value;
 {
     register struct bucket *b, **p;
 
-    p = &(h->data[key % h->size]);
+    p = &(h->data[hash_func(h, key)]);
     if (*p == NULL) {
        b = *p = (struct bucket *) malloc(sizeof(struct bucket));
+       if (b == (struct bucket *) NULL)
+         return(-1);
        b->next = NULL;
        b->key = key;
        b->data = value;
@@ -96,6 +108,8 @@ char *value;
        return(1);
     }
     b = *p = (struct bucket *) malloc(sizeof(struct bucket));
+    if (b == (struct bucket *) NULL)
+      return(-1);
     b->next = NULL;
     b->key = key;
     b->data = value;
This page took 0.096145 seconds and 4 git commands to generate.