/***************************************************************************
* _/_/_/_/ _/ _/ _/_/_/_/ _/_/_/_/ AckFUSS is modified ACK!MUD 4.3.1 *
* _/ _/ _/ _/ _/ copyright Matt Goff (Kline) 2008 *
* _/_/ _/ _/ _/_/_/_/ _/_/_/_/ *
* _/ _/ _/ _/ _/ Support for this code is provided *
* _/ _/_/_/_/ _/_/_/_/ _/_/_/_/ at www.ackmud.net -- check it out!*
***************************************************************************/
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include "globals.h"
#include "hash.h"
#ifndef DEC_DB_H
#include "h/db.h"
#endif
/*
* Deals with generic hashing tables.
*/
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;
temp = new HASH_ENTRY;
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;
delete search_entry;
}
}
hash_table *create_hash_table( int max_hash )
{
int a;
hash_table *hash_head;
HASH_ENTRY **hash_table;
hash_table = (HASH_ENTRY **)getmem( sizeof( HASH_ENTRY * ) * max_hash );
hash_head = (struct hash_table_tp *)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;
delete entry;
}
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;
delete entry;
}
hash_table[a] = NULL;
}
}
dispose( hash_table, sizeof( HASH_ENTRY * ) * hash_head->max_hash );
dispose( hash_head, sizeof( *hash_head ) );
}