xref: /csrg-svn/usr.bin/window/wwdelchar.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[] = "@(#)wwdelchar.c	8.1 (Berkeley) 06/06/93";
1333514Sbostic #endif /* not lint */
1433514Sbostic 
1514432Sedward #include "ww.h"
1614650Sedward #include "tt.h"
1714432Sedward 
wwdelchar(w,row,col)1814988Sedward wwdelchar(w, row, col)
1914432Sedward register struct ww *w;
2014432Sedward {
2114459Sedward 	register i;
2214459Sedward 	int nvis;
2314459Sedward 
2414978Sedward 	/*
2514978Sedward 	 * First, shift the line.
2614978Sedward 	 */
2714459Sedward 	{
2814459Sedward 		register union ww_char *p, *q;
2914459Sedward 
3014988Sedward 		p = &w->ww_buf[row][col];
3114459Sedward 		q = p + 1;
3214988Sedward 		for (i = w->ww_b.r - col; --i > 0;)
3314459Sedward 			*p++ = *q++;
3414459Sedward 		p->c_w = ' ';
3514459Sedward 	}
3614978Sedward 
3714978Sedward 	/*
3814978Sedward 	 * If can't see it, just return.
3914978Sedward 	 */
4014988Sedward 	if (row < w->ww_i.t || row >= w->ww_i.b
4114988Sedward 	    || w->ww_i.r <= 0 || w->ww_i.r <= col)
4214459Sedward 		return;
4314978Sedward 
4414988Sedward 	if (col < w->ww_i.l)
4514988Sedward 		col = w->ww_i.l;
4614978Sedward 
4714978Sedward 	/*
4814978Sedward 	 * Now find out how much is actually changed, and fix wwns.
4914978Sedward 	 */
5014459Sedward 	{
5114459Sedward 		register union ww_char *buf;
5214459Sedward 		register char *win;
5314459Sedward 		register union ww_char *ns;
5414459Sedward 		register char *smap;
5515638Sedward 		char touched;
5614459Sedward 
5714459Sedward 		nvis = 0;
5814988Sedward 		smap = &wwsmap[row][col];
5915638Sedward 		for (i = col; i < w->ww_i.r && *smap++ != w->ww_index; i++)
6015638Sedward 			;
6115638Sedward 		if (i >= w->ww_i.r)
6214459Sedward 			return;
6315638Sedward 		col = i;
6415638Sedward 		buf = w->ww_buf[row];
6515638Sedward 		win = w->ww_win[row];
6615638Sedward 		ns = wwns[row];
6715638Sedward 		smap = &wwsmap[row][i];
6815638Sedward 		touched = wwtouched[row];
6915638Sedward 		for (; i < w->ww_i.r; i++) {
7015638Sedward 			if (*smap++ != w->ww_index)
7115638Sedward 				continue;
7215654Sedward 			touched |= WWU_TOUCHED;
7315638Sedward 			if (win[i])
7415638Sedward 				ns[i].c_w =
7515638Sedward 					buf[i].c_w ^ win[i] << WWC_MSHIFT;
7615638Sedward 			else {
7714459Sedward 				nvis++;
7815638Sedward 				ns[i] = buf[i];
7914459Sedward 			}
8015638Sedward 		}
8115638Sedward 		wwtouched[row] = touched;
8214459Sedward 	}
8314978Sedward 
8414978Sedward 	/*
8514978Sedward 	 * Can/Should we use delete character?
8614978Sedward 	 */
8714988Sedward 	if (tt.tt_delchar != 0 && nvis > (wwncol - col) / 2) {
8814459Sedward 		register union ww_char *p, *q;
8914459Sedward 
9037998Sedward 		xxdelchar(row, col);
9114988Sedward 		p = &wwos[row][col];
9214459Sedward 		q = p + 1;
9314988Sedward 		for (i = wwncol - col; --i > 0;)
9414459Sedward 			*p++ = *q++;
9514459Sedward 		p->c_w = ' ';
9614459Sedward 	}
9714432Sedward }
98