#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; idata[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; inum; i++) if (st->data[i] != NULL) func(st->data[i]); sk_free(st);*/ }