/*
* Simple hash table
* Copyright
* (C) 1992 Joseph H. Allen
*
* This file is part of JOE (Joe's Own Editor)
*/
struct entry {
HENTRY *next;
const char *name;
ptrdiff_t hash_val;
void *val;
};
struct Hash {
ptrdiff_t len;
HENTRY **tab;
ptrdiff_t nentries;
};
/* Compute hash code for a string */
ptrdiff_t hash(const char *s);
/* Create a hash table of specified size, which must be a power of 2 */
HASH *htmk(ptrdiff_t len);
/* Delete a hash table. HENTRIES get freed, but name/vals don't. */
void htrm(HASH *ht);
/* Add an entry to a hash table.
Note: 'name' is _not_ strdup()ed */
void *htadd(HASH *ht, const char *name, void *val);
/* Look up an entry in a hash table, returns NULL if not found */
void *htfind(HASH *ht, const char *name);
/* Same as above, but for Z-strings: strings made up of integers instead of chars */
struct Zentry {
ZHENTRY *next;
const int *name;
ptrdiff_t hash_val;
void *val;
};
struct Zhash {
ptrdiff_t len;
ZHENTRY **tab;
ptrdiff_t nentries;
};
/* Compute hash code for a string */
ptrdiff_t zhash(const int *s);
/* Create a hash table of specified size, which must be a power of 2 */
ZHASH *Zhtmk(ptrdiff_t len);
/* Delete a hash table. HENTRIES get freed, but name/vals don't. */
void Zhtrm(ZHASH *ht);
/* Add an entry to a hash table.
Note: 'name' is _not_ strdup()ed */
void *Zhtadd(ZHASH *ht, const int *name, void *val);
/* Look up an entry in a hash table, returns NULL if not found */
void *Zhtfind(ZHASH *ht, const int *name);