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