Commit | Line | Data |
---|---|---|
65478625 | 1 | #ifndef lint |
60de5df9 | 2 | static char sccsid[] = "@(#)wwframe.c 3.16 %G%"; |
65478625 EW |
3 | #endif |
4 | ||
60de5df9 EW |
5 | /* |
6 | * Copyright (c) 1983 Regents of the University of California, | |
7 | * All rights reserved. Redistribution permitted subject to | |
8 | * the terms of the Berkeley Software License Agreement. | |
9 | */ | |
10 | ||
65478625 | 11 | #include "ww.h" |
e908bfac | 12 | #include "tt.h" |
65478625 | 13 | |
6e2a769e | 14 | #define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \ |
4a4250bc | 15 | w1->ww_fmap || w1->ww_order > (w)->ww_order) |
6e2a769e | 16 | |
85af59e4 | 17 | wwframe(w, wframe) |
0896e17e EW |
18 | register struct ww *w; |
19 | struct ww *wframe; | |
65478625 | 20 | { |
0896e17e EW |
21 | register r, c; |
22 | char a1, a2, a3; | |
23 | char b1, b2, b3; | |
24 | register char *smap; | |
25 | register code; | |
6e2a769e | 26 | register struct ww *w1; |
65478625 | 27 | |
0896e17e EW |
28 | if (w->ww_w.t > 0) { |
29 | r = w->ww_w.t - 1; | |
19f9784c | 30 | c = w->ww_i.l - 1; |
0896e17e EW |
31 | smap = &wwsmap[r + 1][c + 1]; |
32 | a1 = 0; | |
33 | a2 = 0; | |
34 | b1 = 0; | |
6e2a769e | 35 | b2 = c < 0 || frameok(w, r, c); |
65478625 | 36 | |
19f9784c | 37 | for (; c < w->ww_i.r; c++) { |
3531d4a4 EW |
38 | if (c + 1 >= wwncol) { |
39 | a3 = 1; | |
40 | b3 = 1; | |
41 | } else { | |
42 | a3 = w->ww_index == *smap++; | |
43 | b3 = frameok(w, r, c + 1); | |
44 | } | |
0896e17e EW |
45 | if (b2) { |
46 | code = 0; | |
47 | if ((a1 || a2) && b1) | |
48 | code |= WWF_L; | |
49 | if ((a2 || a3) && b3) | |
50 | code |= WWF_R; | |
51 | if (code) | |
2357b64e | 52 | wwframec(wframe, r, c, code|WWF_TOP); |
0896e17e EW |
53 | } |
54 | a1 = a2; | |
55 | a2 = a3; | |
56 | b1 = b2; | |
57 | b2 = b3; | |
58 | } | |
59 | if ((a1 || a2) && b1 && b2) | |
2357b64e | 60 | wwframec(wframe, r, c, WWF_L|WWF_TOP); |
65478625 EW |
61 | } |
62 | ||
0896e17e EW |
63 | if (w->ww_w.b < wwnrow) { |
64 | r = w->ww_w.b; | |
19f9784c | 65 | c = w->ww_i.l - 1; |
0896e17e EW |
66 | smap = &wwsmap[r - 1][c + 1]; |
67 | a1 = 0; | |
68 | a2 = 0; | |
69 | b1 = 0; | |
6e2a769e | 70 | b2 = c < 0 || frameok(w, r, c); |
0896e17e | 71 | |
19f9784c | 72 | for (; c < w->ww_i.r; c++) { |
3531d4a4 EW |
73 | if (c + 1 >= wwncol) { |
74 | a3 = 1; | |
75 | b3 = 1; | |
76 | } else { | |
77 | a3 = w->ww_index == *smap++; | |
78 | b3 = frameok(w, r, c + 1); | |
79 | } | |
0896e17e EW |
80 | if (b2) { |
81 | code = 0; | |
82 | if ((a1 || a2) && b1) | |
83 | code |= WWF_L; | |
84 | if ((a2 || a3) && b3) | |
85 | code |= WWF_R; | |
86 | if (code) | |
2357b64e | 87 | wwframec(wframe, r, c, code); |
0896e17e EW |
88 | } |
89 | a1 = a2; | |
90 | a2 = a3; | |
91 | b1 = b2; | |
92 | b2 = b3; | |
93 | } | |
94 | if ((a1 || a2) && b1 && b2) | |
2357b64e | 95 | wwframec(wframe, r, c, WWF_L); |
65478625 | 96 | } |
65478625 | 97 | |
0896e17e | 98 | if (w->ww_w.l > 0) { |
19f9784c | 99 | r = w->ww_i.t - 1; |
0896e17e EW |
100 | c = w->ww_w.l - 1; |
101 | a1 = 0; | |
102 | a2 = 0; | |
103 | b1 = 0; | |
6e2a769e | 104 | b2 = r < 0 || frameok(w, r, c); |
85af59e4 | 105 | |
19f9784c | 106 | for (; r < w->ww_i.b; r++) { |
3531d4a4 EW |
107 | if (r + 1 >= wwnrow) { |
108 | a3 = 1; | |
109 | b3 = 1; | |
110 | } else { | |
111 | a3 = w->ww_index == wwsmap[r + 1][c + 1]; | |
112 | b3 = frameok(w, r + 1, c); | |
113 | } | |
0896e17e EW |
114 | if (b2) { |
115 | code = 0; | |
116 | if ((a1 || a2) && b1) | |
117 | code |= WWF_U; | |
118 | if ((a2 || a3) && b3) | |
119 | code |= WWF_D; | |
120 | if (code) | |
2357b64e | 121 | wwframec(wframe, r, c, code); |
0896e17e EW |
122 | } |
123 | a1 = a2; | |
124 | a2 = a3; | |
125 | b1 = b2; | |
126 | b2 = b3; | |
127 | } | |
128 | if ((a1 || a2) && b1 && b2) | |
2357b64e | 129 | wwframec(wframe, r, c, WWF_U); |
85af59e4 | 130 | } |
0896e17e EW |
131 | |
132 | if (w->ww_w.r < wwncol) { | |
19f9784c | 133 | r = w->ww_i.t - 1; |
0896e17e EW |
134 | c = w->ww_w.r; |
135 | a1 = 0; | |
136 | a2 = 0; | |
137 | b1 = 0; | |
6e2a769e | 138 | b2 = r < 0 || frameok(w, r, c); |
0896e17e | 139 | |
19f9784c | 140 | for (; r < w->ww_i.b; r++) { |
3531d4a4 EW |
141 | if (r + 1 >= wwnrow) { |
142 | a3 = 1; | |
143 | b3 = 1; | |
144 | } else { | |
145 | a3 = w->ww_index == wwsmap[r + 1][c - 1]; | |
146 | b3 = frameok(w, r + 1, c); | |
147 | } | |
0896e17e EW |
148 | if (b2) { |
149 | code = 0; | |
150 | if ((a1 || a2) && b1) | |
151 | code |= WWF_U; | |
152 | if ((a2 || a3) && b3) | |
153 | code |= WWF_D; | |
154 | if (code) | |
2357b64e | 155 | wwframec(wframe, r, c, code); |
0896e17e EW |
156 | } |
157 | a1 = a2; | |
158 | a2 = a3; | |
159 | b1 = b2; | |
160 | b2 = b3; | |
161 | } | |
162 | if ((a1 || a2) && b1 && b2) | |
2357b64e | 163 | wwframec(wframe, r, c, WWF_U); |
65478625 | 164 | } |
65478625 EW |
165 | } |
166 | ||
f2a77fe1 | 167 | wwframec(f, r, c, code) |
85af59e4 | 168 | register struct ww *f; |
f2a77fe1 | 169 | register r, c; |
6e2a769e | 170 | char code; |
85af59e4 | 171 | { |
6e2a769e | 172 | char oldcode; |
84ad208b | 173 | register char *smap; |
85af59e4 | 174 | |
f2a77fe1 | 175 | if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r) |
85af59e4 | 176 | return; |
84ad208b EW |
177 | |
178 | smap = &wwsmap[r][c]; | |
179 | ||
0896e17e EW |
180 | { |
181 | register struct ww *w; | |
6e2a769e | 182 | |
84ad208b | 183 | w = wwindex[*smap]; |
0896e17e | 184 | if (w->ww_order > f->ww_order) { |
84ad208b EW |
185 | if (w != &wwnobody && w->ww_win[r][c] == 0) |
186 | w->ww_nvis[r]--; | |
187 | *smap = f->ww_index; | |
c417b691 | 188 | } |
85af59e4 | 189 | } |
2357b64e | 190 | |
2357b64e | 191 | if (f->ww_fmap != 0) { |
0896e17e | 192 | register char *fmap; |
6e2a769e | 193 | |
2357b64e | 194 | fmap = &f->ww_fmap[r][c]; |
6e2a769e | 195 | oldcode = *fmap; |
0896e17e EW |
196 | *fmap |= code; |
197 | if (code & WWF_TOP) | |
198 | *fmap &= ~WWF_LABEL; | |
6e2a769e EW |
199 | code = *fmap; |
200 | } else | |
201 | oldcode = 0; | |
202 | { | |
f2a77fe1 | 203 | register char *win = &f->ww_win[r][c]; |
6e2a769e | 204 | |
84ad208b | 205 | if (*win == WWM_GLS && *smap == f->ww_index) |
f2a77fe1 EW |
206 | f->ww_nvis[r]++; |
207 | *win &= ~WWM_GLS; | |
208 | } | |
209 | if (oldcode != code && (code & WWF_LABEL) == 0) { | |
210 | register short frame; | |
211 | ||
a830e8bb | 212 | frame = tt.tt_frame[code & WWF_MASK]; |
f2a77fe1 EW |
213 | f->ww_buf[r][c].c_w = frame; |
214 | if (wwsmap[r][c] == f->ww_index) { | |
04d70db4 | 215 | wwtouched[r] |= WWU_TOUCHED; |
f2a77fe1 | 216 | wwns[r][c].c_w = frame; |
861cd1ed | 217 | } |
0896e17e EW |
218 | } |
219 | } |