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