OLD | NEW |
1 /* crypto/lhash/lhash.h */ | 1 /* crypto/lhash/lhash.h */ |
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 * All rights reserved. | 3 * All rights reserved. |
4 * | 4 * |
5 * This package is an SSL implementation written | 5 * This package is an SSL implementation written |
6 * by Eric Young (eay@cryptsoft.com). | 6 * by Eric Young (eay@cryptsoft.com). |
7 * The implementation was written so as to conform with Netscapes SSL. | 7 * The implementation was written so as to conform with Netscapes SSL. |
8 * | 8 * |
9 * This library is free for commercial and non-commercial use as long as | 9 * This library is free for commercial and non-commercial use as long as |
10 * the following conditions are aheared to. The following conditions | 10 * the following conditions are aheared to. The following conditions |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 typedef void (*LHASH_DOALL_ARG_FN_TYPE)(void *, void *); | 91 typedef void (*LHASH_DOALL_ARG_FN_TYPE)(void *, void *); |
92 | 92 |
93 /* Macros for declaring and implementing type-safe wrappers for LHASH callbacks. | 93 /* Macros for declaring and implementing type-safe wrappers for LHASH callbacks. |
94 * This way, callbacks can be provided to LHASH structures without function | 94 * This way, callbacks can be provided to LHASH structures without function |
95 * pointer casting and the macro-defined callbacks provide per-variable casting | 95 * pointer casting and the macro-defined callbacks provide per-variable casting |
96 * before deferring to the underlying type-specific callbacks. NB: It is | 96 * before deferring to the underlying type-specific callbacks. NB: It is |
97 * possible to place a "static" in front of both the DECLARE and IMPLEMENT | 97 * possible to place a "static" in front of both the DECLARE and IMPLEMENT |
98 * macros if the functions are strictly internal. */ | 98 * macros if the functions are strictly internal. */ |
99 | 99 |
100 /* First: "hash" functions */ | 100 /* First: "hash" functions */ |
101 #define DECLARE_LHASH_HASH_FN(f_name,o_type) \ | 101 #define DECLARE_LHASH_HASH_FN(name, o_type) \ |
102 » unsigned long f_name##_LHASH_HASH(const void *); | 102 » unsigned long name##_LHASH_HASH(const void *); |
103 #define IMPLEMENT_LHASH_HASH_FN(f_name,o_type) \ | 103 #define IMPLEMENT_LHASH_HASH_FN(name, o_type) \ |
104 » unsigned long f_name##_LHASH_HASH(const void *arg) { \ | 104 » unsigned long name##_LHASH_HASH(const void *arg) { \ |
105 » » o_type a = (o_type)arg; \ | 105 » » const o_type *a = arg; \ |
106 » » return f_name(a); } | 106 » » return name##_hash(a); } |
107 #define LHASH_HASH_FN(f_name) f_name##_LHASH_HASH | 107 #define LHASH_HASH_FN(name) name##_LHASH_HASH |
108 | 108 |
109 /* Second: "compare" functions */ | 109 /* Second: "compare" functions */ |
110 #define DECLARE_LHASH_COMP_FN(f_name,o_type) \ | 110 #define DECLARE_LHASH_COMP_FN(name, o_type) \ |
111 » int f_name##_LHASH_COMP(const void *, const void *); | 111 » int name##_LHASH_COMP(const void *, const void *); |
112 #define IMPLEMENT_LHASH_COMP_FN(f_name,o_type) \ | 112 #define IMPLEMENT_LHASH_COMP_FN(name, o_type) \ |
113 » int f_name##_LHASH_COMP(const void *arg1, const void *arg2) { \ | 113 » int name##_LHASH_COMP(const void *arg1, const void *arg2) { \ |
114 » » o_type a = (o_type)arg1; \ | 114 » » const o_type *a = arg1;»» \ |
115 » » o_type b = (o_type)arg2; \ | 115 » » const o_type *b = arg2; \ |
116 » » return f_name(a,b); } | 116 » » return name##_cmp(a,b); } |
117 #define LHASH_COMP_FN(f_name) f_name##_LHASH_COMP | 117 #define LHASH_COMP_FN(name) name##_LHASH_COMP |
118 | 118 |
119 /* Third: "doall" functions */ | 119 /* Third: "doall" functions */ |
120 #define DECLARE_LHASH_DOALL_FN(f_name,o_type) \ | 120 #define DECLARE_LHASH_DOALL_FN(name, o_type) \ |
121 » void f_name##_LHASH_DOALL(void *); | 121 » void name##_LHASH_DOALL(void *); |
122 #define IMPLEMENT_LHASH_DOALL_FN(f_name,o_type) \ | 122 #define IMPLEMENT_LHASH_DOALL_FN(name, o_type) \ |
123 » void f_name##_LHASH_DOALL(void *arg) { \ | 123 » void name##_LHASH_DOALL(void *arg) { \ |
124 » » o_type a = (o_type)arg; \ | 124 » » o_type *a = arg; \ |
125 » » f_name(a); } | 125 » » name##_doall(a); } |
126 #define LHASH_DOALL_FN(f_name) f_name##_LHASH_DOALL | 126 #define LHASH_DOALL_FN(name) name##_LHASH_DOALL |
127 | 127 |
128 /* Fourth: "doall_arg" functions */ | 128 /* Fourth: "doall_arg" functions */ |
129 #define DECLARE_LHASH_DOALL_ARG_FN(f_name,o_type,a_type) \ | 129 #define DECLARE_LHASH_DOALL_ARG_FN(name, o_type, a_type) \ |
130 » void f_name##_LHASH_DOALL_ARG(void *, void *); | 130 » void name##_LHASH_DOALL_ARG(void *, void *); |
131 #define IMPLEMENT_LHASH_DOALL_ARG_FN(f_name,o_type,a_type) \ | 131 #define IMPLEMENT_LHASH_DOALL_ARG_FN(name, o_type, a_type) \ |
132 » void f_name##_LHASH_DOALL_ARG(void *arg1, void *arg2) { \ | 132 » void name##_LHASH_DOALL_ARG(void *arg1, void *arg2) { \ |
133 » » o_type a = (o_type)arg1; \ | 133 » » o_type *a = arg1; \ |
134 » » a_type b = (a_type)arg2; \ | 134 » » a_type *b = arg2; \ |
135 » » f_name(a,b); } | 135 » » name##_doall_arg(a, b); } |
136 #define LHASH_DOALL_ARG_FN(f_name) f_name##_LHASH_DOALL_ARG | 136 #define LHASH_DOALL_ARG_FN(name) name##_LHASH_DOALL_ARG |
137 | 137 |
138 typedef struct lhash_st | 138 typedef struct lhash_st |
139 { | 139 { |
140 LHASH_NODE **b; | 140 LHASH_NODE **b; |
141 LHASH_COMP_FN_TYPE comp; | 141 LHASH_COMP_FN_TYPE comp; |
142 LHASH_HASH_FN_TYPE hash; | 142 LHASH_HASH_FN_TYPE hash; |
143 unsigned int num_nodes; | 143 unsigned int num_nodes; |
144 unsigned int num_alloc_nodes; | 144 unsigned int num_alloc_nodes; |
145 unsigned int p; | 145 unsigned int p; |
146 unsigned int pmax; | 146 unsigned int pmax; |
147 unsigned long up_load; /* load times 256 */ | 147 unsigned long up_load; /* load times 256 */ |
148 unsigned long down_load; /* load times 256 */ | 148 unsigned long down_load; /* load times 256 */ |
149 unsigned long num_items; | 149 unsigned long num_items; |
150 | 150 |
151 unsigned long num_expands; | 151 unsigned long num_expands; |
152 unsigned long num_expand_reallocs; | 152 unsigned long num_expand_reallocs; |
153 unsigned long num_contracts; | 153 unsigned long num_contracts; |
154 unsigned long num_contract_reallocs; | 154 unsigned long num_contract_reallocs; |
155 unsigned long num_hash_calls; | 155 unsigned long num_hash_calls; |
156 unsigned long num_comp_calls; | 156 unsigned long num_comp_calls; |
157 unsigned long num_insert; | 157 unsigned long num_insert; |
158 unsigned long num_replace; | 158 unsigned long num_replace; |
159 unsigned long num_delete; | 159 unsigned long num_delete; |
160 unsigned long num_no_delete; | 160 unsigned long num_no_delete; |
161 unsigned long num_retrieve; | 161 unsigned long num_retrieve; |
162 unsigned long num_retrieve_miss; | 162 unsigned long num_retrieve_miss; |
163 unsigned long num_hash_comps; | 163 unsigned long num_hash_comps; |
164 | 164 |
165 int error; | 165 int error; |
166 » } LHASH; | 166 » } _LHASH;» /* Do not use _LHASH directly, use LHASH_OF |
| 167 » » » * and friends */ |
167 | 168 |
168 #define LH_LOAD_MULT 256 | 169 #define LH_LOAD_MULT 256 |
169 | 170 |
170 /* Indicates a malloc() error in the last call, this is only bad | 171 /* Indicates a malloc() error in the last call, this is only bad |
171 * in lh_insert(). */ | 172 * in lh_insert(). */ |
172 #define lh_error(lh) ((lh)->error) | 173 #define lh_error(lh) ((lh)->error) |
173 | 174 |
174 LHASH *lh_new(LHASH_HASH_FN_TYPE h, LHASH_COMP_FN_TYPE c); | 175 _LHASH *lh_new(LHASH_HASH_FN_TYPE h, LHASH_COMP_FN_TYPE c); |
175 void lh_free(LHASH *lh); | 176 void lh_free(_LHASH *lh); |
176 void *lh_insert(LHASH *lh, void *data); | 177 void *lh_insert(_LHASH *lh, void *data); |
177 void *lh_delete(LHASH *lh, const void *data); | 178 void *lh_delete(_LHASH *lh, const void *data); |
178 void *lh_retrieve(LHASH *lh, const void *data); | 179 void *lh_retrieve(_LHASH *lh, const void *data); |
179 void lh_doall(LHASH *lh, LHASH_DOALL_FN_TYPE func); | 180 void lh_doall(_LHASH *lh, LHASH_DOALL_FN_TYPE func); |
180 void lh_doall_arg(LHASH *lh, LHASH_DOALL_ARG_FN_TYPE func, void *arg); | 181 void lh_doall_arg(_LHASH *lh, LHASH_DOALL_ARG_FN_TYPE func, void *arg); |
181 unsigned long lh_strhash(const char *c); | 182 unsigned long lh_strhash(const char *c); |
182 unsigned long lh_num_items(const LHASH *lh); | 183 unsigned long lh_num_items(const _LHASH *lh); |
183 | 184 |
184 #ifndef OPENSSL_NO_FP_API | 185 #ifndef OPENSSL_NO_FP_API |
185 void lh_stats(const LHASH *lh, FILE *out); | 186 void lh_stats(const _LHASH *lh, FILE *out); |
186 void lh_node_stats(const LHASH *lh, FILE *out); | 187 void lh_node_stats(const _LHASH *lh, FILE *out); |
187 void lh_node_usage_stats(const LHASH *lh, FILE *out); | 188 void lh_node_usage_stats(const _LHASH *lh, FILE *out); |
188 #endif | 189 #endif |
189 | 190 |
190 #ifndef OPENSSL_NO_BIO | 191 #ifndef OPENSSL_NO_BIO |
191 void lh_stats_bio(const LHASH *lh, BIO *out); | 192 void lh_stats_bio(const _LHASH *lh, BIO *out); |
192 void lh_node_stats_bio(const LHASH *lh, BIO *out); | 193 void lh_node_stats_bio(const _LHASH *lh, BIO *out); |
193 void lh_node_usage_stats_bio(const LHASH *lh, BIO *out); | 194 void lh_node_usage_stats_bio(const _LHASH *lh, BIO *out); |
194 #endif | 195 #endif |
| 196 |
| 197 /* Type checking... */ |
| 198 |
| 199 #define LHASH_OF(type) struct lhash_st_##type |
| 200 |
| 201 #define DECLARE_LHASH_OF(type) LHASH_OF(type) { int dummy; } |
| 202 |
| 203 #define CHECKED_LHASH_OF(type,lh) \ |
| 204 ((_LHASH *)CHECKED_PTR_OF(LHASH_OF(type),lh)) |
| 205 |
| 206 /* Define wrapper functions. */ |
| 207 #define LHM_lh_new(type, name) \ |
| 208 ((LHASH_OF(type) *)lh_new(LHASH_HASH_FN(name), LHASH_COMP_FN(name))) |
| 209 #define LHM_lh_error(type, lh) \ |
| 210 lh_error(CHECKED_LHASH_OF(type,lh)) |
| 211 #define LHM_lh_insert(type, lh, inst) \ |
| 212 ((type *)lh_insert(CHECKED_LHASH_OF(type, lh), \ |
| 213 CHECKED_PTR_OF(type, inst))) |
| 214 #define LHM_lh_retrieve(type, lh, inst) \ |
| 215 ((type *)lh_retrieve(CHECKED_LHASH_OF(type, lh), \ |
| 216 CHECKED_PTR_OF(type, inst))) |
| 217 #define LHM_lh_delete(type, lh, inst) \ |
| 218 ((type *)lh_delete(CHECKED_LHASH_OF(type, lh), \ |
| 219 CHECKED_PTR_OF(type, inst))) |
| 220 #define LHM_lh_doall(type, lh,fn) lh_doall(CHECKED_LHASH_OF(type, lh), fn) |
| 221 #define LHM_lh_doall_arg(type, lh, fn, arg_type, arg) \ |
| 222 lh_doall_arg(CHECKED_LHASH_OF(type, lh), fn, CHECKED_PTR_OF(arg_type, arg)) |
| 223 #define LHM_lh_num_items(type, lh) lh_num_items(CHECKED_LHASH_OF(type, lh)) |
| 224 #define LHM_lh_down_load(type, lh) (CHECKED_LHASH_OF(type, lh)->down_load) |
| 225 #define LHM_lh_node_stats_bio(type, lh, out) \ |
| 226 lh_node_stats_bio(CHECKED_LHASH_OF(type, lh), out) |
| 227 #define LHM_lh_node_usage_stats_bio(type, lh, out) \ |
| 228 lh_node_usage_stats_bio(CHECKED_LHASH_OF(type, lh), out) |
| 229 #define LHM_lh_stats_bio(type, lh, out) \ |
| 230 lh_stats_bio(CHECKED_LHASH_OF(type, lh), out) |
| 231 #define LHM_lh_free(type, lh) lh_free(CHECKED_LHASH_OF(type, lh)) |
| 232 |
| 233 DECLARE_LHASH_OF(OPENSSL_STRING); |
| 234 DECLARE_LHASH_OF(OPENSSL_CSTRING); |
| 235 |
195 #ifdef __cplusplus | 236 #ifdef __cplusplus |
196 } | 237 } |
197 #endif | 238 #endif |
198 | 239 |
199 #endif | 240 #endif |
200 | 241 |
OLD | NEW |