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