xref: /csrg-svn/usr.bin/window/wwinschar.c (revision 62479)
118740Sedward /*
2*62479Sbostic  * Copyright (c) 1983, 1993
3*62479Sbostic  *	The Regents of the University of California.  All rights reserved.
433514Sbostic  *
542954Sbostic  * This code is derived from software contributed to Berkeley by
642954Sbostic  * Edward Wang at The University of California, Berkeley.
742954Sbostic  *
842835Sbostic  * %sccs.include.redist.c%
918740Sedward  */
1018740Sedward 
1133514Sbostic #ifndef lint
12*62479Sbostic static char sccsid[] = "@(#)wwinschar.c	8.1 (Berkeley) 06/06/93";
1333514Sbostic #endif /* not lint */
1433514Sbostic 
1514427Sedward #include "ww.h"
1614650Sedward #include "tt.h"
1714427Sedward 
wwinschar(w,row,col,c,m)1838749Sedward wwinschar(w, row, col, c, m)
1914427Sedward register struct ww *w;
2038749Sedward char c, m;
2114427Sedward {
2214459Sedward 	register i;
2314459Sedward 	int nvis;
2438749Sedward 	short x = c | m << WWC_MSHIFT;
2514427Sedward 
2614977Sedward 	/*
2714977Sedward 	 * First, shift the line.
2814977Sedward 	 */
2914459Sedward 	{
3014459Sedward 		register union ww_char *p, *q;
3114459Sedward 
3214988Sedward 		p = &w->ww_buf[row][w->ww_b.r];
3314459Sedward 		q = p - 1;
3414988Sedward 		for (i = w->ww_b.r - col; --i > 0;)
3514459Sedward 			*--p = *--q;
3638749Sedward 		q->c_w = x;
3714459Sedward 	}
3814977Sedward 
3914977Sedward 	/*
4014977Sedward 	 * If can't see it, just return.
4114977Sedward 	 */
4214988Sedward 	if (row < w->ww_i.t || row >= w->ww_i.b
4314988Sedward 	    || w->ww_i.r <= 0 || w->ww_i.r <= col)
4414459Sedward 		return;
4514977Sedward 
4614988Sedward 	if (col < w->ww_i.l)
4714988Sedward 		col = w->ww_i.l;
4814977Sedward 
4914977Sedward 	/*
5014977Sedward 	 * Now find out how much is actually changed, and fix wwns.
5114977Sedward 	 */
5214459Sedward 	{
5314459Sedward 		register union ww_char *buf;
5414459Sedward 		register char *win;
5514459Sedward 		register union ww_char *ns;
5614459Sedward 		register char *smap;
5715637Sedward 		char touched;
5814459Sedward 
5914459Sedward 		nvis = 0;
6014988Sedward 		smap = &wwsmap[row][col];
6115637Sedward 		for (i = col; i < w->ww_i.r && *smap++ != w->ww_index; i++)
6215637Sedward 			;
6315637Sedward 		if (i >= w->ww_i.r)
6414459Sedward 			return;
6515637Sedward 		col = i;
6615637Sedward 		buf = w->ww_buf[row];
6715637Sedward 		win = w->ww_win[row];
6815637Sedward 		ns = wwns[row];
6915637Sedward 		smap = &wwsmap[row][i];
7015637Sedward 		touched = wwtouched[row];
7115637Sedward 		for (; i < w->ww_i.r; i++) {
7215637Sedward 			if (*smap++ != w->ww_index)
7315637Sedward 				continue;
7415654Sedward 			touched |= WWU_TOUCHED;
7515637Sedward 			if (win[i])
7615637Sedward 				ns[i].c_w =
7715637Sedward 					buf[i].c_w ^ win[i] << WWC_MSHIFT;
7815637Sedward 			else {
7914459Sedward 				nvis++;
8015637Sedward 				ns[i] = buf[i];
8114427Sedward 			}
8215637Sedward 		}
8315637Sedward 		wwtouched[row] = touched;
8414427Sedward 	}
8514977Sedward 
8614977Sedward 	/*
8714977Sedward 	 * Can/Should we use delete character?
8814977Sedward 	 */
8938749Sedward 	if ((tt.tt_inschar || tt.tt_insspace) && nvis > (wwncol - col) / 2) {
9014459Sedward 		register union ww_char *p, *q;
9114459Sedward 
9238749Sedward 		if (tt.tt_inschar)
9338749Sedward 			xxinschar(row, col, c, m);
9438749Sedward 		else {
9538749Sedward 			xxinsspace(row, col);
9638749Sedward 			x = ' ';
9738749Sedward 		}
9814988Sedward 		p = &wwos[row][wwncol];
9914459Sedward 		q = p - 1;
10014988Sedward 		for (i = wwncol - col; --i > 0;)
10114459Sedward 			*--p = *--q;
10238749Sedward 		q->c_w = x;
10314459Sedward 	}
10414427Sedward }
105