00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef ST_INCLUDED
00015 #define ST_INCLUDED
00016
00017 typedef struct st_table_entry st_table_entry;
00018 struct st_table_entry {
00019 char *key;
00020 char *record;
00021 st_table_entry *next;
00022 };
00023
00024 typedef struct st_table st_table;
00025 struct st_table {
00026 int (*compare)(const char *, const char *);
00027 int (*hash)(char *, int);
00028 int num_bins;
00029 int num_entries;
00030 int max_density;
00031 int reorder_flag;
00032 double grow_factor;
00033 st_table_entry **bins;
00034 };
00035
00036 typedef struct st_generator st_generator;
00037 struct st_generator {
00038 st_table *table;
00039 st_table_entry *entry;
00040 int index;
00041 };
00042
00043 #define st_is_member(table,key) st_lookup(table,key,(char **) 0)
00044 #define st_count(table) ((table)->num_entries)
00045
00046 enum st_retval {ST_CONTINUE, ST_STOP, ST_DELETE};
00047
00048 typedef enum st_retval (*ST_PFSR)(char *, char *, char *);
00049 typedef int (*ST_PFICPCP)(const char *, const char *);
00050 typedef int (*ST_PFICPI)(char *, int);
00051
00052 EXTERN st_table *st_init_table_with_params ARGS((ST_PFICPCP, ST_PFICPI, int, int, double, int));
00053 EXTERN st_table *st_init_table ARGS((ST_PFICPCP, ST_PFICPI));
00054 EXTERN void st_free_table ARGS((st_table *));
00055 EXTERN int st_lookup ARGS((st_table *, char *, char **));
00056 EXTERN int st_lookup_int ARGS((st_table *, char *, int *));
00057 EXTERN int st_insert ARGS((st_table *, char *, char *));
00058 EXTERN int st_add_direct ARGS((st_table *, char *, char *));
00059 EXTERN int st_find_or_add ARGS((st_table *, char *, char ***));
00060 EXTERN int st_find ARGS((st_table *, char *, char ***));
00061 EXTERN st_table *st_copy ARGS((st_table *));
00062 EXTERN int st_delete ARGS((st_table *, char **, char **));
00063 EXTERN int st_delete_int ARGS((st_table *, int *, char **));
00064 EXTERN int st_foreach ARGS((st_table *, ST_PFSR, char *));
00065 EXTERN int st_strhash ARGS((char *, int));
00066 EXTERN int st_numhash ARGS((char *, int));
00067 EXTERN int st_ptrhash ARGS((char *, int));
00068 EXTERN int st_numcmp ARGS((const char *, const char *));
00069 EXTERN int st_ptrcmp ARGS((const char *, const char *));
00070 EXTERN st_generator *st_init_gen ARGS((st_table *));
00071 EXTERN int st_gen ARGS((st_generator *, char **, char **));
00072 EXTERN int st_gen_int ARGS((st_generator *, char **, long *));
00073 EXTERN void st_free_gen ARGS((st_generator *));
00074
00075
00076 #define ST_DEFAULT_MAX_DENSITY 5
00077 #define ST_DEFAULT_INIT_TABLE_SIZE 11
00078 #define ST_DEFAULT_GROW_FACTOR 2.0
00079 #define ST_DEFAULT_REORDER_FLAG 0
00080
00081 #define st_foreach_item(table, gen, key, value) \
00082 for(gen=st_init_gen(table); st_gen(gen,key,value) || (st_free_gen(gen),0);)
00083
00084 #define st_foreach_item_int(table, gen, key, value) \
00085 for(gen=st_init_gen(table); st_gen_int(gen,key,value) || (st_free_gen(gen),0);)
00086
00087 #define ST_OUT_OF_MEM -10000
00088
00089 #endif