1e71b7053SJung-uk Kim=pod 2e71b7053SJung-uk Kim 3e71b7053SJung-uk Kim=head1 NAME 4e71b7053SJung-uk Kim 5e71b7053SJung-uk KimDEFINE_STACK_OF, DEFINE_STACK_OF_CONST, DEFINE_SPECIAL_STACK_OF, 6e71b7053SJung-uk KimDEFINE_SPECIAL_STACK_OF_CONST, 7e71b7053SJung-uk Kimsk_TYPE_num, sk_TYPE_value, sk_TYPE_new, sk_TYPE_new_null, 8e71b7053SJung-uk Kimsk_TYPE_reserve, sk_TYPE_free, sk_TYPE_zero, sk_TYPE_delete, 9e71b7053SJung-uk Kimsk_TYPE_delete_ptr, sk_TYPE_push, sk_TYPE_unshift, sk_TYPE_pop, 10e71b7053SJung-uk Kimsk_TYPE_shift, sk_TYPE_pop_free, sk_TYPE_insert, sk_TYPE_set, 11*b077aed3SPierre Proncherysk_TYPE_find, sk_TYPE_find_ex, sk_TYPE_find_all, sk_TYPE_sort, 12*b077aed3SPierre Proncherysk_TYPE_is_sorted, sk_TYPE_dup, sk_TYPE_deep_copy, sk_TYPE_set_cmp_func, 13*b077aed3SPierre Proncherysk_TYPE_new_reserve, 14*b077aed3SPierre ProncheryOPENSSL_sk_deep_copy, OPENSSL_sk_delete, OPENSSL_sk_delete_ptr, 15*b077aed3SPierre ProncheryOPENSSL_sk_dup, OPENSSL_sk_find, OPENSSL_sk_find_ex, OPENSSL_sk_find_all, 16*b077aed3SPierre ProncheryOPENSSL_sk_free, OPENSSL_sk_insert, OPENSSL_sk_is_sorted, OPENSSL_sk_new, 17*b077aed3SPierre ProncheryOPENSSL_sk_new_null, OPENSSL_sk_new_reserve, OPENSSL_sk_num, OPENSSL_sk_pop, 18*b077aed3SPierre ProncheryOPENSSL_sk_pop_free, OPENSSL_sk_push, OPENSSL_sk_reserve, OPENSSL_sk_set, 19*b077aed3SPierre ProncheryOPENSSL_sk_set_cmp_func, OPENSSL_sk_shift, OPENSSL_sk_sort, 20*b077aed3SPierre ProncheryOPENSSL_sk_unshift, OPENSSL_sk_value, OPENSSL_sk_zero 21e71b7053SJung-uk Kim- stack container 22e71b7053SJung-uk Kim 23e71b7053SJung-uk Kim=head1 SYNOPSIS 24e71b7053SJung-uk Kim 25*b077aed3SPierre Pronchery=for openssl generic 26e71b7053SJung-uk Kim 27e71b7053SJung-uk Kim #include <openssl/safestack.h> 28e71b7053SJung-uk Kim 29e71b7053SJung-uk Kim STACK_OF(TYPE) 30e71b7053SJung-uk Kim DEFINE_STACK_OF(TYPE) 31e71b7053SJung-uk Kim DEFINE_STACK_OF_CONST(TYPE) 32e71b7053SJung-uk Kim DEFINE_SPECIAL_STACK_OF(FUNCTYPE, TYPE) 33e71b7053SJung-uk Kim DEFINE_SPECIAL_STACK_OF_CONST(FUNCTYPE, TYPE) 34e71b7053SJung-uk Kim 35e71b7053SJung-uk Kim typedef int (*sk_TYPE_compfunc)(const TYPE *const *a, const TYPE *const *b); 36e71b7053SJung-uk Kim typedef TYPE * (*sk_TYPE_copyfunc)(const TYPE *a); 37e71b7053SJung-uk Kim typedef void (*sk_TYPE_freefunc)(TYPE *a); 38e71b7053SJung-uk Kim 39e71b7053SJung-uk Kim int sk_TYPE_num(const STACK_OF(TYPE) *sk); 40e71b7053SJung-uk Kim TYPE *sk_TYPE_value(const STACK_OF(TYPE) *sk, int idx); 41e71b7053SJung-uk Kim STACK_OF(TYPE) *sk_TYPE_new(sk_TYPE_compfunc compare); 42e71b7053SJung-uk Kim STACK_OF(TYPE) *sk_TYPE_new_null(void); 43e71b7053SJung-uk Kim int sk_TYPE_reserve(STACK_OF(TYPE) *sk, int n); 44e71b7053SJung-uk Kim void sk_TYPE_free(const STACK_OF(TYPE) *sk); 45e71b7053SJung-uk Kim void sk_TYPE_zero(const STACK_OF(TYPE) *sk); 46e71b7053SJung-uk Kim TYPE *sk_TYPE_delete(STACK_OF(TYPE) *sk, int i); 47e71b7053SJung-uk Kim TYPE *sk_TYPE_delete_ptr(STACK_OF(TYPE) *sk, TYPE *ptr); 48e71b7053SJung-uk Kim int sk_TYPE_push(STACK_OF(TYPE) *sk, const TYPE *ptr); 49e71b7053SJung-uk Kim int sk_TYPE_unshift(STACK_OF(TYPE) *sk, const TYPE *ptr); 50e71b7053SJung-uk Kim TYPE *sk_TYPE_pop(STACK_OF(TYPE) *sk); 51e71b7053SJung-uk Kim TYPE *sk_TYPE_shift(STACK_OF(TYPE) *sk); 52e71b7053SJung-uk Kim void sk_TYPE_pop_free(STACK_OF(TYPE) *sk, sk_TYPE_freefunc freefunc); 53e71b7053SJung-uk Kim int sk_TYPE_insert(STACK_OF(TYPE) *sk, TYPE *ptr, int idx); 54e71b7053SJung-uk Kim TYPE *sk_TYPE_set(STACK_OF(TYPE) *sk, int idx, const TYPE *ptr); 55e71b7053SJung-uk Kim int sk_TYPE_find(STACK_OF(TYPE) *sk, TYPE *ptr); 56e71b7053SJung-uk Kim int sk_TYPE_find_ex(STACK_OF(TYPE) *sk, TYPE *ptr); 57*b077aed3SPierre Pronchery int sk_TYPE_find_all(STACK_OF(TYPE) *sk, TYPE *ptr, int *pnum); 58e71b7053SJung-uk Kim void sk_TYPE_sort(const STACK_OF(TYPE) *sk); 59e71b7053SJung-uk Kim int sk_TYPE_is_sorted(const STACK_OF(TYPE) *sk); 60e71b7053SJung-uk Kim STACK_OF(TYPE) *sk_TYPE_dup(const STACK_OF(TYPE) *sk); 61e71b7053SJung-uk Kim STACK_OF(TYPE) *sk_TYPE_deep_copy(const STACK_OF(TYPE) *sk, 62e71b7053SJung-uk Kim sk_TYPE_copyfunc copyfunc, 63e71b7053SJung-uk Kim sk_TYPE_freefunc freefunc); 64e71b7053SJung-uk Kim sk_TYPE_compfunc (*sk_TYPE_set_cmp_func(STACK_OF(TYPE) *sk, 65e71b7053SJung-uk Kim sk_TYPE_compfunc compare)); 66e71b7053SJung-uk Kim STACK_OF(TYPE) *sk_TYPE_new_reserve(sk_TYPE_compfunc compare, int n); 67e71b7053SJung-uk Kim 68e71b7053SJung-uk Kim=head1 DESCRIPTION 69e71b7053SJung-uk Kim 70e71b7053SJung-uk KimApplications can create and use their own stacks by placing any of the macros 71e71b7053SJung-uk Kimdescribed below in a header file. These macros define typesafe inline 72e71b7053SJung-uk Kimfunctions that wrap around the utility B<OPENSSL_sk_> API. 73*b077aed3SPierre ProncheryIn the description here, B<I<TYPE>> is used 74*b077aed3SPierre Proncheryas a placeholder for any of the OpenSSL datatypes, such as B<X509>. 75e71b7053SJung-uk Kim 76*b077aed3SPierre ProncheryThe STACK_OF() macro returns the name for a stack of the specified B<I<TYPE>>. 77*b077aed3SPierre ProncheryThis is an opaque pointer to a structure declaration. 78*b077aed3SPierre ProncheryThis can be used in every header file that references the stack. 79*b077aed3SPierre ProncheryThere are several B<DEFINE...> macros that create static inline functions 80*b077aed3SPierre Proncheryfor all of the functions described on this page. 81*b077aed3SPierre ProncheryThis should normally be used in one source file, and the stack manipulation 82*b077aed3SPierre Proncheryis wrapped with application-specific functions. 83e71b7053SJung-uk Kim 84*b077aed3SPierre ProncheryDEFINE_STACK_OF() creates set of functions for a stack of B<I<TYPE>> elements. 85*b077aed3SPierre ProncheryThe type is referenced by 86*b077aed3SPierre ProncheryB<STACK_OF>(B<I<TYPE>>) and each function name begins with B<sk_I<TYPE>_>. 87e71b7053SJung-uk KimDEFINE_STACK_OF_CONST() is identical to DEFINE_STACK_OF() except 88*b077aed3SPierre Proncheryeach element is constant. 89e71b7053SJung-uk Kim 90*b077aed3SPierre Pronchery /* DEFINE_STACK_OF(TYPE) */ 91*b077aed3SPierre Pronchery TYPE *sk_TYPE_value(STACK_OF(TYPE) *sk, int idx); 92*b077aed3SPierre Pronchery /* DEFINE_STACK_OF_CONST(TYPE) */ 93e71b7053SJung-uk Kim const TYPE *sk_TYPE_value(STACK_OF(TYPE) *sk, int idx); 94e71b7053SJung-uk Kim 95*b077aed3SPierre ProncheryDEFINE_SPECIAL_STACK_OF() and DEFINE_SPECIAL_STACK_OF_CONST() are similar 96*b077aed3SPierre Proncheryexcept B<FUNCNAME> is used in the function names: 97e71b7053SJung-uk Kim 98*b077aed3SPierre Pronchery /* DEFINE_SPECIAL_STACK_OF(TYPE, FUNCNAME) */ 99e71b7053SJung-uk Kim TYPE *sk_FUNCNAME_value(STACK_OF(TYPE) *sk, int idx); 100*b077aed3SPierre Pronchery /* DEFINE_SPECIAL_STACK_OF(TYPE, FUNCNAME) */ 101e71b7053SJung-uk Kim const TYPE *sk_FUNCNAME_value(STACK_OF(TYPE) *sk, int idx); 102e71b7053SJung-uk Kim 103*b077aed3SPierre ProncheryB<sk_I<TYPE>_num>() returns the number of elements in I<sk> or -1 if I<sk> is 104*b077aed3SPierre ProncheryNULL. 105e71b7053SJung-uk Kim 106*b077aed3SPierre ProncheryB<sk_I<TYPE>_value>() returns element I<idx> in I<sk>, where I<idx> starts at 107*b077aed3SPierre Proncheryzero. If I<idx> is out of range then NULL is returned. 108e71b7053SJung-uk Kim 109*b077aed3SPierre ProncheryB<sk_I<TYPE>_new>() allocates a new empty stack using comparison function 110*b077aed3SPierre ProncheryI<compare>. If I<compare> is NULL then no comparison function is used. This 111*b077aed3SPierre Proncheryfunction is equivalent to B<sk_I<TYPE>_new_reserve>(I<compare>, 0). 112e71b7053SJung-uk Kim 113*b077aed3SPierre ProncheryB<sk_I<TYPE>_new_null>() allocates a new empty stack with no comparison 114*b077aed3SPierre Proncheryfunction. This function is equivalent to B<sk_I<TYPE>_new_reserve>(NULL, 0). 115e71b7053SJung-uk Kim 116*b077aed3SPierre ProncheryB<sk_I<TYPE>_reserve>() allocates additional memory in the I<sk> structure 117*b077aed3SPierre Proncherysuch that the next I<n> calls to B<sk_I<TYPE>_insert>(), B<sk_I<TYPE>_push>() 118*b077aed3SPierre Proncheryor B<sk_I<TYPE>_unshift>() will not fail or cause memory to be allocated 119*b077aed3SPierre Proncheryor reallocated. If I<n> is zero, any excess space allocated in the 120*b077aed3SPierre ProncheryI<sk> structure is freed. On error I<sk> is unchanged. 121e71b7053SJung-uk Kim 122*b077aed3SPierre ProncheryB<sk_I<TYPE>_new_reserve>() allocates a new stack. The new stack will have 123*b077aed3SPierre Proncheryadditional memory allocated to hold I<n> elements if I<n> is positive. 124*b077aed3SPierre ProncheryThe next I<n> calls to B<sk_I<TYPE>_insert>(), B<sk_I<TYPE>_push>() or 125*b077aed3SPierre ProncheryB<sk_I<TYPE>_unshift>() will not fail or cause memory to be allocated or 126*b077aed3SPierre Proncheryreallocated. If I<n> is zero or less than zero, no memory is allocated. 127*b077aed3SPierre ProncheryB<sk_I<TYPE>_new_reserve>() also sets the comparison function I<compare> 128*b077aed3SPierre Proncheryto the newly created stack. If I<compare> is NULL then no comparison 129*b077aed3SPierre Proncheryfunction is used. 130e71b7053SJung-uk Kim 131*b077aed3SPierre ProncheryB<sk_I<TYPE>_set_cmp_func>() sets the comparison function of I<sk> to 132*b077aed3SPierre ProncheryI<compare>. The previous comparison function is returned or NULL if there 133*b077aed3SPierre Proncherywas no previous comparison function. 134e71b7053SJung-uk Kim 135*b077aed3SPierre ProncheryB<sk_I<TYPE>_free>() frees up the I<sk> structure. It does I<not> free up any 136*b077aed3SPierre Proncheryelements of I<sk>. After this call I<sk> is no longer valid. 137e71b7053SJung-uk Kim 138*b077aed3SPierre ProncheryB<sk_I<TYPE>_zero>() sets the number of elements in I<sk> to zero. It does not 139*b077aed3SPierre Proncheryfree I<sk> so after this call I<sk> is still valid. 140e71b7053SJung-uk Kim 141*b077aed3SPierre ProncheryB<sk_I<TYPE>_pop_free>() frees up all elements of I<sk> and I<sk> itself. The 142e71b7053SJung-uk Kimfree function freefunc() is called on each element to free it. 143e71b7053SJung-uk Kim 144*b077aed3SPierre ProncheryB<sk_I<TYPE>_delete>() deletes element I<i> from I<sk>. It returns the deleted 145*b077aed3SPierre Proncheryelement or NULL if I<i> is out of range. 146e71b7053SJung-uk Kim 147*b077aed3SPierre ProncheryB<sk_I<TYPE>_delete_ptr>() deletes element matching I<ptr> from I<sk>. It 148*b077aed3SPierre Proncheryreturns the deleted element or NULL if no element matching I<ptr> was found. 149e71b7053SJung-uk Kim 150*b077aed3SPierre ProncheryB<sk_I<TYPE>_insert>() inserts I<ptr> into I<sk> at position I<idx>. Any 151*b077aed3SPierre Proncheryexisting elements at or after I<idx> are moved downwards. If I<idx> is out 152*b077aed3SPierre Proncheryof range the new element is appended to I<sk>. B<sk_I<TYPE>_insert>() either 153*b077aed3SPierre Proncheryreturns the number of elements in I<sk> after the new element is inserted or 154*b077aed3SPierre Proncheryzero if an error (such as memory allocation failure) occurred. 155e71b7053SJung-uk Kim 156*b077aed3SPierre ProncheryB<sk_I<TYPE>_push>() appends I<ptr> to I<sk> it is equivalent to: 157e71b7053SJung-uk Kim 158e71b7053SJung-uk Kim sk_TYPE_insert(sk, ptr, -1); 159e71b7053SJung-uk Kim 160*b077aed3SPierre ProncheryB<sk_I<TYPE>_unshift>() inserts I<ptr> at the start of I<sk> it is equivalent 161*b077aed3SPierre Proncheryto: 162e71b7053SJung-uk Kim 163e71b7053SJung-uk Kim sk_TYPE_insert(sk, ptr, 0); 164e71b7053SJung-uk Kim 165*b077aed3SPierre ProncheryB<sk_I<TYPE>_pop>() returns and removes the last element from I<sk>. 166e71b7053SJung-uk Kim 167*b077aed3SPierre ProncheryB<sk_I<TYPE>_shift>() returns and removes the first element from I<sk>. 168e71b7053SJung-uk Kim 169*b077aed3SPierre ProncheryB<sk_I<TYPE>_set>() sets element I<idx> of I<sk> to I<ptr> replacing the current 170*b077aed3SPierre Proncheryelement. The new element value is returned or NULL if an error occurred: 171*b077aed3SPierre Proncherythis will only happen if I<sk> is NULL or I<idx> is out of range. 172e71b7053SJung-uk Kim 173*b077aed3SPierre ProncheryB<sk_I<TYPE>_find>() searches I<sk> for the element I<ptr>. In the case 174e71b7053SJung-uk Kimwhere no comparison function has been specified, the function performs 175*b077aed3SPierre Proncherya linear search for a pointer equal to I<ptr>. The index of the first 176e71b7053SJung-uk Kimmatching element is returned or B<-1> if there is no match. In the case 177*b077aed3SPierre Proncherywhere a comparison function has been specified, I<sk> is sorted and 178*b077aed3SPierre ProncheryB<sk_I<TYPE>_find>() returns the index of a matching element or B<-1> if there 179*b077aed3SPierre Proncheryis no match. Note that, in this case the comparison function will usually 180e71b7053SJung-uk Kimcompare the values pointed to rather than the pointers themselves and 181*b077aed3SPierre Proncherythe order of elements in I<sk> can change. Note that because the stack may be 182*b077aed3SPierre Proncherysorted as the result of a B<sk_I<TYPE>_find>() call, if a lock is being used to 183*b077aed3SPierre Proncherysynchronise access to the stack across multiple threads, then that lock must be 184*b077aed3SPierre Proncherya "write" lock. 185e71b7053SJung-uk Kim 186*b077aed3SPierre ProncheryB<sk_I<TYPE>_find_ex>() operates like B<sk_I<TYPE>_find>() except when a 187*b077aed3SPierre Proncherycomparison function has been specified and no matching element is found. 188*b077aed3SPierre ProncheryInstead of returning B<-1>, B<sk_I<TYPE>_find_ex>() returns the index of the 189*b077aed3SPierre Proncheryelement either before or after the location where I<ptr> would be if it were 190*b077aed3SPierre Proncherypresent in I<sk>. The function also does not guarantee that the first matching 191*b077aed3SPierre Proncheryelement in the sorted stack is returned. 192e71b7053SJung-uk Kim 193*b077aed3SPierre ProncheryB<sk_I<TYPE>_find_all>() operates like B<sk_I<TYPE>_find>() but it also 194*b077aed3SPierre Proncherysets the I<*pnum> to number of matching elements in the stack. In case 195*b077aed3SPierre Proncheryno comparison function has been specified the I<*pnum> will be always set 196*b077aed3SPierre Proncheryto 1 if matching element was found, 0 otherwise. 197e71b7053SJung-uk Kim 198*b077aed3SPierre ProncheryB<sk_I<TYPE>_sort>() sorts I<sk> using the supplied comparison function. 199e71b7053SJung-uk Kim 200*b077aed3SPierre ProncheryB<sk_I<TYPE>_is_sorted>() returns B<1> if I<sk> is sorted and B<0> otherwise. 201e71b7053SJung-uk Kim 202*b077aed3SPierre ProncheryB<sk_I<TYPE>_dup>() returns a shallow copy of I<sk> 203*b077aed3SPierre Proncheryor an empty stack if the passed stack is NULL. 204*b077aed3SPierre ProncheryNote the pointers in the copy are identical to the original. 205*b077aed3SPierre Pronchery 206*b077aed3SPierre ProncheryB<sk_I<TYPE>_deep_copy>() returns a new stack where each element has been 207*b077aed3SPierre Proncherycopied or an empty stack if the passed stack is NULL. 208*b077aed3SPierre ProncheryCopying is performed by the supplied copyfunc() and freeing by freefunc(). 209*b077aed3SPierre ProncheryThe function freefunc() is only called if an error occurs. 210e71b7053SJung-uk Kim 211e71b7053SJung-uk Kim=head1 NOTES 212e71b7053SJung-uk Kim 213e71b7053SJung-uk KimCare should be taken when accessing stacks in multi-threaded environments. 214*b077aed3SPierre ProncheryAny operation which increases the size of a stack such as B<sk_I<TYPE>_insert>() 215*b077aed3SPierre Proncheryor B<sk_I<TYPE>_push>() can "grow" the size of an internal array and cause race 216*b077aed3SPierre Proncheryconditions if the same stack is accessed in a different thread. Operations such 217*b077aed3SPierre Proncheryas B<sk_I<TYPE>_find>() and B<sk_I<TYPE>_sort>() can also reorder the stack. 218e71b7053SJung-uk Kim 219e71b7053SJung-uk KimAny comparison function supplied should use a metric suitable 220e71b7053SJung-uk Kimfor use in a binary search operation. That is it should return zero, a 221*b077aed3SPierre Proncherypositive or negative value if I<a> is equal to, greater than 222*b077aed3SPierre Proncheryor less than I<b> respectively. 223e71b7053SJung-uk Kim 224e71b7053SJung-uk KimCare should be taken when checking the return values of the functions 225*b077aed3SPierre ProncheryB<sk_I<TYPE>_find>() and B<sk_I<TYPE>_find_ex>(). They return an index to the 226e71b7053SJung-uk Kimmatching element. In particular B<0> indicates a matching first element. 227e71b7053SJung-uk KimA failed search is indicated by a B<-1> return value. 228e71b7053SJung-uk Kim 229e71b7053SJung-uk KimSTACK_OF(), DEFINE_STACK_OF(), DEFINE_STACK_OF_CONST(), and 230e71b7053SJung-uk KimDEFINE_SPECIAL_STACK_OF() are implemented as macros. 231e71b7053SJung-uk Kim 232*b077aed3SPierre ProncheryIt is not an error to call B<sk_I<TYPE>_num>(), B<sk_I<TYPE>_value>(), 233*b077aed3SPierre ProncheryB<sk_I<TYPE>_free>(), B<sk_I<TYPE>_zero>(), B<sk_I<TYPE>_pop_free>(), 234*b077aed3SPierre ProncheryB<sk_I<TYPE>_delete>(), B<sk_I<TYPE>_delete_ptr>(), B<sk_I<TYPE>_pop>(), 235*b077aed3SPierre ProncheryB<sk_I<TYPE>_shift>(), B<sk_I<TYPE>_find>(), B<sk_I<TYPE>_find_ex>(), 236*b077aed3SPierre Proncheryand B<sk_I<TYPE>_find_all>() on a NULL stack, empty stack, or with 237*b077aed3SPierre Proncheryan invalid index. An error is not raised in these conditions. 238*b077aed3SPierre Pronchery 239e71b7053SJung-uk KimThe underlying utility B<OPENSSL_sk_> API should not be used directly. 240e71b7053SJung-uk KimIt defines these functions: OPENSSL_sk_deep_copy(), 241e71b7053SJung-uk KimOPENSSL_sk_delete(), OPENSSL_sk_delete_ptr(), OPENSSL_sk_dup(), 242*b077aed3SPierre ProncheryOPENSSL_sk_find(), OPENSSL_sk_find_ex(), OPENSSL_sk_find_all(), 243*b077aed3SPierre ProncheryOPENSSL_sk_free(), OPENSSL_sk_insert(), OPENSSL_sk_is_sorted(), 244*b077aed3SPierre ProncheryOPENSSL_sk_new(), OPENSSL_sk_new_null(), OPENSSL_sk_new_reserve(), 245*b077aed3SPierre ProncheryOPENSSL_sk_num(), OPENSSL_sk_pop(), OPENSSL_sk_pop_free(), OPENSSL_sk_push(), 246*b077aed3SPierre ProncheryOPENSSL_sk_reserve(), OPENSSL_sk_set(), OPENSSL_sk_set_cmp_func(), 247*b077aed3SPierre ProncheryOPENSSL_sk_shift(), OPENSSL_sk_sort(), OPENSSL_sk_unshift(), 248*b077aed3SPierre ProncheryOPENSSL_sk_value(), OPENSSL_sk_zero(). 249e71b7053SJung-uk Kim 250e71b7053SJung-uk Kim=head1 RETURN VALUES 251e71b7053SJung-uk Kim 252*b077aed3SPierre ProncheryB<sk_I<TYPE>_num>() returns the number of elements in the stack or B<-1> if the 253*b077aed3SPierre Proncherypassed stack is NULL. 254e71b7053SJung-uk Kim 255*b077aed3SPierre ProncheryB<sk_I<TYPE>_value>() returns a pointer to a stack element or NULL if the 256e71b7053SJung-uk Kimindex is out of range. 257e71b7053SJung-uk Kim 258*b077aed3SPierre ProncheryB<sk_I<TYPE>_new>(), B<sk_I<TYPE>_new_null>() and B<sk_I<TYPE>_new_reserve>() 259*b077aed3SPierre Proncheryreturn an empty stack or NULL if an error occurs. 260e71b7053SJung-uk Kim 261*b077aed3SPierre ProncheryB<sk_I<TYPE>_reserve>() returns B<1> on successful allocation of the required 262*b077aed3SPierre Proncherymemory or B<0> on error. 263e71b7053SJung-uk Kim 264*b077aed3SPierre ProncheryB<sk_I<TYPE>_set_cmp_func>() returns the old comparison function or NULL if 265e71b7053SJung-uk Kimthere was no old comparison function. 266e71b7053SJung-uk Kim 267*b077aed3SPierre ProncheryB<sk_I<TYPE>_free>(), B<sk_I<TYPE>_zero>(), B<sk_I<TYPE>_pop_free>() and 268*b077aed3SPierre ProncheryB<sk_I<TYPE>_sort>() do not return values. 269e71b7053SJung-uk Kim 270*b077aed3SPierre ProncheryB<sk_I<TYPE>_pop>(), B<sk_I<TYPE>_shift>(), B<sk_I<TYPE>_delete>() and 271*b077aed3SPierre ProncheryB<sk_I<TYPE>_delete_ptr>() return a pointer to the deleted element or NULL 272*b077aed3SPierre Proncheryon error. 273e71b7053SJung-uk Kim 274*b077aed3SPierre ProncheryB<sk_I<TYPE>_insert>(), B<sk_I<TYPE>_push>() and B<sk_I<TYPE>_unshift>() return 275*b077aed3SPierre Proncherythe total number of elements in the stack and 0 if an error occurred. 276*b077aed3SPierre ProncheryB<sk_I<TYPE>_push>() further returns -1 if I<sk> is NULL. 277e71b7053SJung-uk Kim 278*b077aed3SPierre ProncheryB<sk_I<TYPE>_set>() returns a pointer to the replacement element or NULL on 279e71b7053SJung-uk Kimerror. 280e71b7053SJung-uk Kim 281*b077aed3SPierre ProncheryB<sk_I<TYPE>_find>() and B<sk_I<TYPE>_find_ex>() return an index to the found 282*b077aed3SPierre Proncheryelement or B<-1> on error. 283e71b7053SJung-uk Kim 284*b077aed3SPierre ProncheryB<sk_I<TYPE>_is_sorted>() returns B<1> if the stack is sorted and B<0> if it is 285e71b7053SJung-uk Kimnot. 286e71b7053SJung-uk Kim 287*b077aed3SPierre ProncheryB<sk_I<TYPE>_dup>() and B<sk_I<TYPE>_deep_copy>() return a pointer to the copy 288*b077aed3SPierre Proncheryof the stack or NULL on error. 289e71b7053SJung-uk Kim 290e71b7053SJung-uk Kim=head1 HISTORY 291e71b7053SJung-uk Kim 292e71b7053SJung-uk KimBefore OpenSSL 1.1.0, this was implemented via macros and not inline functions 293e71b7053SJung-uk Kimand was not a public API. 294e71b7053SJung-uk Kim 295*b077aed3SPierre ProncheryB<sk_I<TYPE>_reserve>() and B<sk_I<TYPE>_new_reserve>() were added in OpenSSL 296*b077aed3SPierre Pronchery1.1.1. 297e71b7053SJung-uk Kim 298e71b7053SJung-uk Kim=head1 COPYRIGHT 299e71b7053SJung-uk Kim 300*b077aed3SPierre ProncheryCopyright 2000-2022 The OpenSSL Project Authors. All Rights Reserved. 301e71b7053SJung-uk Kim 302*b077aed3SPierre ProncheryLicensed under the Apache License 2.0 (the "License"). You may not use 303e71b7053SJung-uk Kimthis file except in compliance with the License. You can obtain a copy 304e71b7053SJung-uk Kimin the file LICENSE in the source distribution or at 305e71b7053SJung-uk KimL<https://www.openssl.org/source/license.html>. 306e71b7053SJung-uk Kim 307e71b7053SJung-uk Kim=cut 308