1 /*
2  * Revision Control Information
3  *
4  * /projects/hsis/CVS/utilities/st/st.h,v
5  * serdar
6  * 1.1
7  * 1993/07/29 01:00:21
8  *
9  */
10 /* LINTLIBRARY */
11 
12 /* /projects/hsis/CVS/utilities/st/st.h,v 1.1 1993/07/29 01:00:21 serdar Exp */
13 
14 #ifndef ABC__misc__st__stmm_h
15 #define ABC__misc__st__stmm_h
16 
17 #include "misc/util/abc_global.h"
18 
19 ABC_NAMESPACE_HEADER_START
20 
21 
22 /* These are potential duplicates. */
23 #ifndef EXTERN
24 #   ifdef __cplusplus
25 #       ifdef ABC_NAMESPACE
26 #           define EXTERN extern
27 #       else
28 #           define EXTERN extern "C"
29 #       endif
30 #   else
31 #       define EXTERN extern
32 #   endif
33 #endif
34 
35 #ifndef ARGS
36 #define ARGS(protos) protos
37 #endif
38 
39 typedef int (*stmm_compare_func_type)(const char*, const char*);
40 typedef int (*stmm_hash_func_type)(const char*, int);
41 
42 typedef struct stmm_table_entry stmm_table_entry;
43 typedef struct stmm_table stmm_table;
44 typedef struct stmm_generator stmm_generator;
45 
46 struct stmm_table_entry
47 {
48     char *key;
49     char *record;
50     stmm_table_entry *next;
51 };
52 
53 struct stmm_table
54 {
55     stmm_compare_func_type compare;
56     stmm_hash_func_type hash;
57     int num_bins;
58     int num_entries;
59     int max_density;
60     int reorder_flag;
61     double grow_factor;
62     stmm_table_entry **bins;
63     // memory manager to improve runtime and prevent memory fragmentation
64     // added by alanmi - January 16, 2003
65     void * pMemMan;
66 };
67 
68 struct stmm_generator
69 {
70     stmm_table *table;
71     stmm_table_entry *entry;
72     int index;
73 };
74 
75 #define stmm_is_member(table,key) stmm_lookup(table,key,(char **) 0)
76 #define stmm_count(table) ((table)->num_entries)
77 
78 enum stmm_retval
79 { STMM_CONTINUE, STMM_STOP, STMM_DELETE };
80 
81 typedef enum stmm_retval (*STMM_PFSR) (char *, char *, char *);
82 
83 EXTERN stmm_table *stmm_init_table_with_params
84 ARGS ((stmm_compare_func_type compare, stmm_hash_func_type hash, int size, int density, double grow_factor, int reorder_flag));
85 EXTERN stmm_table *stmm_init_table ARGS ((stmm_compare_func_type, stmm_hash_func_type));
86 EXTERN void stmm_free_table ARGS ((stmm_table *));
87 EXTERN int stmm_lookup ARGS ((stmm_table *, char *, char **));
88 EXTERN int stmm_lookup_int ARGS ((stmm_table *, char *, int *));
89 EXTERN int stmm_insert ARGS ((stmm_table *, char *, char *));
90 EXTERN int stmm_add_direct ARGS ((stmm_table *, char *, char *));
91 EXTERN int stmm_find_or_add ARGS ((stmm_table *, char *, char ***));
92 EXTERN int stmm_find ARGS ((stmm_table *, char *, char ***));
93 EXTERN stmm_table *stmm_copy ARGS ((stmm_table *));
94 EXTERN int stmm_delete ARGS ((stmm_table *, char **, char **));
95 EXTERN int stmm_delete_int ARGS ((stmm_table *, long *, char **));
96 EXTERN int stmm_foreach ARGS ((stmm_table *, STMM_PFSR, char *));
97 EXTERN int stmm_strhash ARGS ((const char *, int));
98 EXTERN int stmm_numhash ARGS ((const char *, int));
99 EXTERN int stmm_ptrhash ARGS ((const char *, int));
100 EXTERN int stmm_numcmp ARGS ((const char *, const char *));
101 EXTERN int stmm_ptrcmp ARGS ((const char *, const char *));
102 EXTERN stmm_generator *stmm_init_gen ARGS ((stmm_table *));
103 EXTERN int stmm_gen ARGS ((stmm_generator *, char **, char **));
104 EXTERN int stmm_gen_int ARGS ((stmm_generator *, char **, long *));
105 EXTERN void stmm_free_gen ARGS ((stmm_generator *));
106 // additional functions
107 EXTERN void stmm_clean ARGS ((stmm_table *));
108 
109 
110 
111 #define STMM_DEFAULT_MAX_DENSITY        5
112 #define STMM_DEFAULT_INIT_TABLE_SIZE   11
113 #define STMM_DEFAULT_GROW_FACTOR      2.0
114 #define STMM_DEFAULT_REORDER_FLAG       0
115 
116 // added by Zhihong: no need for memory allocation
117 #define stmm_foreach_item2(tb, /* stmm_generator */gen, key, value) \
118     for(gen.table=(tb), gen.entry=NULL, gen.index=0; \
119         stmm_gen(&(gen),key,value);)
120 
121 #define stmm_foreach_item(table, gen, key, value) \
122     for(gen=stmm_init_gen(table); stmm_gen(gen,key,value) || (stmm_free_gen(gen),0);)
123 
124 #define stmm_foreach_item_int(table, gen, key, value) \
125     for(gen=stmm_init_gen(table); stmm_gen_int(gen,key,value) || (stmm_free_gen(gen),0);)
126 
127 #define STMM_OUT_OF_MEM -10000
128 
129 /*
130 
131 // consider adding these other other similar definitions
132 #define st__table       stmm_table
133 #define st__insert      stmm_insert
134 #define st__delete      stmm_delete
135 #define st__lookup      stmm_lookup
136 #define st__init_table  stmm_init_table
137 #define st__free_table  stmm_free_table
138 
139 */
140 
141 
142 
143 ABC_NAMESPACE_HEADER_END
144 
145 
146 
147 #endif /* STMM_INCLUDED */
148