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