1 /*****************************************************************************
2 
3 	ExeSCl()
4 
5 	This function executes a semi-colon (;) command.
6 
7 	;	Exit iteration on search failure
8 	n;	Exit iteration if n is positive
9 	:;	Exit iteration on search success
10 	n:;	Exit iteration if n is negative
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 #include "deferr.h"		/* define identifiers for error messages */
17 
ExeSCl()18 DEFAULT ExeSCl()			/* execute semi-colon command */
19 {
20 #if DEBUGGING
21 	static char *DbgFNm = "ExeSCl";
22 	DbgFEn(1,DbgFNm,
23 		(CmdMod & COLON)
24 			? (EStTop == EStBot) ? "have :;" : "have n:;"
25 			: (EStTop == EStBot) ? "have ;"  : "have n;"   );
26 #endif
27 	if (LStTop == LStBot) {			/* if not in a loop */
28 		ErrMsg(ERR_SNI);		/* ; not in iteration */
29 		DBGFEX(1,DbgFNm,"FAILURE");
30 		return FAILURE;
31 	}
32 
33 	if (EStTop == EStBot) {			/* if no numeric argument */
34 		ErrMsg(ERR_NAS);		/* no argument before ; */
35 		DBGFEX(1,DbgFNm,"FAILURE");
36 		return FAILURE;
37 	}
38 
39 	if (GetNmA() == FAILURE) {		/* get numeric argument */
40 		DBGFEX(1,DbgFNm,"FAILURE. GetNmA failed()");
41 		return FAILURE;
42 	}
43 
44 /*
45  * If not colon-modified and numeric arg is positive OR
46  *    if colon-modified and numeric arg is negative
47  *	flow to the end of the loop and exit it
48  */
49 	if ( (!(CmdMod & COLON) && (NArgmt >= 0) ) ||
50 	     ( (CmdMod & COLON) && (NArgmt <  0) ) ) {
51 		if (FlowEL() == FAILURE) {	/* flow to end of loop */
52 			DBGFEX(1,DbgFNm,"FAILURE, FlowEL() failed");
53 			return FAILURE;
54 		}
55 	}
56 
57 	CmdMod = '\0';				/* clear modifiers flags */
58 	EStTop = EStBot;			/* clear expression stack */
59 
60 	DBGFEX(1,DbgFNm,"SUCCESS");
61 	return SUCCESS;
62 }
63