|
- /* VEDIT.C - BUFFER EDITING FOR THE C64 VIM CLONE: INSERT, DELETE, SAVE. */
EXTERN CHAR *BFR;
EXTERN UNSIGNED BLEN;
EXTERN UNSIGNED LPTR[];
EXTERN INT NLINES, CY, CX, TOP, LEFTCOL, MODE, DIRTY;
EXTERN CHAR *NOTE;
EXTERN CHAR FNAME[];
EXTERN CHAR YBUF[];
EXTERN INT YLEN, YOK;
/* END OFFSET (EXCLUSIVE OF THE $0D) OF LINE LN */
LINEND(LN)
INT LN;
Û
IF (LN + 1 < NLINES) RETURN LPTR[LN + 1] - 1;
RETURN BLEN;
Ý
/* KEEP CX INSIDE THE CURRENT LINE */
CLAMPX()
Û
INT LEN;
LEN = LINEND(CY) - LPTR[CY];
IF (CX > LEN) CX = LEN;
IF (CX < 0) CX = 0;
RETURN 0;
Ý
/* ------------------------------------------------------------- EDITING */
/* INSERT BYTE CH AT BUFFER OFFSET POS. 1 ON SUCCESS, 0 IF THE BUFFER IS FULL */
BINS(POS, CH)
UNSIGNED POS;
INT CH;
Û
UNSIGNED I;
IF (BLEN >= 18999) RETURN 0;
FOR (I = BLEN; I > POS; I--) BFR[I] = BFR[I - 1];
BFR[POS] = CH;
BLEN++;
DIRTY = 1;
RETURN 1;
Ý
/* REMOVE N BYTES AT OFFSET POS */
DELRANGE(POS, N)
UNSIGNED POS, N;
Û
UNSIGNED I;
FOR (I = POS; I + N < BLEN; I++) BFR[I] = BFR[I + N];
BLEN = BLEN - N;
DIRTY = 1;
RETURN 0;
Ý
/* TYPE ONE CHARACTER AT THE CURSOR */
INSCHAR(CH)
INT CH;
Û
INT L;
IF (BINS(LPTR[CY] + CX, CH) == 0) RETURN 0;
FOR (L = CY + 1; L < NLINES; L++) LPTR[L]++;
CX++;
RETURN 1;
Ý
/* SPLIT THE LINE AT THE CURSOR */
NEWLINE()
Û
INT L;
UNSIGNED POS;
IF (NLINES >= 599) RETURN 0;
POS = LPTR[CY] + CX;
IF (BINS(POS, 13) == 0) RETURN 0;
FOR (L = NLINES; L > CY + 1; L--) LPTR[L] = LPTR[L - 1];
LPTR[CY + 1] = POS + 1;
NLINES++;
FOR (L = CY + 2; L < NLINES; L++) LPTR[L]++;
CY++;
CX = 0;
RETURN 1;
Ý
/* DELETE THE CHARACTER UNDER THE CURSOR */
DELCHAR()
Û
INT L;
IF (CX >= LINEND(CY) - LPTR[CY]) RETURN 0;
DELRANGE(LPTR[CY] + CX, 1);
FOR (L = CY + 1; L < NLINES; L++) LPTR[L]--;
RETURN 1;
Ý
/* BACKSPACE: DELETE BEFORE THE CURSOR, OR JOIN ONTO THE PREVIOUS LINE */
BKSPACE()
Û
INT L, PL;
IF (CX > 0) Û
CX--;
DELCHAR();
RETURN 0;
Ý
IF (CY == 0) RETURN 0;
PL = LINEND(CY - 1) - LPTR[CY - 1];
DELRANGE(LPTR[CY] - 1, 1);
FOR (L = CY; L < NLINES - 1; L++) LPTR[L] = LPTR[L + 1];
NLINES--;
FOR (L = CY; L < NLINES; L++) LPTR[L]--;
CY--;
CX = PL;
RETURN 0;
Ý
/* DD: YANK THE CURRENT LINE AND REMOVE IT */
DELLINE()
Û
INT L, I;
UNSIGNED S, E, N;
S = LPTR[CY];
E = LINEND(CY);
YLEN = E - S;
IF (YLEN > 159) YLEN = 159;
FOR (I = 0; I < YLEN; I++) YBUF[I] = BFR[S + I];
YOK = 1;
IF (NLINES == 1) Û
BLEN = 0;
DIRTY = 1;
Ý ELSE IF (CY + 1 < NLINES) Û
N = LPTR[CY + 1] - S;
DELRANGE(S, N);
FOR (L = CY; L < NLINES - 1; L++) LPTR[L] = LPTR[L + 1];
NLINES--;
FOR (L = CY; L < NLINES; L++) LPTR[L] -= N;
Ý ELSE Û /* LAST LINE: TAKE ITS LEADING $0D */
DELRANGE(S - 1, BLEN - S + 1);
NLINES--;
CY--;
Ý
CX = 0;
RETURN 0;
Ý
/* P: PUT THE YANKED LINE BELOW THE CURSOR LINE */
PASTE()
Û
INT I;
IF (YOK == 0) RETURN 0;
CX = LINEND(CY) - LPTR[CY];
IF (NEWLINE() == 0) RETURN 0;
FOR (I = 0; I < YLEN; I++) INSCHAR(YBUF[I]);
CX = 0;
RETURN 0;
Ý
/* CURSOR KEYS, THE SAME IN BOTH MODES. 1 IF K WAS ONE OF THEM */
ARROW(K)
INT K;
Û
IF (K == 17) Û
IF (CY + 1 < NLINES) Û
CY++;
CLAMPX();
Ý
RETURN 1;
Ý
IF (K == 145) Û
IF (CY > 0) Û
CY--;
CLAMPX();
Ý
RETURN 1;
Ý
IF (K == 29) Û
CX++;
CLAMPX();
RETURN 1;
Ý
IF (K == 157) Û
IF (CX > 0) CX--;
RETURN 1;
Ý
RETURN 0;
Ý
/* WRITE THE BUFFER TO FNAME, REPLACING ANY OLD COPY. 1 ON SUCCESS */
SAVEF()
Û
CHAR ON[32];
INT I, F;
UNSIGNED J;
ON[0] = 64; /* @ */
ON[1] = 48; /* 0 */
ON[2] = 58; /* : */
I = 3;
J = 0;
WHILE (FNAME[J] && J < 20) ON[I++] = FNAME[J++];
ON[I++] = 44; /* , */
ON[I++] = 83; /* Ó (PETSCII, NOT ASCII) */
ON[I++] = 44; /* , */
ON[I++] = 87; /* × */
ON[I] = 0;
F = OPEN(5, 8, 3, ON);
IF (F == 0) RETURN 0;
FOR (J = 0; J < BLEN; J++) PUTC(BFR[J], 5);
IF (BLEN > 0) Û
IF (BFR[BLEN - 1] != 13) PUTC(13, 5);
Ý
CLOSE(5);
RETURN 1;
Ý
|