1 /* $NetBSD: nvtable.c,v 1.1.1.1 2009/06/23 10:09:00 tron Exp $ */ 2 3 /*++ 4 /* NAME 5 /* nvtable 3 6 /* SUMMARY 7 /* attribute list manager 8 /* SYNOPSIS 9 /* #include <nvtable.h> 10 /* 11 /* typedef struct { 12 /* .in +4 13 /* char *key; 14 /* char *value; 15 /* /* private fields... */ 16 /* .in -4 17 /* } NVTABLE_INFO; 18 /* 19 /* NVTABLE *nvtable_create(size) 20 /* int size; 21 /* 22 /* NVTABLE_INFO *nvtable_update(table, key, value) 23 /* NVTABLE *table; 24 /* const char *key; 25 /* const char *value; 26 /* 27 /* char *nvtable_find(table, key) 28 /* NVTABLE *table; 29 /* const char *key; 30 /* 31 /* NVTABLE_INFO *nvtable_locate(table, key) 32 /* NVTABLE *table; 33 /* const char *key; 34 /* 35 /* void nvtable_delete(table, key) 36 /* NVTABLE *table; 37 /* const char *key; 38 /* 39 /* void nvtable_free(table) 40 /* NVTABLE *table; 41 /* 42 /* void nvtable_walk(table, action, ptr) 43 /* NVTABLE *table; 44 /* void (*action)(NVTABLE_INFO *, char *ptr); 45 /* char *ptr; 46 /* 47 /* NVTABLE_INFO **nvtable_list(table) 48 /* NVTABLE *table; 49 /* DESCRIPTION 50 /* This module maintains one or more attribute lists. It provides a 51 /* more convenient interface than hash tables, although it uses the 52 /* same underlying implementation. Each attribute list entry consists 53 /* of a unique string-valued lookup key and a string value. 54 /* 55 /* nvtable_create() creates a table of the specified size and returns a 56 /* pointer to the result. 57 /* 58 /* nvtable_update() stores or updates a (key, value) pair in the specified 59 /* table and returns a pointer to the resulting entry. The key and the 60 /* value are copied. 61 /* 62 /* nvtable_find() returns the value that was stored under the given key, 63 /* or a null pointer if it was not found. In order to distinguish 64 /* a null value from a non-existent value, use nvtable_locate(). 65 /* 66 /* nvtable_locate() returns a pointer to the entry that was stored 67 /* for the given key, or a null pointer if it was not found. 68 /* 69 /* nvtable_delete() removes one entry that was stored under the given key. 70 /* 71 /* nvtable_free() destroys a hash table, including contents. 72 /* 73 /* nvtable_walk() invokes the action function for each table entry, with 74 /* a pointer to the entry as its argument. The ptr argument is passed 75 /* on to the action function. 76 /* 77 /* nvtable_list() returns a null-terminated list of pointers to 78 /* all elements in the named table. The list should be passed to 79 /* myfree(). 80 /* RESTRICTIONS 81 /* A callback function should not modify the attribute list that is 82 /* specified to its caller. 83 /* DIAGNOSTICS 84 /* The following conditions are reported and cause the program to 85 /* terminate immediately: memory allocation failure; an attempt 86 /* to delete a non-existent entry. 87 /* SEE ALSO 88 /* mymalloc(3) memory management wrapper 89 /* htable(3) hash table manager 90 /* LICENSE 91 /* .ad 92 /* .fi 93 /* The Secure Mailer license must be distributed with this software. 94 /* AUTHOR(S) 95 /* Wietse Venema 96 /* IBM T.J. Watson Research 97 /* P.O. Box 704 98 /* Yorktown Heights, NY 10598, USA 99 /*--*/ 100 101 /* C library */ 102 103 #include <sys_defs.h> 104 105 /* Utility library. */ 106 107 #include <mymalloc.h> 108 #include <htable.h> 109 #include <nvtable.h> 110 111 /* nvtable_update - update or enter (key, value) pair */ 112 113 NVTABLE_INFO *nvtable_update(NVTABLE * table, const char *key, const char *value) 114 { 115 NVTABLE_INFO *ht; 116 117 if ((ht = htable_locate(table, key)) != 0) { 118 myfree(ht->value); 119 } else { 120 ht = htable_enter(table, key, (char *) 0); 121 } 122 ht->value = mystrdup(value); 123 return (ht); 124 } 125