7 #define stricmp strcasecmp
11 // hash init assumes we get clean memory
12 void Hash_InitTable(hashtable_t *table, int numbucks, void *mem)
14 table->numbuckets = numbucks;
15 table->bucket = (bucket_t **)mem;
18 int Hash_Key(const char *name, int modulus)
21 for (key=0;*name; name++)
22 key += ((key<<3) + (key>>28) + *name);
24 return (int)(key%modulus);
26 int Hash_KeyInsensative(const char *name, int modulus)
29 for (key=0;*name; name++)
31 if (*name >= 'A' && *name <= 'Z')
32 key += ((key<<3) + (key>>28) + (*name-'A'+'a'));
34 key += ((key<<3) + (key>>28) + *name);
37 return (int)(key%modulus);
40 void *Hash_Get(hashtable_t *table, const char *name)
42 int bucknum = Hash_Key(name, table->numbuckets);
45 buck = table->bucket[bucknum];
49 if (!STRCMP(name, buck->key.string))
56 void *Hash_GetInsensative(hashtable_t *table, const char *name)
58 int bucknum = Hash_KeyInsensative(name, table->numbuckets);
61 buck = table->bucket[bucknum];
65 if (!stricmp(name, buck->key.string))
72 void *Hash_GetKey(hashtable_t *table, int key)
74 int bucknum = key%table->numbuckets;
77 buck = table->bucket[bucknum];
81 if (buck->key.value == key)
88 void *Hash_GetNext(hashtable_t *table, char *name, void *old)
90 int bucknum = Hash_Key(name, table->numbuckets);
93 buck = table->bucket[bucknum];
97 if (!STRCMP(name, buck->key.string))
99 if (buck->data == old) //found the old one
108 buck = buck->next;//don't return old
111 if (!STRCMP(name, buck->key.string))
118 void *Hash_GetNextInsensative(hashtable_t *table, char *name, void *old)
120 int bucknum = Hash_KeyInsensative(name, table->numbuckets);
123 buck = table->bucket[bucknum];
127 if (!STRCMP(name, buck->key.string))
129 if (buck->data == old) //found the old one
138 buck = buck->next;//don't return old
141 if (!STRCMP(name, buck->key.string))
150 void *Hash_Add(hashtable_t *table, char *name, void *data, bucket_t *buck)
152 int bucknum = Hash_Key(name, table->numbuckets);
155 buck->key.string = name;
156 buck->next = table->bucket[bucknum];
157 table->bucket[bucknum] = buck;
161 void *Hash_AddInsensative(hashtable_t *table, char *name, void *data, bucket_t *buck)
163 int bucknum = Hash_KeyInsensative(name, table->numbuckets);
166 buck->key.string = name;
167 buck->next = table->bucket[bucknum];
168 table->bucket[bucknum] = buck;
172 void *Hash_AddKey(hashtable_t *table, int key, void *data, bucket_t *buck)
174 int bucknum = key%table->numbuckets;
177 buck->key.value = key;
178 buck->next = table->bucket[bucknum];
179 table->bucket[bucknum] = buck;
184 void Hash_Remove(hashtable_t *table, char *name)
186 int bucknum = Hash_Key(name, table->numbuckets);
189 buck = table->bucket[bucknum];
193 if (!STRCMP(name, buck->key.string))
195 table->bucket[bucknum] = buck->next;
202 if (!STRCMP(name, buck->next->key.string))
204 buck->next = buck->next->next;
213 void Hash_RemoveData(hashtable_t *table, char *name, void *data)
215 int bucknum = Hash_Key(name, table->numbuckets);
218 buck = table->bucket[bucknum];
222 if (buck->data == data)
223 if (!STRCMP(name, buck->key.string))
225 table->bucket[bucknum] = buck->next;
232 if (buck->next->data == data)
233 if (!STRCMP(name, buck->next->key.string))
235 buck->next = buck->next->next;
245 void Hash_RemoveKey(hashtable_t *table, int key)
247 int bucknum = key%table->numbuckets;
250 buck = table->bucket[bucknum];
254 if (buck->key.value == key)
256 table->bucket[bucknum] = buck->next;
263 if (buck->next->key.value == key)
265 buck->next = buck->next->next;