2 ** _ __ ___ ___ __| | ___ ___| | mod_ssl
3 ** | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL
4 ** | | | | | | (_) | (_| | \__ \__ \ | www.modssl.org
5 ** |_| |_| |_|\___/ \__,_|___|___/___/_| ftp.modssl.org
8 ** Additional Data Structures
11 /* ====================================================================
12 * Copyright (c) 1998-2001 Ralf S. Engelschall. All rights reserved.
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions
18 * 1. Redistributions of source code must retain the above copyright
19 * notice, this list of conditions and the following disclaimer.
21 * 2. Redistributions in binary form must reproduce the above copyright
22 * notice, this list of conditions and the following
23 * disclaimer in the documentation and/or other materials
24 * provided with the distribution.
26 * 3. All advertising materials mentioning features or use of this
27 * software must display the following acknowledgment:
28 * "This product includes software developed by
29 * Ralf S. Engelschall <rse@engelschall.com> for use in the
30 * mod_ssl project (http://www.modssl.org/)."
32 * 4. The names "mod_ssl" must not be used to endorse or promote
33 * products derived from this software without prior written
34 * permission. For written permission, please contact
35 * rse@engelschall.com.
37 * 5. Products derived from this software may not be called "mod_ssl"
38 * nor may "mod_ssl" appear in their names without prior
39 * written permission of Ralf S. Engelschall.
41 * 6. Redistributions of any form whatsoever must retain the following
43 * "This product includes software developed by
44 * Ralf S. Engelschall <rse@engelschall.com> for use in the
45 * mod_ssl project (http://www.modssl.org/)."
47 * THIS SOFTWARE IS PROVIDED BY RALF S. ENGELSCHALL ``AS IS'' AND ANY
48 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
49 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
50 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RALF S. ENGELSCHALL OR
51 * HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
52 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
53 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
54 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
55 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
56 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
57 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
58 * OF THE POSSIBILITY OF SUCH DAMAGE.
59 * ====================================================================
61 /* ``If you can't do it in
62 C or assembly language,
63 it isn't worth doing.''
68 /* _________________________________________________________________
70 ** Data Structures which store _arbitrary_ data
71 ** _________________________________________________________________
74 ssl_ds_array *ssl_ds_array_make(pool *p, int size)
78 if ((a = (ssl_ds_array *)ap_palloc(p, sizeof(ssl_ds_array))) == NULL)
81 if ((a->pSubPool = ap_make_sub_pool(p)) == NULL)
83 a->aData = ap_make_array(a->pSubPool, 2, size);
87 BOOL ssl_ds_array_isempty(ssl_ds_array *a)
89 if (a == NULL || a->aData == NULL || a->aData->nelts == 0)
95 void *ssl_ds_array_push(ssl_ds_array *a)
99 d = (void *)ap_push_array(a->aData);
103 void *ssl_ds_array_get(ssl_ds_array *a, int n)
107 if (n < 0 || n >= a->aData->nelts)
109 d = (void *)(a->aData->elts+(a->aData->elt_size*n));
113 void ssl_ds_array_wipeout(ssl_ds_array *a)
115 if (a->aData->nelts > 0)
116 memset(a->aData->elts, 0, a->aData->elt_size*a->aData->nelts);
120 void ssl_ds_array_kill(ssl_ds_array *a)
122 ap_destroy_pool(a->pSubPool);
128 ssl_ds_table *ssl_ds_table_make(pool *p, int size)
132 if ((t = (ssl_ds_table *)ap_palloc(p, sizeof(ssl_ds_table))) == NULL)
135 if ((t->pSubPool = ap_make_sub_pool(p)) == NULL)
137 t->aKey = ap_make_array(t->pSubPool, 2, MAX_STRING_LEN);
138 t->aData = ap_make_array(t->pSubPool, 2, size);
142 BOOL ssl_ds_table_isempty(ssl_ds_table *t)
144 if (t == NULL || t->aKey == NULL || t->aKey->nelts == 0)
150 void *ssl_ds_table_push(ssl_ds_table *t, char *key)
155 k = (char *)ap_push_array(t->aKey);
156 d = (void *)ap_push_array(t->aData);
157 ap_cpystrn(k, key, t->aKey->elt_size);
161 void *ssl_ds_table_get(ssl_ds_table *t, char *key)
168 for (i = 0; i < t->aKey->nelts; i++) {
169 k = (t->aKey->elts+(t->aKey->elt_size*i));
171 d = (void *)(t->aData->elts+(t->aData->elt_size*i));
178 void ssl_ds_table_wipeout(ssl_ds_table *t)
180 if (t->aKey->nelts > 0) {
181 memset(t->aKey->elts, 0, t->aKey->elt_size*t->aKey->nelts);
182 memset(t->aData->elts, 0, t->aData->elt_size*t->aData->nelts);
187 void ssl_ds_table_kill(ssl_ds_table *t)
189 ap_destroy_pool(t->pSubPool);