#ifndef _DICT_H_INCLUDED_
#define _DICT_H_INCLUDED_
#include <fcntl.h>
#include <vstream.h>
#include <argv.h>
typedef struct DICT {
char *type;
char *name;
int flags;
const char *(*lookup) (struct DICT *, const char *);
void (*update) (struct DICT *, const char *, const char *);
int (*delete) (struct DICT *, const char *);
int (*sequence) (struct DICT *, int, const char **, const char **);
void (*close) (struct DICT *);
int lock_fd;
int stat_fd;
time_t mtime;
} DICT;
extern DICT *dict_alloc(const char *, const char *, int);
extern void dict_free(DICT *);
extern DICT *dict_debug(DICT *);
#define DICT_DEBUG(d) ((d)->flags & DICT_FLAG_DEBUG ? dict_debug(d) : (d))
#define DICT_FLAG_NONE (0)
#define DICT_FLAG_DUP_WARN (1<<0)
#define DICT_FLAG_DUP_IGNORE (1<<1)
#define DICT_FLAG_TRY0NULL (1<<2)
#define DICT_FLAG_TRY1NULL (1<<3)
#define DICT_FLAG_FIXED (1<<4)
#define DICT_FLAG_PATTERN (1<<5)
#define DICT_FLAG_LOCK (1<<6)
#define DICT_FLAG_DUP_REPLACE (1<<7)
#define DICT_FLAG_SYNC_UPDATE (1<<8)
#define DICT_FLAG_DEBUG (1<<9)
#define DICT_FLAG_FOLD_KEY (1<<10)
#define DICT_FLAG_NO_REGSUB (1<<11)
#define DICT_FLAG_NO_PROXY (1<<12)
#define DICT_FLAG_NO_UNAUTH (1<<13)
#define DICT_FLAG_PARANOID \
(DICT_FLAG_NO_REGSUB | DICT_FLAG_NO_PROXY | DICT_FLAG_NO_UNAUTH)
extern int dict_unknown_allowed;
extern int dict_errno;
#define DICT_ERR_NONE 0
#define DICT_ERR_RETRY 1
#define DICT_SEQ_FUN_FIRST 0
#define DICT_SEQ_FUN_NEXT 1
extern ARGV *dict_mapnames(void);
extern void dict_register(const char *, DICT *);
extern DICT *dict_handle(const char *);
extern void dict_unregister(const char *);
extern void dict_update(const char *, const char *, const char *);
extern const char *dict_lookup(const char *, const char *);
extern int dict_delete(const char *, const char *);
extern int dict_sequence(const char *, const int, const char **, const char **);
extern void dict_load_file(const char *, const char *);
extern void dict_load_fp(const char *, VSTREAM *);
extern const char *dict_eval(const char *, const char *, int);
extern DICT *dict_open(const char *, int, int);
extern DICT *dict_open3(const char *, const char *, int, int);
extern void dict_open_register(const char *, DICT *(*) (const char *, int, int));
#define dict_get(dp, key) (dp)->lookup((dp), (key))
#define dict_put(dp, key, val) (dp)->update((dp), (key), (val))
#define dict_del(dp, key) (dp)->delete((dp), (key))
#define dict_seq(dp, f, key, val) (dp)->sequence((dp), (f), (key), (val))
#define dict_close(dp) (dp)->close(dp)
typedef void (*DICT_WALK_ACTION) (const char *, DICT *, char *);
extern void dict_walk(DICT_WALK_ACTION, char *);
extern int dict_changed(void);
extern const char *dict_changed_name(void);
#endif