|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: static char sccsid[] = "@(#)wwframe.c 3.18 (Berkeley) 6/29/88";
20: #endif /* not lint */
21:
22: #include "ww.h"
23: #include "tt.h"
24:
25: #define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \
26: w1->ww_fmap || w1->ww_order > (w)->ww_order)
27:
28: wwframe(w, wframe)
29: register struct ww *w;
30: struct ww *wframe;
31: {
32: register r, c;
33: char a1, a2, a3;
34: char b1, b2, b3;
35: register char *smap;
36: register code;
37: register struct ww *w1;
38:
39: if (w->ww_w.t > 0) {
40: r = w->ww_w.t - 1;
41: c = w->ww_i.l - 1;
42: smap = &wwsmap[r + 1][c + 1];
43: a1 = 0;
44: a2 = 0;
45: b1 = 0;
46: b2 = c < 0 || frameok(w, r, c);
47:
48: for (; c < w->ww_i.r; c++) {
49: if (c + 1 >= wwncol) {
50: a3 = 1;
51: b3 = 1;
52: } else {
53: a3 = w->ww_index == *smap++;
54: b3 = frameok(w, r, c + 1);
55: }
56: if (b2) {
57: code = 0;
58: if ((a1 || a2) && b1)
59: code |= WWF_L;
60: if ((a2 || a3) && b3)
61: code |= WWF_R;
62: if (code)
63: wwframec(wframe, r, c, code|WWF_TOP);
64: }
65: a1 = a2;
66: a2 = a3;
67: b1 = b2;
68: b2 = b3;
69: }
70: if ((a1 || a2) && b1 && b2)
71: wwframec(wframe, r, c, WWF_L|WWF_TOP);
72: }
73:
74: if (w->ww_w.b < wwnrow) {
75: r = w->ww_w.b;
76: c = w->ww_i.l - 1;
77: smap = &wwsmap[r - 1][c + 1];
78: a1 = 0;
79: a2 = 0;
80: b1 = 0;
81: b2 = c < 0 || frameok(w, r, c);
82:
83: for (; c < w->ww_i.r; c++) {
84: if (c + 1 >= wwncol) {
85: a3 = 1;
86: b3 = 1;
87: } else {
88: a3 = w->ww_index == *smap++;
89: b3 = frameok(w, r, c + 1);
90: }
91: if (b2) {
92: code = 0;
93: if ((a1 || a2) && b1)
94: code |= WWF_L;
95: if ((a2 || a3) && b3)
96: code |= WWF_R;
97: if (code)
98: wwframec(wframe, r, c, code);
99: }
100: a1 = a2;
101: a2 = a3;
102: b1 = b2;
103: b2 = b3;
104: }
105: if ((a1 || a2) && b1 && b2)
106: wwframec(wframe, r, c, WWF_L);
107: }
108:
109: if (w->ww_w.l > 0) {
110: r = w->ww_i.t - 1;
111: c = w->ww_w.l - 1;
112: a1 = 0;
113: a2 = 0;
114: b1 = 0;
115: b2 = r < 0 || frameok(w, r, c);
116:
117: for (; r < w->ww_i.b; r++) {
118: if (r + 1 >= wwnrow) {
119: a3 = 1;
120: b3 = 1;
121: } else {
122: a3 = w->ww_index == wwsmap[r + 1][c + 1];
123: b3 = frameok(w, r + 1, c);
124: }
125: if (b2) {
126: code = 0;
127: if ((a1 || a2) && b1)
128: code |= WWF_U;
129: if ((a2 || a3) && b3)
130: code |= WWF_D;
131: if (code)
132: wwframec(wframe, r, c, code);
133: }
134: a1 = a2;
135: a2 = a3;
136: b1 = b2;
137: b2 = b3;
138: }
139: if ((a1 || a2) && b1 && b2)
140: wwframec(wframe, r, c, WWF_U);
141: }
142:
143: if (w->ww_w.r < wwncol) {
144: r = w->ww_i.t - 1;
145: c = w->ww_w.r;
146: a1 = 0;
147: a2 = 0;
148: b1 = 0;
149: b2 = r < 0 || frameok(w, r, c);
150:
151: for (; r < w->ww_i.b; r++) {
152: if (r + 1 >= wwnrow) {
153: a3 = 1;
154: b3 = 1;
155: } else {
156: a3 = w->ww_index == wwsmap[r + 1][c - 1];
157: b3 = frameok(w, r + 1, c);
158: }
159: if (b2) {
160: code = 0;
161: if ((a1 || a2) && b1)
162: code |= WWF_U;
163: if ((a2 || a3) && b3)
164: code |= WWF_D;
165: if (code)
166: wwframec(wframe, r, c, code);
167: }
168: a1 = a2;
169: a2 = a3;
170: b1 = b2;
171: b2 = b3;
172: }
173: if ((a1 || a2) && b1 && b2)
174: wwframec(wframe, r, c, WWF_U);
175: }
176: }
177:
178: wwframec(f, r, c, code)
179: register struct ww *f;
180: register r, c;
181: char code;
182: {
183: char oldcode;
184: register char *smap;
185:
186: if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r)
187: return;
188:
189: smap = &wwsmap[r][c];
190:
191: {
192: register struct ww *w;
193:
194: w = wwindex[*smap];
195: if (w->ww_order > f->ww_order) {
196: if (w != &wwnobody && w->ww_win[r][c] == 0)
197: w->ww_nvis[r]--;
198: *smap = f->ww_index;
199: }
200: }
201:
202: if (f->ww_fmap != 0) {
203: register char *fmap;
204:
205: fmap = &f->ww_fmap[r][c];
206: oldcode = *fmap;
207: *fmap |= code;
208: if (code & WWF_TOP)
209: *fmap &= ~WWF_LABEL;
210: code = *fmap;
211: } else
212: oldcode = 0;
213: {
214: register char *win = &f->ww_win[r][c];
215:
216: if (*win == WWM_GLS && *smap == f->ww_index)
217: f->ww_nvis[r]++;
218: *win &= ~WWM_GLS;
219: }
220: if (oldcode != code && (code & WWF_LABEL) == 0) {
221: register short frame;
222:
223: frame = tt.tt_frame[code & WWF_MASK];
224: f->ww_buf[r][c].c_w = frame;
225: if (wwsmap[r][c] == f->ww_index) {
226: wwtouched[r] |= WWU_TOUCHED;
227: wwns[r][c].c_w = frame;
228: }
229: }
230: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.