|
|
BSD 4.3reno
/*
******************************************************************************
*
* Module: bb_hash.c
*
* Functions:
* bb_put_hash() - Place an entry in the hash table.
* bb_get_hash() - Return an index from the hash table.
*
*
******************************************************************************
*/
/*
******************************************************************************
* Include Files
******************************************************************************
*/
#include <stdio.h>
#include <rpc/rpc.h>
#include "common.h"
#include "protocol.h"
#include "server.h"
static BB_hash bb_hash; /* The hash table of id, index. */
static BB_co_data bb_co_d[BB_MAX_IMP]; /* The company data table. */
int
bb_put_hash( id, index)
BB_id id; /* The identifier to hash. */
int index; /* Index of this record in co. data tbl.*/
{
int i; /* Nice loop variable name. */
int hash_idx = 0; /* Index into hash table. */
int term_idx; /* Termination index of circular search.*/
/*
** Sum up all of the characters in the id and mod it by the
** hash list size. This is the initial hash index.
*/
for( i = 0; (id[i] != NUL) && (i < BB_ID_NAME_LEN); i++)
{
hash_idx += id[i];
}
hash_idx = term_idx = (hash_idx % BB_MAX_HASH);
/*
** Search the table for the first open hash bucket. If the hash
** table does not contain one break at the termination index.
*/
while( bb_hash[hash_idx].id_ptr != NULL )
{
hash_idx = ((hash_idx + 1) % BB_MAX_HASH);
if ( hash_idx == term_idx )
break;
}
/*
** If the hash bucket is empty then install the info here.
** Otherwise the table is full.
*/
if ( bb_hash[hash_idx].id_ptr == NULL )
{
bb_hash[hash_idx].index = index;
bb_hash[hash_idx].id_ptr = id;
return BB_SUCCESS;
}
else
{
return BB_HASH_TABLE_FULL;
}
}
int
bb_get_hash( id)
BB_id id; /* The identifier to hash. */
{
int i; /* Nice loop variable name. */
int hash_idx = 0; /* Index into hash table. */
int term_idx; /* Termination index of circular search.*/
/*
** Sum up all of the characters in the id and mod it by the
** hash list size. This is the initial hash index.
*/
for( i = 0; (id[i] != NUL) && (i < BB_ID_NAME_LEN); i++)
{
hash_idx += id[i];
}
hash_idx = term_idx = (hash_idx % BB_MAX_HASH);
/*
** Search the hash table based upon the initial index. The search
** ends when the index is found or one complete cycle of the hash
** table has been done. This is linear resolution.
*/
while( ( bb_hash[hash_idx].id_ptr != NULL ) &&
( strncmp( bb_hash[hash_idx].id_ptr, id, BB_ID_NAME_LEN) != 0 ) )
{
hash_idx = ((hash_idx + 1) % BB_MAX_HASH);
if ( hash_idx == term_idx )
break;
}
/*
** If the id is equal to that of the hash bucket then a match is
** found. Otherwise the table does not contain this id.
*/
if ( ( bb_hash[hash_idx].id_ptr != NUL ) &&
( strncmp( bb_hash[hash_idx].id_ptr, id, BB_ID_NAME_LEN) == 0 ) )
{
return bb_hash[hash_idx].index;
}
else
{
return BB_HASH_ID_NOT_FOUND;
}
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.