/* -*- Mode: Text -*- */

#ifdef unix
#  define BITFIELDTYPE unsigned short
#else
#  define BITFIELDTYPE unsigned
#endif

struct dent {
	struct dent *next;
	char *word;

	BITFIELDTYPE used : 1;

/* bit fields for all of the flags */
	BITFIELDTYPE v_flag : 1;
		/*
			"V" flag:
		        ...E --> ...IVE  as in CREATE --> CREATIVE
		        if # .ne. E, ...# --> ...#IVE  as in PREVENT --> PREVENTIVE
		*/
	BITFIELDTYPE n_flag : 1;
		/*
			"N" flag:
			        ...E --> ...ION  as in CREATE --> CREATION
			        ...Y --> ...ICATION  as in MULTIPLY --> MULTIPLICATION
			        if # .ne. E or Y, ...# --> ...#EN  as in FALL --> FALLEN
		*/
	BITFIELDTYPE x_flag : 1;
		/*
			"X" flag:
			        ...E --> ...IONS  as in CREATE --> CREATIONS
			        ...Y --> ...ICATIONS  as in MULTIPLY --> MULTIPLICATIONS
			        if # .ne. E or Y, ...# --> ...#ENS  as in WEAK --> WEAKENS
		*/
	BITFIELDTYPE h_flag : 1;
		/*
			"H" flag:
			        ...Y --> ...IETH  as in TWENTY --> TWENTIETH
			        if # .ne. Y, ...# --> ...#TH  as in HUNDRED --> HUNDREDTH
		*/
	BITFIELDTYPE y_flag : 1;
		/*
			"Y" FLAG:
			        ... --> ...LY  as in QUICK --> QUICKLY
		*/
	BITFIELDTYPE g_flag : 1;
		/*
			"G" FLAG:
			        ...E --> ...ING  as in FILE --> FILING
			        if # .ne. E, ...# --> ...#ING  as in CROSS --> CROSSING
		*/
	BITFIELDTYPE j_flag : 1;
		/*
			"J" FLAG"
			        ...E --> ...INGS  as in FILE --> FILINGS
			        if # .ne. E, ...# --> ...#INGS  as in CROSS --> CROSSINGS
		*/
	BITFIELDTYPE d_flag : 1;
		/*
			"D" FLAG:
			        ...E --> ...ED  as in CREATE --> CREATED
			        if @ .ne. A, E, I, O, or U,
			                ...@Y --> ...@IED  as in IMPLY --> IMPLIED
			        if # .ne. E or Y, or (# = Y and @ = A, E, I, O, or U)
			                ...@# --> ...@#ED  as in CROSS --> CROSSED
			                                or CONVEY --> CONVEYED
		*/
	BITFIELDTYPE t_flag : 1;
		/*
			"T" FLAG:
			        ...E --> ...EST  as in LATE --> LATEST
			        if @ .ne. A, E, I, O, or U,
			                ...@Y --> ...@IEST  as in DIRTY --> DIRTIEST
			        if # .ne. E or Y, or (# = Y and @ = A, E, I, O, or U)
			                ...@# --> ...@#EST  as in SMALL --> SMALLEST
			                                or GRAY --> GRAYEST
		*/
	BITFIELDTYPE r_flag : 1;
		/*
			"R" FLAG:
			        ...E --> ...ER  as in SKATE --> SKATER
			        if @ .ne. A, E, I, O, or U,
			                ...@Y --> ...@IER  as in MULTIPLY --> MULTIPLIER
			        if # .ne. E or Y, or (# = Y and @ = A, E, I, O, or U)
			                ...@# --> ...@#ER  as in BUILD --> BUILDER
			                                or CONVEY --> CONVEYER
		*/
	BITFIELDTYPE z_flag : 1;
		/*
			"Z FLAG:
			        ...E --> ...ERS  as in SKATE --> SKATERS
			        if @ .ne. A, E, I, O, or U,
			                ...@Y --> ...@IERS  as in MULTIPLY --> MULTIPLIERS
			        if # .ne. E or Y, or (# = Y and @ = A, E, I, O, or U)
			                ...@# --> ...@#ERS  as in BUILD --> BUILDERS
			                                or SLAY --> SLAYERS
		*/
	BITFIELDTYPE s_flag : 1;
		/*
			"S" FLAG:
			        if @ .ne. A, E, I, O, or U,
			                ...@Y --> ...@IES  as in IMPLY --> IMPLIES
			        if # .eq. S, X, Z, or H,
			                ...# --> ...#ES  as in FIX --> FIXES
			        if # .ne. S,X,Z,H, or Y, or (# = Y and @ = A, E, I, O, or U)
			                ...# --> ...#S  as in BAT --> BATS
			                                or CONVEY --> CONVEYS
		*/
	BITFIELDTYPE p_flag : 1;
		/*
			"P" FLAG:
			        if @ .ne. A, E, I, O, or U,
			                ...@Y --> ...@INESS  as in CLOUDY --> CLOUDINESS
			        if # .ne. Y, or @ = A, E, I, O, or U,
			                ...@# --> ...@#NESS  as in LATE --> LATENESS
			                                or GRAY --> GRAYNESS
		*/
	BITFIELDTYPE m_flag : 1;
		/*
			"M" FLAG:
			        ... --> ...'S  as in DOG --> DOG'S
		*/

};

#define WORDLEN 30

struct hashheader {
	int magic;
	int stringsize;
	int tblsize;
};

#define MAGIC 1

	
/*
 * termcap variables
 */
extern char *tgetstr();
extern char PC;	/* padding character */
extern char *BC;	/* backspace if not ^H */
extern char *UP;	/* Upline (cursor up) */
extern char *cd;	/* clear to end of display */
extern char *ce;	/* clear to end of line */
extern char *cl;	/* clear display */
extern char *cm;	/* cursor movement */
extern char *dc;	/* delete character */
extern char *dl;	/* delete line */
extern char *dm;	/* delete mode */
extern char *ed;	/* exit delete mode */
extern char *ei;	/* exit insert mode */
extern char *ho;	/* home */
extern char *ic;	/* insert character */
extern char *il;	/* insert line */
extern char *im;	/* insert mode */
extern char *ip;	/* insert padding */
extern char *nd;	/* non-destructive space */
extern char *vb;	/* visible bell */
extern char *so;	/* standout */
extern char *se;	/* standout end */
extern int bs;
extern int li;		/* lines */
extern int co;		/* columns */

extern char termcap[];
extern char termstr[];	/* for string values */
extern char *termptr;

extern char rootword[];
extern struct dent *lastdent;

extern char *hashstrings;

extern int aflag;
extern int lflag;

struct node {
	struct node *left;
	struct node *right;
	char *word;
	int keep;
};

extern int erasechar;
extern int killchar;

extern char tempfile[];

#ifdef AMIGA
#  define index strchr
#  define sleep(a) Delay(a*50)	/* Come on Lattice, it's so easy... */
#endif
