113983Sedward #ifndef lint 2*14663Sedward static char *sccsid = "@(#)wwframe.c 3.4 83/08/16"; 313983Sedward #endif 413983Sedward 513983Sedward #include "ww.h" 614649Sedward #include "tt.h" 713983Sedward 814415Sedward wwframe(w, wframe) 914591Sedward register struct ww *w; 1014591Sedward struct ww *wframe; 1113983Sedward { 1214591Sedward register r, c; 1314591Sedward char a1, a2, a3; 1414591Sedward char b1, b2, b3; 1514591Sedward register char *smap; 1614591Sedward register code; 1713983Sedward 1814591Sedward if (w->ww_w.t > 0) { 1914591Sedward r = w->ww_w.t - 1; 2014591Sedward c = w->ww_w.l - 1; 2114591Sedward smap = &wwsmap[r + 1][c + 1]; 2214591Sedward a1 = 0; 2314591Sedward a2 = 0; 2414591Sedward b1 = 0; 2514591Sedward b2 = wwframeok(w, r, c); 2613983Sedward 2714591Sedward for (; c < w->ww_w.r; c++) { 2814591Sedward a3 = w->ww_index == *smap++; 2914591Sedward b3 = wwframeok(w, r, c + 1); 3014591Sedward if (b2) { 3114591Sedward code = 0; 3214591Sedward if ((a1 || a2) && b1) 3314591Sedward code |= WWF_L; 3414591Sedward if ((a2 || a3) && b3) 3514591Sedward code |= WWF_R; 3614591Sedward if (code) 3714591Sedward wwframec(r, c, wframe, code|WWF_TOP); 3814591Sedward } 3914591Sedward a1 = a2; 4014591Sedward a2 = a3; 4114591Sedward b1 = b2; 4214591Sedward b2 = b3; 4314591Sedward } 4414591Sedward if ((a1 || a2) && b1 && b2) 4514591Sedward wwframec(r, c, wframe, WWF_L|WWF_TOP); 4613983Sedward } 4713983Sedward 4814591Sedward if (w->ww_w.b < wwnrow) { 4914591Sedward r = w->ww_w.b; 5014591Sedward c = w->ww_w.l - 1; 5114591Sedward smap = &wwsmap[r - 1][c + 1]; 5214591Sedward a1 = 0; 5314591Sedward a2 = 0; 5414591Sedward b1 = 0; 5514591Sedward b2 = wwframeok(w, r, c); 5613983Sedward 5714591Sedward for (; c < w->ww_w.r; c++) { 5814591Sedward a3 = w->ww_index == *smap++; 5914591Sedward b3 = wwframeok(w, r, c + 1); 6014591Sedward if (b2) { 6114591Sedward code = 0; 6214591Sedward if ((a1 || a2) && b1) 6314591Sedward code |= WWF_L; 6414591Sedward if ((a2 || a3) && b3) 6514591Sedward code |= WWF_R; 6614591Sedward if (code) 6714591Sedward wwframec(r, c, wframe, code); 6814591Sedward } 6914591Sedward a1 = a2; 7014591Sedward a2 = a3; 7114591Sedward b1 = b2; 7214591Sedward b2 = b3; 7314591Sedward } 7414591Sedward if ((a1 || a2) && b1 && b2) 7514591Sedward wwframec(r, c, wframe, WWF_L); 7613983Sedward } 7713983Sedward 7814591Sedward if (w->ww_w.l > 0) { 7914591Sedward r = w->ww_w.t - 1; 8014591Sedward c = w->ww_w.l - 1; 8114591Sedward a1 = 0; 8214591Sedward a2 = 0; 8314591Sedward b1 = 0; 8414591Sedward b2 = wwframeok(w, r, c); 8514591Sedward 8614591Sedward for (; r < w->ww_w.b; r++) { 8714591Sedward a3 = w->ww_index == wwsmap[r + 1][c + 1]; 8814591Sedward b3 = wwframeok(w, r + 1, c); 8914591Sedward if (b2) { 9014591Sedward code = 0; 9114591Sedward if ((a1 || a2) && b1) 9214591Sedward code |= WWF_U; 9314591Sedward if ((a2 || a3) && b3) 9414591Sedward code |= WWF_D; 9514591Sedward if (code) 9614591Sedward wwframec(r, c, wframe, code); 9714591Sedward } 9814591Sedward a1 = a2; 9914591Sedward a2 = a3; 10014591Sedward b1 = b2; 10114591Sedward b2 = b3; 10214591Sedward } 10314591Sedward if ((a1 || a2) && b1 && b2) 10414591Sedward wwframec(r, c, wframe, WWF_U); 10513983Sedward } 10613983Sedward 10714591Sedward if (w->ww_w.r < wwncol) { 10814591Sedward r = w->ww_w.t - 1; 10914591Sedward c = w->ww_w.r; 11014591Sedward a1 = 0; 11114591Sedward a2 = 0; 11214591Sedward b1 = 0; 11314591Sedward b2 = wwframeok(w, r, c); 11414415Sedward 11514591Sedward for (; r < w->ww_w.b; r++) { 11614591Sedward a3 = w->ww_index == wwsmap[r + 1][c - 1]; 11714591Sedward b3 = wwframeok(w, r + 1, c); 11814591Sedward if (b2) { 11914591Sedward code = 0; 12014591Sedward if ((a1 || a2) && b1) 12114591Sedward code |= WWF_U; 12214591Sedward if ((a2 || a3) && b3) 12314591Sedward code |= WWF_D; 12414591Sedward if (code) 12514591Sedward wwframec(r, c, wframe, code); 12614591Sedward } 12714591Sedward a1 = a2; 12814591Sedward a2 = a3; 12914591Sedward b1 = b2; 13014591Sedward b2 = b3; 13114591Sedward } 13214591Sedward if ((a1 || a2) && b1 && b2) 13314591Sedward wwframec(r, c, wframe, WWF_U); 13414415Sedward } 13513983Sedward } 13613983Sedward 13714415Sedward wwframeok(w, r, c) 13814591Sedward struct ww *w; 13914591Sedward register r, c; 14013983Sedward { 14114415Sedward register struct ww *w1; 14213983Sedward 14314415Sedward if (r < 0 || r >= wwnrow || c < 0 || c >= wwncol) 14414077Sedward return 1; 14514415Sedward w1 = wwindex[wwsmap[r][c]]; 14614591Sedward return !w1->ww_hasframe || w1->ww_order > w->ww_order; 14713983Sedward } 14813983Sedward 14914415Sedward wwframec(rr, cc, f, code) 15014415Sedward register struct ww *f; 15114415Sedward register rr, cc; 15214591Sedward int code; 15313983Sedward { 15414415Sedward register r, c; 15513983Sedward 15614415Sedward if (rr < 0 || rr >= wwnrow || cc < 0 || cc >= wwncol) 15714415Sedward return; 15814591Sedward { 15914591Sedward register struct ww *w; 16014591Sedward w = wwindex[wwsmap[rr][cc]]; 16114591Sedward if (w->ww_order > f->ww_order) { 16214591Sedward if (w != &wwnobody) { 16314591Sedward r = rr - w->ww_w.t; 16414591Sedward c = cc - w->ww_w.l; 16514591Sedward if ((w->ww_win[r][c] |= WWM_COV) == WWM_COV) 16614591Sedward w->ww_nvis[r]--; 16714591Sedward w->ww_cov[r][c] = f->ww_index; 16814591Sedward } 16914591Sedward wwsmap[rr][cc] = f->ww_index; 17014415Sedward } 17113983Sedward } 17214591Sedward { 17314591Sedward register char *fmap; 17414591Sedward fmap = &wwfmap[rr][cc]; 17514591Sedward *fmap |= code; 17614591Sedward if (code & WWF_TOP) 17714591Sedward *fmap &= ~WWF_LABEL; 17814591Sedward code = *(unsigned char *)fmap; 17914591Sedward } 18014415Sedward r = rr - f->ww_w.t; 18114415Sedward c = cc - f->ww_w.l; 18214415Sedward if (f->ww_win[r][c] == WWM_GLS) 18314415Sedward f->ww_nvis[r]++; 18414415Sedward f->ww_win[r][c] &= ~WWM_GLS; 18514591Sedward if ((code & WWF_LABEL) == 0) { 18614591Sedward register tmp; 18714591Sedward 18814591Sedward tmp = tt.tt_frame[code & WWF_MASK] & WWC_CMASK; 18914591Sedward f->ww_buf[f->ww_scroll + r][c].c_w = tmp; 190*14663Sedward if (wwsmap[rr][cc] == f->ww_index) { 191*14663Sedward wwtouched[rr] = 1; 19214591Sedward wwns[rr][cc].c_w = tmp; 193*14663Sedward } 19414591Sedward } 19513983Sedward } 19614591Sedward 19714591Sedward /* 19814591Sedward wwckns() 19914591Sedward { 20014591Sedward register i, j; 20114591Sedward 20214591Sedward for (i = 0; i < wwnrow; i++) 20314591Sedward for (j = 0; j < wwncol; j++) 20414591Sedward if ((wwns[i][j].c_c & 0x7f) < ' ') 20514591Sedward abort(); 20614591Sedward } 20714591Sedward */ 208