X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/14f251df941eec1f9d72fdb4efa68967b5a39750..b041ccece3687baa46a947a5695b634ef113edfd:/usr/src/usr.bin/window/wwinschar.c diff --git a/usr/src/usr.bin/window/wwinschar.c b/usr/src/usr.bin/window/wwinschar.c index daafb145af..9fa6fd7670 100644 --- a/usr/src/usr.bin/window/wwinschar.c +++ b/usr/src/usr.bin/window/wwinschar.c @@ -1,78 +1,98 @@ #ifndef lint -static char *sccsid = "@(#)wwinschar.c 3.2 83/08/11"; +static char sccsid[] = "@(#)wwinschar.c 3.14 %G%"; #endif +/* + * Copyright (c) 1983 Regents of the University of California, + * All rights reserved. Redistribution permitted subject to + * the terms of the Berkeley Software License Agreement. + */ + #include "ww.h" +#include "tt.h" -wwinschar(w, line, col, c) +wwinschar(w, row, col, c) register struct ww *w; short c; { register i; - int row = line - w->ww_scroll; int nvis; + /* + * First, shift the line. + */ { register union ww_char *p, *q; - p = &w->ww_buf[line][w->ww_w.nc]; + p = &w->ww_buf[row][w->ww_b.r]; q = p - 1; - for (i = w->ww_w.nc - col - 1; --i >= 0;) + for (i = w->ww_b.r - col; --i > 0;) *--p = *--q; q->c_w = c; } - if (row < 0 || row >= w->ww_w.nr) + + /* + * If can't see it, just return. + */ + if (row < w->ww_i.t || row >= w->ww_i.b + || w->ww_i.r <= 0 || w->ww_i.r <= col) return; + + if (col < w->ww_i.l) + col = w->ww_i.l; + + /* + * Now find out how much is actually changed, and fix wwns. + */ { register union ww_char *buf; register char *win; register union ww_char *ns; register char *smap; + char touched; nvis = 0; - smap = &wwsmap[row + w->ww_w.t][col + w->ww_w.l]; - for (i = w->ww_w.nc - col; i > 0; i--) - if (*smap == w->ww_index) - break; - else { - smap++; - col++; - } - if (i <= 0) + smap = &wwsmap[row][col]; + for (i = col; i < w->ww_i.r && *smap++ != w->ww_index; i++) + ; + if (i >= w->ww_i.r) return; - buf = &w->ww_buf[line][col]; - win = &w->ww_win[row][col]; - ns = &wwns[row + w->ww_w.t][col + w->ww_w.l]; - c = buf->c_w ^ *win << WWC_MSHIFT; - for (; --i >= 0;) { - if (*win) { - if ((*win & (WWM_COV|WWM_GLS)) != 0) { - ns++; - buf++; - } else - ns++->c_w = buf++->c_w - ^ *win++ << WWC_MSHIFT; - } else { - *ns++ = *buf++; - win++; + col = i; + buf = w->ww_buf[row]; + win = w->ww_win[row]; + ns = wwns[row]; + smap = &wwsmap[row][i]; + touched = wwtouched[row]; + for (; i < w->ww_i.r; i++) { + if (*smap++ != w->ww_index) + continue; + touched |= WWU_TOUCHED; + if (win[i]) + ns[i].c_w = + buf[i].c_w ^ win[i] << WWC_MSHIFT; + else { nvis++; + ns[i] = buf[i]; } } + wwtouched[row] = touched; } - col += w->ww_w.l; - row += w->ww_w.t; - if (nvis > (wwncol - col) / 2) { + + /* + * Can/Should we use delete character? + */ + if (tt.tt_hasinsert && nvis > (wwncol - col) / 2) { register union ww_char *p, *q; - (*tt.tt_setinsert)(1); + tt.tt_ninsert = 1; + tt.tt_nmodes = c >> WWC_MSHIFT & tt.tt_availmodes; (*tt.tt_move)(row, col); - (*tt.tt_setmodes)(c >> WWC_MSHIFT); (*tt.tt_putc)(c & WWC_CMASK); - (*tt.tt_setinsert)(0); + tt.tt_ninsert = 0; p = &wwos[row][wwncol]; q = p - 1; - for (i = wwncol - col - 1; --i >= 0;) + for (i = wwncol - col; --i > 0;) *--p = *--q; q->c_w = c; }