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