/* Original source is from the VED editor provided with the */ /* Aztec C compiler from Manx Systems */ /* It has been heavily modified for CP/M and VT100 terminals */ /* JWD 10/15/2024 */ #include "vi.h" int errflag=0; int errline, errcol; char errmsg[90]; int main(argc, argv) int argc; char **argv; { register int c, l, i; register char *t; scr_init(); init(); End_buf = Mem_buf; Cur_ptr = Cur_lp = Mem_buf; *Fil_nam = 0; while (--argc) { Tabwidth = 4; /* set default tab width to 4 */ if (*(*++argv) == '-') { switch ((*argv)[1]) { case 't': Tabwidth = atoi(*argv+2); break; } } else { strcpy(Fil_nam, argv[0]); } } if (*Fil_nam == 0 || read_fil(Fil_nam) < 0) t_insert(Cur_ptr, 0, "\r", 1); Modflg = 0; /* File modified flag */ redraw(Mem_buf, 1, SCR_TOP); /* Display first page of buffer */ stats(); /* Display file stats */ for (;;) { set_param(Cur_lp); /* Set the Lin_siz variable */ mv_curs(Cur_x, Cur_y); /* Set cursor position */ /* Use "getkey" assembly key mapper for ANSI keyboard strings. */ /* getchar() is too slow for polled I/O */ #ifdef ANSIKEY c = getkey(); /* Get character from console with VT100 cursor keys */ #else c = getchar(); /* Read one character from stdin */ #endif if (c != '0') /* Check for number and set repeat */ { c = get_num(c); /* Returns with character if not a number */ } switch (c) { case 'y': /* Yank buffer command (vi) */ c = getchar(); /* Read one character from stdin */ if (c == 'y' || c == 'd') yank(); if (c == 'd') lin_del(); break; case 'p': /* Put lines from yank buffer (vi) */ put(); break; case 'n': /* Find next matching string (vi) */ while (Num--) search(1); break; case '/': /* String search (vi) */ search(0); break; case 0xc: /* Redraw screen (vi) */ redraw(Cur_lp, Cur_lin, SCR_BOT/2); break; case 'r': /* Replace character (vi) */ if (*Cur_ptr == '\r' || (c = getchar()) == '\r') { beep(); break; } l = Lin_siz; *Cur_ptr = c; Modflg = 1; set_param(Cur_lp); if (l != Lin_siz) draw(Cur_lp, Cur_lin, Cur_y); else draw_lin(Cur_ptr, Cur_x, Cur_y); break; case 'k': /* Cursor up (vi) */ while (Num-- && Cur_lp != Mem_buf) { l=Cur_ptr-Cur_lp; t=Cur_lp; Cur_ptr = Cur_lp = get_prev(Cur_lp); if (c==0xb) Cur_ptr += (l<(i=t-Cur_lp-1)?l:i); set_param(Cur_lp); Cur_y -= Lin_siz; Cur_lin--; if (Cur_lin < Top_lin) scrl_dn(); } break; case '\r': /* Carriage return (vi) */ case 'j': /* Cursor down (vi) */ while (Num-- && get_next(Cur_ptr) != End_buf) { l=Cur_ptr-Cur_lp; Cur_ptr = Cur_lp = get_next(Cur_ptr); if (c==0xa) Cur_ptr += (l<(i=get_next(Cur_lp)-Cur_lp-1)?l:i); Cur_lin++; Cur_y += Lin_siz; if (Cur_lin == Bot_lin) scrl_up(); } break; case 'h': /* Cursor left (vi) */ while (Num-- && Cur_ptr > Cur_lp) Cur_ptr--; break; case 'l': /* Cursor right (vi) */ while (Num-- && *Cur_ptr != '\r') Cur_ptr++; break; case 0x2: /* Page Up (vi) */ Num = Cur_lin - 23 + Cur_x; if (Num < 1) Num = 1; Cur_lp = Mem_buf; Cur_lin = 1; while (--Num && (t = get_next(Cur_lp)) != End_buf) { Cur_lp = t; Cur_lin++; } Cur_ptr = Cur_lp; redraw(Cur_lp, Cur_lin, SCR_BOT/2); break; case 0x6: /* Page Down (vi) */ Num = Cur_lin + 23 + Cur_x; Cur_lp = Mem_buf; Cur_lin = 1; while (--Num && (t = get_next(Cur_lp)) != End_buf) { Cur_lp = t; Cur_lin++; } Cur_ptr = Cur_lp; redraw(Cur_lp, Cur_lin, SCR_BOT/2); break; case '0': /* Beginning of line */ Cur_ptr = Cur_lp; break; case '$': /* End of line */ Cur_ptr = get_next(Cur_ptr) - 1; break; case 'H': /* Move to top line of screen (vi) */ Cur_lp = Cur_ptr = Top_lp; Cur_y = Top_y; Cur_lin = Top_lin; break; case 'M': /* Move to middle of screen */ Cur_lp = Cur_ptr = Top_lp; Cur_y = Top_y; Cur_lin = Top_lin; Num = (SCR_BOT/2) - 1; while (Num-- && get_next(Cur_ptr) != End_buf) { l=Cur_ptr-Cur_lp; Cur_ptr = Cur_lp = get_next(Cur_ptr); if (c==0xa) Cur_ptr += (l<(i=get_next(Cur_lp)-Cur_lp-1)?l:i); Cur_lin++; Cur_y += Lin_siz; } break; case 'L': /* Move cursor to bottom of screen (vi) */ Cur_lp = Cur_ptr = get_prev(Bot_lp); set_param(Cur_lp); Cur_y = Bot_y - Lin_siz; Cur_lin = Bot_lin - 1; break; case 'G': /* Goto nG line or end of file (vi) */ if (Val == 0) /* If no number prefix, set up for 65535 reps. */ Num = -1; /* Bottom of file */ Cur_lp = Mem_buf; Cur_lin = 1; while (--Num && (t = get_next(Cur_lp)) != End_buf) { Cur_lp = t; Cur_lin++; } Cur_ptr = Cur_lp; redraw(Cur_lp, Cur_lin, SCR_BOT/2); break; case ':': /* vi command */ colon(); break; case 'x': /* Delete n characters under cursor (vi) */ delete(); break; case 'd': /* Double d for delete n lines (vi) */ if (getchar() == 'd') lin_del(); break; case 'o': /* Open new line (vi) */ if (End_buf > Mem_buf+1) { set_param(Cur_lp); Cur_lp = Cur_ptr = get_next(Cur_ptr); Cur_y += Lin_siz; t_insert(Cur_lp, 0, "\r", 1); if (Cur_y >= SCR_BOT) scrl_up(); else ++Cur_lin; draw(Cur_lp, Cur_lin, Cur_y); } insert(); break; case 'i': /* Insert characters on line (vi) */ insert(); break; case 'Z': /* Start of save command */ if (getchar() == 'Z' && Modflg) if (writ_fil(Fil_nam) != 0) break; quit(); break; } if (Val == 1) clr_statline(); } }