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