Use recursive delete1() for fast wwdelete()
[unix-history] / usr / src / usr.bin / window / wwdelete.c
CommitLineData
07662491 1#ifndef lint
665bc9e7 2static char *sccsid = "@(#)wwdelete.c 3.8 83/11/28";
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{
84ad208b
EW
13 register struct ww *wp;
14 register i, j;
15
16 for (i = w->ww_i.t; i < w->ww_i.b; i++)
17 for (j = w->ww_i.l; j < w->ww_i.r; j++)
18 if (wwsmap[i][j] == w->ww_index) {
19 wwsmap[i][j] = WWX_NOBODY;
20 wwns[i][j].c_w = ' ';
21 wwtouched[i] = 1;
22 }
84ad208b 23
665bc9e7 24 for (wp = w->ww_forw; wp != &wwhead; wp = wp->ww_forw)
84ad208b 25 w->ww_order--;
665bc9e7
EW
26
27 if ((wp = w->ww_forw) != &wwhead)
28 wwdelete1(wp, w->ww_i.t, w->ww_i.b, w->ww_i.l, w->ww_i.r);
861cd1ed 29
07662491
EW
30 w->ww_back->ww_forw = w->ww_forw;
31 w->ww_forw->ww_back = w->ww_back;
32 w->ww_forw = w->ww_back = 0;
33}
665bc9e7
EW
34
35wwdelete1(w, t, b, l, r)
36register struct ww *w;
37{
38 int i;
39 int tt, bb, ll, rr;
40
41 tt = MAX(t, w->ww_i.t);
42 bb = MIN(b, w->ww_i.b);
43 ll = MAX(l, w->ww_i.l);
44 rr = MIN(r, w->ww_i.r);
45 for (i = tt; i < bb; i++) {
46 register j = ll;
47 register char *smap = wwsmap[i];
48 register union ww_char *ns = wwns[i];
49 register char *win = w->ww_win[i];
50 register union ww_char *buf = w->ww_buf[i];
51 int nvis = w->ww_nvis[i];
52 char touched = wwtouched[i];
53
54 for (j = ll; j < rr; j++) {
55 if (smap[j] != WWX_NOBODY)
56 continue;
57 if ((win[j] & WWM_GLS) == 0) {
58 smap[j] = w->ww_index;
59 ns[j].c_w = buf[j].c_w ^ win[j] << WWC_MSHIFT;
60 touched = 1;
61 if (win[j] == 0)
62 nvis++;
63 }
64 }
65 wwtouched[i] = touched;
66 w->ww_nvis[i] = nvis;
67 }
68 if ((w = w->ww_forw) == &wwhead)
69 return;
70 if (tt > t)
71 wwdelete1(w, t, tt, l, r);
72 if (bb < b)
73 wwdelete1(w, bb, b, l, r);
74 if (ll > l)
75 wwdelete1(w, t, b, l, ll);
76 if (rr < r)
77 wwdelete1(w, t, b, rr, r);
78}