/*****************************************************************************

	ExeCrt()

	This function "executes" a caret (^) command.

*****************************************************************************/

#include "ZPort.h"		/* define portability identifiers */
#include "DefTeco.h"		/* define general identifiers */
#include "ChrMacs.h"		/* define character processing macros */
#include "DefError.h"		/* define identifiers for error messages */

extern	VOID	ErrMsg();	/* display an error message */
extern	DEFAULT	ExeCCC();	/* execute a control-^ command */
extern	DEFAULT	ExeCtA();	/* execute a control-A command */
extern	DEFAULT	ExeCtD();	/* execute a control-D command */
extern	DEFAULT	ExeCtE();	/* execute a control-E command */
extern	DEFAULT	ExeCtI();	/* execute a control-I (tab) command */
extern	DEFAULT	ExeCtL();	/* execute a control-L command */
extern	DEFAULT	ExeCtN();	/* execute a control-N command */
extern	DEFAULT	ExeCtO();	/* execute a control-O command */
extern	DEFAULT	ExeCtP();	/* execute a control-P command */
extern	DEFAULT	ExeCtQ();	/* execute a control-Q command */
extern	DEFAULT	ExeCtR();	/* execute a control-R command */
extern	DEFAULT	ExeCtS();	/* execute a control-S command */
extern	DEFAULT	ExeCtT();	/* execute a control-T command */
extern	DEFAULT	ExeCtU();	/* execute a control-U command */
extern	DEFAULT	ExeCtV();	/* execute a control-V command */
extern	DEFAULT	ExeCtW();	/* execute a control-W command */
extern	DEFAULT	ExeCtX();	/* execute a control-X command */
extern	DEFAULT	ExeCtY();	/* execute a control-Y command */
extern	DEFAULT	ExeCtZ();	/* execute a control-Z command */
extern	DEFAULT	Execut();	/* execute a function */
extern	DEFAULT	ExeEsc();	/* execute an ESCAPE command */
extern	DEFAULT	ExeIll();	/* "illegal command" function */
extern	DEFAULT	ExeNul();	/* execute a null command */
extern	DEFAULT	ExeNYI();	/* "not yet implemented" function */
extern	DEFAULT	ExeUsc();	/* execute control-_ command */
extern	DEFAULT	IncCBP();	/* increment CBfPtr */
extern	DEFAULT	ZExCtB();	/* execute a ^B command */
extern	DEFAULT	ZExCtH();	/* execute a ^H command */

EXTERN	char	*CBfPtr;	/* pointer into command string */


DEFAULT ExeCrt()		/* execute a ^ (caret) command */
{
	static DEFAULT (*FCAray[])() = {
/* ^A*/ ExeCtA,   /* ^B*/ ZExCtB,   /* ^C*/ ExeIll,   /* ^D*/ ExeCtD,
/* ^E*/ ExeCtE,   /* ^F*/ ExeNYI,   /* ^G*/ ExeNYI,   /* ^H*/ ZExCtH,
/*TAB*/ ExeCtI,   /* LF*/ ExeNul,   /* VT*/ ExeIll,   /* FF*/ ExeCtL,
/* CR*/ ExeNul,   /* ^N*/ ExeCtN,   /* ^O*/ ExeCtO,   /* ^P*/ ExeCtP,
/* ^Q*/ ExeCtQ,   /* ^R*/ ExeCtR,   /* ^S*/ ExeCtS,   /* ^T*/ ExeCtT,
/* ^U*/ ExeCtU,   /* ^V*/ ExeCtV,   /* ^W*/ ExeCtW,   /* ^X*/ ExeCtX,
/* ^Y*/ ExeCtY,   /* ^Z*/ ExeCtZ,   /* ^[*/ ExeEsc,   /* ^\*/ ExeIll,
/* ^]*/ ExeIll,   /* ^^*/ ExeCCC,   /* ^_*/ ExeUsc
	};
	static char *ErrTxt = "x";
	LOCAL WORD TmpChr;

	if (IncCBP() == FAILURE)
		return(FAILURE);
	TmpChr = To_Upper(*CBfPtr);
	if ((TmpChr < 'A') || (TmpChr > '_'))
		{
		*ErrTxt = *CBfPtr;
		ErrMsg(ERR_IUC, ErrTxt);
		return(FAILURE);
		}
	TmpChr = TmpChr - 'A';
	return(Execut(FCAray[TmpChr]));
}
