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