|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)wwframe.c 3.16 4/24/85";
3: #endif
4:
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:
11: #include "ww.h"
12: #include "tt.h"
13:
14: #define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \
15: w1->ww_fmap || w1->ww_order > (w)->ww_order)
16:
17: wwframe(w, wframe)
18: register struct ww *w;
19: struct ww *wframe;
20: {
21: register r, c;
22: char a1, a2, a3;
23: char b1, b2, b3;
24: register char *smap;
25: register code;
26: register struct ww *w1;
27:
28: if (w->ww_w.t > 0) {
29: r = w->ww_w.t - 1;
30: c = w->ww_i.l - 1;
31: smap = &wwsmap[r + 1][c + 1];
32: a1 = 0;
33: a2 = 0;
34: b1 = 0;
35: b2 = c < 0 || frameok(w, r, c);
36:
37: for (; c < w->ww_i.r; c++) {
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: }
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)
52: wwframec(wframe, r, c, code|WWF_TOP);
53: }
54: a1 = a2;
55: a2 = a3;
56: b1 = b2;
57: b2 = b3;
58: }
59: if ((a1 || a2) && b1 && b2)
60: wwframec(wframe, r, c, WWF_L|WWF_TOP);
61: }
62:
63: if (w->ww_w.b < wwnrow) {
64: r = w->ww_w.b;
65: c = w->ww_i.l - 1;
66: smap = &wwsmap[r - 1][c + 1];
67: a1 = 0;
68: a2 = 0;
69: b1 = 0;
70: b2 = c < 0 || frameok(w, r, c);
71:
72: for (; c < w->ww_i.r; c++) {
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: }
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)
87: wwframec(wframe, r, c, code);
88: }
89: a1 = a2;
90: a2 = a3;
91: b1 = b2;
92: b2 = b3;
93: }
94: if ((a1 || a2) && b1 && b2)
95: wwframec(wframe, r, c, WWF_L);
96: }
97:
98: if (w->ww_w.l > 0) {
99: r = w->ww_i.t - 1;
100: c = w->ww_w.l - 1;
101: a1 = 0;
102: a2 = 0;
103: b1 = 0;
104: b2 = r < 0 || frameok(w, r, c);
105:
106: for (; r < w->ww_i.b; r++) {
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: }
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)
121: wwframec(wframe, r, c, code);
122: }
123: a1 = a2;
124: a2 = a3;
125: b1 = b2;
126: b2 = b3;
127: }
128: if ((a1 || a2) && b1 && b2)
129: wwframec(wframe, r, c, WWF_U);
130: }
131:
132: if (w->ww_w.r < wwncol) {
133: r = w->ww_i.t - 1;
134: c = w->ww_w.r;
135: a1 = 0;
136: a2 = 0;
137: b1 = 0;
138: b2 = r < 0 || frameok(w, r, c);
139:
140: for (; r < w->ww_i.b; r++) {
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: }
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)
155: wwframec(wframe, r, c, code);
156: }
157: a1 = a2;
158: a2 = a3;
159: b1 = b2;
160: b2 = b3;
161: }
162: if ((a1 || a2) && b1 && b2)
163: wwframec(wframe, r, c, WWF_U);
164: }
165: }
166:
167: wwframec(f, r, c, code)
168: register struct ww *f;
169: register r, c;
170: char code;
171: {
172: char oldcode;
173: register char *smap;
174:
175: if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r)
176: return;
177:
178: smap = &wwsmap[r][c];
179:
180: {
181: register struct ww *w;
182:
183: w = wwindex[*smap];
184: if (w->ww_order > f->ww_order) {
185: if (w != &wwnobody && w->ww_win[r][c] == 0)
186: w->ww_nvis[r]--;
187: *smap = f->ww_index;
188: }
189: }
190:
191: if (f->ww_fmap != 0) {
192: register char *fmap;
193:
194: fmap = &f->ww_fmap[r][c];
195: oldcode = *fmap;
196: *fmap |= code;
197: if (code & WWF_TOP)
198: *fmap &= ~WWF_LABEL;
199: code = *fmap;
200: } else
201: oldcode = 0;
202: {
203: register char *win = &f->ww_win[r][c];
204:
205: if (*win == WWM_GLS && *smap == f->ww_index)
206: f->ww_nvis[r]++;
207: *win &= ~WWM_GLS;
208: }
209: if (oldcode != code && (code & WWF_LABEL) == 0) {
210: register short frame;
211:
212: frame = tt.tt_frame[code & WWF_MASK];
213: f->ww_buf[r][c].c_w = frame;
214: if (wwsmap[r][c] == f->ww_index) {
215: wwtouched[r] |= WWU_TOUCHED;
216: wwns[r][c].c_w = frame;
217: }
218: }
219: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.