#!perl -w use ktemplate; # List of parameters accepted for substitution. @parms = qw(NAME KEY VALUE COMPARE COPYKEY FREEKEY FREEVALUE); # Defaults, if any. $parm{"COPYKEY"} = "0"; $parm{"FREEKEY"} = "0"; $parm{"FREEVALUE"} = "0"; # &run; # __DATA__ /* * map, generated from template * map name: * key: * value: * compare: * copy_key: * free_key: * free_value: */ struct __element { key; value; struct __element *next; }; struct __head { struct __element *first; }; typedef struct __head ; static inline int _init (struct __head *head) { head->first = NULL; return 0; } static inline void _destroy (struct __head *head) { struct __element *e, *e_next; void (*free_key)() = ; void (*free_value)() = ; 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 __element * __find_node (struct __head *head, key) { struct __element *e; for (e = head->first; e; e = e->next) if ( (key, e->key) == 0) return e; return 0; } /* Returns pointer to value, or null if key not found. */ static inline * _find (struct __head *head, key) { struct __element *e = __find_node(head, key); if (e) return &e->value; return 0; } /* Returns 0 or error code. */ static inline int __copy_key ( *out, in) { int (*copykey)( *, ) = ; if (copykey == 0) { *out = in; return 0; } else return (*copykey)(out, in); } /* Returns 0 or error code. */ static inline int _replace_or_insert (struct __head *head, key, new_value) { struct __element *e = __find_node(head, key); int ret; if (e) { /* replace */ void (*free_value)() = ; if (free_value) (*free_value)(e->value); e->value = new_value; } else { /* insert */ e = malloc(sizeof(*e)); if (e == NULL) return ENOMEM; ret = __copy_key (&e->key, key); if (ret) { free(e); return ret; } e->value = new_value; e->next = head->first; head->first = e; } return 0; }