#include "hash.h"
#include "defs.h"
#define STRCMP(A, B) (cf(A, B) != 0)
#define FACTOR 035761254233
#define TABLENGTH 64
#define LOG2LEN 6
#define hash(str) (int)(((unsigned)(crunch(str) * FACTOR)) >> shift)
struct node
{
ENTRY item;
struct node *next;
};
static struct node **last;
static struct node *next;
static struct node **table;
static unsigned int bitsper;
static unsigned int shift;
static unsigned int crunch();
void
hcreate(void)
{
unsigned char c = (unsigned char)~0;
int j;
table = (struct node **)alloc(TABLENGTH * sizeof(struct node *));
for (j=0; j < TABLENGTH; ++j)
{
table[j] = 0;
}
bitsper = 0;
while (c)
{
c = (unsigned int)c >> 1;
bitsper++;
}
shift = (bitsper * sizeof(int)) - LOG2LEN;
}
void hscan(uscan)
void (*uscan)();
{
struct node *p, *nxt;
int j;
for (j=0; j < TABLENGTH; ++j)
{
p = table[j];
while (p)
{
nxt = p->next;
(*uscan)(&p->item);
p = nxt;
}
}
}
ENTRY *
hfind(str)
unsigned char *str;
{
struct node *p;
struct node **q;
unsigned int i;
int res;
i = hash(str);
if(table[i] == 0)
{
last = &table[i];
next = 0;
return(0);
}
else
{
q = &table[i];
p = table[i];
while (p != 0 && (res = STRCMP(str, p->item.key)))
{
q = &(p->next);
p = p->next;
}
if (p != 0 && res == 0)
return(&(p->item));
else
{
last = q;
next = p;
return(0);
}
}
}
ENTRY *
henter(item)
ENTRY item;
{
struct node *p = (struct node *)alloc(sizeof(struct node));
p->item = item;
*last = p;
p->next = next;
return(&(p->item));
}
static unsigned int
crunch(key)
unsigned char *key;
{
unsigned int sum = 0;
int s;
for (s = 0; *key; s++)
sum += *key++;
return(sum + s);
}