Add spl's around queue manipulation
[unix-history] / usr / src / usr.bin / window / wwdelete.c
CommitLineData
07662491 1#ifndef lint
7edc52ec 2static char sccsid[] = "@(#)wwdelete.c 3.12 %G%";
07662491
EW
3#endif
4
5#include "ww.h"
6
7/*
8 * Pull w free from the cover list.
9 */
10wwdelete(w)
11register struct ww *w;
12{
c05972b9
EW
13 register i;
14
15 for (i = w->ww_i.t; i < w->ww_i.b; i++) {
16 register j;
17 register char *smap = wwsmap[i];
18 register struct ww_char *ns = wwns[i];
04d70db4 19 register int nchanged = 0;
84ad208b 20
84ad208b 21 for (j = w->ww_i.l; j < w->ww_i.r; j++)
c05972b9
EW
22 if (smap[j] == w->ww_index) {
23 smap[j] = WWX_NOBODY;
24 ns[j].c_w = ' ';
04d70db4 25 nchanged++;
84ad208b 26 }
04d70db4
EW
27 if (nchanged > 4)
28 wwtouched[i] |= WWU_MAJOR|WWU_TOUCHED;
29 else if (nchanged > 0)
30 wwtouched[i] |= WWU_TOUCHED;
c05972b9 31 }
84ad208b 32
c05972b9
EW
33 {
34 register struct ww *wp;
665bc9e7 35
c05972b9
EW
36 for (wp = w->ww_forw; wp != &wwhead; wp = wp->ww_forw)
37 wp->ww_order--;
38 }
39
40 if (w->ww_forw != &wwhead)
41 wwdelete1(w->ww_forw,
42 w->ww_i.t, w->ww_i.b, w->ww_i.l, w->ww_i.r);
861cd1ed 43
07662491
EW
44 w->ww_back->ww_forw = w->ww_forw;
45 w->ww_forw->ww_back = w->ww_back;
46 w->ww_forw = w->ww_back = 0;
47}
665bc9e7
EW
48
49wwdelete1(w, t, b, l, r)
50register struct ww *w;
51{
52 int i;
53 int tt, bb, ll, rr;
1ceeb7e2 54 char hasglass;
665bc9e7 55
1ceeb7e2
EW
56again:
57 hasglass = 0;
665bc9e7
EW
58 tt = MAX(t, w->ww_i.t);
59 bb = MIN(b, w->ww_i.b);
60 ll = MAX(l, w->ww_i.l);
61 rr = MIN(r, w->ww_i.r);
1ceeb7e2
EW
62 if (tt >= bb || ll >= rr) {
63 if ((w = w->ww_forw) == &wwhead)
64 return;
65 goto again;
66 }
665bc9e7 67 for (i = tt; i < bb; i++) {
c05972b9 68 register j;
665bc9e7
EW
69 register char *smap = wwsmap[i];
70 register union ww_char *ns = wwns[i];
71 register char *win = w->ww_win[i];
72 register union ww_char *buf = w->ww_buf[i];
73 int nvis = w->ww_nvis[i];
04d70db4 74 int nchanged = 0;
665bc9e7
EW
75
76 for (j = ll; j < rr; j++) {
1ceeb7e2
EW
77 if (smap[j] != WWX_NOBODY)
78 continue;
79 if (win[j] & WWM_GLS) {
80 hasglass = 1;
665bc9e7 81 continue;
1ceeb7e2 82 }
c05972b9
EW
83 smap[j] = w->ww_index;
84 ns[j].c_w = buf[j].c_w ^ win[j] << WWC_MSHIFT;
04d70db4 85 nchanged++;
c05972b9
EW
86 if (win[j] == 0)
87 nvis++;
665bc9e7 88 }
04d70db4
EW
89 if (nchanged > 4)
90 wwtouched[i] |= WWU_MAJOR|WWU_TOUCHED;
91 else if (nchanged > 0)
92 wwtouched[i] |= WWU_TOUCHED;
665bc9e7
EW
93 w->ww_nvis[i] = nvis;
94 }
95 if ((w = w->ww_forw) == &wwhead)
96 return;
1ceeb7e2
EW
97 if (hasglass)
98 goto again;
665bc9e7
EW
99 if (tt > t)
100 wwdelete1(w, t, tt, l, r);
101 if (bb < b)
102 wwdelete1(w, bb, b, l, r);
103 if (ll > l)
1ceeb7e2 104 wwdelete1(w, tt, bb, l, ll);
665bc9e7 105 if (rr < r)
1ceeb7e2 106 wwdelete1(w, tt, bb, rr, r);
665bc9e7 107}