1 /*****************************************************************************
2 
3 	PopMac()
4 
5 	This function "pops" the current macro environment,  which was
6 established by an earlier call to the PshMac function.  Part of this job
7 is de-allocating memory consumed by local q-registers.
8 
9 *****************************************************************************/
10 
11 #include "zport.h"		/* define portability identifiers */
12 #include "tecoc.h"		/* define general identifiers */
13 #include "defext.h"		/* define external global variables */
14 
PopMac()15 DEFAULT PopMac()		/* restore environment after macro exit */
16 {
17     WORD	i;
18     MSptr	MSp;		/* pointer into the macro stack */
19     QRptr	QRp;		/* pointer into local Q-register table */
20     BOOLEAN	RetVal;		/* TRUE if macro is returning a value */
21 
22     DBGFEN(1,"PopMac",NULL);
23 
24     RetVal = (EStTop > EStBot);
25     if (RetVal) {		/* if macro is returning a value */
26         if (GetNmA() == FAILURE) {
27 	    DBGFEX(1,DbgFNm,"FAILURE, GetNmA() failed");
28 	    return FAILURE;
29 	}
30     }
31 
32 /*
33  * restore old environment
34  */
35 
36     MSp = &MStack[MStTop];
37     CStBeg = MSp->CStBeg;		/* restore old command string start */
38     CBfPtr = MSp->CBfPtr;		/* restore old command string ptr */
39     CStEnd = MSp->CStEnd;		/* restore old command string end */
40     EStBot = MSp->EStBot;		/* restore expression stack bottom */
41     EStTop = MSp->EStTop;		/* restore expression stack top */
42     LStBot = MSp->LStBot;		/* restore loop stack bottom */
43     LStTop = MSp->LStTop;		/* restore loop stack top */
44     if (MSp->QRgstr != NULL) {		/* local q-registers allocated? */
45         for (QRp = MSp->QRgstr, i = 0; i < 36; ++i, ++QRp) {
46 	    if (QRp->Start != NULL) {
47 		ZFree((voidptr)QRp->Start);
48 	    }
49 	}
50 	ZFree(MSp->QRgstr);
51     }
52     --MStTop;
53 
54 #if DEBUGGING
55     sprintf(DbgSBf,"%s", (RetVal) ? "PushEx(NArgmt)" : "SUCCESS");
56     DbgFEx(1,DbgFNm,DbgSBf);
57 #endif
58 
59     return ((RetVal) ? PushEx(NArgmt, OPERAND) : SUCCESS);
60 }
61