1 /*****************************************************************************
2 
3 	ExeK()
4 
5 	This function executes a K command.
6 	nK	Kill n lines
7 	m,nK	Delete between m and n
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 
ExeK()14 DEFAULT ExeK()			/* execute a K command */
15 {
16 	ptrdiff_t	HowFar;
17 
18 	DBGFEN(1,"ExeK",NULL);
19 
20 	if (EStTop == EStBot) {			/* if no numeric argument */
21 		NArgmt = 1;			/* default is 1K */
22 	} else {
23 		UMinus();			/* if it's -K, make it -1K */
24 		if (GetNmA() == FAILURE) {	/* get numeric argument */
25 			DBGFEX(1,DbgFNm,"FALURE");
26 			return FAILURE;
27 		}
28 	}
29 
30 	if (CmdMod & MARGIS) {			/* if it's m,nK */
31 		if (NArgmt == MArgmt) {		/* if n equals m */
32 			CmdMod = '\0';		/* clear modifiers flags */
33 			DBGFEX(1,DbgFNm,"SUCCESS");
34 			return SUCCESS;
35 		}
36 		MEMMOVE(ErrTxt,
37 			(*CBfPtr == 'D' || *CBfPtr=='d') ? "m,nD" : "m,nK",
38 			5);
39 		if (GetAra() == FAILURE) {
40 			DBGFEX(1,DbgFNm,"FAILURE");
41 			return FAILURE;
42 		}
43 		if ((AraBeg < GapBeg) && (AraEnd > GapEnd)) {
44 			GapBeg = AraBeg;
45 			GapEnd = AraEnd;
46 		} else {
47 			if (AraEnd < GapEnd) {
48 				HowFar = (GapBeg-1) - AraEnd;
49 				GapBeg -= HowFar;
50 				GapEnd -= HowFar;
51 				MEMMOVE(GapEnd+1, GapBeg, (SIZE_T)HowFar);
52 				GapBeg = AraBeg;
53 			} else {
54 				HowFar = AraBeg - (GapEnd+1);
55 				MEMMOVE(GapBeg, GapEnd+1, (SIZE_T)HowFar);
56 				GapBeg += HowFar;
57 				GapEnd = AraEnd;
58 			}
59 		}
60 	} else {				/* else it's nK */
61 		NArgmt = Ln2Chr(NArgmt);	/* cvt line to char offset */
62 		if (NArgmt > 0) {
63 			GapEnd += NArgmt;
64 		} else {
65 			GapBeg += NArgmt;
66 		}
67 	}
68 
69 	CmdMod = '\0';				/* clear modifiers flags */
70 
71 	DBGFEX(1,DbgFNm,"SUCCESS");
72 	return SUCCESS;
73 }
74