1 /* This is a public domain general purpose hash table package written by Peter Moore @ UCB. */ 2 3 /* @(#) st.h 5.1 89/12/14 */ 4 5 #ifndef ST_INCLUDED 6 #define ST_INCLUDED 7 8 #if SIZEOF_VOIDP == SIZEOF_LONG 9 typedef unsigned long st_data_t; 10 #elif SIZEOF_VOIDP == SIZEOF_LONG_LONG 11 typedef unsigned long long st_data_t; 12 #endif 13 14 #define ST_DATA_T_DEFINED 15 16 typedef struct st_table st_table; 17 18 struct st_hash_type { 19 int (*compare)(); 20 int (*hash)(); 21 }; 22 23 struct st_table { 24 struct st_hash_type *type; 25 int num_bins; 26 int num_entries; 27 struct st_table_entry **bins; 28 }; 29 30 #define st_is_member(table,key) st_lookup(table,key,(st_data_t *)0) 31 32 enum st_retval {ST_CONTINUE, ST_STOP, ST_DELETE, ST_CHECK}; 33 34 #ifndef _ 35 # define _(args) args 36 #endif 37 #ifndef ANYARGS 38 # ifdef __cplusplus 39 # define ANYARGS ... 40 # else 41 # define ANYARGS 42 # endif 43 #endif 44 45 st_table *st_init_table _((struct st_hash_type *)); 46 st_table *st_init_table_with_size _((struct st_hash_type *, int)); 47 st_table *st_init_numtable _((void)); 48 st_table *st_init_numtable_with_size _((int)); 49 st_table *st_init_strtable _((void)); 50 st_table *st_init_strtable_with_size _((int)); 51 int st_delete _((st_table *, st_data_t *, st_data_t *)); 52 int st_delete_safe _((st_table *, st_data_t *, st_data_t *, st_data_t)); 53 int st_insert _((st_table *, st_data_t, st_data_t)); 54 int st_lookup _((st_table *, st_data_t, st_data_t *)); 55 int st_foreach _((st_table *, int (*)(ANYARGS), st_data_t)); 56 void st_add_direct _((st_table *, st_data_t, st_data_t)); 57 void st_free_table _((st_table *)); 58 void st_cleanup_safe _((st_table *, st_data_t)); 59 st_table *st_copy _((st_table *)); 60 61 #define ST_NUMCMP ((int (*)()) 0) 62 #define ST_NUMHASH ((int (*)()) -2) 63 64 #define st_numcmp ST_NUMCMP 65 #define st_numhash ST_NUMHASH 66 67 #endif /* ST_INCLUDED */ 68