/* Copyright (C) 1993 Stephen F. White */

/*
 * This hashing function was ripped from Aho & Ullman, who ripped it
 * from someone else.
 */

#include "config.h"
#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;
}

HashT *
hash_new(int  htsize)
{
    HashT	*new;
    int		 i;

    if (htsize == 0) {
	htsize = 1;
    }
    new = cool_malloc(sizeof(HashT) + htsize * sizeof(void *));
    new->size = htsize;
    new->num = 0;
    new->table = (void *) (new + 1);
    for (i = 0; i < htsize; i++) {
	new->table[i] = 0;
    }
    return new;
}