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.c108
1 files changed, 56 insertions, 52 deletions
diff --git a/src/lib/libcrypto/stack/stack.c b/src/lib/libcrypto/stack/stack.c
index 610ccbb756..8b96713884 100644
--- a/src/lib/libcrypto/stack/stack.c
+++ b/src/lib/libcrypto/stack/stack.c
@@ -67,32 +67,28 @@
67 */ 67 */
68#include <stdio.h> 68#include <stdio.h>
69#include "cryptlib.h" 69#include "cryptlib.h"
70#include "stack.h" 70#include <openssl/stack.h>
71 71
72#undef MIN_NODES 72#undef MIN_NODES
73#define MIN_NODES 4 73#define MIN_NODES 4
74 74
75char *STACK_version="STACK part of SSLeay 0.9.0b 29-Jun-1998"; 75const char *STACK_version="Stack" OPENSSL_VERSION_PTEXT;
76 76
77#ifndef NOPROTO
78#define FP_ICC (int (*)(const void *,const void *)) 77#define FP_ICC (int (*)(const void *,const void *))
79#else
80#define FP_ICC
81#endif
82
83#include <errno.h> 78#include <errno.h>
84 79
85void sk_set_cmp_func(sk,c) 80int (*sk_set_cmp_func(STACK *sk, int (*c)()))(void)
86STACK *sk;
87int (*c)();
88 { 81 {
82 int (*old)()=sk->comp;
83
89 if (sk->comp != c) 84 if (sk->comp != c)
90 sk->sorted=0; 85 sk->sorted=0;
91 sk->comp=c; 86 sk->comp=c;
87
88 return old;
92 } 89 }
93 90
94STACK *sk_dup(sk) 91STACK *sk_dup(STACK *sk)
95STACK *sk;
96 { 92 {
97 STACK *ret; 93 STACK *ret;
98 char **s; 94 char **s;
@@ -113,8 +109,7 @@ err:
113 return(NULL); 109 return(NULL);
114 } 110 }
115 111
116STACK *sk_new(c) 112STACK *sk_new(int (*c)())
117int (*c)();
118 { 113 {
119 STACK *ret; 114 STACK *ret;
120 int i; 115 int i;
@@ -136,13 +131,11 @@ err0:
136 return(NULL); 131 return(NULL);
137 } 132 }
138 133
139int sk_insert(st,data,loc) 134int sk_insert(STACK *st, char *data, int loc)
140STACK *st;
141char *data;
142int loc;
143 { 135 {
144 char **s; 136 char **s;
145 137
138 if(st == NULL) return 0;
146 if (st->num_alloc <= st->num+1) 139 if (st->num_alloc <= st->num+1)
147 { 140 {
148 s=(char **)Realloc((char *)st->data, 141 s=(char **)Realloc((char *)st->data,
@@ -161,7 +154,7 @@ int loc;
161 154
162 f=(char **)st->data; 155 f=(char **)st->data;
163 t=(char **)&(st->data[1]); 156 t=(char **)&(st->data[1]);
164 for (i=st->num; i>loc; i--) 157 for (i=st->num; i>=loc; i--)
165 t[i]=f[i]; 158 t[i]=f[i];
166 159
167#ifdef undef /* no memmove on sunos :-( */ 160#ifdef undef /* no memmove on sunos :-( */
@@ -176,9 +169,7 @@ int loc;
176 return(st->num); 169 return(st->num);
177 } 170 }
178 171
179char *sk_delete_ptr(st,p) 172char *sk_delete_ptr(STACK *st, char *p)
180STACK *st;
181char *p;
182 { 173 {
183 int i; 174 int i;
184 175
@@ -188,14 +179,13 @@ char *p;
188 return(NULL); 179 return(NULL);
189 } 180 }
190 181
191char *sk_delete(st,loc) 182char *sk_delete(STACK *st, int loc)
192STACK *st;
193int loc;
194 { 183 {
195 char *ret; 184 char *ret;
196 int i,j; 185 int i,j;
197 186
198 if ((st->num == 0) || (loc < 0) || (loc >= st->num)) return(NULL); 187 if ((st == NULL) || (st->num == 0) || (loc < 0)
188 || (loc >= st->num)) return(NULL);
199 189
200 ret=st->data[loc]; 190 ret=st->data[loc];
201 if (loc != st->num-1) 191 if (loc != st->num-1)
@@ -213,13 +203,12 @@ int loc;
213 return(ret); 203 return(ret);
214 } 204 }
215 205
216int sk_find(st,data) 206int sk_find(STACK *st, char *data)
217STACK *st;
218char *data;
219 { 207 {
220 char **r; 208 char **r;
221 int i; 209 int i;
222 int (*comp_func)(); 210 int (*comp_func)();
211 if(st == NULL) return -1;
223 212
224 if (st->comp == NULL) 213 if (st->comp == NULL)
225 { 214 {
@@ -228,13 +217,9 @@ char *data;
228 return(i); 217 return(i);
229 return(-1); 218 return(-1);
230 } 219 }
231 comp_func=(int (*)())st->comp; 220 sk_sort(st);
232 if (!st->sorted)
233 {
234 qsort((char *)st->data,st->num,sizeof(char *),FP_ICC comp_func);
235 st->sorted=1;
236 }
237 if (data == NULL) return(-1); 221 if (data == NULL) return(-1);
222 comp_func=(int (*)())st->comp;
238 r=(char **)bsearch(&data,(char *)st->data, 223 r=(char **)bsearch(&data,(char *)st->data,
239 st->num,sizeof(char *),FP_ICC comp_func); 224 st->num,sizeof(char *),FP_ICC comp_func);
240 if (r == NULL) return(-1); 225 if (r == NULL) return(-1);
@@ -245,38 +230,31 @@ char *data;
245 return(i); 230 return(i);
246 } 231 }
247 232
248int sk_push(st,data) 233int sk_push(STACK *st, char *data)
249STACK *st;
250char *data;
251 { 234 {
252 return(sk_insert(st,data,st->num)); 235 return(sk_insert(st,data,st->num));
253 } 236 }
254 237
255int sk_unshift(st,data) 238int sk_unshift(STACK *st, char *data)
256STACK *st;
257char *data;
258 { 239 {
259 return(sk_insert(st,data,0)); 240 return(sk_insert(st,data,0));
260 } 241 }
261 242
262char *sk_shift(st) 243char *sk_shift(STACK *st)
263STACK *st;
264 { 244 {
265 if (st == NULL) return(NULL); 245 if (st == NULL) return(NULL);
266 if (st->num <= 0) return(NULL); 246 if (st->num <= 0) return(NULL);
267 return(sk_delete(st,0)); 247 return(sk_delete(st,0));
268 } 248 }
269 249
270char *sk_pop(st) 250char *sk_pop(STACK *st)
271STACK *st;
272 { 251 {
273 if (st == NULL) return(NULL); 252 if (st == NULL) return(NULL);
274 if (st->num <= 0) return(NULL); 253 if (st->num <= 0) return(NULL);
275 return(sk_delete(st,st->num-1)); 254 return(sk_delete(st,st->num-1));
276 } 255 }
277 256
278void sk_zero(st) 257void sk_zero(STACK *st)
279STACK *st;
280 { 258 {
281 if (st == NULL) return; 259 if (st == NULL) return;
282 if (st->num <= 0) return; 260 if (st->num <= 0) return;
@@ -284,9 +262,7 @@ STACK *st;
284 st->num=0; 262 st->num=0;
285 } 263 }
286 264
287void sk_pop_free(st,func) 265void sk_pop_free(STACK *st, void (*func)())
288STACK *st;
289void (*func)();
290 { 266 {
291 int i; 267 int i;
292 268
@@ -297,11 +273,39 @@ void (*func)();
297 sk_free(st); 273 sk_free(st);
298 } 274 }
299 275
300void sk_free(st) 276void sk_free(STACK *st)
301STACK *st;
302 { 277 {
303 if (st == NULL) return; 278 if (st == NULL) return;
304 if (st->data != NULL) Free((char *)st->data); 279 if (st->data != NULL) Free((char *)st->data);
305 Free((char *)st); 280 Free((char *)st);
306 } 281 }
307 282
283int sk_num(STACK *st)
284{
285 if(st == NULL) return -1;
286 return st->num;
287}
288
289char *sk_value(STACK *st, int i)
290{
291 if(st == NULL) return NULL;
292 return st->data[i];
293}
294
295char *sk_set(STACK *st, int i, char *value)
296{
297 if(st == NULL) return NULL;
298 return (st->data[i] = value);
299}
300
301void sk_sort(STACK *st)
302 {
303 if (!st->sorted)
304 {
305 int (*comp_func)();
306
307 comp_func=(int (*)())st->comp;
308 qsort(st->data,st->num,sizeof(char *),FP_ICC comp_func);
309 st->sorted=1;
310 }
311 }