|
- /* 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;
EXTERN INT REDRAW; /* 1 CURSOR ROW, 2 WHOLE SCREEN */
/* 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;
Û
IF (BLEN >= 18999) RETURN 0;
MLMOVE((UNSIGNED) BFR + POS, (UNSIGNED) BFR + POS + 1, BLEN - POS);
BFR[POS] = CH;
BLEN++;
DIRTY = 1;
RETURN 1;
Ý
/* REMOVE N BYTES AT OFFSET POS */
DELRANGE(POS, N)
UNSIGNED POS, N;
Û
MLMOVE((UNSIGNED) BFR + POS + N, (UNSIGNED) BFR + POS, BLEN - POS - N);
BLEN = BLEN - N;
DIRTY = 1;
RETURN 0;
Ý
#DEFINE ÍÁØÃÏÌ 80 /* LONGEST LINE THE EDITOR KEEPS */
/* TYPE ONE CHARACTER AT THE CURSOR */
INSCHAR(CH)
INT CH;
Û
IF (LINEND(CY) - LPTR[CY] >= ÍÁØÃÏÌ) Û
NOTE = "LINE FULL (80)";
RETURN 0;
Ý
IF (BINS(LPTR[CY] + CX, CH) == 0) RETURN 0;
MLADJ((UNSIGNED) &LPTR[CY + 1], NLINES - CY - 1, 1);
CX++;
IF (REDRAW < 1) REDRAW = 1;
RETURN 1;
Ý
/* SPLIT THE LINE AT THE CURSOR */
NEWLINE()
Û
UNSIGNED POS;
IF (NLINES >= 599) RETURN 0;
POS = LPTR[CY] + CX;
IF (BINS(POS, 13) == 0) RETURN 0;
MLMOVE((UNSIGNED) &LPTR[CY + 1], (UNSIGNED) &LPTR[CY + 2],
(NLINES - CY - 1) * 2);
LPTR[CY + 1] = POS + 1;
NLINES++;
MLADJ((UNSIGNED) &LPTR[CY + 2], NLINES - CY - 2, 1);
REDRAW = 2;
CY++;
CX = 0;
RETURN 1;
Ý
/* DELETE THE CHARACTER UNDER THE CURSOR */
DELCHAR()
Û
IF (CX >= LINEND(CY) - LPTR[CY]) RETURN 0;
DELRANGE(LPTR[CY] + CX, 1);
MLADJ((UNSIGNED) &LPTR[CY + 1], NLINES - CY - 1, 65535);
IF (REDRAW < 1) REDRAW = 1;
RETURN 1;
Ý
/* BACKSPACE: DELETE BEFORE THE CURSOR, OR JOIN ONTO THE PREVIOUS LINE */
BKSPACE()
Û
INT PL;
IF (CX > 0) Û
CX--;
DELCHAR();
RETURN 0;
Ý
IF (CY == 0) RETURN 0;
PL = LINEND(CY - 1) - LPTR[CY - 1];
IF (PL + LINEND(CY) - LPTR[CY] > ÍÁØÃÏÌ) Û
NOTE = "JOINED LINE WOULD PASS 80";
RETURN 0;
Ý
DELRANGE(LPTR[CY] - 1, 1);
MLMOVE((UNSIGNED) &LPTR[CY + 1], (UNSIGNED) &LPTR[CY],
(NLINES - CY - 1) * 2);
NLINES--;
MLADJ((UNSIGNED) &LPTR[CY], NLINES - CY, 65535);
REDRAW = 2;
CY--;
CX = PL;
RETURN 0;
Ý
/* DD: YANK THE CURRENT LINE AND REMOVE IT */
DELLINE()
Û
INT I;
UNSIGNED S, E, N;
S = LPTR[CY];
E = LINEND(CY);
YLEN = E - S;
IF (YLEN > ÍÁØÃÏÌ) YLEN = ÍÁØÃÏÌ;
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);
MLMOVE((UNSIGNED) &LPTR[CY + 1], (UNSIGNED) &LPTR[CY],
(NLINES - CY - 1) * 2);
NLINES--;
MLADJ((UNSIGNED) &LPTR[CY], NLINES - CY, 0 - N);
Ý ELSE Û /* LAST LINE: TAKE ITS LEADING $0D */
DELRANGE(S - 1, BLEN - S + 1);
NLINES--;
CY--;
Ý
CX = 0;
REDRAW = 2;
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;
Ý
|