summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/stack/stack.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/stack/stack.c')
-rw-r--r--src/lib/libcrypto/stack/stack.c85
1 files changed, 39 insertions, 46 deletions
diff --git a/src/lib/libcrypto/stack/stack.c b/src/lib/libcrypto/stack/stack.c
index 378bd7c796..76cf1a1168 100644
--- a/src/lib/libcrypto/stack/stack.c
+++ b/src/lib/libcrypto/stack/stack.c
@@ -77,10 +77,10 @@ const char STACK_version[]="Stack" OPENSSL_VERSION_PTEXT;
77 77
78#include <errno.h> 78#include <errno.h>
79 79
80int (*sk_set_cmp_func(STACK *sk, int (*c)(const char * const *,const char * const *))) 80int (*sk_set_cmp_func(_STACK *sk, int (*c)(const void *, const void *)))
81 (const char * const *, const char * const *) 81 (const void *, const void *)
82 { 82 {
83 int (*old)(const char * const *,const char * const *)=sk->comp; 83 int (*old)(const void *,const void *)=sk->comp;
84 84
85 if (sk->comp != c) 85 if (sk->comp != c)
86 sk->sorted=0; 86 sk->sorted=0;
@@ -89,9 +89,9 @@ int (*sk_set_cmp_func(STACK *sk, int (*c)(const char * const *,const char * cons
89 return old; 89 return old;
90 } 90 }
91 91
92STACK *sk_dup(STACK *sk) 92_STACK *sk_dup(_STACK *sk)
93 { 93 {
94 STACK *ret; 94 _STACK *ret;
95 char **s; 95 char **s;
96 96
97 if ((ret=sk_new(sk->comp)) == NULL) goto err; 97 if ((ret=sk_new(sk->comp)) == NULL) goto err;
@@ -112,19 +112,19 @@ err:
112 return(NULL); 112 return(NULL);
113 } 113 }
114 114
115STACK *sk_new_null(void) 115_STACK *sk_new_null(void)
116 { 116 {
117 return sk_new((int (*)(const char * const *, const char * const *))0); 117 return sk_new((int (*)(const void *, const void *))0);
118 } 118 }
119 119
120STACK *sk_new(int (*c)(const char * const *, const char * const *)) 120_STACK *sk_new(int (*c)(const void *, const void *))
121 { 121 {
122 STACK *ret; 122 _STACK *ret;
123 int i; 123 int i;
124 124
125 if ((ret=(STACK *)OPENSSL_malloc(sizeof(STACK))) == NULL) 125 if ((ret=OPENSSL_malloc(sizeof(_STACK))) == NULL)
126 goto err; 126 goto err;
127 if ((ret->data=(char **)OPENSSL_malloc(sizeof(char *)*MIN_NODES)) == NULL) 127 if ((ret->data=OPENSSL_malloc(sizeof(char *)*MIN_NODES)) == NULL)
128 goto err; 128 goto err;
129 for (i=0; i<MIN_NODES; i++) 129 for (i=0; i<MIN_NODES; i++)
130 ret->data[i]=NULL; 130 ret->data[i]=NULL;
@@ -139,14 +139,14 @@ err:
139 return(NULL); 139 return(NULL);
140 } 140 }
141 141
142int sk_insert(STACK *st, char *data, int loc) 142int sk_insert(_STACK *st, void *data, int loc)
143 { 143 {
144 char **s; 144 char **s;
145 145
146 if(st == NULL) return 0; 146 if(st == NULL) return 0;
147 if (st->num_alloc <= st->num+1) 147 if (st->num_alloc <= st->num+1)
148 { 148 {
149 s=(char **)OPENSSL_realloc((char *)st->data, 149 s=OPENSSL_realloc((char *)st->data,
150 (unsigned int)sizeof(char *)*st->num_alloc*2); 150 (unsigned int)sizeof(char *)*st->num_alloc*2);
151 if (s == NULL) 151 if (s == NULL)
152 return(0); 152 return(0);
@@ -160,14 +160,14 @@ int sk_insert(STACK *st, char *data, int loc)
160 int i; 160 int i;
161 char **f,**t; 161 char **f,**t;
162 162
163 f=(char **)st->data; 163 f=st->data;
164 t=(char **)&(st->data[1]); 164 t=&(st->data[1]);
165 for (i=st->num; i>=loc; i--) 165 for (i=st->num; i>=loc; i--)
166 t[i]=f[i]; 166 t[i]=f[i];
167 167
168#ifdef undef /* no memmove on sunos :-( */ 168#ifdef undef /* no memmove on sunos :-( */
169 memmove( (char *)&(st->data[loc+1]), 169 memmove(&(st->data[loc+1]),
170 (char *)&(st->data[loc]), 170 &(st->data[loc]),
171 sizeof(char *)*(st->num-loc)); 171 sizeof(char *)*(st->num-loc));
172#endif 172#endif
173 st->data[loc]=data; 173 st->data[loc]=data;
@@ -177,7 +177,7 @@ int sk_insert(STACK *st, char *data, int loc)
177 return(st->num); 177 return(st->num);
178 } 178 }
179 179
180char *sk_delete_ptr(STACK *st, char *p) 180void *sk_delete_ptr(_STACK *st, void *p)
181 { 181 {
182 int i; 182 int i;
183 183
@@ -187,7 +187,7 @@ char *sk_delete_ptr(STACK *st, char *p)
187 return(NULL); 187 return(NULL);
188 } 188 }
189 189
190char *sk_delete(STACK *st, int loc) 190void *sk_delete(_STACK *st, int loc)
191 { 191 {
192 char *ret; 192 char *ret;
193 int i,j; 193 int i,j;
@@ -210,11 +210,11 @@ char *sk_delete(STACK *st, int loc)
210 return(ret); 210 return(ret);
211 } 211 }
212 212
213static int internal_find(STACK *st, char *data, int ret_val_options) 213static int internal_find(_STACK *st, void *data, int ret_val_options)
214 { 214 {
215 char **r; 215 const void * const *r;
216 int i; 216 int i;
217 int (*comp_func)(const void *,const void *); 217
218 if(st == NULL) return -1; 218 if(st == NULL) return -1;
219 219
220 if (st->comp == NULL) 220 if (st->comp == NULL)
@@ -226,53 +226,46 @@ static int internal_find(STACK *st, char *data, int ret_val_options)
226 } 226 }
227 sk_sort(st); 227 sk_sort(st);
228 if (data == NULL) return(-1); 228 if (data == NULL) return(-1);
229 /* This (and the "qsort" below) are the two places in OpenSSL 229 r=OBJ_bsearch_ex_(&data,st->data,st->num,sizeof(void *),st->comp,
230 * where we need to convert from our standard (type **,type **) 230 ret_val_options);
231 * compare callback type to the (void *,void *) type required by
232 * bsearch. However, the "data" it is being called(back) with are
233 * not (type *) pointers, but the *pointers* to (type *) pointers,
234 * so we get our extra level of pointer dereferencing that way. */
235 comp_func=(int (*)(const void *,const void *))(st->comp);
236 r=(char **)OBJ_bsearch_ex((char *)&data,(char *)st->data,
237 st->num,sizeof(char *),comp_func,ret_val_options);
238 if (r == NULL) return(-1); 231 if (r == NULL) return(-1);
239 return((int)(r-st->data)); 232 return (int)((char **)r-st->data);
240 } 233 }
241 234
242int sk_find(STACK *st, char *data) 235int sk_find(_STACK *st, void *data)
243 { 236 {
244 return internal_find(st, data, OBJ_BSEARCH_FIRST_VALUE_ON_MATCH); 237 return internal_find(st, data, OBJ_BSEARCH_FIRST_VALUE_ON_MATCH);
245 } 238 }
246int sk_find_ex(STACK *st, char *data) 239int sk_find_ex(_STACK *st, void *data)
247 { 240 {
248 return internal_find(st, data, OBJ_BSEARCH_VALUE_ON_NOMATCH); 241 return internal_find(st, data, OBJ_BSEARCH_VALUE_ON_NOMATCH);
249 } 242 }
250 243
251int sk_push(STACK *st, char *data) 244int sk_push(_STACK *st, void *data)
252 { 245 {
253 return(sk_insert(st,data,st->num)); 246 return(sk_insert(st,data,st->num));
254 } 247 }
255 248
256int sk_unshift(STACK *st, char *data) 249int sk_unshift(_STACK *st, void *data)
257 { 250 {
258 return(sk_insert(st,data,0)); 251 return(sk_insert(st,data,0));
259 } 252 }
260 253
261char *sk_shift(STACK *st) 254void *sk_shift(_STACK *st)
262 { 255 {
263 if (st == NULL) return(NULL); 256 if (st == NULL) return(NULL);
264 if (st->num <= 0) return(NULL); 257 if (st->num <= 0) return(NULL);
265 return(sk_delete(st,0)); 258 return(sk_delete(st,0));
266 } 259 }
267 260
268char *sk_pop(STACK *st) 261void *sk_pop(_STACK *st)
269 { 262 {
270 if (st == NULL) return(NULL); 263 if (st == NULL) return(NULL);
271 if (st->num <= 0) return(NULL); 264 if (st->num <= 0) return(NULL);
272 return(sk_delete(st,st->num-1)); 265 return(sk_delete(st,st->num-1));
273 } 266 }
274 267
275void sk_zero(STACK *st) 268void sk_zero(_STACK *st)
276 { 269 {
277 if (st == NULL) return; 270 if (st == NULL) return;
278 if (st->num <= 0) return; 271 if (st->num <= 0) return;
@@ -280,7 +273,7 @@ void sk_zero(STACK *st)
280 st->num=0; 273 st->num=0;
281 } 274 }
282 275
283void sk_pop_free(STACK *st, void (*func)(void *)) 276void sk_pop_free(_STACK *st, void (*func)(void *))
284 { 277 {
285 int i; 278 int i;
286 279
@@ -291,32 +284,32 @@ void sk_pop_free(STACK *st, void (*func)(void *))
291 sk_free(st); 284 sk_free(st);
292 } 285 }
293 286
294void sk_free(STACK *st) 287void sk_free(_STACK *st)
295 { 288 {
296 if (st == NULL) return; 289 if (st == NULL) return;
297 if (st->data != NULL) OPENSSL_free(st->data); 290 if (st->data != NULL) OPENSSL_free(st->data);
298 OPENSSL_free(st); 291 OPENSSL_free(st);
299 } 292 }
300 293
301int sk_num(const STACK *st) 294int sk_num(const _STACK *st)
302{ 295{
303 if(st == NULL) return -1; 296 if(st == NULL) return -1;
304 return st->num; 297 return st->num;
305} 298}
306 299
307char *sk_value(const STACK *st, int i) 300void *sk_value(const _STACK *st, int i)
308{ 301{
309 if(!st || (i < 0) || (i >= st->num)) return NULL; 302 if(!st || (i < 0) || (i >= st->num)) return NULL;
310 return st->data[i]; 303 return st->data[i];
311} 304}
312 305
313char *sk_set(STACK *st, int i, char *value) 306void *sk_set(_STACK *st, int i, void *value)
314{ 307{
315 if(!st || (i < 0) || (i >= st->num)) return NULL; 308 if(!st || (i < 0) || (i >= st->num)) return NULL;
316 return (st->data[i] = value); 309 return (st->data[i] = value);
317} 310}
318 311
319void sk_sort(STACK *st) 312void sk_sort(_STACK *st)
320 { 313 {
321 if (st && !st->sorted) 314 if (st && !st->sorted)
322 { 315 {
@@ -333,7 +326,7 @@ void sk_sort(STACK *st)
333 } 326 }
334 } 327 }
335 328
336int sk_is_sorted(const STACK *st) 329int sk_is_sorted(const _STACK *st)
337 { 330 {
338 if (!st) 331 if (!st)
339 return 1; 332 return 1;