/*++ /* NAME /* nvtable 3 /* SUMMARY /* attribute list manager /* SYNOPSIS /* #include /* /* typedef struct { /* .in +4 /* char *key; /* char *value; /* /* private fields... */ /* .in -4 /* } NVTABLE_INFO; /* /* NVTABLE *nvtable_create(size) /* int size; /* /* NVTABLE_INFO *nvtable_update(table, key, value) /* NVTABLE *table; /* const char *key; /* const char *value; /* /* char *nvtable_find(table, key) /* NVTABLE *table; /* const char *key; /* /* NVTABLE_INFO *nvtable_locate(table, key) /* NVTABLE *table; /* const char *key; /* /* void nvtable_delete(table, key) /* NVTABLE *table; /* const char *key; /* /* void nvtable_free(table) /* NVTABLE *table; /* /* void nvtable_walk(table, action, ptr) /* NVTABLE *table; /* void (*action)(NVTABLE_INFO *, char *ptr); /* char *ptr; /* /* NVTABLE_INFO **nvtable_list(table) /* NVTABLE *table; /* DESCRIPTION /* This module maintains one or more attribute lists. It provides a /* more convenient interface than hash tables, although it uses the /* same underlying implementation. Each attribute list entry consists /* of a unique string-valued lookup key and a string value. /* /* nvtable_create() creates a table of the specified size and returns a /* pointer to the result. /* /* nvtable_update() stores or updates a (key, value) pair in the specified /* table and returns a pointer to the resulting entry. The key and the /* value are copied. /* /* nvtable_find() returns the value that was stored under the given key, /* or a null pointer if it was not found. In order to distinguish /* a null value from a non-existent value, use nvtable_locate(). /* /* nvtable_locate() returns a pointer to the entry that was stored /* for the given key, or a null pointer if it was not found. /* /* nvtable_delete() removes one entry that was stored under the given key. /* /* nvtable_free() destroys a hash table, including contents. /* /* nvtable_walk() invokes the action function for each table entry, with /* a pointer to the entry as its argument. The ptr argument is passed /* on to the action function. /* /* nvtable_list() returns a null-terminated list of pointers to /* all elements in the named table. The list should be passed to /* myfree(). /* RESTRICTIONS /* A callback function should not modify the attribute list that is /* specified to its caller. /* DIAGNOSTICS /* The following conditions are reported and cause the program to /* terminate immediately: memory allocation failure; an attempt /* to delete a non-existent entry. /* SEE ALSO /* mymalloc(3) memory management wrapper /* htable(3) hash table manager /* LICENSE /* .ad /* .fi /* The Secure Mailer license must be distributed with this software. /* AUTHOR(S) /* Wietse Venema /* IBM T.J. Watson Research /* P.O. Box 704 /* Yorktown Heights, NY 10598, USA /*--*/ /* C library */ #include /* Utility library. */ #include #include #include /* nvtable_update - update or enter (key, value) pair */ NVTABLE_INFO *nvtable_update(NVTABLE * table, const char *key, const char *value) { NVTABLE_INFO *ht; if ((ht = htable_locate(table, key)) != 0) { myfree(ht->value); } else { ht = htable_enter(table, key, (void *) 0); } ht->value = mystrdup(value); return (ht); }