sdk-hwV1.3/lichee/brandy-2.0/u-boot-2018/lib/openssl/asn1/stk.c

103 lines
2.0 KiB
C

#include "stack.h"
#include "cryptlib.h"
#include "objects.h"
#undef MIN_NODES
#define MIN_NODES 4
/////////////////////sk_new_null//////////////////////////////////ok
STACK *sk_new_null(void)
{
return sk_new((int (*)(const char *const *, const char *const *))0);
}
/////////////////sk_new//////////////////////////////////ok
STACK *sk_new(int (*c)(const char *const *, const char *const *))
{
STACK *ret;
int i;
if ((ret = (STACK *)OPENSSL_malloc(sizeof(STACK))) == NULL)
goto err;
if ((ret->data = (char **)OPENSSL_malloc(sizeof(char *) * MIN_NODES)) ==
NULL)
goto err;
for (i = 0; i < MIN_NODES; i++)
ret->data[i] = NULL;
ret->comp = c;
ret->num_alloc = MIN_NODES;
ret->num = 0;
ret->sorted = 0;
return (ret);
err:
if (ret)
OPENSSL_free(ret);
return (NULL);
}
///////////////sk_insert////////////////////////////ok
int sk_insert(STACK *st, char *data, int loc)
{
char **s;
if (st == NULL)
return 0;
if (st->num_alloc <= st->num + 1) {
s = (char **)OPENSSL_realloc((char *)st->data,
(unsigned int)sizeof(char *) *
st->num_alloc * 2);
if (s == NULL)
return (0);
st->data = s;
st->num_alloc *= 2;
}
if ((loc >= (int)st->num) || (loc < 0))
st->data[st->num] = data;
else {
int i;
char **f, **t;
f = (char **)st->data;
t = (char **)&(st->data[1]);
for (i = st->num; i >= loc; i--)
t[i] = f[i];
st->data[loc] = data;
}
st->num++;
st->sorted = 0;
return (st->num);
}
////////////sk_push//////////////////////////ok
int sk_push(STACK *st, char *data)
{
return (sk_insert(st, data, st->num));
}
//////////////sk_free////////////////////////ok
void sk_free(STACK *st)
{
if (st == NULL)
return;
if (st->data != NULL)
OPENSSL_free(st->data);
OPENSSL_free(st);
}
/////////////sk_pop_free////////////////////////ok
void sk_pop_free(STACK *st, void (*func)(void *))
{
/*int i;
if (st == NULL) return;
for (i=0; i<st->num; i++)
if (st->data[i] != NULL)
func(st->data[i]);
sk_free(st);*/
}