X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/39b49130f530c89c263e299005d5bf6d69a7942d..03e75950ae6499acf15ad8dc58b1dddb3b8415e7:/usr/src/usr.bin/window/wwwrite.c diff --git a/usr/src/usr.bin/window/wwwrite.c b/usr/src/usr.bin/window/wwwrite.c index 484befeec3..1e44f480f9 100644 --- a/usr/src/usr.bin/window/wwwrite.c +++ b/usr/src/usr.bin/window/wwwrite.c @@ -1,44 +1,107 @@ #ifndef lint -static char *sccsid = "@(#)wwwrite.c 1.5 83/07/27"; +static char *sccsid = "@(#)wwwrite.c 3.9 83/08/26"; #endif #include "ww.h" -int wwnwrite; -int wwnwritec; - wwwrite(w, p, n) register struct ww *w; register char *p; -register n; +int n; { - register char c; + char c; + char hascursor = 0; - if (w == 0 || w->ww_win == 0) - return -1; wwnwrite++; wwnwritec += n; - while (n-- > 0) { + if (hascursor = w->ww_hascursor) + wwcursor(w, 0); + while (--n >= 0) { c = *p++ & 0x7f; switch (w->ww_wstate) { case 0: - if (c >= ' ' && c < 0x7f) { - if (w->ww_insert) - Winschars(w->ww_win, 1); - Wputc(c, w->ww_win); + if (!ISCTRL(c)) { + int i, j; + register union ww_char *bp; + union ww_char *bq; + register union ww_char *ns; + register char *smap; + register char *win; + char *touched; + + if (w->ww_insert) { + wwinschar(w, w->ww_scroll + w->ww_cur.r, + w->ww_cur.c, + c | w->ww_modes << WWC_MSHIFT); + goto right; + } + i = w->ww_w.nc - w->ww_cur.c - 1; + bp = bq = &w->ww_buf[w->ww_scroll+w->ww_cur.r] + [w->ww_cur.c]; + bp++->c_w = c | w->ww_modes << WWC_MSHIFT; + while (n > 0 && --i >= 0 && !ISCTRL(*p)) { + n--; + bp++->c_w = *p++ & 0x7f + | w->ww_modes << WWC_MSHIFT; + } + win = &w->ww_win[w->ww_cur.r][w->ww_cur.c]; + i = wwcurrow(w); + j = wwcurcol(w); + smap = &wwsmap[i][j]; + ns = &wwns[i][j]; + touched = &wwtouched[i]; + j = i = bp - bq; + bp = bq; + while (--i >= 0) { + if (*smap++ == w->ww_index) { + *touched = 1; + ns++->c_w = bp++->c_w + ^ *win++ << WWC_MSHIFT; + } else { + ns++; + bp++; + win++; + } + } + if ((w->ww_cur.c += j) >= w->ww_w.nc) { + w->ww_cur.c = 0; + goto lf; + } break; } switch (c) { case '\n': - Wputc(c, w->ww_win); - if (w->ww_refresh) - Wrefresh(1); + if (w->ww_mapnl) + w->ww_cur.c = 0; + lf: + if (++w->ww_cur.r >= w->ww_w.nr) { + w->ww_cur.r = w->ww_w.nr - 1; + if (w->ww_scroll + w->ww_w.nr + < w->ww_nline) + wwscroll(w, 1); + else + wwdelline(w, 0); + } break; case '\t': + w->ww_cur.c |= 7; + right: + if (++w->ww_cur.c >= w->ww_w.nc) { + w->ww_cur.c = 0; + goto lf; + } + break; case '\b': + if (--w->ww_cur.c < 0) { + w->ww_cur.c = w->ww_w.nc - 1; + goto up; + } + break; case '\r': + w->ww_cur.c = 0; + break; case CTRL(g): - Wputc(c, w->ww_win); + wwbell(); break; case CTRL([): w->ww_wstate = 1; @@ -52,41 +115,44 @@ register n; w->ww_insert = 1; break; case 'A': - Wcurup(w->ww_win, 1); + up: + if (--w->ww_cur.r < 0) { + w->ww_cur.r = 0; + if (w->ww_scroll > 0) + wwscroll(w, -1); + else + wwinsline(w, 0); + } break; case 'B': - Wcurdown(w->ww_win, 1); - break; + goto lf; case 'C': - Wcurright(w->ww_win, 1); - break; + goto right; case 'E': - WWcursor(w->ww_win, 0, 0); - Wclear(w->ww_win, 2); - /* always refresh */ - Wrefresh(1); + w->ww_scroll = 0; + w->ww_cur.c = w->ww_cur.r = 0; + wwclreos(w, 0, 0); break; case 'H': - WWcursor(w->ww_win, 0, 0); + w->ww_cur.c = w->ww_cur.r = 0; break; case 'J': - Wclear(w->ww_win, 0); + wwclreos(w, w->ww_scroll + w->ww_cur.r, + w->ww_cur.c); break; case 'K': - Wclearline(w->ww_win, 0); + wwclreol(w, w->ww_scroll + w->ww_cur.r, + w->ww_cur.c); break; case 'L': - Winslines(w->ww_win, 1); - if (w->ww_refresh) - Wrefresh(1); + wwinsline(w, w->ww_scroll + w->ww_cur.r); break; case 'M': - Wdellines(w->ww_win, 1); - if (w->ww_refresh) - Wrefresh(1); + wwdelline(w, w->ww_scroll + w->ww_cur.r); break; case 'N': - Wdelchars(w->ww_win, 1); + wwdelchar(w, w->ww_scroll + w->ww_cur.r, + w->ww_cur.c); break; case 'O': w->ww_insert = 0; @@ -94,18 +160,31 @@ register n; case 'Y': w->ww_wstate = 2; break; + case 'p': + w->ww_modes |= WWM_REV; + break; + case 'q': + w->ww_modes &= ~WWM_REV; + break; + case 'r': + w->ww_modes |= WWM_UL; + break; + case 's': + w->ww_modes &= ~WWM_UL; + break; } break; case 2: - WWcursor(w->ww_win, (c - ' ') % w->ww_i.nrow, - w->ww_win->w_cursor.col); + w->ww_cur.r = (c - ' ') % w->ww_w.nr; w->ww_wstate++; break; case 3: - WWcursor(w->ww_win, w->ww_win->w_cursor.row, - (c - ' ') % w->ww_i.ncol); + w->ww_cur.c = (c - ' ') % w->ww_w.nc; w->ww_wstate = 0; break; } } + if (hascursor) + wwcursor(w, 1); + return 0; }