103 lines
2.4 KiB
C
103 lines
2.4 KiB
C
/*++
|
|
/* NAME
|
|
/* dict_ht 3
|
|
/* SUMMARY
|
|
/* dictionary manager interface to hash tables
|
|
/* SYNOPSIS
|
|
/* #include <dict_ht.h>
|
|
/*
|
|
/* DICT *dict_ht_open(table, remove)
|
|
/* HTABLE *table;
|
|
/* void (*remove)(char *value)
|
|
/* DESCRIPTION
|
|
/* dict_ht_open() makes specified hash table accessible via the
|
|
/* generic dictionary operations documented in dict_open(3).
|
|
/* \fIremove\fR specifies an optional callback function
|
|
/* that is called by the hash table manager when the hash table is
|
|
/* removed from the dictionary manager's care. The hash table is not
|
|
/* destroyed when \fIremove\fR is a null pointer.
|
|
/* SEE ALSO
|
|
/* dict(3) generic dictionary 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
|
|
/*--*/
|
|
|
|
/* System library. */
|
|
|
|
#include "sys_defs.h"
|
|
|
|
/* Utility library. */
|
|
|
|
#include "mymalloc.h"
|
|
#include "htable.h"
|
|
#include "dict.h"
|
|
#include "dict_ht.h"
|
|
|
|
/* Application-specific. */
|
|
|
|
typedef struct {
|
|
DICT dict; /* generic members */
|
|
HTABLE *table; /* hash table */
|
|
void (*remove) (char *); /* callback */
|
|
} DICT_HT;
|
|
|
|
/* dict_ht_lookup - find hash-table entry */
|
|
|
|
static const char *dict_ht_lookup(DICT *dict, const char *name)
|
|
{
|
|
DICT_HT *dict_ht = (DICT_HT *) dict;
|
|
|
|
dict_errno = 0;
|
|
|
|
return (htable_find(dict_ht->table, name));
|
|
}
|
|
|
|
/* dict_ht_update - add or update hash-table entry */
|
|
|
|
static void dict_ht_update(DICT *dict, const char *name, const char *value)
|
|
{
|
|
DICT_HT *dict_ht = (DICT_HT *) dict;
|
|
HTABLE_INFO *ht;
|
|
|
|
if ((ht = htable_locate(dict_ht->table, name)) != 0) {
|
|
myfree(ht->value);
|
|
} else {
|
|
ht = htable_enter(dict_ht->table, name, (char *) 0);
|
|
}
|
|
ht->value = mystrdup(value);
|
|
}
|
|
|
|
/* dict_ht_close - disassociate from hash table */
|
|
|
|
static void dict_ht_close(DICT *dict)
|
|
{
|
|
DICT_HT *dict_ht = (DICT_HT *) dict;
|
|
|
|
if (dict_ht->remove)
|
|
htable_free(dict_ht->table, dict_ht->remove);
|
|
myfree((char *) dict);
|
|
}
|
|
|
|
/* dict_ht_open - create association with hash table */
|
|
|
|
DICT *dict_ht_open(HTABLE *table, void (*remove) (char *))
|
|
{
|
|
DICT_HT *dict_ht;
|
|
|
|
dict_ht = (DICT_HT *) mymalloc(sizeof(*dict_ht));
|
|
dict_ht->dict.lookup = dict_ht_lookup;
|
|
dict_ht->dict.update = dict_ht_update;
|
|
dict_ht->dict.close = dict_ht_close;
|
|
dict_ht->dict.fd = -1;
|
|
dict_ht->table = table;
|
|
dict_ht->remove = remove;
|
|
return (&dict_ht->dict);
|
|
}
|