	/*** (C) Copyright 1984, 1985  S.R.I. International ***/
#ifndef	COMND_RAISE

#include <setjmp.h>

/*
 *
 *	CONSTANT, STRUCTURE and MACRO definitions for the COMND JSYS.
 *
 */
struct comnd_state {			/* Structure to hold COMND state */
	jmp_buf	 saved_execution_state;		/* How to restart a parse*/
	int	 flags;				/* Flags		 */
/* USER OPTIONS */
#define	COMND_RAISE		(1<<0)			/* Uppercaseify  */
#define	COMND_NO_INDIRECT_FILE	(1<<1)			/* no @file	 */
#define	COMND_WAKEUP_ON_FIELD	(1<<2)			/* wake each fld */
#define	COMND_REPARSE_ADDR_SET	(1<<12)			/* setjmp is set */
#define	COMND_HANDLE_ERRORS	(1<<13)			/* intrn handler */
#define	COMND_USER_FLAGS	(COMND_RAISE|\
				 COMND_NO_INDIRECT_FILE|\
				 COMND_WAKEUP_ON_FIELD|\
				 COMND_REPARSE_ADDR_SET|\
				 COMND_HANDLE_ERRORS)
/* RETURNED STATUS FLAGS */
#define	COMND_NOT_PARSED	(1<<3)			/* Not parsed	 */
#define	COMND_REPARSE_REQUIRED	(1<<4)			/* Need reparse	 */
#define	COMND_SWITCH_COLON	(1<<5)			/* ":" on switch */
#define	COMND_PREV_ESCAPE_TYPED	(1<<6)			/* <ESC> prev fld*/
#define	COMND_ESCAPE_TYPED	(1<<7)			/* <ESC> term.	 */
#define	COMND_CTRL_F_TYPED	(1<<8)			/* ^F term.	 */
#define	COMND_QUESTION_TYPED	(1<<9)			/* ? term.	 */
#define	COMND_CR_TYPED		(1<<10)			/* <CR> term.	 */
#define	COMND_AT_END_OF_BUFFER	(1<<11)			/* Token=EOB	 */
#define	COMND_STATUS_FLAGS	(COMND_NOT_PARSED|\
				 COMND_REPARSE_REQUIRED|\
				 COMND_SWITCH_COLON|\
				 COMND_PREV_ESCAPE_TYPED|\
				 COMND_ESCAPE_TYPED|\
				 COMND_CTRL_F_TYPED|\
				 COMND_QUESTION_TYPED|\
				 COMND_CR_TYPED| \
				 COMND_AT_END_OF_BUFFER)
#define	COMND_STATUS_FLAGS1	(COMND_STATUS_FLAGS &\
				 ~(COMND_PREV_ESCAPE_TYPED |\
				   COMND_CR_TYPED |\
				   COMND_AT_END_OF_BUFFER))
#define	COMND_STATUS_FLAGS2	(COMND_STATUS_FLAGS1 &\
				 ~(COMND_ESCAPE_TYPED |\
				   COMND_CTRL_F_TYPED |\
				   COMND_QUESTION_TYPED))
	int	 input;				/* Input JFN (unused now)*/
	int	 output;			/* Output JFN  ""    ""  */
	char	*prompt;			/* Prompt (for ^R)	 */
	char	*buffer;			/* Input buffer		 */
	int	 buffer_size;			/* Input buffer size	 */
	char	*next_field;			/* Next field to parse   */
	int	 space_left;			/* Space left in buffer  */
	int	 unparsed_characters;		/* chars after next_field*/
	char	*atom_buffer;			/* Pointer to atom buffer*/
	int	 atom_buffer_size;		/* Size of atom buffer	 */
	struct gtjfn_block *gtjfn;		/* GTJFN for FILE parsing*/
	};

