104 lines
2.0 KiB
C
Executable File
104 lines
2.0 KiB
C
Executable File
#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);*/
|
|
}
|
|
|