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

	ExeRBr()

	This function executes a ] command.

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

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

extern	VOID	ErrMsg();	/* display an error message */
extern	DEFAULT	FindQR();	/* find q-register index */
extern	DEFAULT	IncCBP();	/* increment CBfPtr */
extern	DEFAULT	MakRom();	/* make room for text in q-register */
extern	DEFAULT	PushEx();	/* push onto expression stack */
extern	VOID	ZFree();	/* free memory */

EXTERN	BYTE	CmdMod;		/* command modifiers flags for @, :, etc. */
EXTERN	char	*(*QBfBeg);	/* beginning of q-register text area */
EXTERN	char	*(*QBfPtr);	/* end of q-register text area, plus 1 */
EXTERN	LONG	*QNumbr;	/* pointer to q-register number */
EXTERN	struct	QReg QStack[];	/* q-register stack */
EXTERN	WORD	QStTop;		/* top of q-register stack */


DEFAULT ExeRBr()                /* execute ] command */
{
	LOCAL	LONG	TmpSiz;

#if DEBUGGING
DbgInd+=2;if(DbgLvl>=1){DbgMsg();DbgDBf("ExeRBr: called.\015\012");DbgROf();}
#endif
	if (IncCBP() == FAILURE)
		return(FAILURE);
	if (FindQR() == FAILURE)
#if DEBUGGING
{if(DbgLvl>=1)
{DbgMsg();DbgDBf("ExeRBr: returning FAILURE.\015\012");DbgROf();}DbgInd-=2;
#endif
		return(FAILURE);
#if DEBUGGING
}
#endif
	if (QStTop < 0)			/* if q-register stack is empty */
		{
		if (CmdMod & COLON)		/* if it's :] */
#if DEBUGGING
{if(DbgLvl>=1)
{DbgMsg();DbgDBf("ExeRBr: returning PushEx(0L).\015\012");DbgROf();}DbgInd-=2;
#endif
			return(PushEx(0L, OPERAND));
#if DEBUGGING
}
#endif
		else
			{
			ErrMsg(ERR_PES);	/* can't pop empty stack */
#if DEBUGGING
if(DbgLvl>=1)
{DbgMsg();DbgDBf("ExeRBr: returning FAILURE.\015\012");DbgROf();}DbgInd-=2;
#endif
			return(FAILURE);
			}
		}
	*QNumbr = QStack[QStTop].Number;
	if (*QBfBeg != NULL)
		ZFree(*QBfBeg);
	TmpSiz = QStack[QStTop].End_P1 - QStack[QStTop].Start;
	if (TmpSiz > 0L)
		{
		if (MakRom(TmpSiz) == FAILURE)
#if DEBUGGING
{if(DbgLvl>=1)
{DbgMsg();DbgDBf("ExeRBr: returning FAILURE.\015\012");DbgROf();}DbgInd-=2;
#endif
			return(FAILURE);
#if DEBUGGING
}
#endif
		ZCpyBl(	TmpSiz, QStack[QStTop].Start, *QBfBeg);
		*QBfPtr = *QBfBeg + TmpSiz;
		}
	--QStTop;
	if (CmdMod & COLON)		  /* if it's :] */
#if DEBUGGING
{if(DbgLvl>=1)
{DbgMsg();DbgDBf("ExeRBr: returning PushEx(-1L).\015\012");DbgROf();}DbgInd-=2;
#endif
		return(PushEx(-1L, OPERAND));
#if DEBUGGING
}
#endif
#if DEBUGGING
if(DbgLvl>=1)
{DbgMsg();DbgDBf("ExeRBr: returning SUCCESS.\015\012");DbgROf();}DbgInd-=2;
#endif
	return(SUCCESS);
}
