
#include "StrTab.h"
#include <stdlib.h>

StrTab::StrTab(void)
{
    numBuckets = 1024;
    numEntries = 0;
    buckets = new StrTabNode*[numBuckets];
    memset(buckets, 0, sizeof(numBuckets * sizeof(StrTabNode*)));
}

void StrTab::Insert(String *str, void *value)
{
    long bucket = Hash(str);
    StrTabNode *n = buckets[bucket];
    while (n) {
	if (str->Equal(n->str)) {
	    n->value = value;
	    return;
	}
	n = n->next;
    }
    StrTabNode *nw = new StrTabNode;
    nw->str = str;
    nw->value = value;
    nw->next = buckets[bucket];
    buckets[bucket] = nw;
}


int StrTab::Lookup(String *str, void **value)
{
    long bucket = Hash(str);
    StrTabNode *n = buckets[bucket];
    while (n) {
	if (str->Equal(n->str)) {
	    *value = n->value;
	    return 1;
	}
	n = n->next;
    }
    return 0;
}
     

long StrTab::Hash (String *str)
{
    char *d = str->Data();
    long length = str->Length();
    long hash = 0;
    int n, m, c;

    if (length == 0) return 0;
    for (n = 0; n < 16; n++) {
	c = d[n % length];
	for (m = 0; m < 8; m++) {
	    hash <<= 1;
	    if (c & 1) {
		hash ^= 0x2041;
	    }
	    c >>= 1;
	}
    }
    return (hash & (numBuckets-1));
}

		
	
