ackmud/
ackmud/area/imc/
ackmud/npcs/a/
ackmud/npcs/c/
ackmud/npcs/d/
ackmud/npcs/e/
ackmud/npcs/f/
ackmud/npcs/h/
ackmud/npcs/i/
ackmud/npcs/k/
ackmud/npcs/l/
ackmud/npcs/n/
ackmud/npcs/o/
ackmud/npcs/p/
ackmud/npcs/r/
ackmud/npcs/s/
ackmud/npcs/w/
ackmud/player/c/
ackmud/player/s/
ackmud/player/z/
#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));
}