1 /*****************************************************************************
2 
3 	ExeI()
4 
5 	This function executes an I command.
6 	Itext$		Insert text
7 	nI		Insert ASCII character "n"
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 #include "dchars.h"		/* define identifiers for characters */
15 #include "deferr.h"		/* define identifiers for error messages */
16 
ExeI()17 DEFAULT ExeI()			/* execute an I command */
18 {
19 	unsigned char InChar;
20 
21 	DBGFEN(1,"ExeI",NULL);
22 	if (EStTop > EStBot) {			/* if numeric argument */
23 		if (GetNmA() == FAILURE) {	/* get numeric argument */
24 			DBGFEX(1,DbgFNm,"FAILURE, GetNmA() failed");
25 			return FAILURE;
26 		}
27 
28 		if (CmdMod & ATSIGN) {		/* if it's n@I// */
29 			if (IncCBP() == FAILURE) {
30 				DBGFEX(1,DbgFNm,"FAILURE, 1st IncCBP() failed");
31 				return FAILURE;
32 			}
33 			if (IncCBP() == FAILURE) {
34 				DBGFEX(1,DbgFNm,"FAILURE, 2nd IncCBP() failed");
35 				return FAILURE;
36 			}
37 			if (*CBfPtr != *(CBfPtr-1)) {
38 				ErrMsg(ERR_IIA);     /* illegal insert arg */
39 				DBGFEX(1,DbgFNm,"FAILURE, illegal insert arg");
40 				return FAILURE;
41 			}
42 		} else {				/* else must be nI$ */
43 			if ((CBfPtr+1) == CStEnd) {
44 				if (MStTop < 0) {
45 					ErrUTC();
46 					DBGFEX(1,DbgFNm,"FAILURE, unterminated command");
47 					return FAILURE;
48 				} else {
49 					DBGFEX(1,DbgFNm,"SUCCESS");
50 					return SUCCESS;
51 				}
52 			}
53 			if (*(CBfPtr+1) != ESCAPE) {
54 				ErrMsg(ERR_IIA);     /* illegal insert arg */
55 				DBGFEX(1,DbgFNm,"FAILURE, illegal insert arg");
56 				return FAILURE;
57 			}
58 		}
59 		InChar = (char)NArgmt;
60 		if (InsStr(&InChar, (ptrdiff_t)1) == FAILURE) {
61 			DBGFEX(1,DbgFNm,"FAILURE, InsStr() failed");
62 			return FAILURE;
63 		}
64 	} else {				/* else no numeric argument */
65 		if (FindES(ESCAPE) == FAILURE) {
66 			DBGFEX(1,DbgFNm,"FAILURE, FindES() failed");
67 			return FAILURE;
68 		}
69 		if (InsStr(ArgPtr, CBfPtr-ArgPtr) == FAILURE) {
70 			DBGFEX(1,DbgFNm,"FAILURE, InsStr() failed");
71 			return FAILURE;
72 		}
73 	}
74 
75 	CmdMod = '\0';				/* clear modifiers flags */
76 
77 	DBGFEX(1,DbgFNm,"SUCCESS");
78 	return SUCCESS;
79 }
80