xref: /freebsd/crypto/openssl/doc/man3/DEFINE_STACK_OF.pod (revision b077aed33b7b6aefca7b17ddb250cf521f938613)
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