Commit | Line | Data |
---|---|---|
07662491 | 1 | #ifndef lint |
665bc9e7 | 2 | static 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 | */ | |
10 | wwdelete(w) | |
11 | register 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 | |
35 | wwdelete1(w, t, b, l, r) | |
36 | register 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 | } |