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; 33 static inline int gsserrmap_init (struct gsserrmap__head *head) 34 { 35 head->first = NULL; 36 return 0; 37 } 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 * 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 * * 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 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 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