113983Sedward #ifndef lint 2*14591Sedward static char *sccsid = "@(#)wwframe.c 3.2 83/08/12"; 313983Sedward #endif 413983Sedward 513983Sedward #include "ww.h" 613983Sedward 714415Sedward wwframe(w, wframe) 8*14591Sedward register struct ww *w; 9*14591Sedward struct ww *wframe; 1013983Sedward { 11*14591Sedward register r, c; 12*14591Sedward char a1, a2, a3; 13*14591Sedward char b1, b2, b3; 14*14591Sedward register char *smap; 15*14591Sedward register code; 1613983Sedward 17*14591Sedward if (w->ww_w.t > 0) { 18*14591Sedward r = w->ww_w.t - 1; 19*14591Sedward c = w->ww_w.l - 1; 20*14591Sedward smap = &wwsmap[r + 1][c + 1]; 21*14591Sedward a1 = 0; 22*14591Sedward a2 = 0; 23*14591Sedward b1 = 0; 24*14591Sedward b2 = wwframeok(w, r, c); 2513983Sedward 26*14591Sedward for (; c < w->ww_w.r; c++) { 27*14591Sedward a3 = w->ww_index == *smap++; 28*14591Sedward b3 = wwframeok(w, r, c + 1); 29*14591Sedward if (b2) { 30*14591Sedward code = 0; 31*14591Sedward if ((a1 || a2) && b1) 32*14591Sedward code |= WWF_L; 33*14591Sedward if ((a2 || a3) && b3) 34*14591Sedward code |= WWF_R; 35*14591Sedward if (code) 36*14591Sedward wwframec(r, c, wframe, code|WWF_TOP); 37*14591Sedward } 38*14591Sedward a1 = a2; 39*14591Sedward a2 = a3; 40*14591Sedward b1 = b2; 41*14591Sedward b2 = b3; 42*14591Sedward } 43*14591Sedward if ((a1 || a2) && b1 && b2) 44*14591Sedward wwframec(r, c, wframe, WWF_L|WWF_TOP); 4513983Sedward } 4613983Sedward 47*14591Sedward if (w->ww_w.b < wwnrow) { 48*14591Sedward r = w->ww_w.b; 49*14591Sedward c = w->ww_w.l - 1; 50*14591Sedward smap = &wwsmap[r - 1][c + 1]; 51*14591Sedward a1 = 0; 52*14591Sedward a2 = 0; 53*14591Sedward b1 = 0; 54*14591Sedward b2 = wwframeok(w, r, c); 5513983Sedward 56*14591Sedward for (; c < w->ww_w.r; c++) { 57*14591Sedward a3 = w->ww_index == *smap++; 58*14591Sedward b3 = wwframeok(w, r, c + 1); 59*14591Sedward if (b2) { 60*14591Sedward code = 0; 61*14591Sedward if ((a1 || a2) && b1) 62*14591Sedward code |= WWF_L; 63*14591Sedward if ((a2 || a3) && b3) 64*14591Sedward code |= WWF_R; 65*14591Sedward if (code) 66*14591Sedward wwframec(r, c, wframe, code); 67*14591Sedward } 68*14591Sedward a1 = a2; 69*14591Sedward a2 = a3; 70*14591Sedward b1 = b2; 71*14591Sedward b2 = b3; 72*14591Sedward } 73*14591Sedward if ((a1 || a2) && b1 && b2) 74*14591Sedward wwframec(r, c, wframe, WWF_L); 7513983Sedward } 7613983Sedward 77*14591Sedward if (w->ww_w.l > 0) { 78*14591Sedward r = w->ww_w.t - 1; 79*14591Sedward c = w->ww_w.l - 1; 80*14591Sedward a1 = 0; 81*14591Sedward a2 = 0; 82*14591Sedward b1 = 0; 83*14591Sedward b2 = wwframeok(w, r, c); 84*14591Sedward 85*14591Sedward for (; r < w->ww_w.b; r++) { 86*14591Sedward a3 = w->ww_index == wwsmap[r + 1][c + 1]; 87*14591Sedward b3 = wwframeok(w, r + 1, c); 88*14591Sedward if (b2) { 89*14591Sedward code = 0; 90*14591Sedward if ((a1 || a2) && b1) 91*14591Sedward code |= WWF_U; 92*14591Sedward if ((a2 || a3) && b3) 93*14591Sedward code |= WWF_D; 94*14591Sedward if (code) 95*14591Sedward wwframec(r, c, wframe, code); 96*14591Sedward } 97*14591Sedward a1 = a2; 98*14591Sedward a2 = a3; 99*14591Sedward b1 = b2; 100*14591Sedward b2 = b3; 101*14591Sedward } 102*14591Sedward if ((a1 || a2) && b1 && b2) 103*14591Sedward wwframec(r, c, wframe, WWF_U); 10413983Sedward } 10513983Sedward 106*14591Sedward if (w->ww_w.r < wwncol) { 107*14591Sedward r = w->ww_w.t - 1; 108*14591Sedward c = w->ww_w.r; 109*14591Sedward a1 = 0; 110*14591Sedward a2 = 0; 111*14591Sedward b1 = 0; 112*14591Sedward b2 = wwframeok(w, r, c); 11314415Sedward 114*14591Sedward for (; r < w->ww_w.b; r++) { 115*14591Sedward a3 = w->ww_index == wwsmap[r + 1][c - 1]; 116*14591Sedward b3 = wwframeok(w, r + 1, c); 117*14591Sedward if (b2) { 118*14591Sedward code = 0; 119*14591Sedward if ((a1 || a2) && b1) 120*14591Sedward code |= WWF_U; 121*14591Sedward if ((a2 || a3) && b3) 122*14591Sedward code |= WWF_D; 123*14591Sedward if (code) 124*14591Sedward wwframec(r, c, wframe, code); 125*14591Sedward } 126*14591Sedward a1 = a2; 127*14591Sedward a2 = a3; 128*14591Sedward b1 = b2; 129*14591Sedward b2 = b3; 130*14591Sedward } 131*14591Sedward if ((a1 || a2) && b1 && b2) 132*14591Sedward wwframec(r, c, wframe, WWF_U); 13314415Sedward } 13413983Sedward } 13513983Sedward 13614415Sedward wwframeok(w, r, c) 137*14591Sedward struct ww *w; 138*14591Sedward register r, c; 13913983Sedward { 14014415Sedward register struct ww *w1; 14113983Sedward 14214415Sedward if (r < 0 || r >= wwnrow || c < 0 || c >= wwncol) 14314077Sedward return 1; 14414415Sedward w1 = wwindex[wwsmap[r][c]]; 145*14591Sedward return !w1->ww_hasframe || w1->ww_order > w->ww_order; 14613983Sedward } 14713983Sedward 14814415Sedward wwframec(rr, cc, f, code) 14914415Sedward register struct ww *f; 15014415Sedward register rr, cc; 151*14591Sedward int code; 15213983Sedward { 15314415Sedward register r, c; 15413983Sedward 15514415Sedward if (rr < 0 || rr >= wwnrow || cc < 0 || cc >= wwncol) 15614415Sedward return; 157*14591Sedward { 158*14591Sedward register struct ww *w; 159*14591Sedward w = wwindex[wwsmap[rr][cc]]; 160*14591Sedward if (w->ww_order > f->ww_order) { 161*14591Sedward if (w != &wwnobody) { 162*14591Sedward r = rr - w->ww_w.t; 163*14591Sedward c = cc - w->ww_w.l; 164*14591Sedward if ((w->ww_win[r][c] |= WWM_COV) == WWM_COV) 165*14591Sedward w->ww_nvis[r]--; 166*14591Sedward w->ww_cov[r][c] = f->ww_index; 167*14591Sedward } 168*14591Sedward wwsmap[rr][cc] = f->ww_index; 16914415Sedward } 17013983Sedward } 171*14591Sedward { 172*14591Sedward register char *fmap; 173*14591Sedward fmap = &wwfmap[rr][cc]; 174*14591Sedward *fmap |= code; 175*14591Sedward if (code & WWF_TOP) 176*14591Sedward *fmap &= ~WWF_LABEL; 177*14591Sedward code = *(unsigned char *)fmap; 178*14591Sedward } 17914415Sedward r = rr - f->ww_w.t; 18014415Sedward c = cc - f->ww_w.l; 18114415Sedward if (f->ww_win[r][c] == WWM_GLS) 18214415Sedward f->ww_nvis[r]++; 18314415Sedward f->ww_win[r][c] &= ~WWM_GLS; 184*14591Sedward if ((code & WWF_LABEL) == 0) { 185*14591Sedward register tmp; 186*14591Sedward 187*14591Sedward tmp = tt.tt_frame[code & WWF_MASK] & WWC_CMASK; 188*14591Sedward f->ww_buf[f->ww_scroll + r][c].c_w = tmp; 189*14591Sedward if (wwsmap[rr][cc] == f->ww_index) 190*14591Sedward wwns[rr][cc].c_w = tmp; 191*14591Sedward } 19213983Sedward } 193*14591Sedward 194*14591Sedward /* 195*14591Sedward wwckns() 196*14591Sedward { 197*14591Sedward register i, j; 198*14591Sedward 199*14591Sedward for (i = 0; i < wwnrow; i++) 200*14591Sedward for (j = 0; j < wwncol; j++) 201*14591Sedward if ((wwns[i][j].c_c & 0x7f) < ' ') 202*14591Sedward abort(); 203*14591Sedward } 204*14591Sedward */ 205