/*****************************************************************************

	DoFlag()

	This function changes a TECO mode control flag.

	The TECO mode control flags are ED, EH, ES, ET, EU, EV and ^X.
The EO flag can only be examined,  not set,  so ExeEO does not call this
function.

*****************************************************************************/

#include "ZPort.h"		/* define portability identifiers */
#include "DefTeco.h"		/* define general identifiers */

extern	DEFAULT	GetNmA();	/* get numeric argument */
extern	DEFAULT	PushEx();	/* push onto expression stack */

EXTERN	BYTE	CmdMod;		/* command modifiers flags for @, :, etc. */
EXTERN	WORD	EStBot;		/* expression stack bottom */
EXTERN	WORD	EStTop;		/* expression stack top */
EXTERN	LONG	MArgmt;		/* m part of m,n numeric argument pair */
EXTERN	LONG	NArgmt;		/* numeric argument */


DEFAULT DoFlag(Flag)		/* handle a mode control flag */
WORD *Flag;
{
#if DEBUGGING
DbgInd+=2;if(DbgLvl>=2){DbgMsg();DbgDBf("DoFlag: called.\015\012");DbgROf();}
#endif

	if (EStTop == EStBot)			/* if no numeric argument */
#if DEBUGGING
{if(DbgLvl>=2)
{DbgMsg();DbgDBf("DoFlag: returning PushEx().\015\012");DbgROf();}DbgInd-=2;
#endif
		return(PushEx((LONG)*Flag, OPERAND));	/* return the flag */
#if DEBUGGING
}
#endif

	if (GetNmA() == FAILURE)		/* get the numeric argument */
#if DEBUGGING
{if(DbgLvl>=2)
{DbgMsg();DbgDBf("DoFlag: returning FAILURE.\015\012");DbgROf();}DbgInd-=2;
#endif
		return(FAILURE);
#if DEBUGGING
}
#endif

	if ((CmdMod & MARGIS) == '\0')		/* if it's n<flag> */
		*Flag = (WORD)NArgmt;		/* set the flag to n */
	else if (MArgmt && NArgmt)		/* else if it's m,n<flag> */
		{
		*Flag &= (WORD)~MArgmt;		/* turn off m bits */
		*Flag |= (WORD)NArgmt;		/* turn on n bits */
		}
	else if ((MArgmt == 0L) && NArgmt)	/* else if it's 0,n<flag> */
		*Flag |= (WORD)NArgmt;		/* turn on n bits */
	else if ((MArgmt) && (NArgmt == 0L))	/* else if it's m,0<flag> */
		*Flag &= (WORD)~MArgmt;		/* turn off m bits */
	EStTop = EStBot;			/* clear expression stack */
	CmdMod = '\0';				/* clear modifiers flags */
#if DEBUGGING
if(DbgLvl>=2)
{DbgMsg();DbgDBf("DoFlag: returning SUCCESS.\015\012");DbgROf();}DbgInd-=2;
#endif
	return(SUCCESS);
}
