/* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. */ /* * This file is generated, please don't edit it. * script: ./../../../util/gen-map.pl * args: * -oerror_map.new * NAME=gsserrmap * KEY=OM_uint32 * VALUE=char * * COMPARE=compare_OM_uint32 * FREEVALUE=free_string * The rest of this file is copied from a template, with * substitutions. See the template for copyright info. */ /* * map, generated from template * map name: gsserrmap * key: OM_uint32 * value: char * * compare: compare_OM_uint32 * copy_key: 0 * free_key: 0 * free_value: free_string */ struct gsserrmap__element { OM_uint32 key; char * value; struct gsserrmap__element *next; }; struct gsserrmap__head { struct gsserrmap__element *first; }; typedef struct gsserrmap__head gsserrmap; static inline int gsserrmap_init (struct gsserrmap__head *head) { head->first = NULL; return 0; } static inline void gsserrmap_destroy (struct gsserrmap__head *head) { struct gsserrmap__element *e, *e_next; void (*free_key)(OM_uint32) = 0; void (*free_value)(char *) = free_string; for (e = head->first; e; e = e_next) { e_next = e->next; if (free_key) (*free_key)(e->key); if (free_value) (*free_value)(e->value); free(e); } head->first = NULL; } /* Returns pointer to linked-list entry, or null if key not found. */ static inline struct gsserrmap__element * gsserrmap__find_node (struct gsserrmap__head *head, OM_uint32 key) { struct gsserrmap__element *e; for (e = head->first; e; e = e->next) if (compare_OM_uint32 (key, e->key) == 0) return e; return 0; } /* Returns pointer to value, or null if key not found. */ static inline char * * gsserrmap_find (struct gsserrmap__head *head, OM_uint32 key) { struct gsserrmap__element *e = gsserrmap__find_node(head, key); if (e) return &e->value; return 0; } /* Returns 0 or error code. */ static inline int gsserrmap__copy_key (OM_uint32 *out, OM_uint32 in) { int (*copykey)(OM_uint32 *, OM_uint32) = 0; if (copykey == 0) { *out = in; return 0; } else return (*copykey)(out, in); } /* Returns 0 or error code. */ static inline int gsserrmap_replace_or_insert (struct gsserrmap__head *head, OM_uint32 key, char * new_value) { struct gsserrmap__element *e = gsserrmap__find_node(head, key); int ret; if (e) { /* replace */ void (*free_value)(char *) = free_string; if (free_value) (*free_value)(e->value); e->value = new_value; } else { /* insert */ e = malloc(sizeof(*e)); if (e == NULL) return ENOMEM; ret = gsserrmap__copy_key (&e->key, key); if (ret) { free(e); return ret; } e->value = new_value; e->next = head->first; head->first = e; } return 0; }