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