X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/861cd1ed8cc1cccf3803dcd1f404347b56689d57..d93758100f2a0e2107957c31450a3e9c6bf278b8:/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 5c82261cb9..715a2dabeb 100644 --- a/usr/src/usr.bin/window/wwinschar.c +++ b/usr/src/usr.bin/window/wwinschar.c @@ -1,85 +1,105 @@ +/* + * Copyright (c) 1983 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + #ifndef lint -static char *sccsid = "@(#)wwinschar.c 3.4 83/08/16"; -#endif +static char sccsid[] = "@(#)wwinschar.c 3.18 (Berkeley) %G%"; +#endif /* not lint */ #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; + 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]; - touched = &wwtouched[row + w->ww_w.t]; - c = buf->c_w ^ *win << WWC_MSHIFT; - for (; --i >= 0;) { - if (*win) { - if ((*win & (WWM_COV|WWM_GLS)) != 0) { - ns++; - buf++; - } else { - *touched = 1; - ns++->c_w = buf++->c_w - ^ *win++ << WWC_MSHIFT; - } - } else { - *touched = 1; - *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) { - register union ww_char *p, *q; - (*tt.tt_setinsert)(1); - (*tt.tt_move)(row, col); - (*tt.tt_setmodes)(c >> WWC_MSHIFT); - (*tt.tt_putc)(c & WWC_CMASK); - (*tt.tt_setinsert)(0); + /* + * Can/Should we use delete character? + */ + if ((tt.tt_inschar || tt.tt_setinsert) && nvis > (wwncol - col) / 2) { + register union ww_char *p, *q; + xxinschar(row, col, c & wwavailmodes << WWC_MSHIFT); 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; + q->c_w = tt.tt_setinsert ? c : ' '; } }