00001
00022 #ifndef ST_INCLUDED
00023 #define ST_INCLUDED
00024
00025
00026
00027
00028
00029 #ifdef __cplusplus
00030 extern "C" {
00031 #endif
00032
00033
00034
00035
00036
00037 #define ST_DEFAULT_MAX_DENSITY 5
00038 #define ST_DEFAULT_INIT_TABLE_SIZE 11
00039 #define ST_DEFAULT_GROW_FACTOR 2.0
00040 #define ST_DEFAULT_REORDER_FLAG 0
00041 #define ST_OUT_OF_MEM -10000
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 typedef struct st_table_entry st_table_entry;
00053 struct st_table_entry {
00054 char *key;
00055 char *record;
00056 st_table_entry *next;
00057 };
00058
00059 typedef struct st_table st_table;
00060 struct st_table {
00061 int (*compare)(const char *, const char *);
00062 int (*hash)(char *, int);
00063 int num_bins;
00064 int num_entries;
00065 int max_density;
00066 int reorder_flag;
00067 double grow_factor;
00068 st_table_entry **bins;
00069 };
00070
00071 typedef struct st_generator st_generator;
00072 struct st_generator {
00073 st_table *table;
00074 st_table_entry *entry;
00075 int index;
00076 };
00077
00078 enum st_retval {ST_CONTINUE, ST_STOP, ST_DELETE};
00079
00080 typedef enum st_retval (*ST_PFSR)(char *, char *, char *);
00081
00082 typedef int (*ST_PFICPCP)(const char *, const char *);
00083
00084 typedef int (*ST_PFICPI)(char *, int);
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00107 #define st_is_member(table,key) st_lookup(table,key,(char **) 0)
00108
00109
00121 #define st_count(table) ((table)->num_entries)
00122
00123
00155 #define st_foreach_item(table, gen, key, value) \
00156 for(gen=st_init_gen(table); st_gen(gen,key,value) || (st_free_gen(gen),0);)
00157
00158
00194 #define st_foreach_item_int(table, gen, key, value) \
00195 for(gen=st_init_gen(table); st_gen_int(gen,key,value) || (st_free_gen(gen),0);)
00196
00199
00200
00201
00202
00203 extern st_table *st_init_table_with_params (ST_PFICPCP, ST_PFICPI, int, int, double, int);
00204 extern st_table *st_init_table (ST_PFICPCP, ST_PFICPI);
00205 extern void st_free_table (st_table *);
00206 extern int st_lookup (st_table *, void *, void *);
00207 extern int st_lookup_int (st_table *, void *, int *);
00208 extern int st_insert (st_table *, void *, void *);
00209 extern int st_add_direct (st_table *, void *, void *);
00210 extern int st_find_or_add (st_table *, void *, void *);
00211 extern int st_find (st_table *, void *, void *);
00212 extern st_table *st_copy (st_table *);
00213 extern int st_delete (st_table *, void *, void *);
00214 extern int st_delete_int (st_table *, void *, int *);
00215 extern int st_foreach (st_table *, ST_PFSR, char *);
00216 extern int st_strhash (char *, int);
00217 extern int st_numhash (char *, int);
00218 extern int st_ptrhash (char *, int);
00219 extern int st_numcmp (const char *, const char *);
00220 extern int st_ptrcmp (const char *, const char *);
00221 extern st_generator *st_init_gen (st_table *);
00222 extern int st_gen (st_generator *, void *, void *);
00223 extern int st_gen_int (st_generator *, void *, int *);
00224 extern void st_free_gen (st_generator *);
00225
00228 #ifdef __cplusplus
00229 }
00230 #endif
00231
00232 #endif