xref: /csrg-svn/usr.bin/window/wwinschar.c (revision 14459)
114427Sedward #ifndef lint
2*14459Sedward static	char *sccsid = "@(#)wwinschar.c	3.2 83/08/11";
314427Sedward #endif
414427Sedward 
514427Sedward #include "ww.h"
614427Sedward 
7*14459Sedward wwinschar(w, line, col, c)
814427Sedward register struct ww *w;
9*14459Sedward short c;
1014427Sedward {
11*14459Sedward 	register i;
12*14459Sedward 	int row = line - w->ww_scroll;
13*14459Sedward 	int nvis;
1414427Sedward 
15*14459Sedward 	{
16*14459Sedward 		register union ww_char *p, *q;
17*14459Sedward 
18*14459Sedward 		p = &w->ww_buf[line][w->ww_w.nc];
19*14459Sedward 		q = p - 1;
20*14459Sedward 		for (i = w->ww_w.nc - col - 1; --i >= 0;)
21*14459Sedward 			*--p = *--q;
22*14459Sedward 		q->c_w = c;
23*14459Sedward 	}
24*14459Sedward 	if (row < 0 || row >= w->ww_w.nr)
25*14459Sedward 		return;
26*14459Sedward 	{
27*14459Sedward 		register union ww_char *buf;
28*14459Sedward 		register char *win;
29*14459Sedward 		register union ww_char *ns;
30*14459Sedward 		register char *smap;
31*14459Sedward 
32*14459Sedward 		nvis = 0;
33*14459Sedward 		smap = &wwsmap[row + w->ww_w.t][col + w->ww_w.l];
34*14459Sedward 		for (i = w->ww_w.nc - col; i > 0; i--)
35*14459Sedward 			if (*smap == w->ww_index)
36*14459Sedward 				break;
37*14459Sedward 			else {
38*14459Sedward 				smap++;
39*14459Sedward 				col++;
40*14459Sedward 			}
41*14459Sedward 		if (i <= 0)
42*14459Sedward 			return;
43*14459Sedward 		buf = &w->ww_buf[line][col];
44*14459Sedward 		win = &w->ww_win[row][col];
45*14459Sedward 		ns = &wwns[row + w->ww_w.t][col + w->ww_w.l];
46*14459Sedward 		c = buf->c_w ^ *win << WWC_MSHIFT;
47*14459Sedward 		for (; --i >= 0;) {
48*14459Sedward 			if (*win) {
49*14459Sedward 				if ((*win & (WWM_COV|WWM_GLS)) != 0) {
50*14459Sedward 					ns++;
51*14459Sedward 					buf++;
52*14459Sedward 				} else
53*14459Sedward 					ns++->c_w = buf++->c_w
54*14459Sedward 						^ *win++ << WWC_MSHIFT;
5514427Sedward 			} else {
56*14459Sedward 				*ns++ = *buf++;
57*14459Sedward 				win++;
58*14459Sedward 				nvis++;
5914427Sedward 			}
6014427Sedward 		}
6114427Sedward 	}
62*14459Sedward 	col += w->ww_w.l;
63*14459Sedward 	row += w->ww_w.t;
64*14459Sedward 	if (nvis > (wwncol - col) / 2) {
65*14459Sedward 		register union ww_char *p, *q;
66*14459Sedward 
67*14459Sedward 		(*tt.tt_setinsert)(1);
68*14459Sedward 		(*tt.tt_move)(row, col);
69*14459Sedward 		(*tt.tt_setmodes)(c >> WWC_MSHIFT);
70*14459Sedward 		(*tt.tt_putc)(c & WWC_CMASK);
71*14459Sedward 		(*tt.tt_setinsert)(0);
72*14459Sedward 
73*14459Sedward 		p = &wwos[row][wwncol];
74*14459Sedward 		q = p - 1;
75*14459Sedward 		for (i = wwncol - col - 1; --i >= 0;)
76*14459Sedward 			*--p = *--q;
77*14459Sedward 		q->c_w = c;
78*14459Sedward 	}
7914427Sedward }
80