/* htab.h - Structures and declarations needed for table hashing */

#include "copyright.h"

#ifndef __HTAB_H
#define __HTAB_H

#include "db.h"

typedef struct hashentry HASHENT;
struct hashentry {
	char			*target;
	int			*data;
	struct hashentry	*next;
};

typedef struct num_hashentry NHSHENT;
struct num_hashentry {
	int			target;
	int			*data;
	struct num_hashentry	*next;
};

typedef struct hasharray HASHARR;
struct hasharray {
	HASHENT		*element[500];
};

typedef struct num_hasharray NHSHARR;
struct num_hasharray {
	NHSHENT		*element[500];
};

typedef struct hashtable HASHTAB;
struct hashtable {
	int		hashsize;
	int		checks;
	int		scans;
	int		max_scan;
	int		hits;
	int		entries;
	int		deletes;
	int		nulls;
	HASHARR		*entry;
};

typedef struct num_hashtable NHSHTAB;
struct num_hashtable {
	int		hashsize;
	int		checks;
	int		scans;
	int		max_scan;
	int		hits;
	int		entries;
	int		deletes;
	int		nulls;
	NHSHARR		*entry;
};

typedef struct name_table NAMETAB;
struct name_table {
	char	*name;
	int	minlen;
	int	perm;
	int	flag;
};

/* BQUE - Command queue */

typedef struct bque BQUE;
struct bque {
	BQUE *next;
	dbref player;		/* player who will do command */
	dbref cause;		/* player causing command (for %N) */
	dbref sem;		/* blocking semaphore */
	int left;		/* seconds left until execution */
	char *env[NUM_ENV_VARS];/* environment, from wild_match or command */
	int nargs;		/* How many args I have */
	char *comm;		/* store the command here */
};

#ifdef WANT_ANSI

extern void hashinit (HASHTAB *htab, int size);
extern void hashreset (HASHTAB *htab);
extern int hashval (char *str, HASHTAB *htab);
extern int *hashfind (char *str, HASHTAB *htab);
extern int hashadd (char *str, int *hashdata, HASHTAB *htab);
extern void hashdelete (char *str, HASHTAB *htab);
extern void hashflush (HASHTAB *htab, int size);
extern int hashrepl (char *str, int *hashdata, HASHTAB *htab);
extern char *hashinfo(const char *tab_name, HASHTAB *htab);
extern int *nhashfind (int val, NHSHTAB *htab);
extern int nhashadd (int val, int *hashdata, NHSHTAB *htab);
extern void nhashdelete (int val, NHSHTAB *htab);
extern void nhashflush (NHSHTAB *htab, int size);
extern int nhashrepl (int val, int *hashdata, NHSHTAB *htab);
extern int search_nametab (dbref player, NAMETAB *ntab, char *flagname);
extern NAMETAB *find_nametab_ent (dbref player, NAMETAB *ntab, char *flagname);
extern void display_nametab (dbref player, NAMETAB *ntab, char *prefix,
	int list_if_none);
extern void interp_nametab (dbref player, NAMETAB *ntab, int flagword,
	char *prefix, char *true_text, char *false_text);
extern void listset_nametab (dbref player, NAMETAB *ntab, int flagword,
	char *prefix, int list_if_none);

#else

extern void hashinit ();
extern void hashreset ();
extern int hashval ();
extern int *hashfind ();
extern int hashadd ();
extern void hashdelete ();
extern void hashflush ();
extern int hashrepl ();
extern char *hashinfo();
extern int *nhashfind ();
extern int nhashadd ();
extern void nhashdelete ();
extern void nhashflush ();
extern int nhashrepl ();
extern int search_nametab ();
extern NAMETAB *find_nametab_ent ();
extern void display_nametab ();
extern void interp_nametab ();
extern void listset_nametab ();

#endif /* WANT_ANSI */

extern NAMETAB powers_nametab[];
#define nhashinit(h,s) hashinit((HASHTAB *)h, s)
#define nhashreset(h) hashreset((HASHTAB *)h)
#define nhashinfo(t,h) hashinfo(t,(HASHTAB *)h)

#endif