xref: /freebsd-src/crypto/heimdal/base/heimbase.h (revision 6a068746777241722b2b32c5d0bc443a2a64d80b)
1*ae771770SStanislav Sedov /*
2*ae771770SStanislav Sedov  * Copyright (c) 2010 Kungliga Tekniska Högskolan
3*ae771770SStanislav Sedov  * (Royal Institute of Technology, Stockholm, Sweden).
4*ae771770SStanislav Sedov  * All rights reserved.
5*ae771770SStanislav Sedov  *
6*ae771770SStanislav Sedov  * Portions Copyright (c) 2010 Apple Inc. All rights reserved.
7*ae771770SStanislav Sedov  *
8*ae771770SStanislav Sedov  * Redistribution and use in source and binary forms, with or without
9*ae771770SStanislav Sedov  * modification, are permitted provided that the following conditions
10*ae771770SStanislav Sedov  * are met:
11*ae771770SStanislav Sedov  *
12*ae771770SStanislav Sedov  * 1. Redistributions of source code must retain the above copyright
13*ae771770SStanislav Sedov  *    notice, this list of conditions and the following disclaimer.
14*ae771770SStanislav Sedov  *
15*ae771770SStanislav Sedov  * 2. Redistributions in binary form must reproduce the above copyright
16*ae771770SStanislav Sedov  *    notice, this list of conditions and the following disclaimer in the
17*ae771770SStanislav Sedov  *    documentation and/or other materials provided with the distribution.
18*ae771770SStanislav Sedov  *
19*ae771770SStanislav Sedov  * 3. Neither the name of the Institute nor the names of its contributors
20*ae771770SStanislav Sedov  *    may be used to endorse or promote products derived from this software
21*ae771770SStanislav Sedov  *    without specific prior written permission.
22*ae771770SStanislav Sedov  *
23*ae771770SStanislav Sedov  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
24*ae771770SStanislav Sedov  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25*ae771770SStanislav Sedov  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26*ae771770SStanislav Sedov  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
27*ae771770SStanislav Sedov  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28*ae771770SStanislav Sedov  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29*ae771770SStanislav Sedov  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30*ae771770SStanislav Sedov  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31*ae771770SStanislav Sedov  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32*ae771770SStanislav Sedov  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33*ae771770SStanislav Sedov  * SUCH DAMAGE.
34*ae771770SStanislav Sedov  */
35*ae771770SStanislav Sedov 
36*ae771770SStanislav Sedov #ifndef HEIM_BASE_H
37*ae771770SStanislav Sedov #define HEIM_BASE_H 1
38*ae771770SStanislav Sedov 
39*ae771770SStanislav Sedov #include <sys/types.h>
40*ae771770SStanislav Sedov #include <krb5-types.h>
41*ae771770SStanislav Sedov #include <stdarg.h>
42*ae771770SStanislav Sedov #include <stdbool.h>
43*ae771770SStanislav Sedov 
44*ae771770SStanislav Sedov typedef void * heim_object_t;
45*ae771770SStanislav Sedov typedef unsigned int heim_tid_t;
46*ae771770SStanislav Sedov typedef heim_object_t heim_bool_t;
47*ae771770SStanislav Sedov typedef heim_object_t heim_null_t;
48*ae771770SStanislav Sedov #define HEIM_BASE_ONCE_INIT 0
49*ae771770SStanislav Sedov typedef long heim_base_once_t; /* XXX arch dependant */
50*ae771770SStanislav Sedov 
51*ae771770SStanislav Sedov #if !defined(__has_extension)
52*ae771770SStanislav Sedov #define __has_extension(x) 0
53*ae771770SStanislav Sedov #endif
54*ae771770SStanislav Sedov 
55*ae771770SStanislav Sedov #define HEIM_REQUIRE_GNUC(m,n,p) \
56*ae771770SStanislav Sedov     (((__GNUC__ * 10000) + (__GNUC_MINOR__ * 100) + __GNUC_PATCHLEVEL__) >= \
57*ae771770SStanislav Sedov      (((m) * 10000) + ((n) * 100) + (p)))
58*ae771770SStanislav Sedov 
59*ae771770SStanislav Sedov 
60*ae771770SStanislav Sedov #if __has_extension(__builtin_expect) || HEIM_REQUIRE_GNUC(3,0,0)
61*ae771770SStanislav Sedov #define heim_builtin_expect(_op,_res) __builtin_expect(_op,_res)
62*ae771770SStanislav Sedov #else
63*ae771770SStanislav Sedov #define heim_builtin_expect(_op,_res) (_op)
64*ae771770SStanislav Sedov #endif
65*ae771770SStanislav Sedov 
66*ae771770SStanislav Sedov 
67*ae771770SStanislav Sedov void *	heim_retain(heim_object_t);
68*ae771770SStanislav Sedov void	heim_release(heim_object_t);
69*ae771770SStanislav Sedov 
70*ae771770SStanislav Sedov typedef void (*heim_type_dealloc)(void *);
71*ae771770SStanislav Sedov 
72*ae771770SStanislav Sedov void *
73*ae771770SStanislav Sedov heim_alloc(size_t size, const char *name, heim_type_dealloc dealloc);
74*ae771770SStanislav Sedov 
75*ae771770SStanislav Sedov heim_tid_t
76*ae771770SStanislav Sedov heim_get_tid(heim_object_t object);
77*ae771770SStanislav Sedov 
78*ae771770SStanislav Sedov int
79*ae771770SStanislav Sedov heim_cmp(heim_object_t a, heim_object_t b);
80*ae771770SStanislav Sedov 
81*ae771770SStanislav Sedov unsigned long
82*ae771770SStanislav Sedov heim_get_hash(heim_object_t ptr);
83*ae771770SStanislav Sedov 
84*ae771770SStanislav Sedov void
85*ae771770SStanislav Sedov heim_base_once_f(heim_base_once_t *, void *, void (*)(void *));
86*ae771770SStanislav Sedov 
87*ae771770SStanislav Sedov void
88*ae771770SStanislav Sedov heim_abort(const char *fmt, ...)
89*ae771770SStanislav Sedov     HEIMDAL_NORETURN_ATTRIBUTE
90*ae771770SStanislav Sedov     HEIMDAL_PRINTF_ATTRIBUTE((printf, 1, 2));
91*ae771770SStanislav Sedov 
92*ae771770SStanislav Sedov void
93*ae771770SStanislav Sedov heim_abortv(const char *fmt, va_list ap)
94*ae771770SStanislav Sedov     HEIMDAL_NORETURN_ATTRIBUTE
95*ae771770SStanislav Sedov     HEIMDAL_PRINTF_ATTRIBUTE((printf, 1, 0));
96*ae771770SStanislav Sedov 
97*ae771770SStanislav Sedov #define heim_assert(e,t) \
98*ae771770SStanislav Sedov     (heim_builtin_expect(!(e), 0) ? heim_abort(t ":" #e) : (void)0)
99*ae771770SStanislav Sedov 
100*ae771770SStanislav Sedov /*
101*ae771770SStanislav Sedov  *
102*ae771770SStanislav Sedov  */
103*ae771770SStanislav Sedov 
104*ae771770SStanislav Sedov heim_null_t
105*ae771770SStanislav Sedov heim_null_create(void);
106*ae771770SStanislav Sedov 
107*ae771770SStanislav Sedov heim_bool_t
108*ae771770SStanislav Sedov heim_bool_create(int);
109*ae771770SStanislav Sedov 
110*ae771770SStanislav Sedov int
111*ae771770SStanislav Sedov heim_bool_val(heim_bool_t);
112*ae771770SStanislav Sedov 
113*ae771770SStanislav Sedov /*
114*ae771770SStanislav Sedov  * Array
115*ae771770SStanislav Sedov  */
116*ae771770SStanislav Sedov 
117*ae771770SStanislav Sedov typedef struct heim_array_data *heim_array_t;
118*ae771770SStanislav Sedov 
119*ae771770SStanislav Sedov heim_array_t heim_array_create(void);
120*ae771770SStanislav Sedov heim_tid_t heim_array_get_type_id(void);
121*ae771770SStanislav Sedov 
122*ae771770SStanislav Sedov typedef void (*heim_array_iterator_f_t)(heim_object_t, void *);
123*ae771770SStanislav Sedov 
124*ae771770SStanislav Sedov int	heim_array_append_value(heim_array_t, heim_object_t);
125*ae771770SStanislav Sedov void	heim_array_iterate_f(heim_array_t, heim_array_iterator_f_t, void *);
126*ae771770SStanislav Sedov #ifdef __BLOCKS__
127*ae771770SStanislav Sedov void	heim_array_iterate(heim_array_t, void (^)(heim_object_t));
128*ae771770SStanislav Sedov #endif
129*ae771770SStanislav Sedov size_t	heim_array_get_length(heim_array_t);
130*ae771770SStanislav Sedov heim_object_t
131*ae771770SStanislav Sedov 	heim_array_copy_value(heim_array_t, size_t);
132*ae771770SStanislav Sedov void	heim_array_delete_value(heim_array_t, size_t);
133*ae771770SStanislav Sedov #ifdef __BLOCKS__
134*ae771770SStanislav Sedov void	heim_array_filter(heim_array_t, int (^)(heim_object_t));
135*ae771770SStanislav Sedov #endif
136*ae771770SStanislav Sedov 
137*ae771770SStanislav Sedov /*
138*ae771770SStanislav Sedov  * Dict
139*ae771770SStanislav Sedov  */
140*ae771770SStanislav Sedov 
141*ae771770SStanislav Sedov typedef struct heim_dict_data *heim_dict_t;
142*ae771770SStanislav Sedov 
143*ae771770SStanislav Sedov heim_dict_t heim_dict_create(size_t size);
144*ae771770SStanislav Sedov heim_tid_t heim_dict_get_type_id(void);
145*ae771770SStanislav Sedov 
146*ae771770SStanislav Sedov typedef void (*heim_dict_iterator_f_t)(heim_object_t, heim_object_t, void *);
147*ae771770SStanislav Sedov 
148*ae771770SStanislav Sedov int	heim_dict_add_value(heim_dict_t, heim_object_t, heim_object_t);
149*ae771770SStanislav Sedov void	heim_dict_iterate_f(heim_dict_t, heim_dict_iterator_f_t, void *);
150*ae771770SStanislav Sedov #ifdef __BLOCKS__
151*ae771770SStanislav Sedov void	heim_dict_iterate(heim_dict_t, void (^)(heim_object_t, heim_object_t));
152*ae771770SStanislav Sedov #endif
153*ae771770SStanislav Sedov 
154*ae771770SStanislav Sedov heim_object_t
155*ae771770SStanislav Sedov 	heim_dict_copy_value(heim_dict_t, heim_object_t);
156*ae771770SStanislav Sedov void	heim_dict_delete_key(heim_dict_t, heim_object_t);
157*ae771770SStanislav Sedov 
158*ae771770SStanislav Sedov /*
159*ae771770SStanislav Sedov  * String
160*ae771770SStanislav Sedov  */
161*ae771770SStanislav Sedov 
162*ae771770SStanislav Sedov typedef struct heim_string_data *heim_string_t;
163*ae771770SStanislav Sedov 
164*ae771770SStanislav Sedov heim_string_t heim_string_create(const char *);
165*ae771770SStanislav Sedov heim_tid_t heim_string_get_type_id(void);
166*ae771770SStanislav Sedov const char * heim_string_get_utf8(heim_string_t);
167*ae771770SStanislav Sedov 
168*ae771770SStanislav Sedov /*
169*ae771770SStanislav Sedov  * Number
170*ae771770SStanislav Sedov  */
171*ae771770SStanislav Sedov 
172*ae771770SStanislav Sedov typedef struct heim_number_data *heim_number_t;
173*ae771770SStanislav Sedov 
174*ae771770SStanislav Sedov heim_number_t heim_number_create(int);
175*ae771770SStanislav Sedov heim_tid_t heim_number_get_type_id(void);
176*ae771770SStanislav Sedov int heim_number_get_int(heim_number_t);
177*ae771770SStanislav Sedov 
178*ae771770SStanislav Sedov /*
179*ae771770SStanislav Sedov  *
180*ae771770SStanislav Sedov  */
181*ae771770SStanislav Sedov 
182*ae771770SStanislav Sedov typedef struct heim_auto_release * heim_auto_release_t;
183*ae771770SStanislav Sedov 
184*ae771770SStanislav Sedov heim_auto_release_t heim_auto_release_create(void);
185*ae771770SStanislav Sedov void heim_auto_release_drain(heim_auto_release_t);
186*ae771770SStanislav Sedov void heim_auto_release(heim_object_t);
187*ae771770SStanislav Sedov 
188*ae771770SStanislav Sedov #endif /* HEIM_BASE_H */
189