/* Copyright (C) 1993 Stephen F. White */ /* * This hashing function was ripped from Aho & Ullman, who ripped it * from someone else. */ #include "cool.h" #include "proto.h" int hash (const char *s) { const char *p; unsigned h = 0, g; for (p = s; *p; p++) { h = (h << 4) + (*p); g = h & 0xf0000000; if (g) { h = h ^ (g >> 24); h = h ^ g; } } return h; } int hash_var (Var v) { switch (v.type) { case STR: return hash (v.v.str->str); case NUM: return v.v.num; case OBJ: return v.v.obj.id; /* these */ case LIST: return v.v.list->len; /* are */ case MAP: return v.v.map->num; /* totally */ case ERR: return (int) v.v.err; /* bogus */ case PC: return 0; } return 0; } HashT *hash_new (int htsize) { HashT *new; int i; htsize = MAX (htsize, HASH_INIT_SIZE); new = cool_malloc (sizeof (HashT) + htsize * sizeof (void *)); new->size = htsize; new->num = 0; new->table = (void *) (new + 1); new->ref = 1; for (i = 0; i < htsize; i++) { new->table[i] = 0; } return new; }