| 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 |