struct comnd_function {			/* Structure to specify a funct. */
	short	 code;				/* Function Code	 */
#define	COMND_INIT_CODE		0			/* Initialize	 */
#define	COMND_KEYWORD		1			/* Keyword	 */
#define	COMND_NUMBER		2			/* Number	 */
#define	COMND_NOISE		3			/* Noise Word	 */
#define	COMND_SWITCH		4			/* Switch	 */
#define	COMND_INPUT_FILE	5			/* Input File	 */
#define	COMND_OUTPUT_FILE	6			/* Output File	 */
#define	COMND_FILE		7			/* General File	 */
#define	COMND_FIELD		8			/* Arbit. field	 */
#define	COMND_CONFIRM		9			/* Confirm	 */
#define	COMND_DIRECTORY		10			/* Directory	 */
#define	COMND_USERNAME		11			/* User Name	 */
#define	COMND_COMMA		12			/* Comma	 */
#define	COMND_FLOAT		13			/* Floating Pt.	 */
#define	COMND_DEVICE		14			/* Device	 */
#define	COMND_TEXT		15			/* Text		 */
#define	COMND_DATE		16			/* Time & Date	 */
#define	COMND_DO_DATE		IDT_NO_DATE			/* Date	 */
#define	COMND_DO_TIME		IDT_NO_TIME			/* Time	 */
#define	COMND_QUOTED_STRING	17			/* Quoted String */
#define	COMND_UNQUOTED_STRING	18			/*~Quoted String */
#define	COMND_TOKEN		19			/* Given String	 */
#define	COMND_NUMBER1		20			/* Number	 */
#define	COMND_NETWORK_NODE	21			/* Network Node	 */
	short	 flags;				/* Flags		 */
#define	COMND_BREAK			(1<<0)		/* Enable brk msk*/
#define COMND_PARSE_ONLY		(1<<1)		/* Don't verify  */
#define	COMND_HELP_VALID		(1<<2)		/* help is valid */
#define	COMND_DEFAULT_VALID		(1<<3)		/* default valid */
#define	COMND_SUPPRESS_DEFAULT_HELP	(1<<4)		/* no default "?"*/
	struct comnd_function *next;		/* Next function block	 */
	int	 data;				/* function specific data*/
	char	*help_string;			/* Help text		 */
	char	*default_string;		/* Default		 */
	unsigned long int *break_mask;		/* End of field chars	 */
	};


/*
 *	Macro to get the number of characters in the COMND buffer
 */
#define	COMND_CHARACTERS_IN_BUFFER(State_Block) \
	((State_Block)->buffer_size - (State_Block)->space_left)

/*
 *	Macro to get a pointer to the end of the COMND buffer
 */
#define	COMND_END_OF_BUFFER(State_Block) \
	((State_Block)->buffer + COMND_CHARACTERS_IN_BUFFER(State_Block))

/*
 *	Macro to get a pointer to the current token
 */
#define	COMND_CURRENT_TOKEN(State_Block) \
	((State_Block)->buffer + \
	 COMND_CHARACTERS_IN_BUFFER(State_Block) - \
	 (State_Block)->unparsed_characters)

/*
 *	Macro to test if special characters (<ESCAPE>,^F or "?") are there
 */
#define	COMND_SPECIAL_CHARACTER(State_Block) \
	((State_Block)->flags & COMND_AT_END_OF_BUFFER)
/*
 *	Macro to test if <ESCAPE> is to processed
 */
#define	COMND_ESCAPE(State_Block) \
	(((State_Block)->flags & COMND_AT_END_OF_BUFFER) && \
	 ((State_Block)->flags & COMND_ESCAPE_TYPED))

/*
 *	Macro to test if ^F is to processed
 */
#define	COMND_CTRL_F(State_Block) \
	(((State_Block)->flags & COMND_AT_END_OF_BUFFER) && \
	 ((State_Block)->flags & COMND_CTRL_F_TYPED))

/*
 *	Macro to test if "?" is to processed
 */
#define	COMND_QUESTION(State_Block) \
	(((State_Block)->flags & COMND_AT_END_OF_BUFFER) && \
	 ((State_Block)->flags & COMND_QUESTION_TYPED))

/*
 *	Macro to test if <CR> is to processed
 */
#define	COMND_CR(State_Block) \
	(((State_Block)->flags & COMND_AT_END_OF_BUFFER) && \
	 ((State_Block)->flags & COMND_CR_TYPED))

/*
 *	Macro to test if <ESCAPE> is to processed
 */
