11
根据数据地址来查找它在堆栈中的位置 。 当堆栈设置了比较函数时 , 它首先对
堆栈进行排序 , 然后通过二分法进行查找 。 如果堆栈没有设置比较函数 , 它只是简
单的比较数据地址来查找 .
3 ) sk_sort
本函数对堆栈数据排序 。 它首先根据 sorted 来判断是否已经排序 , 如果未排序
则调用了标准 C 函数 qsort 进行快速排序。
4 ) sk_pop_free
本函数用于释放堆栈内存放的数据以及堆栈本身 , 它需要一个由用户指定的针
对具体数据的释放函数。如果用户仅调用 sk_free 函数,则只会释放堆栈本身所用
的内存,而不会释放数据内存。
3.4
3.4
3.4
3.4 定义用户自己的堆栈函数
定义用户自己的堆栈函数
定义用户自己的堆栈函数
定义用户自己的堆栈函数
用户直接调用最底层的堆栈操作函数是一个麻烦的事情,对此 openssl 提供了用宏
来帮助用户实现接口 。 用户可以参考 safestack.h 来定义自己的上层堆栈操作函数 , 举例
如下, safestack.h 定义了如下关于 GENERAL_NAME 数据结构的堆栈操作:
#define sk_GENERAL_NAME_new(st) SKM_sk_new(GENERAL_NAME, (st))
#define sk_GENERAL_NAME_new_null() SKM_sk_new_null(GENERAL_NAME)
#define sk_GENERAL_NAME_free(st) SKM_sk_free(GENERAL_NAME, (st))
#define sk_GENERAL_NAME_num(st) SKM_sk_num(GENERAL_NAME, (st))
#define sk_GENERAL_NAME_value(st, i) SKM_sk_value(GENERAL_NAME, (st), (i))
#define sk_GENERAL_NAME_set(st, i, val) SKM_sk_set(GENERAL_NAME, (st), (i), (val))
#define sk_GENERAL_NAME_zero(st) SKM_sk_zero(GENERAL_NAME, (st))
#define sk_GENERAL_NAME_push(st, val) SKM_sk_push(GENERAL_NAME, (st), (val))
#define sk_GENERAL_NAME_unshift(st, val) SKM_sk_unshift(GENERAL_NAME, (st), (val))
#define sk_GENERAL_NAME_find(st, val) SKM_sk_find(GENERAL_NAME, (st), (val))
#define sk_GENERAL_NAME_find_ex(st, val) SKM_sk_find_ex(GENERAL_NAME, (st),
(val))
#define sk_GENERAL_NAME_delete(st, i) SKM_sk_delete(GENERAL_NAME, (st), (i))
#define sk_GENERAL_NAME_delete_ptr(st, ptr) SKM_sk_delete_ptr(GENERAL_NAME, (st),
(ptr))
#define sk_GENERAL_NAME_insert(st, val, i) SKM_sk_insert(GENERAL_NAME, (st), (val),
(i))
#define sk_GENERAL_NAME_set_cmp_func(st, cmp)
SKM_sk_set_cmp_func(GENERAL_NAME, (st), (cmp))
#define sk_GENERAL_NAME_dup(st) SKM_sk_dup(GENERAL_NAME, st)
#define sk_GENERAL_NAME_pop_free(st, free_func) SKM_sk_pop_free(GENERAL_NAME,
(st), (free_func))
#define sk_GENERAL_NAME_shift(st) SKM_sk_shift(GENERAL_NAME, (st))
#define sk_GENERAL_NAME_pop(st) SKM_sk_pop(GENERAL_NAME, (st))
#define sk_GENERAL_NAME_sort(st) SKM_sk_sort(GENERAL_NAME, (st))
#define sk_GENERAL_NAME_is_sorted(st) SKM_sk_is_sorted(GENERAL_NAME, (st))
当用户想对 GENERAL_NAME 数据进行堆栈操作时,调用上面由宏定义的函数即可
,
即直观又方便。比如用户想设置堆栈数据的比较函数和对堆栈排序时,他分别调用: