Lines Matching refs:st

173 static int sk_reserve(OPENSSL_STACK *st, int n, int exact)
179 if (n > max_nodes - st->num) {
185 num_alloc = st->num + n;
189 /* If |st->data| allocation was postponed */
190 if (st->data == NULL) {
192 * At this point, |st->num_alloc| and |st->num| are 0;
195 if ((st->data = OPENSSL_zalloc(sizeof(void *) * num_alloc)) == NULL) {
199 st->num_alloc = num_alloc;
204 if (num_alloc <= st->num_alloc)
206 num_alloc = compute_growth(num_alloc, st->num_alloc);
211 } else if (num_alloc == st->num_alloc) {
215 tmpdata = OPENSSL_realloc((void *)st->data, sizeof(void *) * num_alloc);
221 st->data = tmpdata;
222 st->num_alloc = num_alloc;
228 OPENSSL_STACK *st = OPENSSL_zalloc(sizeof(OPENSSL_STACK));
230 if (st == NULL) {
235 st->comp = c;
238 return st;
240 if (!sk_reserve(st, n, 1)) {
241 OPENSSL_sk_free(st);
245 return st;
248 int OPENSSL_sk_reserve(OPENSSL_STACK *st, int n)
250 if (st == NULL) {
257 return sk_reserve(st, n, 1);
260 int OPENSSL_sk_insert(OPENSSL_STACK *st, const void *data, int loc)
262 if (st == NULL) {
266 if (st->num == max_nodes) {
271 if (!sk_reserve(st, 1, 0))
274 if ((loc >= st->num) || (loc < 0)) {
275 st->data[st->num] = data;
277 memmove(&st->data[loc + 1], &st->data[loc],
278 sizeof(st->data[0]) * (st->num - loc));
279 st->data[loc] = data;
281 st->num++;
282 st->sorted = 0;
283 return st->num;
286 static ossl_inline void *internal_delete(OPENSSL_STACK *st, int loc)
288 const void *ret = st->data[loc];
290 if (loc != st->num - 1)
291 memmove(&st->data[loc], &st->data[loc + 1],
292 sizeof(st->data[0]) * (st->num - loc - 1));
293 st->num--;
298 void *OPENSSL_sk_delete_ptr(OPENSSL_STACK *st, const void *p)
302 if (st == NULL)
305 for (i = 0; i < st->num; i++)
306 if (st->data[i] == p)
307 return internal_delete(st, i);
311 void *OPENSSL_sk_delete(OPENSSL_STACK *st, int loc)
313 if (st == NULL || loc < 0 || loc >= st->num)
316 return internal_delete(st, loc);
319 static int internal_find(OPENSSL_STACK *st, const void *data,
325 if (st == NULL || st->num == 0)
328 if (st->comp == NULL) {
329 for (i = 0; i < st->num; i++)
330 if (st->data[i] == data) {
340 if (!st->sorted) {
341 if (st->num > 1)
342 qsort(st->data, st->num, sizeof(void *), st->comp);
343 st->sorted = 1; /* empty or single-element stack is considered sorted */
349 r = ossl_bsearch(&data, st->data, st->num, sizeof(void *), st->comp,
357 while (p < st->data + st->num) {
358 if (st->comp(&data, p) != 0)
366 return r == NULL ? -1 : (int)((const void **)r - st->data);
369 int OPENSSL_sk_find(OPENSSL_STACK *st, const void *data)
371 return internal_find(st, data, OSSL_BSEARCH_FIRST_VALUE_ON_MATCH, NULL);
374 int OPENSSL_sk_find_ex(OPENSSL_STACK *st, const void *data)
376 return internal_find(st, data, OSSL_BSEARCH_VALUE_ON_NOMATCH, NULL);
379 int OPENSSL_sk_find_all(OPENSSL_STACK *st, const void *data, int *pnum)
381 return internal_find(st, data, OSSL_BSEARCH_FIRST_VALUE_ON_MATCH, pnum);
384 int OPENSSL_sk_push(OPENSSL_STACK *st, const void *data)
386 if (st == NULL)
388 return OPENSSL_sk_insert(st, data, st->num);
391 int OPENSSL_sk_unshift(OPENSSL_STACK *st, const void *data)
393 return OPENSSL_sk_insert(st, data, 0);
396 void *OPENSSL_sk_shift(OPENSSL_STACK *st)
398 if (st == NULL || st->num == 0)
400 return internal_delete(st, 0);
403 void *OPENSSL_sk_pop(OPENSSL_STACK *st)
405 if (st == NULL || st->num == 0)
407 return internal_delete(st, st->num - 1);
410 void OPENSSL_sk_zero(OPENSSL_STACK *st)
412 if (st == NULL || st->num == 0)
414 memset(st->data, 0, sizeof(*st->data) * st->num);
415 st->num = 0;
418 void OPENSSL_sk_pop_free(OPENSSL_STACK *st, OPENSSL_sk_freefunc func)
422 if (st == NULL)
424 for (i = 0; i < st->num; i++)
425 if (st->data[i] != NULL)
426 func((char *)st->data[i]);
427 OPENSSL_sk_free(st);
430 void OPENSSL_sk_free(OPENSSL_STACK *st)
432 if (st == NULL)
434 OPENSSL_free(st->data);
435 OPENSSL_free(st);
438 int OPENSSL_sk_num(const OPENSSL_STACK *st)
440 return st == NULL ? -1 : st->num;
443 void *OPENSSL_sk_value(const OPENSSL_STACK *st, int i)
445 if (st == NULL || i < 0 || i >= st->num)
447 return (void *)st->data[i];
450 void *OPENSSL_sk_set(OPENSSL_STACK *st, int i, const void *data)
452 if (st == NULL) {
456 if (i < 0 || i >= st->num) {
461 st->data[i] = data;
462 st->sorted = 0;
463 return (void *)st->data[i];
466 void OPENSSL_sk_sort(OPENSSL_STACK *st)
468 if (st != NULL && !st->sorted && st->comp != NULL) {
469 if (st->num > 1)
470 qsort(st->data, st->num, sizeof(void *), st->comp);
471 st->sorted = 1; /* empty or single-element stack is considered sorted */
475 int OPENSSL_sk_is_sorted(const OPENSSL_STACK *st)
477 return st == NULL ? 1 : st->sorted;