moving windows
[unix-history] / usr / src / usr.bin / window / wwdelchar.c
CommitLineData
53069d72 1#ifndef lint
861cd1ed 2static char *sccsid = "@(#)wwdelchar.c 3.4 83/08/16";
53069d72
EW
3#endif
4
5#include "ww.h"
e908bfac 6#include "tt.h"
53069d72 7
14f251df 8wwdelchar(w, line, col)
53069d72
EW
9register struct ww *w;
10{
14f251df
EW
11 register i;
12 int row = line - w->ww_scroll;
13 int nvis;
14
15 {
16 register union ww_char *p, *q;
17
18 p = &w->ww_buf[line][col];
19 q = p + 1;
20 for (i = w->ww_w.nc - col - 1; --i >= 0;)
21 *p++ = *q++;
22 p->c_w = ' ';
23 }
24 if (row < 0 || row >= w->ww_w.nr)
25 return;
26 {
27 register union ww_char *buf;
28 register char *win;
29 register union ww_char *ns;
30 register char *smap;
861cd1ed 31 char *touched;
14f251df
EW
32
33 nvis = 0;
34 smap = &wwsmap[row + w->ww_w.t][col + w->ww_w.l];
35 for (i = w->ww_w.nc - col; i > 0; i--)
36 if (*smap == w->ww_index)
37 break;
38 else {
39 smap++;
40 col++;
41 }
42 if (i <= 0)
43 return;
44 buf = &w->ww_buf[line][col];
45 win = &w->ww_win[row][col];
46 ns = &wwns[row + w->ww_w.t][col + w->ww_w.l];
861cd1ed 47 touched = &wwtouched[row + w->ww_w.t];
14f251df
EW
48 for (; --i >= 0;) {
49 if (*win) {
50 if ((*win & (WWM_COV|WWM_GLS)) != 0) {
51 ns++;
52 buf++;
861cd1ed 53 } else {
14f251df
EW
54 ns++->c_w = buf++->c_w
55 ^ *win++ << WWC_MSHIFT;
861cd1ed
EW
56 *touched = 1;
57 }
14f251df 58 } else {
861cd1ed 59 *touched = 1;
14f251df
EW
60 *ns++ = *buf++;
61 win++;
62 nvis++;
63 }
64 }
65 }
66 col += w->ww_w.l;
67 row += w->ww_w.t;
68 if (nvis > (wwncol - col) / 2) {
69 register union ww_char *p, *q;
70
71 (*tt.tt_move)(row, col);
72 (*tt.tt_delchar)();
73
74 p = &wwos[row][col];
75 q = p + 1;
76 for (i = wwncol - col - 1; --i >= 0;)
77 *p++ = *q++;
78 p->c_w = ' ';
79 }
53069d72 80}