Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

1 linha
5.1KB

  1. /* 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; Ý

Powered by TurnKey Linux.