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

	ExeLBr()

	This function executes a left-bracket ([) command.

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

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

extern	VOID	ErrMsg();	/* display an error message */
extern	DEFAULT	FindQR();	/* find q-register index */
extern	DEFAULT	IncCBP();	/* increment CBfPtr */
extern	DEFAULT	MakRom();	/* make room in q-register */
extern	VOID	ZCpyBl();	/* copy a block of memory */

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 ExeLBr()				/* execute [ command */
{
	LOCAL	char	*TQBfBg;
	LOCAL	LONG	TmpSiz;

#if DEBUGGING
DbgInd+=2;if(DbgLvl>=1){DbgMsg();DbgDBf("ExeLBr: called.\015\012");DbgROf();}
#endif
	if (IncCBP() == FAILURE)
		return(FAILURE);

	if (FindQR() == FAILURE)
#if DEBUGGING
{if(DbgLvl>=1)
{DbgMsg();DbgDBf("ExeLBr: returning FAILURE.\015\012");DbgROf();}DbgInd-=2;
#endif
		return(FAILURE);
#if DEBUGGING
}
#endif
	if (++QStTop >= QRS_SIZE)
		{
		ErrMsg(ERR_PDO);		/* push-down list overflow */
#if DEBUGGING
if(DbgLvl>=1)
{DbgMsg();DbgDBf("ExeLBr: returning FAILURE.\015\012");DbgROf();}DbgInd-=2;
#endif
		return(FAILURE);
		}
	QStack[QStTop].Number = *QNumbr;
	TmpSiz = *QBfPtr - *QBfBeg;
	if (TmpSiz > 0L)
		{
		TQBfBg = *QBfBeg;
		QBfBeg = &QStack[QStTop].Start;
		QBfPtr = &QStack[QStTop].End_P1;
		if (MakRom(TmpSiz) == FAILURE)
			{
			--QStTop;
#if DEBUGGING
if(DbgLvl>=1)
{DbgMsg();DbgDBf("ExeLBr: returning FAILURE.\015\012");DbgROf();}DbgInd-=2;
#endif
			return(FAILURE);
			}
		ZCpyBl(	TmpSiz, TQBfBg, QStack[QStTop].Start);
		QStack[QStTop].End_P1 = QStack[QStTop].Start + TmpSiz;
		}

#if DEBUGGING
if(DbgLvl>=1)
{DbgMsg();DbgDBf("ExeLBr: returning SUCCESS.\015\012");DbgROf();}DbgInd-=2;
#endif
	return(SUCCESS);
}
