xref: /freebsd/krb5/lib/gssapi/error_map.h (revision ee3960cba1068e12fb032a68c46d74841d9edab3)
1 /*
2  * This file is generated, please don't edit it.
3  * script: ../../../util/gen-map.pl
4  * args:
5  *	-oerror_map.new
6  *	NAME=gsserrmap
7  *	KEY=OM_uint32
8  *	VALUE=char *
9  *	COMPARE=compare_OM_uint32
10  *	FREEVALUE=free_string
11  * The rest of this file is copied from a template, with
12  * substitutions.  See the template for copyright info.
13  */
14 /*
15  * map, generated from template
16  * map name: gsserrmap
17  * key: OM_uint32
18  * value: char *
19  * compare: compare_OM_uint32
20  * copy_key: 0
21  * free_key: 0
22  * free_value: free_string
23  */
24 struct gsserrmap__element {
25     OM_uint32 key;
26     char * value;
27     struct gsserrmap__element *next;
28 };
29 struct gsserrmap__head {
30     struct gsserrmap__element *first;
31 };
32 typedef struct gsserrmap__head gsserrmap;
gsserrmap_init(struct gsserrmap__head * head)33 static inline int gsserrmap_init (struct gsserrmap__head *head)
34 {
35     head->first = NULL;
36     return 0;
37 }
gsserrmap_destroy(struct gsserrmap__head * head)38 static inline void gsserrmap_destroy (struct gsserrmap__head *head)
39 {
40     struct gsserrmap__element *e, *e_next;
41     void (*free_key)(OM_uint32) = 0;
42     void (*free_value)(char *) = free_string;
43     for (e = head->first; e; e = e_next) {
44 	e_next = e->next;
45 	if (free_key)
46 	    (*free_key)(e->key);
47 	if (free_value)
48 	    (*free_value)(e->value);
49 	free(e);
50     }
51     head->first = NULL;
52 }
53 /* Returns pointer to linked-list entry, or null if key not found.  */
54 static inline struct gsserrmap__element *
gsserrmap__find_node(struct gsserrmap__head * head,OM_uint32 key)55 gsserrmap__find_node (struct gsserrmap__head *head, OM_uint32 key)
56 {
57     struct gsserrmap__element *e;
58     for (e = head->first; e; e = e->next)
59 	if (compare_OM_uint32 (key, e->key) == 0)
60 	    return e;
61     return 0;
62 }
63 /* Returns pointer to value, or null if key not found.  */
64 static inline char * *
gsserrmap_find(struct gsserrmap__head * head,OM_uint32 key)65 gsserrmap_find (struct gsserrmap__head *head, OM_uint32 key)
66 {
67     struct gsserrmap__element *e = gsserrmap__find_node(head, key);
68     if (e)
69 	return &e->value;
70     return 0;
71 }
72 /* Returns 0 or error code.  */
73 static inline int
gsserrmap__copy_key(OM_uint32 * out,OM_uint32 in)74 gsserrmap__copy_key (OM_uint32 *out, OM_uint32 in)
75 {
76     int (*copykey)(OM_uint32 *, OM_uint32) = 0;
77     if (copykey == 0) {
78 	*out = in;
79 	return 0;
80     } else
81 	return (*copykey)(out, in);
82 }
83 /* Returns 0 or error code.  */
84 static inline int
gsserrmap_replace_or_insert(struct gsserrmap__head * head,OM_uint32 key,char * new_value)85 gsserrmap_replace_or_insert (struct gsserrmap__head *head,
86 			  OM_uint32 key, char * new_value)
87 {
88     struct gsserrmap__element *e = gsserrmap__find_node(head, key);
89     int ret;
90 
91     if (e) {
92 	/* replace */
93 	void (*free_value)(char *) = free_string;
94 	if (free_value)
95 	    (*free_value)(e->value);
96 	e->value = new_value;
97     } else {
98 	/* insert */
99 	e = malloc(sizeof(*e));
100 	if (e == NULL)
101 	    return ENOMEM;
102 	ret = gsserrmap__copy_key (&e->key, key);
103 	if (ret) {
104 	    free(e);
105 	    return ret;
106 	}
107 	e->value = new_value;
108 	e->next = head->first;
109 	head->first = e;
110     }
111     return 0;
112 }
113