|
|
1.1 root 1: /*
2: ******************************************************************************
3: *
4: * Module: bb_hash.c
5: *
6: * Functions:
7: * bb_put_hash() - Place an entry in the hash table.
8: * bb_get_hash() - Return an index from the hash table.
9: *
10: *
11: ******************************************************************************
12: */
13:
14: /*
15: ******************************************************************************
16: * Include Files
17: ******************************************************************************
18: */
19: #include <stdio.h>
20: #include <rpc/rpc.h>
21: #include "common.h"
22: #include "protocol.h"
23: #include "server.h"
24:
25: static BB_hash bb_hash; /* The hash table of id, index. */
26: static BB_co_data bb_co_d[BB_MAX_IMP]; /* The company data table. */
27:
28: int
29: bb_put_hash( id, index)
30: BB_id id; /* The identifier to hash. */
31: int index; /* Index of this record in co. data tbl.*/
32: {
33: int i; /* Nice loop variable name. */
34: int hash_idx = 0; /* Index into hash table. */
35: int term_idx; /* Termination index of circular search.*/
36:
37: /*
38: ** Sum up all of the characters in the id and mod it by the
39: ** hash list size. This is the initial hash index.
40: */
41: for( i = 0; (id[i] != NUL) && (i < BB_ID_NAME_LEN); i++)
42: {
43: hash_idx += id[i];
44: }
45: hash_idx = term_idx = (hash_idx % BB_MAX_HASH);
46:
47: /*
48: ** Search the table for the first open hash bucket. If the hash
49: ** table does not contain one break at the termination index.
50: */
51: while( bb_hash[hash_idx].id_ptr != NULL )
52: {
53: hash_idx = ((hash_idx + 1) % BB_MAX_HASH);
54: if ( hash_idx == term_idx )
55: break;
56: }
57:
58: /*
59: ** If the hash bucket is empty then install the info here.
60: ** Otherwise the table is full.
61: */
62: if ( bb_hash[hash_idx].id_ptr == NULL )
63: {
64: bb_hash[hash_idx].index = index;
65: bb_hash[hash_idx].id_ptr = id;
66: return BB_SUCCESS;
67: }
68: else
69: {
70: return BB_HASH_TABLE_FULL;
71: }
72: }
73:
74: int
75: bb_get_hash( id)
76: BB_id id; /* The identifier to hash. */
77: {
78: int i; /* Nice loop variable name. */
79: int hash_idx = 0; /* Index into hash table. */
80: int term_idx; /* Termination index of circular search.*/
81:
82: /*
83: ** Sum up all of the characters in the id and mod it by the
84: ** hash list size. This is the initial hash index.
85: */
86: for( i = 0; (id[i] != NUL) && (i < BB_ID_NAME_LEN); i++)
87: {
88: hash_idx += id[i];
89: }
90: hash_idx = term_idx = (hash_idx % BB_MAX_HASH);
91:
92: /*
93: ** Search the hash table based upon the initial index. The search
94: ** ends when the index is found or one complete cycle of the hash
95: ** table has been done. This is linear resolution.
96: */
97: while( ( bb_hash[hash_idx].id_ptr != NULL ) &&
98: ( strncmp( bb_hash[hash_idx].id_ptr, id, BB_ID_NAME_LEN) != 0 ) )
99: {
100: hash_idx = ((hash_idx + 1) % BB_MAX_HASH);
101: if ( hash_idx == term_idx )
102: break;
103: }
104:
105: /*
106: ** If the id is equal to that of the hash bucket then a match is
107: ** found. Otherwise the table does not contain this id.
108: */
109: if ( ( bb_hash[hash_idx].id_ptr != NUL ) &&
110: ( strncmp( bb_hash[hash_idx].id_ptr, id, BB_ID_NAME_LEN) == 0 ) )
111: {
112: return bb_hash[hash_idx].index;
113: }
114: else
115: {
116: return BB_HASH_ID_NOT_FOUND;
117: }
118: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.