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