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, 46 insertions, 39 deletions
diff --git a/src/lib/libcrypto/stack/stack.c b/src/lib/libcrypto/stack/stack.c
index 76cf1a1168..378bd7c796 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 void *, const void *))) 80int (*sk_set_cmp_func(STACK *sk, int (*c)(const char * const *,const char * const *)))
81 (const void *, const void *) 81 (const char * const *, const char * const *)
82 { 82 {
83 int (*old)(const void *,const void *)=sk->comp; 83 int (*old)(const char * const *,const char * const *)=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 void *, const void *)))
89 return old; 89 return old;
90 } 90 }
91 91
92_STACK *sk_dup(_STACK *sk) 92STACK *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
115_STACK *sk_new_null(void) 115STACK *sk_new_null(void)
116 { 116 {
117 return sk_new((int (*)(const void *, const void *))0); 117 return sk_new((int (*)(const char * const *, const char * const *))0);
118 } 118 }
119 119
120_STACK *sk_new(int (*c)(const void *, const void *)) 120STACK *sk_new(int (*c)(const char * const *, const char * const *))
121 { 121 {
122 _STACK *ret; 122 STACK *ret;
123 int i; 123 int i;
124 124
125 if ((ret=OPENSSL_malloc(sizeof(_STACK))) == NULL) 125 if ((ret=(STACK *)OPENSSL_malloc(sizeof(STACK))) == NULL)
126 goto err; 126 goto err;
127 if ((ret->data=OPENSSL_malloc(sizeof(char *)*MIN_NODES)) == NULL) 127 if ((ret->data=(char **)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, void *data, int loc) 142int sk_insert(STACK *st, char *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=OPENSSL_realloc((char *)st->data, 149 s=(char **)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, void *data, int loc)
160 int i; 160 int i;
161 char **f,**t; 161 char **f,**t;
162 162
163 f=st->data; 163 f=(char **)st->data;
164 t=&(st->data[1]); 164 t=(char **)&(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(&(st->data[loc+1]), 169 memmove( (char *)&(st->data[loc+1]),
170 &(st->data[loc]), 170 (char *)&(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, void *data, int loc)
177 return(st->num); 177 return(st->num);
178 } 178 }
179 179
180void *sk_delete_ptr(_STACK *st, void *p) 180char *sk_delete_ptr(STACK *st, char *p)
181 { 181 {
182 int i; 182 int i;
183 183
@@ -187,7 +187,7 @@ void *sk_delete_ptr(_STACK *st, void *p)
187 return(NULL); 187 return(NULL);
188 } 188 }
189 189
190void *sk_delete(_STACK *st, int loc) 190char *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 @@ void *sk_delete(_STACK *st, int loc)
210 return(ret); 210 return(ret);
211 } 211 }
212 212
213static int internal_find(_STACK *st, void *data, int ret_val_options) 213static int internal_find(STACK *st, char *data, int ret_val_options)
214 { 214 {
215 const void * const *r; 215 char **r;
216 int i; 216 int i;
217 217 int (*comp_func)(const void *,const void *);
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,46 +226,53 @@ static int internal_find(_STACK *st, void *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 r=OBJ_bsearch_ex_(&data,st->data,st->num,sizeof(void *),st->comp, 229 /* This (and the "qsort" below) are the two places in OpenSSL
230 ret_val_options); 230 * where we need to convert from our standard (type **,type **)
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);
231 if (r == NULL) return(-1); 238 if (r == NULL) return(-1);
232 return (int)((char **)r-st->data); 239 return((int)(r-st->data));
233 } 240 }
234 241
235int sk_find(_STACK *st, void *data) 242int sk_find(STACK *st, char *data)
236 { 243 {
237 return internal_find(st, data, OBJ_BSEARCH_FIRST_VALUE_ON_MATCH); 244 return internal_find(st, data, OBJ_BSEARCH_FIRST_VALUE_ON_MATCH);
238 } 245 }
239int sk_find_ex(_STACK *st, void *data) 246int sk_find_ex(STACK *st, char *data)
240 { 247 {
241 return internal_find(st, data, OBJ_BSEARCH_VALUE_ON_NOMATCH); 248 return internal_find(st, data, OBJ_BSEARCH_VALUE_ON_NOMATCH);
242 } 249 }
243 250
244int sk_push(_STACK *st, void *data) 251int sk_push(STACK *st, char *data)
245 { 252 {
246 return(sk_insert(st,data,st->num)); 253 return(sk_insert(st,data,st->num));
247 } 254 }
248 255
249int sk_unshift(_STACK *st, void *data) 256int sk_unshift(STACK *st, char *data)
250 { 257 {
251 return(sk_insert(st,data,0)); 258 return(sk_insert(st,data,0));
252 } 259 }
253 260
254void *sk_shift(_STACK *st) 261char *sk_shift(STACK *st)
255 { 262 {
256 if (st == NULL) return(NULL); 263 if (st == NULL) return(NULL);
257 if (st->num <= 0) return(NULL); 264 if (st->num <= 0) return(NULL);
258 return(sk_delete(st,0)); 265 return(sk_delete(st,0));
259 } 266 }
260 267
261void *sk_pop(_STACK *st) 268char *sk_pop(STACK *st)
262 { 269 {
263 if (st == NULL) return(NULL); 270 if (st == NULL) return(NULL);
264 if (st->num <= 0) return(NULL); 271 if (st->num <= 0) return(NULL);
265 return(sk_delete(st,st->num-1)); 272 return(sk_delete(st,st->num-1));
266 } 273 }
267 274
268void sk_zero(_STACK *st) 275void sk_zero(STACK *st)
269 { 276 {
270 if (st == NULL) return; 277 if (st == NULL) return;
271 if (st->num <= 0) return; 278 if (st->num <= 0) return;
@@ -273,7 +280,7 @@ void sk_zero(_STACK *st)
273 st->num=0; 280 st->num=0;
274 } 281 }
275 282
276void sk_pop_free(_STACK *st, void (*func)(void *)) 283void sk_pop_free(STACK *st, void (*func)(void *))
277 { 284 {
278 int i; 285 int i;
279 286
@@ -284,32 +291,32 @@ void sk_pop_free(_STACK *st, void (*func)(void *))
284 sk_free(st); 291 sk_free(st);
285 } 292 }
286 293
287void sk_free(_STACK *st) 294void sk_free(STACK *st)
288 { 295 {
289 if (st == NULL) return; 296 if (st == NULL) return;
290 if (st->data != NULL) OPENSSL_free(st->data); 297 if (st->data != NULL) OPENSSL_free(st->data);
291 OPENSSL_free(st); 298 OPENSSL_free(st);
292 } 299 }
293 300
294int sk_num(const _STACK *st) 301int sk_num(const STACK *st)
295{ 302{
296 if(st == NULL) return -1; 303 if(st == NULL) return -1;
297 return st->num; 304 return st->num;
298} 305}
299 306
300void *sk_value(const _STACK *st, int i) 307char *sk_value(const STACK *st, int i)
301{ 308{
302 if(!st || (i < 0) || (i >= st->num)) return NULL; 309 if(!st || (i < 0) || (i >= st->num)) return NULL;
303 return st->data[i]; 310 return st->data[i];
304} 311}
305 312
306void *sk_set(_STACK *st, int i, void *value) 313char *sk_set(STACK *st, int i, char *value)
307{ 314{
308 if(!st || (i < 0) || (i >= st->num)) return NULL; 315 if(!st || (i < 0) || (i >= st->num)) return NULL;
309 return (st->data[i] = value); 316 return (st->data[i] = value);
310} 317}
311 318
312void sk_sort(_STACK *st) 319void sk_sort(STACK *st)
313 { 320 {
314 if (st && !st->sorted) 321 if (st && !st->sorted)
315 { 322 {
@@ -326,7 +333,7 @@ void sk_sort(_STACK *st)
326 } 333 }
327 } 334 }
328 335
329int sk_is_sorted(const _STACK *st) 336int sk_is_sorted(const STACK *st)
330 { 337 {
331 if (!st) 338 if (!st)
332 return 1; 339 return 1;