xref: /csrg-svn/usr.bin/window/wwinschar.c (revision 14977)
114427Sedward #ifndef lint
2*14977Sedward static	char *sccsid = "@(#)wwinschar.c	3.7 83/09/14";
314427Sedward #endif
414427Sedward 
514427Sedward #include "ww.h"
614650Sedward #include "tt.h"
714427Sedward 
814459Sedward wwinschar(w, line, col, c)
914427Sedward register struct ww *w;
1014459Sedward short c;
1114427Sedward {
1214459Sedward 	register i;
1314459Sedward 	int row = line - w->ww_scroll;
14*14977Sedward 	int srow = row + w->ww_w.t;
15*14977Sedward 	int scol = col + w->ww_w.l;
1614459Sedward 	int nvis;
1714427Sedward 
18*14977Sedward 	/*
19*14977Sedward 	 * First, shift the line.
20*14977Sedward 	 */
2114459Sedward 	{
2214459Sedward 		register union ww_char *p, *q;
2314459Sedward 
2414459Sedward 		p = &w->ww_buf[line][w->ww_w.nc];
2514459Sedward 		q = p - 1;
2614459Sedward 		for (i = w->ww_w.nc - col - 1; --i >= 0;)
2714459Sedward 			*--p = *--q;
2814459Sedward 		q->c_w = c;
2914459Sedward 	}
30*14977Sedward 
31*14977Sedward 	/*
32*14977Sedward 	 * If can't see it, just return.
33*14977Sedward 	 */
34*14977Sedward 	if (srow < w->ww_i.t || srow >= w->ww_i.b
35*14977Sedward 	    || w->ww_i.r <= 0 || w->ww_i.r <= scol)
3614459Sedward 		return;
37*14977Sedward 
38*14977Sedward 	if (scol < w->ww_i.l)
39*14977Sedward 		scol = w->ww_i.l;
40*14977Sedward 	col = scol - w->ww_w.l;
41*14977Sedward 
42*14977Sedward 	/*
43*14977Sedward 	 * Now find out how much is actually changed, and fix wwns.
44*14977Sedward 	 */
4514459Sedward 	{
4614459Sedward 		register union ww_char *buf;
4714459Sedward 		register char *win;
4814459Sedward 		register union ww_char *ns;
4914459Sedward 		register char *smap;
5014663Sedward 		char *touched;
5114459Sedward 
5214459Sedward 		nvis = 0;
53*14977Sedward 		smap = &wwsmap[srow][scol];
54*14977Sedward 		for (i = w->ww_i.r - scol; i > 0 && *smap++ != w->ww_index; i--)
55*14977Sedward 			col++, scol++;
5614459Sedward 		if (i <= 0)
5714459Sedward 			return;
5814459Sedward 		buf = &w->ww_buf[line][col];
5914459Sedward 		win = &w->ww_win[row][col];
60*14977Sedward 		ns = &wwns[srow][scol];
61*14977Sedward 		touched = &wwtouched[srow];
6214459Sedward 		c = buf->c_w ^ *win << WWC_MSHIFT;
6314459Sedward 		for (; --i >= 0;) {
6414459Sedward 			if (*win) {
6514459Sedward 				if ((*win & (WWM_COV|WWM_GLS)) != 0) {
6614459Sedward 					ns++;
6714459Sedward 					buf++;
6814663Sedward 				} else {
6914663Sedward 					*touched = 1;
7014459Sedward 					ns++->c_w = buf++->c_w
7114459Sedward 						^ *win++ << WWC_MSHIFT;
7214663Sedward 				}
7314427Sedward 			} else {
7414663Sedward 				*touched = 1;
7514459Sedward 				*ns++ = *buf++;
7614459Sedward 				win++;
7714459Sedward 				nvis++;
7814427Sedward 			}
7914427Sedward 		}
8014427Sedward 	}
81*14977Sedward 
82*14977Sedward 	/*
83*14977Sedward 	 * Can/Should we use delete character?
84*14977Sedward 	 */
85*14977Sedward 	if (tt.tt_setinsert != 0 && nvis > (wwncol - scol) / 2) {
8614459Sedward 		register union ww_char *p, *q;
8714459Sedward 
8814459Sedward 		(*tt.tt_setinsert)(1);
89*14977Sedward 		(*tt.tt_move)(srow, scol);
9014459Sedward 		(*tt.tt_setmodes)(c >> WWC_MSHIFT);
9114459Sedward 		(*tt.tt_putc)(c & WWC_CMASK);
9214459Sedward 		(*tt.tt_setinsert)(0);
9314459Sedward 
94*14977Sedward 		p = &wwos[srow][wwncol];
9514459Sedward 		q = p - 1;
96*14977Sedward 		for (i = wwncol - scol; --i > 0;)
9714459Sedward 			*--p = *--q;
9814459Sedward 		q->c_w = c;
9914459Sedward 	}
10014427Sedward }
101