#define	COMND_ESCAPE(State_Block) \
	(((State_Block)->flags & COMND_AT_END_OF_BUFFER) && \
	 ((State_Block)->flags & COMND_ESCAPE_TYPED))

/*
 *
 *	Structure for array of keyword entries (for TBLUK/TBADD/TBDEL/COMND).
 *	These entries are preceeded by 2 long integers that give,
 *	respectively, the current number of entries in the table
 *	and the maximum number of entries allowed in the table.
 *
 *	(Can't use unions here, even though they are called for, because
 *	"C" is so cretinous!!!! -- If the declaration for a field is not
 *	to your liking you MUST use a cast!!)
 *
 *	The declaration to use for a keyword table would be somthing like:
 *	struct {int current_entries;
 *		int maximum_entries;
 *		struct tbluk_keyword keywords[N];
 *		} variable;
 */
struct tbluk_keyword {
	unsigned long int flags;	/* Lookup flags for this entry */
#define	COMND_ABBREVIATION	(1<<0)		/* Abbreviation        */
#define	COMND_NORECOGNIZE	(1<<1)		/* Don't recognize     */
#define	COMND_INVISIBLE		(1<<2)		/* Invisible entry     */
#define	COMND_CASE_SENSITIVE	(1<<3)		/* Be case sensitive   */
#define	COMND_RELATIVE_ADDRESS	(1<<4)		/* Addrs rel to table  */
	char *keyword;			/* Keyword string              */
	int  user_data;			/* 32-bits of User data	       */
	};

/*
 *	Return flags constants for TBLUK
 */
#define	TBLUK_NOMATCH		(1<<0)		/* No Match Found */
#define	TBLUK_AMBIGUOUS		(1<<1)		/* Ambiguous	  */
#define	TBLUK_ABBREVIATION	(1<<2)		/* Abbreviation	  */
#define	TBLUK_EXACT_MATCH	(1<<3)		/* Exact Match	  */

extern struct tbluk_keyword *tbluk_jsys();

/*
 *	Macros for defining TBLUK tables
 */
#define	TBLUK_TABLE_START(name,size1,size2) \
		struct {\
		int current_size;\
		int maximum_size;\
		struct tbluk_keyword keywords[size2];\
	} name = { size1,size2,

#define	TBLUK_TABLE_ENTRY(flags,string,data) {flags,string,(long int)data},

#define	TBLUK_TABLE_END() };

/*
 *	Macros for invoking the COMND/TBADD/TBDEL/TBLUK JSYSi
 */
#define	COMND_INIT(state_block) {\
	struct comnd_function comnd_init;\
	comnd_init.code = COMND_INIT_CODE;\
	COMND((state_block),&comnd_init,0,0);\
	(state_block)->flags |= COMND_REPARSE_ADDR_SET;\
	setjmp((state_block)->saved_execution_state);\
	}
#ifdef NOTDEF
#define	COMND_INIT(state_block) {\
	struct comnd_function comnd_init;\
	comnd_init.code = COMND_INIT_CODE;\
	COMND((state_block),&comnd_init,0,0);\
	(state_block)->flags |= COMND_REPARSE_ADDR_SET;\
	setjmp((int *)(state_block)->saved_execution_state);\
	}
#endif /* NOTDEF */
	
#define	COMND(a1,a2,a3,a4) comnd_jsys(a1,a2,a3,a4)

#define	TBLUK(a1,a2,a3,a4) tbluk_jsys(a1,a2,a3,a4)

#define	TBADD(a1,a2) tbadd_jsys(a1,a2)

#define	TBDEL(a1,a2) tbdel_jsys(a1,a2)

/*
 *	Macros for calling COMND utility routines
 */
#ifndef	DEFAULT_COMMAND_STATE
#define	DEFAULT_COMMAND_STATE	Command_State
#endif	DEFAULT_COMMAND_STATE

#define	NOISE(string)	__noise(string,&DEFAULT_COMMAND_STATE)
#define	CONFIRM()	__confirm(&DEFAULT_COMMAND_STATE)

/*
 *	Define GTJFN as well
 */
#ifndef	GTJFN_OUTPUT_FILE
#include "gtjfn.h"
#endif	GTJFN_OUTPUT_FILE

#endif	COMND_RAISE
