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