teacl/src/exerbr.c

70 lines
2.0 KiB
C

/*****************************************************************************
ExeRBr()
This function executes a ] command.
]q Q-register pop
*****************************************************************************/
#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 ExeRBr() /* execute ] command */
{
QRptr TmpQRp;
ptrdiff_t TmpSiz;
BOOLEAN ColonMod;
#if DEBUGGING
static char *DbgFNm = "ExeRBr";
sprintf(DbgSBf, "QStTop = %d", QStTop);
DbgFEn(1,DbgFNm,DbgSBf);
#endif
ColonMod = (CmdMod & COLON); /* is it :] ? */
CmdMod &= ~COLON; /* clear colon flag */
if (IncCBP() == FAILURE) {
return FAILURE;
}
if (FindQR() == FAILURE) {
DBGFEX(1,DbgFNm,"FAILURE");
return FAILURE;
}
if (QStTop < 0) { /* if q-reg stack is empty */
if (ColonMod) { /* if it's :] */
DBGFEX(1,DbgFNm,"PushEx(0)");
return PushEx(0L, OPERAND);
} else {
ErrMsg(ERR_PES); /* can't pop empty stack */
DBGFEX(1,DbgFNm,"FAILURE");
return FAILURE;
}
}
/*
* Copy QStack Q-register to QR
*/
TmpQRp = &QStack[QStTop];
TmpSiz = TmpQRp->End_P1 - TmpQRp->Start;
if (TmpSiz == 0) { /* if it should be empty */
if (QR->Start != NULL) { /* but it isn't empty */
ZFree((voidptr)QR->Start); /* then empty it */
QR->Start = QR->End_P1 = NULL;
}
} else {
if (MakRom((SIZE_T)TmpSiz) == FAILURE) { /* adjust QR space */
DBGFEX(1,DbgFNm,"FAILURE");
return FAILURE;
}
MEMMOVE(QR->Start, TmpQRp->Start, (SIZE_T)TmpSiz);
QR->End_P1 = QR->Start + TmpSiz;
}
QR->Number = TmpQRp->Number;
/*
* clear QStack Q-register
*/
if (TmpQRp->Start != NULL) {
ZFree((voidptr)TmpQRp->Start);
TmpQRp->Start = TmpQRp->End_P1 = NULL;
}
TmpQRp->Number = 0;
--QStTop;
DBGFEX(1,DbgFNm,(ColonMod) ? "PushEx(-1)" : "SUCCESS");
return (ColonMod) ? PushEx(-1L, OPERAND) : SUCCESS;
}