1 /*****************************************************************************
2 
3 	ExeRBr()
4 
5 	This function executes a ] command.
6 	]q	Q-register pop
7 
8 *****************************************************************************/
9 
10 #include "zport.h"		/* define portability identifiers */
11 #include "tecoc.h"		/* define general identifiers */
12 #include "defext.h"		/* define external global variables */
13 #include "deferr.h"		/* define identifiers for error messages */
14 
ExeRBr()15 DEFAULT ExeRBr()                /* execute ] command */
16 {
17 	QRptr		TmpQRp;
18 	ptrdiff_t	TmpSiz;
19 	BOOLEAN		ColonMod;
20 
21 #if DEBUGGING
22 	static char *DbgFNm = "ExeRBr";
23 	sprintf(DbgSBf, "QStTop = %d", QStTop);
24 	DbgFEn(1,DbgFNm,DbgSBf);
25 #endif
26 
27 	ColonMod = (CmdMod & COLON);		/* is it :] ? */
28 	CmdMod &= ~COLON;			/* clear colon flag */
29 
30 	if (IncCBP() == FAILURE) {
31 		return FAILURE;
32 	}
33 
34 	if (FindQR() == FAILURE) {
35 		DBGFEX(1,DbgFNm,"FAILURE");
36 		return FAILURE;
37 	}
38 
39 	if (QStTop < 0)	{			/* if q-reg stack is empty */
40 		if (ColonMod) {			/* if it's :] */
41 			DBGFEX(1,DbgFNm,"PushEx(0)");
42 			return PushEx(0L, OPERAND);
43 		} else {
44 			ErrMsg(ERR_PES);	/* can't pop empty stack */
45 			DBGFEX(1,DbgFNm,"FAILURE");
46 			return FAILURE;
47 		}
48 	}
49 
50 /*
51  * Copy QStack Q-register to QR
52  */
53 	TmpQRp = &QStack[QStTop];
54 	TmpSiz = TmpQRp->End_P1 - TmpQRp->Start;
55 	if (TmpSiz == 0) {			/* if it should be empty */
56 		if (QR->Start != NULL) {	    /* but it isn't empty */
57 			ZFree((voidptr)QR->Start);	/* then empty it */
58 			QR->Start = QR->End_P1 = NULL;
59 		}
60 	} else {
61 		if (MakRom((SIZE_T)TmpSiz) == FAILURE) { /* adjust QR space */
62 			DBGFEX(1,DbgFNm,"FAILURE");
63 			return FAILURE;
64 		}
65 		MEMMOVE(QR->Start, TmpQRp->Start, (SIZE_T)TmpSiz);
66 		QR->End_P1 = QR->Start + TmpSiz;
67 	}
68 	QR->Number = TmpQRp->Number;
69 
70 /*
71  * clear QStack Q-register
72  */
73 	if (TmpQRp->Start != NULL) {
74 		ZFree((voidptr)TmpQRp->Start);
75 		TmpQRp->Start = TmpQRp->End_P1 = NULL;
76 	}
77 	TmpQRp->Number = 0;
78 
79 	--QStTop;
80 
81 	DBGFEX(1,DbgFNm,(ColonMod) ? "PushEx(-1)" : "SUCCESS");
82 	return (ColonMod) ? PushEx(-1L, OPERAND) : SUCCESS;
83 }
84