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

	ExeG()

	This function executes a G command.

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

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

extern	DEFAULT	FindQR();	/* find q-register index */
extern	DEFAULT	GroEBf();	/* expand the edit buffer if necessary */
extern	DEFAULT	IncCBP();	/* increment CBfPtr */
extern	VOID	TypBuf();	/* type a buffer */
extern	VOID	ZCpyBl();	/* move a block of memory */

EXTERN	char	*CBfPtr;	/* pointer into command string */
EXTERN	BYTE	CmdMod;		/* command modifiers flags for @, :, etc. */
EXTERN	WORD	EStBot;		/* expression stack bottom */
EXTERN	WORD	EStTop;		/* expression stack top */
EXTERN	char	FBfBeg[];	/* beginning of file specification */
EXTERN	char	*FBfPtr;	/* pointer into file specification */
EXTERN	char	*GapBeg;	/* edit buffer gap beginning */
EXTERN	char	*GapEnd;	/* end of edit buffer gap */
EXTERN	char	*(*QBfBeg);	/* beginning of q-register text area */
EXTERN	char	*(*QBfPtr);	/* end of q-register text area, plus 1 */
EXTERN	LONG	RefLen;		/* value returned by ^S command */
EXTERN	char	*SBfBeg;	/* beginning of search buffer */
EXTERN	char	*SBfPtr;	/* end of search string */


DEFAULT ExeG()			/* execute a G command */
{
	LOCAL char *TxtBeg;		/* beginning of a text area */
	LOCAL char *TxtEnd;		/* end of a text area */

#if DEBUGGING
DbgInd+=2;if(DbgLvl>=1){DbgMsg();DbgDBf("ExeG: called.\015\012");DbgROf();}
#endif
	if (IncCBP() == FAILURE)		/* move to char after G */
		return(FAILURE);
	if (*CBfPtr == '*')			/* if it's G* */
		{
		TxtBeg = FBfBeg;
		TxtEnd = FBfPtr;
		}
	else if (*CBfPtr == '_')		/* else if it's G_ */
		{
		TxtBeg = SBfBeg;
		TxtEnd = SBfPtr;
		}
	else					/* else it's Gq */
		{
		if (FindQR() == FAILURE)
			return(FAILURE);
		if (*QBfBeg == NULL)		/* if empty */
			{
			RefLen = 0L;
			CmdMod = '\0';		/* clear modifiers flags */
			EStTop = EStBot;	/* clear expression stack */
#if DEBUGGING
if(DbgLvl>=1){DbgMsg();
DbgDBf("ExeG: q-register empty, returning SUCCESS.\015\012");DbgROf();}
DbgInd-=2;
#endif
			return(SUCCESS);
			}
		TxtBeg = *QBfBeg;
		TxtEnd = *QBfPtr;
		}

	if (CmdMod & COLON)			/* if it's :G */
		TypBuf(TxtBeg, TxtEnd);
	else					/* else (no : modifier) */
		{
		RefLen = TxtBeg - TxtEnd;
		if ((GapEnd-GapBeg) < -RefLen)
			if (GroEBf(-RefLen) == FAILURE)
#if DEBUGGING
{if(DbgLvl>=1)
{DbgMsg();DbgDBf("ExeG: returning FAILURE.\015\012");DbgROf();}DbgInd-=2;
#endif
				return(FAILURE);
#if DEBUGGING
}
#endif
		ZCpyBl(-RefLen, TxtBeg, GapBeg);
		GapBeg -= RefLen;
		}
	CmdMod = '\0';				/* clear modifiers flags */
	EStTop = EStBot;			/* clear expression stack */
#if DEBUGGING
if(DbgLvl>=1)
{DbgMsg();DbgDBf("ExeG: returning SUCCESS.\015\012");DbgROf();}DbgInd-=2;
#endif
	return(SUCCESS);
}
