xref: /freebsd/krb5/lib/gssapi/errmap.h (revision ee3960cba1068e12fb032a68c46d74841d9edab3)
1*ee3960cbSCy Schubert /*
2*ee3960cbSCy Schubert  * This file is generated, please don't edit it.
3*ee3960cbSCy Schubert  * script: ../../../util/gen.pl
4*ee3960cbSCy Schubert  * args:   bimap errmap.h NAME=mecherrmap LEFT=OM_uint32 RIGHT=struct mecherror LEFTPRINT=print_OM_uint32 RIGHTPRINT=mecherror_print LEFTCMP=cmp_OM_uint32 RIGHTCMP=mecherror_cmp
5*ee3960cbSCy Schubert  * The rest of this file is copied from a template, with
6*ee3960cbSCy Schubert  * substitutions.  See the template for copyright info.
7*ee3960cbSCy Schubert  */
8*ee3960cbSCy Schubert /* start of t_bimap header template */
9*ee3960cbSCy Schubert /*
10*ee3960cbSCy Schubert  * bidirectional mapping table, add-only
11*ee3960cbSCy Schubert  *
12*ee3960cbSCy Schubert  * Parameters:
13*ee3960cbSCy Schubert  * NAME
14*ee3960cbSCy Schubert  * LEFT, RIGHT - types
15*ee3960cbSCy Schubert  * LEFTCMP, RIGHTCMP - comparison functions
16*ee3960cbSCy Schubert  *
17*ee3960cbSCy Schubert  * Methods:
18*ee3960cbSCy Schubert  * int init() - nonzero is error code, if any possible
19*ee3960cbSCy Schubert  * long size()
20*ee3960cbSCy Schubert  * void foreach(int (*)(LEFT, RIGHT, void*), void*)
21*ee3960cbSCy Schubert  * int add(LEFT, RIGHT) - 0 = success, -1 = allocation failure
22*ee3960cbSCy Schubert  * const struct mecherror *findleft(OM_uint32) - null iff not found
23*ee3960cbSCy Schubert  * const OM_uint32 *findright(struct mecherror)
24*ee3960cbSCy Schubert  * void destroy() - destroys container, doesn't delete elements
25*ee3960cbSCy Schubert  *
26*ee3960cbSCy Schubert  * initial implementation: flat array of (left,right) pairs
27*ee3960cbSCy Schubert  */
28*ee3960cbSCy Schubert 
29*ee3960cbSCy Schubert struct mecherrmap__pair {
30*ee3960cbSCy Schubert     OM_uint32 l;
31*ee3960cbSCy Schubert     struct mecherror r;
32*ee3960cbSCy Schubert };
33*ee3960cbSCy Schubert /* end of t_bimap header template */
34*ee3960cbSCy Schubert /* start of t_array template */
35*ee3960cbSCy Schubert 
36*ee3960cbSCy Schubert /*
37*ee3960cbSCy Schubert  * array type, derived from template
38*ee3960cbSCy Schubert  *
39*ee3960cbSCy Schubert  * parameters:
40*ee3960cbSCy Schubert  * NAME: mecherrmap__pairarray
41*ee3960cbSCy Schubert  * TYPE: struct mecherrmap__pair
42*ee3960cbSCy Schubert  *
43*ee3960cbSCy Schubert  * methods:
44*ee3960cbSCy Schubert  * int init() -> nonzero if fail initial allocation
45*ee3960cbSCy Schubert  * unsigned long size() -> nonnegative number of values stored
46*ee3960cbSCy Schubert  * int grow(newsize) -> negative if fail allocation, memset(,0,) new space
47*ee3960cbSCy Schubert  * struct mecherrmap__pair *getaddr(idx) -> aborts if out of range
48*ee3960cbSCy Schubert  * void set(idx, value) -> aborts if out of range
49*ee3960cbSCy Schubert  * struct mecherrmap__pair get(idx) -> value, or aborts if out of range
50*ee3960cbSCy Schubert  */
51*ee3960cbSCy Schubert 
52*ee3960cbSCy Schubert #include <stdlib.h>
53*ee3960cbSCy Schubert #include <errno.h>
54*ee3960cbSCy Schubert #include <limits.h>
55*ee3960cbSCy Schubert #include <string.h>
56*ee3960cbSCy Schubert #include <stdint.h>
57*ee3960cbSCy Schubert 
58*ee3960cbSCy Schubert struct mecherrmap__pairarray__header {
59*ee3960cbSCy Schubert     size_t allocated;
60*ee3960cbSCy Schubert     struct mecherrmap__pair *elts;
61*ee3960cbSCy Schubert };
62*ee3960cbSCy Schubert typedef struct mecherrmap__pairarray__header mecherrmap__pairarray;
63*ee3960cbSCy Schubert 
64*ee3960cbSCy Schubert static inline int
mecherrmap__pairarray_init(mecherrmap__pairarray * arr)65*ee3960cbSCy Schubert mecherrmap__pairarray_init(mecherrmap__pairarray *arr)
66*ee3960cbSCy Schubert {
67*ee3960cbSCy Schubert     arr->elts = calloc(10, sizeof(struct mecherrmap__pair));
68*ee3960cbSCy Schubert     if (arr->elts == NULL)
69*ee3960cbSCy Schubert 	return ENOMEM;
70*ee3960cbSCy Schubert     arr->allocated = 10;
71*ee3960cbSCy Schubert     return 0;
72*ee3960cbSCy Schubert }
73*ee3960cbSCy Schubert 
74*ee3960cbSCy Schubert static inline long
mecherrmap__pairarray_size(mecherrmap__pairarray * arr)75*ee3960cbSCy Schubert mecherrmap__pairarray_size(mecherrmap__pairarray *arr)
76*ee3960cbSCy Schubert {
77*ee3960cbSCy Schubert     return arr->allocated;
78*ee3960cbSCy Schubert }
79*ee3960cbSCy Schubert 
80*ee3960cbSCy Schubert static inline unsigned long
mecherrmap__pairarray_max_size(mecherrmap__pairarray * arr)81*ee3960cbSCy Schubert mecherrmap__pairarray_max_size(mecherrmap__pairarray *arr)
82*ee3960cbSCy Schubert {
83*ee3960cbSCy Schubert     size_t upper_bound;
84*ee3960cbSCy Schubert 
85*ee3960cbSCy Schubert     upper_bound = SIZE_MAX / sizeof(*arr->elts);
86*ee3960cbSCy Schubert     if (upper_bound > ULONG_MAX)
87*ee3960cbSCy Schubert 	upper_bound = ULONG_MAX;
88*ee3960cbSCy Schubert     return (unsigned long) upper_bound;
89*ee3960cbSCy Schubert }
90*ee3960cbSCy Schubert 
91*ee3960cbSCy Schubert static inline int
mecherrmap__pairarray_grow(mecherrmap__pairarray * arr,unsigned long newcount)92*ee3960cbSCy Schubert mecherrmap__pairarray_grow(mecherrmap__pairarray *arr, unsigned long newcount)
93*ee3960cbSCy Schubert {
94*ee3960cbSCy Schubert     size_t oldsize = sizeof(*arr->elts) * arr->allocated;
95*ee3960cbSCy Schubert     size_t newsize;
96*ee3960cbSCy Schubert     void *ptr;
97*ee3960cbSCy Schubert 
98*ee3960cbSCy Schubert     if (newcount > LONG_MAX)
99*ee3960cbSCy Schubert 	return -1;
100*ee3960cbSCy Schubert     if (newcount < arr->allocated)
101*ee3960cbSCy Schubert 	return 0;
102*ee3960cbSCy Schubert     if (newcount > mecherrmap__pairarray_max_size(arr))
103*ee3960cbSCy Schubert 	return -1;
104*ee3960cbSCy Schubert 
105*ee3960cbSCy Schubert     newsize = sizeof(*arr->elts) * newcount;
106*ee3960cbSCy Schubert     ptr = realloc(arr->elts, newsize);
107*ee3960cbSCy Schubert     if (ptr == NULL)
108*ee3960cbSCy Schubert 	return -1;
109*ee3960cbSCy Schubert     memset((char *)ptr + oldsize, 0, newsize - oldsize);
110*ee3960cbSCy Schubert     arr->elts = ptr;
111*ee3960cbSCy Schubert     arr->allocated = newcount;
112*ee3960cbSCy Schubert     return 0;
113*ee3960cbSCy Schubert }
114*ee3960cbSCy Schubert 
115*ee3960cbSCy Schubert static inline struct mecherrmap__pair *
mecherrmap__pairarray_getaddr(mecherrmap__pairarray * arr,long idx)116*ee3960cbSCy Schubert mecherrmap__pairarray_getaddr (mecherrmap__pairarray *arr, long idx)
117*ee3960cbSCy Schubert {
118*ee3960cbSCy Schubert     if (idx < 0 || (unsigned long) idx >= arr->allocated)
119*ee3960cbSCy Schubert 	abort();
120*ee3960cbSCy Schubert     return arr->elts + idx;
121*ee3960cbSCy Schubert }
122*ee3960cbSCy Schubert 
123*ee3960cbSCy Schubert static inline void
mecherrmap__pairarray_set(mecherrmap__pairarray * arr,long idx,struct mecherrmap__pair value)124*ee3960cbSCy Schubert mecherrmap__pairarray_set (mecherrmap__pairarray *arr, long idx, struct mecherrmap__pair value)
125*ee3960cbSCy Schubert {
126*ee3960cbSCy Schubert     struct mecherrmap__pair *newvalp;
127*ee3960cbSCy Schubert     newvalp = mecherrmap__pairarray_getaddr(arr, idx);
128*ee3960cbSCy Schubert     *newvalp = value;
129*ee3960cbSCy Schubert }
130*ee3960cbSCy Schubert 
131*ee3960cbSCy Schubert static inline struct mecherrmap__pair
mecherrmap__pairarray_get(mecherrmap__pairarray * arr,long idx)132*ee3960cbSCy Schubert mecherrmap__pairarray_get (mecherrmap__pairarray *arr, long idx)
133*ee3960cbSCy Schubert {
134*ee3960cbSCy Schubert     return *mecherrmap__pairarray_getaddr(arr, idx);
135*ee3960cbSCy Schubert }
136*ee3960cbSCy Schubert 
137*ee3960cbSCy Schubert static inline void
mecherrmap__pairarray_destroy(mecherrmap__pairarray * arr)138*ee3960cbSCy Schubert mecherrmap__pairarray_destroy (mecherrmap__pairarray *arr)
139*ee3960cbSCy Schubert {
140*ee3960cbSCy Schubert     free(arr->elts);
141*ee3960cbSCy Schubert     arr->elts = 0;
142*ee3960cbSCy Schubert }
143*ee3960cbSCy Schubert /* end of t_array template */
144*ee3960cbSCy Schubert /* start of t_bimap body template */
145*ee3960cbSCy Schubert 
146*ee3960cbSCy Schubert /* for use in cases where text substitutions may not work, like putting
147*ee3960cbSCy Schubert    "const" before a type that turns out to be "char *"  */
148*ee3960cbSCy Schubert typedef OM_uint32 mecherrmap__left_t;
149*ee3960cbSCy Schubert typedef struct mecherror mecherrmap__right_t;
150*ee3960cbSCy Schubert 
151*ee3960cbSCy Schubert typedef struct {
152*ee3960cbSCy Schubert     mecherrmap__pairarray a;
153*ee3960cbSCy Schubert     long nextidx;
154*ee3960cbSCy Schubert } mecherrmap;
155*ee3960cbSCy Schubert 
156*ee3960cbSCy Schubert static inline int
mecherrmap_init(mecherrmap * m)157*ee3960cbSCy Schubert mecherrmap_init (mecherrmap *m)
158*ee3960cbSCy Schubert {
159*ee3960cbSCy Schubert     m->nextidx = 0;
160*ee3960cbSCy Schubert     return mecherrmap__pairarray_init (&m->a);
161*ee3960cbSCy Schubert }
162*ee3960cbSCy Schubert 
163*ee3960cbSCy Schubert static inline long
mecherrmap_size(mecherrmap * m)164*ee3960cbSCy Schubert mecherrmap_size (mecherrmap *m)
165*ee3960cbSCy Schubert {
166*ee3960cbSCy Schubert     return mecherrmap__pairarray_size (&m->a);
167*ee3960cbSCy Schubert }
168*ee3960cbSCy Schubert 
169*ee3960cbSCy Schubert static inline void
mecherrmap_foreach(mecherrmap * m,int (* fn)(OM_uint32,struct mecherror,void *),void * p)170*ee3960cbSCy Schubert mecherrmap_foreach (mecherrmap *m, int (*fn)(OM_uint32, struct mecherror, void *), void *p)
171*ee3960cbSCy Schubert {
172*ee3960cbSCy Schubert     long i, sz;
173*ee3960cbSCy Schubert     sz = m->nextidx;
174*ee3960cbSCy Schubert     for (i = 0; i < sz; i++) {
175*ee3960cbSCy Schubert 	struct mecherrmap__pair *pair;
176*ee3960cbSCy Schubert 	pair = mecherrmap__pairarray_getaddr (&m->a, i);
177*ee3960cbSCy Schubert 	if ((*fn)(pair->l, pair->r, p) != 0)
178*ee3960cbSCy Schubert 	    break;
179*ee3960cbSCy Schubert     }
180*ee3960cbSCy Schubert }
181*ee3960cbSCy Schubert 
182*ee3960cbSCy Schubert static inline int
mecherrmap_add(mecherrmap * m,OM_uint32 l,struct mecherror r)183*ee3960cbSCy Schubert mecherrmap_add (mecherrmap *m, OM_uint32 l, struct mecherror r)
184*ee3960cbSCy Schubert {
185*ee3960cbSCy Schubert     long i, sz;
186*ee3960cbSCy Schubert     struct mecherrmap__pair newpair;
187*ee3960cbSCy Schubert     int err;
188*ee3960cbSCy Schubert 
189*ee3960cbSCy Schubert     sz = m->nextidx;
190*ee3960cbSCy Schubert     /* Make sure we're not duplicating.  */
191*ee3960cbSCy Schubert     for (i = 0; i < sz; i++) {
192*ee3960cbSCy Schubert 	struct mecherrmap__pair *pair;
193*ee3960cbSCy Schubert 	pair = mecherrmap__pairarray_getaddr (&m->a, i);
194*ee3960cbSCy Schubert 	assert ((*cmp_OM_uint32)(l, pair->l) != 0);
195*ee3960cbSCy Schubert 	if ((*cmp_OM_uint32)(l, pair->l) == 0)
196*ee3960cbSCy Schubert 	    abort();
197*ee3960cbSCy Schubert 	assert ((*mecherror_cmp)(r, pair->r) != 0);
198*ee3960cbSCy Schubert 	if ((*mecherror_cmp)(r, pair->r) == 0)
199*ee3960cbSCy Schubert 	    abort();
200*ee3960cbSCy Schubert     }
201*ee3960cbSCy Schubert     newpair.l = l;
202*ee3960cbSCy Schubert     newpair.r = r;
203*ee3960cbSCy Schubert     if (sz >= LONG_MAX - 1)
204*ee3960cbSCy Schubert 	return ENOMEM;
205*ee3960cbSCy Schubert     err = mecherrmap__pairarray_grow (&m->a, sz+1);
206*ee3960cbSCy Schubert     if (err)
207*ee3960cbSCy Schubert 	return err;
208*ee3960cbSCy Schubert     mecherrmap__pairarray_set (&m->a, sz, newpair);
209*ee3960cbSCy Schubert     m->nextidx++;
210*ee3960cbSCy Schubert     return 0;
211*ee3960cbSCy Schubert }
212*ee3960cbSCy Schubert 
213*ee3960cbSCy Schubert static inline const mecherrmap__right_t *
mecherrmap_findleft(mecherrmap * m,OM_uint32 l)214*ee3960cbSCy Schubert mecherrmap_findleft (mecherrmap *m, OM_uint32 l)
215*ee3960cbSCy Schubert {
216*ee3960cbSCy Schubert     long i, sz;
217*ee3960cbSCy Schubert     sz = mecherrmap_size (m);
218*ee3960cbSCy Schubert     for (i = 0; i < sz; i++) {
219*ee3960cbSCy Schubert 	struct mecherrmap__pair *pair;
220*ee3960cbSCy Schubert 	pair = mecherrmap__pairarray_getaddr (&m->a, i);
221*ee3960cbSCy Schubert 	if ((*cmp_OM_uint32)(l, pair->l) == 0)
222*ee3960cbSCy Schubert 	    return &pair->r;
223*ee3960cbSCy Schubert     }
224*ee3960cbSCy Schubert     return 0;
225*ee3960cbSCy Schubert }
226*ee3960cbSCy Schubert 
227*ee3960cbSCy Schubert static inline const mecherrmap__left_t *
mecherrmap_findright(mecherrmap * m,struct mecherror r)228*ee3960cbSCy Schubert mecherrmap_findright (mecherrmap *m, struct mecherror r)
229*ee3960cbSCy Schubert {
230*ee3960cbSCy Schubert     long i, sz;
231*ee3960cbSCy Schubert     sz = mecherrmap_size (m);
232*ee3960cbSCy Schubert     for (i = 0; i < sz; i++) {
233*ee3960cbSCy Schubert 	struct mecherrmap__pair *pair;
234*ee3960cbSCy Schubert 	pair = mecherrmap__pairarray_getaddr (&m->a, i);
235*ee3960cbSCy Schubert 	if ((*mecherror_cmp)(r, pair->r) == 0)
236*ee3960cbSCy Schubert 	    return &pair->l;
237*ee3960cbSCy Schubert     }
238*ee3960cbSCy Schubert     return 0;
239*ee3960cbSCy Schubert }
240*ee3960cbSCy Schubert 
241*ee3960cbSCy Schubert struct mecherrmap__printstat {
242*ee3960cbSCy Schubert     FILE *f;
243*ee3960cbSCy Schubert     int comma;
244*ee3960cbSCy Schubert };
245*ee3960cbSCy Schubert static inline int
mecherrmap__printone(OM_uint32 l,struct mecherror r,void * p)246*ee3960cbSCy Schubert mecherrmap__printone (OM_uint32 l, struct mecherror r, void *p)
247*ee3960cbSCy Schubert {
248*ee3960cbSCy Schubert     struct mecherrmap__printstat *ps = p;
249*ee3960cbSCy Schubert     fprintf(ps->f, ps->comma ? ", (" : "(");
250*ee3960cbSCy Schubert     ps->comma = 1;
251*ee3960cbSCy Schubert     (*print_OM_uint32)(l, ps->f);
252*ee3960cbSCy Schubert     fprintf(ps->f, ",");
253*ee3960cbSCy Schubert     (*mecherror_print)(r, ps->f);
254*ee3960cbSCy Schubert     fprintf(ps->f, ")");
255*ee3960cbSCy Schubert     return 0;
256*ee3960cbSCy Schubert }
257*ee3960cbSCy Schubert 
258*ee3960cbSCy Schubert static inline void
mecherrmap_printmap(mecherrmap * m,FILE * f)259*ee3960cbSCy Schubert mecherrmap_printmap (mecherrmap *m, FILE *f)
260*ee3960cbSCy Schubert {
261*ee3960cbSCy Schubert     struct mecherrmap__printstat ps;
262*ee3960cbSCy Schubert     ps.comma = 0;
263*ee3960cbSCy Schubert     ps.f = f;
264*ee3960cbSCy Schubert     fprintf(f, "(");
265*ee3960cbSCy Schubert     mecherrmap_foreach (m, mecherrmap__printone, &ps);
266*ee3960cbSCy Schubert     fprintf(f, ")");
267*ee3960cbSCy Schubert }
268*ee3960cbSCy Schubert 
269*ee3960cbSCy Schubert static inline void
mecherrmap_destroy(mecherrmap * m)270*ee3960cbSCy Schubert mecherrmap_destroy (mecherrmap *m)
271*ee3960cbSCy Schubert {
272*ee3960cbSCy Schubert     mecherrmap__pairarray_destroy (&m->a);
273*ee3960cbSCy Schubert }
274*ee3960cbSCy Schubert /* end of t_bimap body template */
275