xref: /csrg-svn/usr.bin/window/wwinschar.c (revision 14988)
114427Sedward #ifndef lint
2*14988Sedward static	char *sccsid = "@(#)wwinschar.c	3.8 83/09/15";
314427Sedward #endif
414427Sedward 
514427Sedward #include "ww.h"
614650Sedward #include "tt.h"
714427Sedward 
8*14988Sedward wwinschar(w, row, col, c)
914427Sedward register struct ww *w;
1014459Sedward short c;
1114427Sedward {
1214459Sedward 	register i;
1314459Sedward 	int nvis;
1414427Sedward 
1514977Sedward 	/*
1614977Sedward 	 * First, shift the line.
1714977Sedward 	 */
1814459Sedward 	{
1914459Sedward 		register union ww_char *p, *q;
2014459Sedward 
21*14988Sedward 		p = &w->ww_buf[row][w->ww_b.r];
2214459Sedward 		q = p - 1;
23*14988Sedward 		for (i = w->ww_b.r - col; --i > 0;)
2414459Sedward 			*--p = *--q;
2514459Sedward 		q->c_w = c;
2614459Sedward 	}
2714977Sedward 
2814977Sedward 	/*
2914977Sedward 	 * If can't see it, just return.
3014977Sedward 	 */
31*14988Sedward 	if (row < w->ww_i.t || row >= w->ww_i.b
32*14988Sedward 	    || w->ww_i.r <= 0 || w->ww_i.r <= col)
3314459Sedward 		return;
3414977Sedward 
35*14988Sedward 	if (col < w->ww_i.l)
36*14988Sedward 		col = w->ww_i.l;
3714977Sedward 
3814977Sedward 	/*
3914977Sedward 	 * Now find out how much is actually changed, and fix wwns.
4014977Sedward 	 */
4114459Sedward 	{
4214459Sedward 		register union ww_char *buf;
4314459Sedward 		register char *win;
4414459Sedward 		register union ww_char *ns;
4514459Sedward 		register char *smap;
4614663Sedward 		char *touched;
4714459Sedward 
4814459Sedward 		nvis = 0;
49*14988Sedward 		smap = &wwsmap[row][col];
50*14988Sedward 		for (i = w->ww_i.r - col; i > 0 && *smap++ != w->ww_index; i--)
51*14988Sedward 			col++;
5214459Sedward 		if (i <= 0)
5314459Sedward 			return;
54*14988Sedward 		buf = &w->ww_buf[row][col];
5514459Sedward 		win = &w->ww_win[row][col];
56*14988Sedward 		ns = &wwns[row][col];
57*14988Sedward 		touched = &wwtouched[row];
5814459Sedward 		c = buf->c_w ^ *win << WWC_MSHIFT;
5914459Sedward 		for (; --i >= 0;) {
6014459Sedward 			if (*win) {
6114459Sedward 				if ((*win & (WWM_COV|WWM_GLS)) != 0) {
6214459Sedward 					ns++;
6314459Sedward 					buf++;
6414663Sedward 				} else {
6514663Sedward 					*touched = 1;
6614459Sedward 					ns++->c_w = buf++->c_w
6714459Sedward 						^ *win++ << WWC_MSHIFT;
6814663Sedward 				}
6914427Sedward 			} else {
7014663Sedward 				*touched = 1;
7114459Sedward 				*ns++ = *buf++;
7214459Sedward 				win++;
7314459Sedward 				nvis++;
7414427Sedward 			}
7514427Sedward 		}
7614427Sedward 	}
7714977Sedward 
7814977Sedward 	/*
7914977Sedward 	 * Can/Should we use delete character?
8014977Sedward 	 */
81*14988Sedward 	if (tt.tt_setinsert != 0 && nvis > (wwncol - col) / 2) {
8214459Sedward 		register union ww_char *p, *q;
8314459Sedward 
8414459Sedward 		(*tt.tt_setinsert)(1);
85*14988Sedward 		(*tt.tt_move)(row, col);
8614459Sedward 		(*tt.tt_setmodes)(c >> WWC_MSHIFT);
8714459Sedward 		(*tt.tt_putc)(c & WWC_CMASK);
8814459Sedward 		(*tt.tt_setinsert)(0);
8914459Sedward 
90*14988Sedward 		p = &wwos[row][wwncol];
9114459Sedward 		q = p - 1;
92*14988Sedward 		for (i = wwncol - col; --i > 0;)
9314459Sedward 			*--p = *--q;
9414459Sedward 		q->c_w = c;
9514459Sedward 	}
9614427Sedward }
97