/* $Header$
*
* Generic hash table routines. Uses integer keys to store char * values.
+ *
+ * (c) Copyright 1988 by the Massachusetts Institute of Technology.
+ * For copying and distribution information, please see the file
+ * <mit-copyright.h>.
*/
+#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. */
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);
}
{
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)
{
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) {
/* 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)
{
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;
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;