teacl/src/exelbr.c

53 lines
1.4 KiB
C

/*****************************************************************************
ExeLBr()
This function executes a left-bracket ([) command.
[q Q-register push
*****************************************************************************/
#include "zport.h" /* define portability identifiers */
#include "tecoc.h" /* define general identifiers */
#include "defext.h" /* define external global variables */
#include "deferr.h" /* define identifiers for error messages */
DEFAULT ExeLBr() /* execute [ command */
{
QRptr TmpQRp;
ptrdiff_t TmpSiz;
#if DEBUGGING
static char *DbgFNm = "ExeLBr";
sprintf(DbgSBf, "QStTop = %d", QStTop);
DbgFEn(1,DbgFNm,DbgSBf);
#endif
if (IncCBP() == FAILURE) {
DBGFEX(1,DbgFNm,"IncCBP() FAILURE");
return FAILURE;
}
if (FindQR() == FAILURE) {
DBGFEX(1,DbgFNm,"FindQR() FAILURE");
return FAILURE;
}
if (++QStTop >= QRS_SIZE) {
ErrMsg(ERR_PDO); /* push-down list overflow */
DBGFEX(1,DbgFNm,"ERR_PDO FAILURE");
return FAILURE;
}
/*
* Copy QR to top of QStack
*/
TmpQRp = QR;
QR = &QStack[QStTop];
TmpSiz = TmpQRp->End_P1 - TmpQRp->Start;
if (TmpSiz > 0) {
if (MakRom((SIZE_T)TmpSiz) == FAILURE) {
QR = TmpQRp;
--QStTop;
DBGFEX(1,DbgFNm,"MakRom() FAILURE");
return FAILURE;
}
MEMMOVE(QR->Start, TmpQRp->Start, (SIZE_T) TmpSiz);
QR->End_P1 = QR->Start + TmpSiz;
}
QR->Number = TmpQRp->Number;
QR = TmpQRp;
DBGFEX(1,DbgFNm,"SUCCESS");
return SUCCESS;
}