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, 11b077aed3SPierre Proncherysk_TYPE_find, sk_TYPE_find_ex, sk_TYPE_find_all, sk_TYPE_sort, 12b077aed3SPierre Proncherysk_TYPE_is_sorted, sk_TYPE_dup, sk_TYPE_deep_copy, sk_TYPE_set_cmp_func, 13b077aed3SPierre Proncherysk_TYPE_new_reserve, 14b077aed3SPierre ProncheryOPENSSL_sk_deep_copy, OPENSSL_sk_delete, OPENSSL_sk_delete_ptr, 15b077aed3SPierre ProncheryOPENSSL_sk_dup, OPENSSL_sk_find, OPENSSL_sk_find_ex, OPENSSL_sk_find_all, 16b077aed3SPierre ProncheryOPENSSL_sk_free, OPENSSL_sk_insert, OPENSSL_sk_is_sorted, OPENSSL_sk_new, 17b077aed3SPierre ProncheryOPENSSL_sk_new_null, OPENSSL_sk_new_reserve, OPENSSL_sk_num, OPENSSL_sk_pop, 18b077aed3SPierre ProncheryOPENSSL_sk_pop_free, OPENSSL_sk_push, OPENSSL_sk_reserve, OPENSSL_sk_set, 19b077aed3SPierre ProncheryOPENSSL_sk_set_cmp_func, OPENSSL_sk_shift, OPENSSL_sk_sort, 20b077aed3SPierre 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 25b077aed3SPierre 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); 44*44096ebdSEnji Cooper void sk_TYPE_free(STACK_OF(TYPE) *sk); 45*44096ebdSEnji Cooper void sk_TYPE_zero(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); 57b077aed3SPierre 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. 73b077aed3SPierre ProncheryIn the description here, B<I<TYPE>> is used 74b077aed3SPierre Proncheryas a placeholder for any of the OpenSSL datatypes, such as B<X509>. 75e71b7053SJung-uk Kim 76b077aed3SPierre ProncheryThe STACK_OF() macro returns the name for a stack of the specified B<I<TYPE>>. 77b077aed3SPierre ProncheryThis is an opaque pointer to a structure declaration. 78b077aed3SPierre ProncheryThis can be used in every header file that references the stack. 79b077aed3SPierre ProncheryThere are several B<DEFINE...> macros that create static inline functions 80b077aed3SPierre Proncheryfor all of the functions described on this page. 81b077aed3SPierre ProncheryThis should normally be used in one source file, and the stack manipulation 82b077aed3SPierre Proncheryis wrapped with application-specific functions. 83e71b7053SJung-uk Kim 84b077aed3SPierre ProncheryDEFINE_STACK_OF() creates set of functions for a stack of B<I<TYPE>> elements. 85b077aed3SPierre ProncheryThe type is referenced by 86b077aed3SPierre 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 88b077aed3SPierre Proncheryeach element is constant. 89e71b7053SJung-uk Kim 90b077aed3SPierre Pronchery /* DEFINE_STACK_OF(TYPE) */ 91b077aed3SPierre Pronchery TYPE *sk_TYPE_value(STACK_OF(TYPE) *sk, int idx); 92b077aed3SPierre Pronchery /* DEFINE_STACK_OF_CONST(TYPE) */ 93e71b7053SJung-uk Kim const TYPE *sk_TYPE_value(STACK_OF(TYPE) *sk, int idx); 94e71b7053SJung-uk Kim 95b077aed3SPierre ProncheryDEFINE_SPECIAL_STACK_OF() and DEFINE_SPECIAL_STACK_OF_CONST() are similar 96b077aed3SPierre Proncheryexcept B<FUNCNAME> is used in the function names: 97e71b7053SJung-uk Kim 98b077aed3SPierre Pronchery /* DEFINE_SPECIAL_STACK_OF(TYPE, FUNCNAME) */ 99e71b7053SJung-uk Kim TYPE *sk_FUNCNAME_value(STACK_OF(TYPE) *sk, int idx); 100b077aed3SPierre Pronchery /* DEFINE_SPECIAL_STACK_OF(TYPE, FUNCNAME) */ 101e71b7053SJung-uk Kim const TYPE *sk_FUNCNAME_value(STACK_OF(TYPE) *sk, int idx); 102e71b7053SJung-uk Kim 103b077aed3SPierre ProncheryB<sk_I<TYPE>_num>() returns the number of elements in I<sk> or -1 if I<sk> is 104b077aed3SPierre ProncheryNULL. 105e71b7053SJung-uk Kim 106b077aed3SPierre ProncheryB<sk_I<TYPE>_value>() returns element I<idx> in I<sk>, where I<idx> starts at 107b077aed3SPierre Proncheryzero. If I<idx> is out of range then NULL is returned. 108e71b7053SJung-uk Kim 109b077aed3SPierre ProncheryB<sk_I<TYPE>_new>() allocates a new empty stack using comparison function 110b077aed3SPierre ProncheryI<compare>. If I<compare> is NULL then no comparison function is used. This 111b077aed3SPierre Proncheryfunction is equivalent to B<sk_I<TYPE>_new_reserve>(I<compare>, 0). 112e71b7053SJung-uk Kim 113b077aed3SPierre ProncheryB<sk_I<TYPE>_new_null>() allocates a new empty stack with no comparison 114b077aed3SPierre Proncheryfunction. This function is equivalent to B<sk_I<TYPE>_new_reserve>(NULL, 0). 115e71b7053SJung-uk Kim 116b077aed3SPierre ProncheryB<sk_I<TYPE>_reserve>() allocates additional memory in the I<sk> structure 117b077aed3SPierre Proncherysuch that the next I<n> calls to B<sk_I<TYPE>_insert>(), B<sk_I<TYPE>_push>() 118b077aed3SPierre Proncheryor B<sk_I<TYPE>_unshift>() will not fail or cause memory to be allocated 119b077aed3SPierre Proncheryor reallocated. If I<n> is zero, any excess space allocated in the 120b077aed3SPierre ProncheryI<sk> structure is freed. On error I<sk> is unchanged. 121e71b7053SJung-uk Kim 122b077aed3SPierre ProncheryB<sk_I<TYPE>_new_reserve>() allocates a new stack. The new stack will have 123b077aed3SPierre Proncheryadditional memory allocated to hold I<n> elements if I<n> is positive. 124b077aed3SPierre ProncheryThe next I<n> calls to B<sk_I<TYPE>_insert>(), B<sk_I<TYPE>_push>() or 125b077aed3SPierre ProncheryB<sk_I<TYPE>_unshift>() will not fail or cause memory to be allocated or 126b077aed3SPierre Proncheryreallocated. If I<n> is zero or less than zero, no memory is allocated. 127b077aed3SPierre ProncheryB<sk_I<TYPE>_new_reserve>() also sets the comparison function I<compare> 128b077aed3SPierre Proncheryto the newly created stack. If I<compare> is NULL then no comparison 129b077aed3SPierre Proncheryfunction is used. 130e71b7053SJung-uk Kim 131b077aed3SPierre ProncheryB<sk_I<TYPE>_set_cmp_func>() sets the comparison function of I<sk> to 132b077aed3SPierre ProncheryI<compare>. The previous comparison function is returned or NULL if there 133b077aed3SPierre Proncherywas no previous comparison function. 134e71b7053SJung-uk Kim 135b077aed3SPierre ProncheryB<sk_I<TYPE>_free>() frees up the I<sk> structure. It does I<not> free up any 136b077aed3SPierre Proncheryelements of I<sk>. After this call I<sk> is no longer valid. 137e71b7053SJung-uk Kim 138b077aed3SPierre ProncheryB<sk_I<TYPE>_zero>() sets the number of elements in I<sk> to zero. It does not 139b077aed3SPierre Proncheryfree I<sk> so after this call I<sk> is still valid. 140e71b7053SJung-uk Kim 141b077aed3SPierre 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 144b077aed3SPierre ProncheryB<sk_I<TYPE>_delete>() deletes element I<i> from I<sk>. It returns the deleted 145b077aed3SPierre Proncheryelement or NULL if I<i> is out of range. 146e71b7053SJung-uk Kim 147b077aed3SPierre ProncheryB<sk_I<TYPE>_delete_ptr>() deletes element matching I<ptr> from I<sk>. It 148b077aed3SPierre Proncheryreturns the deleted element or NULL if no element matching I<ptr> was found. 149e71b7053SJung-uk Kim 150b077aed3SPierre ProncheryB<sk_I<TYPE>_insert>() inserts I<ptr> into I<sk> at position I<idx>. Any 151b077aed3SPierre Proncheryexisting elements at or after I<idx> are moved downwards. If I<idx> is out 152b077aed3SPierre Proncheryof range the new element is appended to I<sk>. B<sk_I<TYPE>_insert>() either 153b077aed3SPierre Proncheryreturns the number of elements in I<sk> after the new element is inserted or 154b077aed3SPierre Proncheryzero if an error (such as memory allocation failure) occurred. 155e71b7053SJung-uk Kim 156b077aed3SPierre 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 160b077aed3SPierre ProncheryB<sk_I<TYPE>_unshift>() inserts I<ptr> at the start of I<sk> it is equivalent 161b077aed3SPierre Proncheryto: 162e71b7053SJung-uk Kim 163e71b7053SJung-uk Kim sk_TYPE_insert(sk, ptr, 0); 164e71b7053SJung-uk Kim 165b077aed3SPierre ProncheryB<sk_I<TYPE>_pop>() returns and removes the last element from I<sk>. 166e71b7053SJung-uk Kim 167b077aed3SPierre ProncheryB<sk_I<TYPE>_shift>() returns and removes the first element from I<sk>. 168e71b7053SJung-uk Kim 169b077aed3SPierre ProncheryB<sk_I<TYPE>_set>() sets element I<idx> of I<sk> to I<ptr> replacing the current 170b077aed3SPierre Proncheryelement. The new element value is returned or NULL if an error occurred: 171b077aed3SPierre Proncherythis will only happen if I<sk> is NULL or I<idx> is out of range. 172e71b7053SJung-uk Kim 173b077aed3SPierre 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 175b077aed3SPierre 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 177b077aed3SPierre Proncherywhere a comparison function has been specified, I<sk> is sorted and 178b077aed3SPierre ProncheryB<sk_I<TYPE>_find>() returns the index of a matching element or B<-1> if there 179b077aed3SPierre 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 181b077aed3SPierre Proncherythe order of elements in I<sk> can change. Note that because the stack may be 182b077aed3SPierre Proncherysorted as the result of a B<sk_I<TYPE>_find>() call, if a lock is being used to 183b077aed3SPierre Proncherysynchronise access to the stack across multiple threads, then that lock must be 184b077aed3SPierre Proncherya "write" lock. 185e71b7053SJung-uk Kim 186b077aed3SPierre ProncheryB<sk_I<TYPE>_find_ex>() operates like B<sk_I<TYPE>_find>() except when a 187b077aed3SPierre Proncherycomparison function has been specified and no matching element is found. 188b077aed3SPierre ProncheryInstead of returning B<-1>, B<sk_I<TYPE>_find_ex>() returns the index of the 189b077aed3SPierre Proncheryelement either before or after the location where I<ptr> would be if it were 190b077aed3SPierre Proncherypresent in I<sk>. The function also does not guarantee that the first matching 191b077aed3SPierre Proncheryelement in the sorted stack is returned. 192e71b7053SJung-uk Kim 193b077aed3SPierre ProncheryB<sk_I<TYPE>_find_all>() operates like B<sk_I<TYPE>_find>() but it also 194b077aed3SPierre Proncherysets the I<*pnum> to number of matching elements in the stack. In case 195b077aed3SPierre Proncheryno comparison function has been specified the I<*pnum> will be always set 196b077aed3SPierre Proncheryto 1 if matching element was found, 0 otherwise. 197e71b7053SJung-uk Kim 198b077aed3SPierre ProncheryB<sk_I<TYPE>_sort>() sorts I<sk> using the supplied comparison function. 199e71b7053SJung-uk Kim 200b077aed3SPierre ProncheryB<sk_I<TYPE>_is_sorted>() returns B<1> if I<sk> is sorted and B<0> otherwise. 201e71b7053SJung-uk Kim 202b077aed3SPierre ProncheryB<sk_I<TYPE>_dup>() returns a shallow copy of I<sk> 203b077aed3SPierre Proncheryor an empty stack if the passed stack is NULL. 204b077aed3SPierre ProncheryNote the pointers in the copy are identical to the original. 205b077aed3SPierre Pronchery 206b077aed3SPierre ProncheryB<sk_I<TYPE>_deep_copy>() returns a new stack where each element has been 207b077aed3SPierre Proncherycopied or an empty stack if the passed stack is NULL. 208b077aed3SPierre ProncheryCopying is performed by the supplied copyfunc() and freeing by freefunc(). 209b077aed3SPierre 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. 214b077aed3SPierre ProncheryAny operation which increases the size of a stack such as B<sk_I<TYPE>_insert>() 215b077aed3SPierre Proncheryor B<sk_I<TYPE>_push>() can "grow" the size of an internal array and cause race 216b077aed3SPierre Proncheryconditions if the same stack is accessed in a different thread. Operations such 217b077aed3SPierre 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 221b077aed3SPierre Proncherypositive or negative value if I<a> is equal to, greater than 222b077aed3SPierre Proncheryor less than I<b> respectively. 223e71b7053SJung-uk Kim 224e71b7053SJung-uk KimCare should be taken when checking the return values of the functions 225b077aed3SPierre 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 232b077aed3SPierre ProncheryIt is not an error to call B<sk_I<TYPE>_num>(), B<sk_I<TYPE>_value>(), 233b077aed3SPierre ProncheryB<sk_I<TYPE>_free>(), B<sk_I<TYPE>_zero>(), B<sk_I<TYPE>_pop_free>(), 234b077aed3SPierre ProncheryB<sk_I<TYPE>_delete>(), B<sk_I<TYPE>_delete_ptr>(), B<sk_I<TYPE>_pop>(), 235b077aed3SPierre ProncheryB<sk_I<TYPE>_shift>(), B<sk_I<TYPE>_find>(), B<sk_I<TYPE>_find_ex>(), 236b077aed3SPierre Proncheryand B<sk_I<TYPE>_find_all>() on a NULL stack, empty stack, or with 237b077aed3SPierre Proncheryan invalid index. An error is not raised in these conditions. 238b077aed3SPierre 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(), 242b077aed3SPierre ProncheryOPENSSL_sk_find(), OPENSSL_sk_find_ex(), OPENSSL_sk_find_all(), 243b077aed3SPierre ProncheryOPENSSL_sk_free(), OPENSSL_sk_insert(), OPENSSL_sk_is_sorted(), 244b077aed3SPierre ProncheryOPENSSL_sk_new(), OPENSSL_sk_new_null(), OPENSSL_sk_new_reserve(), 245b077aed3SPierre ProncheryOPENSSL_sk_num(), OPENSSL_sk_pop(), OPENSSL_sk_pop_free(), OPENSSL_sk_push(), 246b077aed3SPierre ProncheryOPENSSL_sk_reserve(), OPENSSL_sk_set(), OPENSSL_sk_set_cmp_func(), 247b077aed3SPierre ProncheryOPENSSL_sk_shift(), OPENSSL_sk_sort(), OPENSSL_sk_unshift(), 248b077aed3SPierre ProncheryOPENSSL_sk_value(), OPENSSL_sk_zero(). 249e71b7053SJung-uk Kim 250e71b7053SJung-uk Kim=head1 RETURN VALUES 251e71b7053SJung-uk Kim 252b077aed3SPierre ProncheryB<sk_I<TYPE>_num>() returns the number of elements in the stack or B<-1> if the 253b077aed3SPierre Proncherypassed stack is NULL. 254e71b7053SJung-uk Kim 255b077aed3SPierre 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 258b077aed3SPierre ProncheryB<sk_I<TYPE>_new>(), B<sk_I<TYPE>_new_null>() and B<sk_I<TYPE>_new_reserve>() 259b077aed3SPierre Proncheryreturn an empty stack or NULL if an error occurs. 260e71b7053SJung-uk Kim 261b077aed3SPierre ProncheryB<sk_I<TYPE>_reserve>() returns B<1> on successful allocation of the required 262b077aed3SPierre Proncherymemory or B<0> on error. 263e71b7053SJung-uk Kim 264b077aed3SPierre 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 267b077aed3SPierre ProncheryB<sk_I<TYPE>_free>(), B<sk_I<TYPE>_zero>(), B<sk_I<TYPE>_pop_free>() and 268b077aed3SPierre ProncheryB<sk_I<TYPE>_sort>() do not return values. 269e71b7053SJung-uk Kim 270b077aed3SPierre ProncheryB<sk_I<TYPE>_pop>(), B<sk_I<TYPE>_shift>(), B<sk_I<TYPE>_delete>() and 271b077aed3SPierre ProncheryB<sk_I<TYPE>_delete_ptr>() return a pointer to the deleted element or NULL 272b077aed3SPierre Proncheryon error. 273e71b7053SJung-uk Kim 274b077aed3SPierre ProncheryB<sk_I<TYPE>_insert>(), B<sk_I<TYPE>_push>() and B<sk_I<TYPE>_unshift>() return 275b077aed3SPierre Proncherythe total number of elements in the stack and 0 if an error occurred. 276b077aed3SPierre ProncheryB<sk_I<TYPE>_push>() further returns -1 if I<sk> is NULL. 277e71b7053SJung-uk Kim 278b077aed3SPierre ProncheryB<sk_I<TYPE>_set>() returns a pointer to the replacement element or NULL on 279e71b7053SJung-uk Kimerror. 280e71b7053SJung-uk Kim 281b077aed3SPierre ProncheryB<sk_I<TYPE>_find>() and B<sk_I<TYPE>_find_ex>() return an index to the found 282b077aed3SPierre Proncheryelement or B<-1> on error. 283e71b7053SJung-uk Kim 284b077aed3SPierre 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 287b077aed3SPierre ProncheryB<sk_I<TYPE>_dup>() and B<sk_I<TYPE>_deep_copy>() return a pointer to the copy 288b077aed3SPierre 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 295b077aed3SPierre ProncheryB<sk_I<TYPE>_reserve>() and B<sk_I<TYPE>_new_reserve>() were added in OpenSSL 296b077aed3SPierre Pronchery1.1.1. 297e71b7053SJung-uk Kim 298e71b7053SJung-uk Kim=head1 COPYRIGHT 299e71b7053SJung-uk Kim 300*44096ebdSEnji CooperCopyright 2000-2024 The OpenSSL Project Authors. All Rights Reserved. 301e71b7053SJung-uk Kim 302b077aed3SPierre 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