113983Sedward #ifndef lint 2*14829Sedward static char *sccsid = "@(#)wwframe.c 3.8 83/08/23"; 313983Sedward #endif 413983Sedward 513983Sedward #include "ww.h" 614649Sedward #include "tt.h" 713983Sedward 814756Sedward #define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \ 914756Sedward !w1->ww_hasframe || w1->ww_order > (w)->ww_order) 1014756Sedward 1114415Sedward wwframe(w, wframe) 1214591Sedward register struct ww *w; 1314591Sedward struct ww *wframe; 1413983Sedward { 1514591Sedward register r, c; 1614591Sedward char a1, a2, a3; 1714591Sedward char b1, b2, b3; 1814591Sedward register char *smap; 1914591Sedward register code; 2014756Sedward register struct ww *w1; 2113983Sedward 2214591Sedward if (w->ww_w.t > 0) { 2314591Sedward r = w->ww_w.t - 1; 2414591Sedward c = w->ww_w.l - 1; 2514591Sedward smap = &wwsmap[r + 1][c + 1]; 2614591Sedward a1 = 0; 2714591Sedward a2 = 0; 2814591Sedward b1 = 0; 2914756Sedward b2 = c < 0 || frameok(w, r, c); 3013983Sedward 3114591Sedward for (; c < w->ww_w.r; c++) { 32*14829Sedward if (c + 1 >= wwncol) { 33*14829Sedward a3 = 1; 34*14829Sedward b3 = 1; 35*14829Sedward } else { 36*14829Sedward a3 = w->ww_index == *smap++; 37*14829Sedward b3 = frameok(w, r, c + 1); 38*14829Sedward } 3914591Sedward if (b2) { 4014591Sedward code = 0; 4114591Sedward if ((a1 || a2) && b1) 4214591Sedward code |= WWF_L; 4314591Sedward if ((a2 || a3) && b3) 4414591Sedward code |= WWF_R; 4514591Sedward if (code) 4614772Sedward wwframec(wframe, r, c, code|WWF_TOP); 4714591Sedward } 4814591Sedward a1 = a2; 4914591Sedward a2 = a3; 5014591Sedward b1 = b2; 5114591Sedward b2 = b3; 5214591Sedward } 5314591Sedward if ((a1 || a2) && b1 && b2) 5414772Sedward wwframec(wframe, r, c, WWF_L|WWF_TOP); 5513983Sedward } 5613983Sedward 5714591Sedward if (w->ww_w.b < wwnrow) { 5814591Sedward r = w->ww_w.b; 5914591Sedward c = w->ww_w.l - 1; 6014591Sedward smap = &wwsmap[r - 1][c + 1]; 6114591Sedward a1 = 0; 6214591Sedward a2 = 0; 6314591Sedward b1 = 0; 6414756Sedward b2 = c < 0 || frameok(w, r, c); 6513983Sedward 6614591Sedward for (; c < w->ww_w.r; c++) { 67*14829Sedward if (c + 1 >= wwncol) { 68*14829Sedward a3 = 1; 69*14829Sedward b3 = 1; 70*14829Sedward } else { 71*14829Sedward a3 = w->ww_index == *smap++; 72*14829Sedward b3 = frameok(w, r, c + 1); 73*14829Sedward } 7414591Sedward if (b2) { 7514591Sedward code = 0; 7614591Sedward if ((a1 || a2) && b1) 7714591Sedward code |= WWF_L; 7814591Sedward if ((a2 || a3) && b3) 7914591Sedward code |= WWF_R; 8014591Sedward if (code) 8114772Sedward wwframec(wframe, r, c, code); 8214591Sedward } 8314591Sedward a1 = a2; 8414591Sedward a2 = a3; 8514591Sedward b1 = b2; 8614591Sedward b2 = b3; 8714591Sedward } 8814591Sedward if ((a1 || a2) && b1 && b2) 8914772Sedward wwframec(wframe, r, c, WWF_L); 9013983Sedward } 9113983Sedward 9214591Sedward if (w->ww_w.l > 0) { 9314591Sedward r = w->ww_w.t - 1; 9414591Sedward c = w->ww_w.l - 1; 9514591Sedward a1 = 0; 9614591Sedward a2 = 0; 9714591Sedward b1 = 0; 9814756Sedward b2 = r < 0 || frameok(w, r, c); 9914591Sedward 10014591Sedward for (; r < w->ww_w.b; r++) { 101*14829Sedward if (r + 1 >= wwnrow) { 102*14829Sedward a3 = 1; 103*14829Sedward b3 = 1; 104*14829Sedward } else { 105*14829Sedward a3 = w->ww_index == wwsmap[r + 1][c + 1]; 106*14829Sedward b3 = frameok(w, r + 1, c); 107*14829Sedward } 10814591Sedward if (b2) { 10914591Sedward code = 0; 11014591Sedward if ((a1 || a2) && b1) 11114591Sedward code |= WWF_U; 11214591Sedward if ((a2 || a3) && b3) 11314591Sedward code |= WWF_D; 11414591Sedward if (code) 11514772Sedward wwframec(wframe, r, c, code); 11614591Sedward } 11714591Sedward a1 = a2; 11814591Sedward a2 = a3; 11914591Sedward b1 = b2; 12014591Sedward b2 = b3; 12114591Sedward } 12214591Sedward if ((a1 || a2) && b1 && b2) 12314772Sedward wwframec(wframe, r, c, WWF_U); 12413983Sedward } 12513983Sedward 12614591Sedward if (w->ww_w.r < wwncol) { 12714591Sedward r = w->ww_w.t - 1; 12814591Sedward c = w->ww_w.r; 12914591Sedward a1 = 0; 13014591Sedward a2 = 0; 13114591Sedward b1 = 0; 13214756Sedward b2 = r < 0 || frameok(w, r, c); 13314415Sedward 13414591Sedward for (; r < w->ww_w.b; r++) { 135*14829Sedward if (r + 1 >= wwnrow) { 136*14829Sedward a3 = 1; 137*14829Sedward b3 = 1; 138*14829Sedward } else { 139*14829Sedward a3 = w->ww_index == wwsmap[r + 1][c - 1]; 140*14829Sedward b3 = frameok(w, r + 1, c); 141*14829Sedward } 14214591Sedward if (b2) { 14314591Sedward code = 0; 14414591Sedward if ((a1 || a2) && b1) 14514591Sedward code |= WWF_U; 14614591Sedward if ((a2 || a3) && b3) 14714591Sedward code |= WWF_D; 14814591Sedward if (code) 14914772Sedward wwframec(wframe, r, c, code); 15014591Sedward } 15114591Sedward a1 = a2; 15214591Sedward a2 = a3; 15314591Sedward b1 = b2; 15414591Sedward b2 = b3; 15514591Sedward } 15614591Sedward if ((a1 || a2) && b1 && b2) 15714772Sedward wwframec(wframe, r, c, WWF_U); 15814415Sedward } 15913983Sedward } 16013983Sedward 16114772Sedward wwframec(f, rr, cc, code) 16214415Sedward register struct ww *f; 16314415Sedward register rr, cc; 16414756Sedward char code; 16513983Sedward { 16614772Sedward register r, c; 16714756Sedward char oldcode; 16813983Sedward 16914720Sedward if (rr < f->ww_w.t || rr >= f->ww_w.b 17014720Sedward || cc < f->ww_w.l || cc >= f->ww_w.r) 17114415Sedward return; 17214591Sedward { 17314591Sedward register struct ww *w; 17414756Sedward 17514591Sedward w = wwindex[wwsmap[rr][cc]]; 17614591Sedward if (w->ww_order > f->ww_order) { 17714591Sedward if (w != &wwnobody) { 17814591Sedward r = rr - w->ww_w.t; 17914591Sedward c = cc - w->ww_w.l; 18014591Sedward if ((w->ww_win[r][c] |= WWM_COV) == WWM_COV) 18114591Sedward w->ww_nvis[r]--; 18214591Sedward w->ww_cov[r][c] = f->ww_index; 18314591Sedward } 18414591Sedward wwsmap[rr][cc] = f->ww_index; 18514415Sedward } 18613983Sedward } 18714772Sedward 18814772Sedward r = rr - f->ww_w.t; 18914772Sedward c = cc - f->ww_w.l; 19014772Sedward if (f->ww_fmap != 0) { 19114591Sedward register char *fmap; 19214756Sedward 19314772Sedward fmap = &f->ww_fmap[r][c]; 19414756Sedward oldcode = *fmap; 19514591Sedward *fmap |= code; 19614591Sedward if (code & WWF_TOP) 19714591Sedward *fmap &= ~WWF_LABEL; 19814756Sedward code = *fmap; 19914756Sedward } else 20014756Sedward oldcode = 0; 20114756Sedward { 20214756Sedward { 20314756Sedward register char *win = &f->ww_win[r][c]; 20414756Sedward 20514756Sedward if (*win == WWM_GLS) 20614756Sedward f->ww_nvis[r]++; 20714756Sedward *win &= ~WWM_GLS; 20814663Sedward } 20914756Sedward if (oldcode != code && (code & WWF_LABEL) == 0) { 21014756Sedward register short frame; 21114756Sedward 21214756Sedward frame = tt.tt_frame[code & WWF_MASK] & WWC_CMASK; 21314756Sedward f->ww_buf[f->ww_scroll + r][c].c_w = frame; 21414756Sedward if (wwsmap[rr][cc] == f->ww_index) { 21514756Sedward wwtouched[rr] = 1; 21614756Sedward wwns[rr][cc].c_w = frame; 21714756Sedward } 21814756Sedward } 21914591Sedward } 22013983Sedward } 221