/* 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" colon() { char buf[80]; register char *cp; register int c; static int nowrite=0; cp = buf; *cp++ = ':'; for (;;) { *cp = 0; mesg(buf); c = getchar(); /* Read one character from stdin */ if (c == '\r') break; if (c == 8) { if (cp > buf+1) cp--; continue; } if (c < 0x20) continue; *cp++ = c; } cp = buf+1; switch (*cp) { case 'f': stats(); return; case 'q': while ((c=*++cp) && c != ' ') if (c == '!') nowrite=1; if (Modflg == 0 || nowrite) quit(); mesg("file modified - use q! to override"); return; case 'w': if (cp[1]=='q') { if (writ_fil(Fil_nam) == 0) quit(); return; } while (*++cp == ' '); if (*cp == 0) cp = Fil_nam; if (writ_fil(cp) == 0) Modflg = 0; return; case 'r': while (*++cp == ' '); read_fil(cp); draw(Cur_lp, Cur_lin, Cur_y); return; case 'e': if (Modflg && *++cp != '!') { mesg("file modified - use e! to override"); return; } if (*(cp+1) == '!') ++cp; while (*++cp == ' '); Cur_lp = Cur_ptr = End_buf = Mem_buf; if (read_fil(cp) < 0) t_insert(Cur_ptr, 0, "\r", 1); Modflg = 0; strcpy(Fil_nam, cp); redraw(Mem_buf, 1, SCR_TOP); stats(); return; } } search(flg) int flg; { static char srch[80]; char buf[80]; register char *tp, *cp; register int c; cp = buf; *cp++ = '/'; for (;;) { *cp = 0; mesg(buf); if (flg) break; c = getchar(); /* one character from stdin */ if (c == '\r') break; if (c == 8) { if (cp > buf+1) cp--; continue; } if (c < 0x20) continue; *cp++ = c; } if (buf[1]) strcpy(srch, buf+1); if (srch[0] == 0) { mesg("no previous search string"); return; } *End_buf = 0; tp = Cur_ptr + 1; c = strlen(srch); for (;;) { cp = index(tp, srch[0]); if (cp == 0) { mesg("no match"); return; } if (strncmp(cp, srch, c) == 0) { Cur_lp = get_prev(get_next(Cur_ptr = cp)); if (Cur_lp >= Top_lp && Cur_lp < Bot_lp) { cp = Top_lp; Cur_lin = Top_lin; Cur_y = Top_y; while (cp < Cur_lp) { set_param(cp); Cur_y += Lin_siz; Cur_lin++; cp = get_next(cp); } return; } redraw(Cur_lp, Cur_lin, SCR_BOT/2); return; } tp = cp + 1; } } get_num(c) int c; { char buf[10]; register char *cp; cp = buf; Num = Val = 0; for (;;) { if (c < '0' || c > '9') { if (Val == 0) Num = 1; return(c); } Val = 1; Num = Num * 10 + c - '0'; *cp++ = c; *cp = 0; mesg(buf); mv_curs(Cur_x, Cur_y); #ifdef ANSIKEY c = getkey(); /* Get character from console with VT100 cursor keys */ #else c = getchar(); /* Read one character from stdin */ #endif } } stats() { char buf[80]; register char *cp; register int c; maknam(buf, Fil_nam); strcat(buf, "line "); itoa(buf+strlen(buf), Cur_lin); strcat(buf, " of "); cp = Mem_buf; c = 1; while ((cp = get_next(cp)) != End_buf) ++c; itoa(buf+strlen(buf), c); mesg(buf); } clr_statline() { mv_curs(0, 0); scr_eol (); mv_curs(Cur_x, Cur_y); } itoa(buf, num) char *buf; int num; { register int flg = 0; register int i, j = 1000; while (j) { i = num/j; num %= j; j /= 10; if (i == 0 && flg == 0) continue; *buf++ = i + '0'; flg = 1; } if (flg == 0) *buf++ = '0'; *buf = 0; }