1 /*****************************************************************************
2 
3 	DoCJR()
4 
5 	This function contains the code that's common to the C, J and R
6 commands.  It is called by ExeC, ExeJ and ExeR only.
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 
DoCJR(HowFar)15 DEFAULT DoCJR(HowFar)		/* do C, J or R stuff */
16 LONG HowFar;			/* positive or negative displacement */
17 {
18 	LONG	InRange;
19 	BOOLEAN	ColonMod;
20 
21 #if DEBUGGING
22 	static char *DbgFNm = "DoCJR";
23 	sprintf(DbgSBf,"HowFar = %ld", HowFar);
24 	DbgFEn(2,DbgFNm,DbgSBf);
25 #endif
26 
27 	ColonMod = (CmdMod & COLON);		/* is it :C, :J, or :R? */
28 	CmdMod &= ~COLON;			/* clear : flag */
29 
30 	InRange = -1;				/* -1 means SUCCESS in TECO */
31 	if (HowFar > 0) {
32 		if ((GapEnd+HowFar) > EBfEnd) {
33 			InRange = 0;		/* 0 means FAILURE in TECO */
34 		} else {
35 			MEMMOVE(GapBeg, GapEnd+1, HowFar);
36 			GapBeg += HowFar;
37 			GapEnd += HowFar;
38 		}
39 	} else {
40 		if ((GapBeg+HowFar) < EBfBeg) {
41 			InRange = 0;		/* 0 means FAILURE in TECO */
42 		} else {
43 			GapBeg += HowFar;
44 			GapEnd += HowFar;
45 			MEMMOVE(GapEnd+1, GapBeg, -(HowFar));
46 		}
47 	}
48 
49 	if (ColonMod) {				/* if colon modifier */
50 		DBGFEX(2,DbgFNm,"PushEx");
51 		return PushEx(InRange, OPERAND);
52 	} else {
53 		if (InRange == 0) {		/* if out-of-bounds */
54 			ErrChr(ERR_POP, *CBfPtr);
55 			DBGFEX(2,DbgFNm,"FAILURE");
56 			return FAILURE;
57 		}
58 	}
59 
60 	CmdMod = '\0';				/* clear modifiers flags */
61 	EStTop = EStBot;			/* clear expression stack */
62 
63 	DBGFEX(2,DbgFNm,"SUCCESS");
64 
65 	return SUCCESS;
66 }
67