1 /*****************************************************************************
2
3 DoFlag()
4
5 This function gets or sets the value of a TECO mode control flag.
6
7 The TECO mode control flags are ED, EH, ES, ET, EU, EV, EZ and ^X.
8 The EO flag can only be examined, not set, so ExeEO does not call this
9 function.
10
11 *****************************************************************************/
12
13 #include "zport.h" /* define portability identifiers */
14 #include "tecoc.h" /* define general identifiers */
15 #include "defext.h" /* define external global variables */
16
DoFlag(Flag)17 DEFAULT DoFlag(Flag) /* handle a mode control flag */
18 WORD *Flag;
19 {
20 DBGFEN(2,"DoFlag",NULL);
21
22 if ((EStTop == EStBot) || /* if no numeric arg or */
23 (EStack[EStTop].ElType != OPERAND)) { /* partial expression */
24 DBGFEX(2,DbgFNm,"PushEx");
25 return PushEx((LONG)*Flag, OPERAND); /* return the flag */
26 }
27
28 if (GetNmA() == FAILURE) { /* get the numeric argument */
29 DBGFEX(2,DbgFNm,"FAILURE, GetNmA() failed");
30 return FAILURE;
31 }
32
33 if ((CmdMod & MARGIS) == '\0') { /* if it's n<flag> */
34 *Flag = (WORD)NArgmt; /* set the flag to n */
35 } else if (MArgmt && NArgmt) { /* else if it's m,n<flag> */
36 *Flag &= (WORD)~MArgmt; /* turn off m bits */
37 *Flag |= (WORD)NArgmt; /* turn on n bits */
38 } else if ((MArgmt == 0) && NArgmt) { /* else if it's 0,n<flag> */
39 *Flag |= (WORD)NArgmt; /* turn on n bits */
40 } else if ((MArgmt) && (NArgmt == 0)) { /* else if it's m,0<flag> */
41 *Flag &= (WORD)~MArgmt; /* turn off m bits */
42 }
43
44 EStTop = EStBot; /* clear expression stack */
45 CmdMod = '\0'; /* clear modifiers flags */
46
47 DBGFEX(2,DbgFNm,"SUCCESS");
48 return SUCCESS;
49 }
50