xref: /csrg-svn/usr.bin/window/wwinschar.c (revision 14650)
114427Sedward #ifndef lint
2*14650Sedward static	char *sccsid = "@(#)wwinschar.c	3.3 83/08/15";
314427Sedward #endif
414427Sedward 
514427Sedward #include "ww.h"
6*14650Sedward #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;
1414459Sedward 	int nvis;
1514427Sedward 
1614459Sedward 	{
1714459Sedward 		register union ww_char *p, *q;
1814459Sedward 
1914459Sedward 		p = &w->ww_buf[line][w->ww_w.nc];
2014459Sedward 		q = p - 1;
2114459Sedward 		for (i = w->ww_w.nc - col - 1; --i >= 0;)
2214459Sedward 			*--p = *--q;
2314459Sedward 		q->c_w = c;
2414459Sedward 	}
2514459Sedward 	if (row < 0 || row >= w->ww_w.nr)
2614459Sedward 		return;
2714459Sedward 	{
2814459Sedward 		register union ww_char *buf;
2914459Sedward 		register char *win;
3014459Sedward 		register union ww_char *ns;
3114459Sedward 		register char *smap;
3214459Sedward 
3314459Sedward 		nvis = 0;
3414459Sedward 		smap = &wwsmap[row + w->ww_w.t][col + w->ww_w.l];
3514459Sedward 		for (i = w->ww_w.nc - col; i > 0; i--)
3614459Sedward 			if (*smap == w->ww_index)
3714459Sedward 				break;
3814459Sedward 			else {
3914459Sedward 				smap++;
4014459Sedward 				col++;
4114459Sedward 			}
4214459Sedward 		if (i <= 0)
4314459Sedward 			return;
4414459Sedward 		buf = &w->ww_buf[line][col];
4514459Sedward 		win = &w->ww_win[row][col];
4614459Sedward 		ns = &wwns[row + w->ww_w.t][col + w->ww_w.l];
4714459Sedward 		c = buf->c_w ^ *win << WWC_MSHIFT;
4814459Sedward 		for (; --i >= 0;) {
4914459Sedward 			if (*win) {
5014459Sedward 				if ((*win & (WWM_COV|WWM_GLS)) != 0) {
5114459Sedward 					ns++;
5214459Sedward 					buf++;
5314459Sedward 				} else
5414459Sedward 					ns++->c_w = buf++->c_w
5514459Sedward 						^ *win++ << WWC_MSHIFT;
5614427Sedward 			} else {
5714459Sedward 				*ns++ = *buf++;
5814459Sedward 				win++;
5914459Sedward 				nvis++;
6014427Sedward 			}
6114427Sedward 		}
6214427Sedward 	}
6314459Sedward 	col += w->ww_w.l;
6414459Sedward 	row += w->ww_w.t;
6514459Sedward 	if (nvis > (wwncol - col) / 2) {
6614459Sedward 		register union ww_char *p, *q;
6714459Sedward 
6814459Sedward 		(*tt.tt_setinsert)(1);
6914459Sedward 		(*tt.tt_move)(row, col);
7014459Sedward 		(*tt.tt_setmodes)(c >> WWC_MSHIFT);
7114459Sedward 		(*tt.tt_putc)(c & WWC_CMASK);
7214459Sedward 		(*tt.tt_setinsert)(0);
7314459Sedward 
7414459Sedward 		p = &wwos[row][wwncol];
7514459Sedward 		q = p - 1;
7614459Sedward 		for (i = wwncol - col - 1; --i >= 0;)
7714459Sedward 			*--p = *--q;
7814459Sedward 		q->c_w = c;
7914459Sedward 	}
8014427Sedward }
81