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