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 */ 25struct gsserrmap__element { 26 OM_uint32 key; 27 char * value; 28 struct gsserrmap__element *next; 29}; 30struct gsserrmap__head { 31 struct gsserrmap__element *first; 32}; 33typedef struct gsserrmap__head gsserrmap; 34static inline int gsserrmap_init (struct gsserrmap__head *head) 35{ 36 head->first = NULL; 37 return 0; 38} 39static 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. */ 55static inline struct gsserrmap__element * 56gsserrmap__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. */ 65static inline char * * 66gsserrmap_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. */ 74static inline int 75gsserrmap__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. */ 85static inline int 86gsserrmap_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