2021SC@SDUSC
3 堆栈
man DEFINE_STACK_OF
https://www.openssl.org/docs/man1.1.1/man3/sk_TYPE_num.html
https://blog.csdn.net/as3luyuan123/article/details/17081581
3.1 openssl堆栈
堆栈是一种先进后出的数据结构。 openssl大量采用堆栈来存放数据。
它实现了一个通用的堆栈,可以方便的存储任意数据。
它实现了许多基本的堆栈操作,主要有:
构建新堆栈(sk_new_null,sk_new)、
堆栈拷贝(sk_dup)、
插入数据(sk_insert)、 删除数据(sk_delete)、
查找数据(sk_find,sk_find_ex)、
入栈(sk_push)、 出栈(sk_pop)、
获取堆栈元素个数(sk_num)、 获取堆栈值(sk_value)、
设置堆栈值(sk_set)和堆栈排序(sk_sort)。
// 通用堆栈
//创建一个空栈,参数可指定排序方法,因为openssl不知道里面存放的是什么类型的数据,
// 所以排序方法需要用户实现,当参数为NULL,同下方法
OPENSSL_STACK *OPENSSL_sk_new(OPENSSL_sk_compfunc cmp);
//创建一个空栈,
OPENSSL_STACK *OPENSSL_sk_new_null(void);
//释放栈,并不释放栈内元素内存
void OPENSSL_sk_free(OPENSSL_STACK *);
//删除并释放所有栈内元素,最后释放栈,可以指定回调函数,栈每次释放一个元素都会回调该回调函数
void OPENSSL_sk_pop_free(OPENSSL_STACK *st, void (*func) (void *));
//栈深copy,
OPENSSL_STACK *OPENSSL_sk_deep_copy( const OPENSSL_STACK *,
OPENSSL_sk_copyfunc c,
OPENSSL_sk_freefunc f);
//在栈指定位置插入元素,成功返回该栈所有元素的个数
int OPENSSL_sk_insert(OPENSSL_STACK *sk, const void *data, int where);
//删除栈指定位置元素,成功返回删除的该元素
void *OPENSSL_sk_delete(OPENSSL_STACK *st, int loc);
//删除栈指定元素,成功返回删除的该元素
void *OPENSSL_sk_delete_ptr(OPENSSL_STACK *st, const void *p);
//在栈中查找指元素,成功返回该元素位置
int OPENSSL_sk_find(OPENSSL_STACK *st, const void *data);
//同上,
int OPENSSL_sk_find_ex(OPENSSL_STACK *st, const void *data);
//在栈顶添加一个元素,成功返回栈元素总数
int OPENSSL_sk_push(OPENSSL_STACK *st, const void *data);
//在栈位置0次添加一个元素,类似 insert(st,0);
int OPENSSL_sk_unshift(OPENSSL_STACK *st, const void *data);
//移出栈位置0处的元素,类似pop
void *OPENSSL_sk_shift(OPENSSL_STACK *st);
//在栈顶移出一个元素,并释放该元素内存,
void *OPENSSL_sk_pop(OPEN