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