#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include "merc.h"
#include "hash.h"
/*
* Deals with generic hashing tables.
*/
hash_entry *hash_free = NULL;
void * get_hash_entry(hash_table * hash_head,int key)
{
int a;
hash_entry * rvalue;
hash_entry ** hash_table;
a=key % hash_head->max_hash;
hash_table=hash_head->table;
for (rvalue=hash_table[a]; rvalue != NULL; rvalue=rvalue->next)
if (rvalue->key == key)
break;
if ( rvalue != NULL)
return rvalue->reference;
else
return NULL;
}
void add_hash_entry(hash_table * hash_head,int key,void * entry)
{
int a;
hash_entry * temp;
hash_entry ** hash_table;
a=key % hash_head->max_hash;
hash_table=hash_head->table;
GET_FREE(temp, hash_free);
temp->key=key;
temp->reference=entry;
temp->next=hash_table[a];
hash_table[a]=temp;
}
void del_hash_entry(hash_table * hash_head,int key)
{
int a;
hash_entry * prev_entry;
hash_entry * search_entry;
hash_entry ** hash_table;
a=key % hash_head->max_hash;
hash_table=hash_head->table;
prev_entry=NULL;
for (search_entry=hash_table[a]; search_entry != NULL; search_entry = search_entry->next)
{
if (search_entry->key==key)
break;
prev_entry=search_entry;
}
if (search_entry != NULL)
{
if (prev_entry == NULL)
hash_table[a]=NULL;
else
prev_entry->next=search_entry->next;
PUT_FREE(search_entry, hash_free);
}
}
hash_table * create_hash_table(int max_hash)
{
int a;
hash_table * hash_head;
hash_entry ** hash_table;
hash_table=getmem(sizeof(hash_entry *)*max_hash);
hash_head=getmem(sizeof(struct hash_table_tp));
hash_head->max_hash=max_hash;
hash_head->table=hash_table;
for (a=0; a < max_hash; a++)
hash_table[a]=NULL;
return hash_head;
}
void clear_hash_table(hash_table * hash_head)
{
int a;
hash_entry * entry, * next_entry;
hash_entry ** hash_table;
hash_table=hash_head->table;
for (a=0; a < hash_head->max_hash; a++)
{
if (hash_table[a] != NULL)
{
for (entry=hash_table[a]; entry != NULL; entry=next_entry)
{
next_entry=entry->next;
PUT_FREE(entry, hash_free);
}
hash_table[a]=NULL;
}
}
}
void delete_hash_table(hash_table * hash_head)
{
int a;
hash_entry * entry, * next_entry;
hash_entry ** hash_table;
hash_table=hash_head->table;
for (a=0; a < hash_head->max_hash; a++)
{
if (hash_table[a] != NULL)
{
for (entry=hash_table[a]; entry != NULL; entry=next_entry)
{
next_entry=entry->next;
PUT_FREE(entry, hash_free);
}
hash_table[a]=NULL;
}
}
dispose(hash_table, sizeof(hash_entry *) * hash_head->max_hash);
dispose(hash_head, sizeof(*hash_head));
}