Sortix nightly manual
This manual documents Sortix nightly, a development build that has not been officially released. You can instead view this document in the latest official manual.
NAME
lh_new, lh_free, lh_insert, lh_delete, lh_retrieve, lh_doall, lh_doall_arg, lh_error, LHASH_COMP_FN_TYPE, LHASH_HASH_FN_TYPE, LHASH_DOALL_FN_TYPE, LHASH_DOALL_ARG_FN_TYPE, lh_strhash — dynamic hash tableSYNOPSIS
#include <openssl/lhash.h>lh_<type>_new(void);
lh_<type>_free(LHASH_OF(<type>) *table);
lh_<type>_insert(LHASH_OF(<type>) *table, <type> *data);
lh_<type>_delete(LHASH_OF(<type>) *table, <type> *data);
lh_<type>_retrieve(LHASH_OF(<type>) *table, <type> *data);
lh_<type>_doall(LHASH_OF(<type>) *table, LHASH_DOALL_FN_TYPE func);
lh_<type>_doall_arg(LHASH_OF(<type>) *table, LHASH_DOALL_ARG_FN_TYPE func, <type2>, <type2> *arg);
lh_<type>_error(LHASH_OF(<type>) *table);
(*LHASH_COMP_FN_TYPE)(const void *, const void *);
(*LHASH_HASH_FN_TYPE)(const void *);
(*LHASH_DOALL_FN_TYPE)(const void *);
(*LHASH_DOALL_ARG_FN_TYPE)(const void *, const void *);
lh_strhash(const char *c);
DESCRIPTION
This library implements type-checked dynamic hash tables. The hash table entries can be arbitrary structures. Usually they consist of key and value fields.#define DECLARE_LHASH_HASH_FN(name, o_type) \ unsigned long name##_LHASH_HASH(const void *); #define IMPLEMENT_LHASH_HASH_FN(name, o_type) \ unsigned long name##_LHASH_HASH(const void *arg) { \ const o_type *a = arg; \ return name##_hash(a); } #define LHASH_HASH_FN(name) name##_LHASH_HASH #define DECLARE_LHASH_COMP_FN(name, o_type) \ int name##_LHASH_COMP(const void *, const void *); #define IMPLEMENT_LHASH_COMP_FN(name, o_type) \ int name##_LHASH_COMP(const void *arg1, const void *arg2) { \ const o_type *a = arg1; \ const o_type *b = arg2; \ return name##_cmp(a,b); } #define LHASH_COMP_FN(name) name##_LHASH_COMP #define DECLARE_LHASH_DOALL_FN(name, o_type) \ void name##_LHASH_DOALL(void *); #define IMPLEMENT_LHASH_DOALL_FN(name, o_type) \ void name##_LHASH_DOALL(void *arg) { \ o_type *a = arg; \ name##_doall(a); } #define LHASH_DOALL_FN(name) name##_LHASH_DOALL #define DECLARE_LHASH_DOALL_ARG_FN(name, o_type, a_type) \ void name##_LHASH_DOALL_ARG(void *, void *); #define IMPLEMENT_LHASH_DOALL_ARG_FN(name, o_type, a_type) \ void name##_LHASH_DOALL_ARG(void *arg1, void *arg2) { \ o_type *a = arg1; \ a_type *b = arg2; \ name##_doall_arg(a, b); } #define LHASH_DOALL_ARG_FN(name) name##_LHASH_DOALL_ARG
/* Calculate the hash value of 'tohash' (implemented elsewhere) */ unsigned long STUFF_hash(const STUFF *tohash); /* Order 'arg1' and 'arg2' (implemented elsewhere) */ int stuff_cmp(const STUFF *arg1, const STUFF *arg2); /* Create type-safe wrapper functions for use in the LHASH internals */ static IMPLEMENT_LHASH_HASH_FN(stuff, STUFF); static IMPLEMENT_LHASH_COMP_FN(stuff, STUFF); /* ... */ int main(int argc, char *argv[]) { /* Create the new hash table using the hash/compare wrappers */ LHASH_OF(STUFF) *hashtable = lh_STUFF_new(LHASH_HASH_FN(STUFF_hash), LHASH_COMP_FN(STUFF_cmp)); /* ... */ }
/* Clean up resources belonging to 'a' (this is implemented elsewhere) */ void STUFF_cleanup_doall(STUFF *a); /* Implement a prototype-compatible wrapper for "STUFF_cleanup" */ IMPLEMENT_LHASH_DOALL_FN(STUFF_cleanup, STUFF) /* ... then later in the code ... */ /* So to run "STUFF_cleanup" against all items in a hash table ... */ lh_STUFF_doall(hashtable, LHASH_DOALL_FN(STUFF_cleanup)); /* Then the hash table itself can be deallocated */ lh_STUFF_free(hashtable);
/* Print item 'a' to 'output_bio' (this is implemented elsewhere) */ void STUFF_print_doall_arg(const STUFF *a, BIO *output_bio); /* Implement a prototype-compatible wrapper for "STUFF_print" */ static IMPLEMENT_LHASH_DOALL_ARG_FN(STUFF, const STUFF, BIO) /* ... then later in the code ... */ /* Print out the entire hashtable to a particular BIO */ lh_STUFF_doall_arg(hashtable, LHASH_DOALL_ARG_FN(STUFF_print), BIO, logging_bio);