]>
Commit | Line | Data |
---|---|---|
58964a49 | 1 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
d02b48c6 RE |
2 | * All rights reserved. |
3 | * | |
4 | * This package is an SSL implementation written | |
5 | * by Eric Young (eay@cryptsoft.com). | |
6 | * The implementation was written so as to conform with Netscapes SSL. | |
0f113f3e | 7 | * |
d02b48c6 RE |
8 | * This library is free for commercial and non-commercial use as long as |
9 | * the following conditions are aheared to. The following conditions | |
10 | * apply to all code found in this distribution, be it the RC4, RSA, | |
11 | * lhash, DES, etc., code; not just the SSL code. The SSL documentation | |
12 | * included with this distribution is covered by the same copyright terms | |
13 | * except that the holder is Tim Hudson (tjh@cryptsoft.com). | |
0f113f3e | 14 | * |
d02b48c6 RE |
15 | * Copyright remains Eric Young's, and as such any Copyright notices in |
16 | * the code are not to be removed. | |
17 | * If this package is used in a product, Eric Young should be given attribution | |
18 | * as the author of the parts of the library used. | |
19 | * This can be in the form of a textual message at program startup or | |
20 | * in documentation (online or textual) provided with the package. | |
0f113f3e | 21 | * |
d02b48c6 RE |
22 | * Redistribution and use in source and binary forms, with or without |
23 | * modification, are permitted provided that the following conditions | |
24 | * are met: | |
25 | * 1. Redistributions of source code must retain the copyright | |
26 | * notice, this list of conditions and the following disclaimer. | |
27 | * 2. Redistributions in binary form must reproduce the above copyright | |
28 | * notice, this list of conditions and the following disclaimer in the | |
29 | * documentation and/or other materials provided with the distribution. | |
30 | * 3. All advertising materials mentioning features or use of this software | |
31 | * must display the following acknowledgement: | |
32 | * "This product includes cryptographic software written by | |
33 | * Eric Young (eay@cryptsoft.com)" | |
34 | * The word 'cryptographic' can be left out if the rouines from the library | |
35 | * being used are not cryptographic related :-). | |
0f113f3e | 36 | * 4. If you include any Windows specific code (or a derivative thereof) from |
d02b48c6 RE |
37 | * the apps directory (application code) you must include an acknowledgement: |
38 | * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" | |
0f113f3e | 39 | * |
d02b48c6 RE |
40 | * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND |
41 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
42 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
43 | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | |
44 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
45 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
46 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
47 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
48 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
49 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
50 | * SUCH DAMAGE. | |
0f113f3e | 51 | * |
d02b48c6 RE |
52 | * The licence and distribution terms for any publically available version or |
53 | * derivative of this code cannot be changed. i.e. this code cannot simply be | |
54 | * copied and put under another distribution licence | |
55 | * [including the GNU Public Licence.] | |
56 | */ | |
57 | ||
0f113f3e MC |
58 | /* |
59 | * Header for dynamic hash table routines Author - Eric Young | |
d02b48c6 RE |
60 | */ |
61 | ||
62 | #ifndef HEADER_LHASH_H | |
0f113f3e | 63 | # define HEADER_LHASH_H |
d02b48c6 | 64 | |
0f113f3e | 65 | # include <openssl/e_os2.h> |
a00ae6c4 | 66 | # include <openssl/bio.h> |
ef33b970 | 67 | |
82271cee RL |
68 | #ifdef __cplusplus |
69 | extern "C" { | |
70 | #endif | |
71 | ||
0f113f3e MC |
72 | typedef struct lhash_node_st { |
73 | void *data; | |
74 | struct lhash_node_st *next; | |
0f113f3e | 75 | unsigned long hash; |
0f113f3e MC |
76 | } LHASH_NODE; |
77 | ||
78 | typedef int (*LHASH_COMP_FN_TYPE) (const void *, const void *); | |
79 | typedef unsigned long (*LHASH_HASH_FN_TYPE) (const void *); | |
80 | typedef void (*LHASH_DOALL_FN_TYPE) (void *); | |
81 | typedef void (*LHASH_DOALL_ARG_FN_TYPE) (void *, void *); | |
82 | ||
83 | /* | |
84 | * Macros for declaring and implementing type-safe wrappers for LHASH | |
85 | * callbacks. This way, callbacks can be provided to LHASH structures without | |
86 | * function pointer casting and the macro-defined callbacks provide | |
87 | * per-variable casting before deferring to the underlying type-specific | |
88 | * callbacks. NB: It is possible to place a "static" in front of both the | |
89 | * DECLARE and IMPLEMENT macros if the functions are strictly internal. | |
90 | */ | |
dfa46e50 GT |
91 | |
92 | /* First: "hash" functions */ | |
0f113f3e MC |
93 | # define DECLARE_LHASH_HASH_FN(name, o_type) \ |
94 | unsigned long name##_LHASH_HASH(const void *); | |
95 | # define IMPLEMENT_LHASH_HASH_FN(name, o_type) \ | |
96 | unsigned long name##_LHASH_HASH(const void *arg) { \ | |
97 | const o_type *a = arg; \ | |
98 | return name##_hash(a); } | |
99 | # define LHASH_HASH_FN(name) name##_LHASH_HASH | |
dfa46e50 GT |
100 | |
101 | /* Second: "compare" functions */ | |
0f113f3e MC |
102 | # define DECLARE_LHASH_COMP_FN(name, o_type) \ |
103 | int name##_LHASH_COMP(const void *, const void *); | |
104 | # define IMPLEMENT_LHASH_COMP_FN(name, o_type) \ | |
105 | int name##_LHASH_COMP(const void *arg1, const void *arg2) { \ | |
106 | const o_type *a = arg1; \ | |
107 | const o_type *b = arg2; \ | |
108 | return name##_cmp(a,b); } | |
109 | # define LHASH_COMP_FN(name) name##_LHASH_COMP | |
dfa46e50 | 110 | |
18602745 | 111 | /* Fourth: "doall_arg" functions */ |
0f113f3e MC |
112 | # define DECLARE_LHASH_DOALL_ARG_FN(name, o_type, a_type) \ |
113 | void name##_LHASH_DOALL_ARG(void *, void *); | |
114 | # define IMPLEMENT_LHASH_DOALL_ARG_FN(name, o_type, a_type) \ | |
115 | void name##_LHASH_DOALL_ARG(void *arg1, void *arg2) { \ | |
116 | o_type *a = arg1; \ | |
117 | a_type *b = arg2; \ | |
118 | name##_doall_arg(a, b); } | |
119 | # define LHASH_DOALL_ARG_FN(name) name##_LHASH_DOALL_ARG | |
120 | ||
121 | typedef struct lhash_st { | |
122 | LHASH_NODE **b; | |
123 | LHASH_COMP_FN_TYPE comp; | |
124 | LHASH_HASH_FN_TYPE hash; | |
125 | unsigned int num_nodes; | |
126 | unsigned int num_alloc_nodes; | |
127 | unsigned int p; | |
128 | unsigned int pmax; | |
129 | unsigned long up_load; /* load times 256 */ | |
130 | unsigned long down_load; /* load times 256 */ | |
131 | unsigned long num_items; | |
132 | unsigned long num_expands; | |
133 | unsigned long num_expand_reallocs; | |
134 | unsigned long num_contracts; | |
135 | unsigned long num_contract_reallocs; | |
136 | unsigned long num_hash_calls; | |
137 | unsigned long num_comp_calls; | |
138 | unsigned long num_insert; | |
139 | unsigned long num_replace; | |
140 | unsigned long num_delete; | |
141 | unsigned long num_no_delete; | |
142 | unsigned long num_retrieve; | |
143 | unsigned long num_retrieve_miss; | |
144 | unsigned long num_hash_comps; | |
145 | int error; | |
146 | } _LHASH; /* Do not use _LHASH directly, use LHASH_OF | |
147 | * and friends */ | |
148 | ||
149 | # define LH_LOAD_MULT 256 | |
150 | ||
151 | /* | |
152 | * Indicates a malloc() error in the last call, this is only bad in | |
153 | * lh_insert(). | |
154 | */ | |
e6b5c341 | 155 | int lh_error(_LHASH *lh); |
dfeab068 | 156 | |
3c1d6bbc BL |
157 | _LHASH *lh_new(LHASH_HASH_FN_TYPE h, LHASH_COMP_FN_TYPE c); |
158 | void lh_free(_LHASH *lh); | |
159 | void *lh_insert(_LHASH *lh, void *data); | |
160 | void *lh_delete(_LHASH *lh, const void *data); | |
161 | void *lh_retrieve(_LHASH *lh, const void *data); | |
162 | void lh_doall(_LHASH *lh, LHASH_DOALL_FN_TYPE func); | |
163 | void lh_doall_arg(_LHASH *lh, LHASH_DOALL_ARG_FN_TYPE func, void *arg); | |
e778802f | 164 | unsigned long lh_strhash(const char *c); |
3c1d6bbc | 165 | unsigned long lh_num_items(const _LHASH *lh); |
e6b5c341 DSH |
166 | unsigned long lh_get_down_load(const _LHASH *lh); |
167 | void lh_set_down_load(_LHASH *lh, unsigned long down_load); | |
d02b48c6 | 168 | |
474e469b RS |
169 | # ifndef OPENSSL_NO_STDIO |
170 | void lh_stats(const _LHASH *lh, FILE *fp); | |
171 | void lh_node_stats(const _LHASH *lh, FILE *fp); | |
31b446e2 | 172 | void lh_node_usage_stats(const _LHASH *lh, FILE *fp); |
474e469b | 173 | # endif |
3c1d6bbc BL |
174 | void lh_stats_bio(const _LHASH *lh, BIO *out); |
175 | void lh_node_stats_bio(const _LHASH *lh, BIO *out); | |
176 | void lh_node_usage_stats_bio(const _LHASH *lh, BIO *out); | |
3c1d6bbc | 177 | |
220903f9 | 178 | /* Type checking... */ |
3c1d6bbc | 179 | |
0f113f3e | 180 | # define LHASH_OF(type) struct lhash_st_##type |
3c1d6bbc | 181 | |
89d6aa10 | 182 | # define DEFINE_LHASH_OF(type) \ |
e6b5c341 | 183 | LHASH_OF(type) { int dummy; }; \ |
89d6aa10 | 184 | static ossl_inline LHASH_OF(type) * \ |
62d0577e DSH |
185 | lh_##type##_new(unsigned long (*hfn)(const type *), \ |
186 | int (*cfn)(const type *, const type *)) \ | |
187 | { \ | |
188 | return (LHASH_OF(type) *) \ | |
189 | lh_new((LHASH_HASH_FN_TYPE) hfn, (LHASH_COMP_FN_TYPE)cfn); \ | |
190 | } \ | |
89d6aa10 | 191 | static ossl_inline void lh_##type##_free(LHASH_OF(type) *lh) \ |
e6b5c341 DSH |
192 | { \ |
193 | lh_free((_LHASH *)lh); \ | |
194 | } \ | |
89d6aa10 | 195 | static ossl_inline type *lh_##type##_insert(LHASH_OF(type) *lh, type *d) \ |
e6b5c341 | 196 | { \ |
917c343e | 197 | return (type *)lh_insert((_LHASH *)lh, d); \ |
e6b5c341 | 198 | } \ |
89d6aa10 | 199 | static ossl_inline type *lh_##type##_delete(LHASH_OF(type) *lh, const type *d) \ |
e6b5c341 | 200 | { \ |
917c343e | 201 | return (type *)lh_delete((_LHASH *)lh, d); \ |
e6b5c341 | 202 | } \ |
89d6aa10 | 203 | static ossl_inline type *lh_##type##_retrieve(LHASH_OF(type) *lh, const type *d) \ |
e6b5c341 | 204 | { \ |
917c343e | 205 | return (type *)lh_retrieve((_LHASH *)lh, d); \ |
e6b5c341 | 206 | } \ |
89d6aa10 | 207 | static ossl_inline int lh_##type##_error(LHASH_OF(type) *lh) \ |
e6b5c341 DSH |
208 | { \ |
209 | return lh_error((_LHASH *)lh); \ | |
210 | } \ | |
89d6aa10 | 211 | static ossl_inline unsigned long lh_##type##_num_items(LHASH_OF(type) *lh) \ |
e6b5c341 DSH |
212 | { \ |
213 | return lh_num_items((_LHASH *)lh); \ | |
214 | } \ | |
89d6aa10 | 215 | static ossl_inline void lh_##type##_node_stats_bio(const LHASH_OF(type) *lh, BIO *out) \ |
e6b5c341 DSH |
216 | { \ |
217 | lh_node_stats_bio((_LHASH *)lh, out); \ | |
218 | } \ | |
89d6aa10 | 219 | static ossl_inline void lh_##type##_node_usage_stats_bio(const LHASH_OF(type) *lh, BIO *out) \ |
e6b5c341 DSH |
220 | { \ |
221 | lh_node_usage_stats_bio((_LHASH *)lh, out); \ | |
222 | } \ | |
89d6aa10 | 223 | static ossl_inline void lh_##type##_stats_bio(const LHASH_OF(type) *lh, BIO *out) \ |
e6b5c341 DSH |
224 | { \ |
225 | lh_stats_bio((_LHASH *)lh, out); \ | |
226 | } \ | |
89d6aa10 | 227 | static ossl_inline unsigned long lh_##type##_get_down_load(LHASH_OF(type) *lh) \ |
e6b5c341 DSH |
228 | { \ |
229 | return lh_get_down_load((_LHASH *)lh); \ | |
230 | } \ | |
89d6aa10 | 231 | static ossl_inline void lh_##type##_set_down_load(LHASH_OF(type) *lh, unsigned long dl) \ |
e6b5c341 DSH |
232 | { \ |
233 | lh_set_down_load((_LHASH *)lh, dl); \ | |
234 | } \ | |
89d6aa10 | 235 | static ossl_inline void lh_##type##_doall(LHASH_OF(type) *lh, \ |
63c75cd6 DSH |
236 | void (*doall)(type *)) \ |
237 | { \ | |
238 | lh_doall((_LHASH *)lh, (LHASH_DOALL_FN_TYPE)doall); \ | |
239 | } \ | |
e6b5c341 | 240 | LHASH_OF(type) |
3c1d6bbc | 241 | |
2a056de8 DSH |
242 | #define IMPLEMENT_LHASH_DOALL_ARG_CONST(type, argtype) \ |
243 | int_implement_lhash_doall(type, argtype, const type) | |
244 | ||
245 | #define IMPLEMENT_LHASH_DOALL_ARG(type, argtype) \ | |
246 | int_implement_lhash_doall(type, argtype, type) | |
247 | ||
248 | #define int_implement_lhash_doall(type, argtype, cbargtype) \ | |
89d6aa10 | 249 | static ossl_inline void \ |
2a056de8 DSH |
250 | lh_##type##_doall_##argtype(LHASH_OF(type) *lh, \ |
251 | void (*fn)(cbargtype *, argtype *), \ | |
252 | argtype *arg) \ | |
253 | { \ | |
254 | lh_doall_arg((_LHASH *)lh, (LHASH_DOALL_ARG_FN_TYPE)fn, (void *)arg); \ | |
255 | } \ | |
256 | LHASH_OF(type) | |
257 | ||
0f113f3e | 258 | # define CHECKED_LHASH_OF(type,lh) \ |
3c1d6bbc BL |
259 | ((_LHASH *)CHECKED_PTR_OF(LHASH_OF(type),lh)) |
260 | ||
220903f9 | 261 | /* Define wrapper functions. */ |
0f113f3e | 262 | # define LHM_lh_doall_arg(type, lh, fn, arg_type, arg) \ |
3c1d6bbc | 263 | lh_doall_arg(CHECKED_LHASH_OF(type, lh), fn, CHECKED_PTR_OF(arg_type, arg)) |
3c1d6bbc | 264 | |
89d6aa10 DSH |
265 | DEFINE_LHASH_OF(OPENSSL_STRING); |
266 | DEFINE_LHASH_OF(OPENSSL_CSTRING); | |
3c1d6bbc | 267 | |
d02b48c6 RE |
268 | #ifdef __cplusplus |
269 | } | |
270 | #endif | |
271 | ||
272 | #endif |