113983Sedward #ifndef lint 2*15733Sedward static char *sccsid = "@(#)wwframe.c 3.13 83/12/17"; 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; 2414972Sedward c = w->ww_i.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 3114972Sedward for (; c < w->ww_i.r; c++) { 3214829Sedward if (c + 1 >= wwncol) { 3314829Sedward a3 = 1; 3414829Sedward b3 = 1; 3514829Sedward } else { 3614829Sedward a3 = w->ww_index == *smap++; 3714829Sedward b3 = frameok(w, r, c + 1); 3814829Sedward } 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; 5914972Sedward c = w->ww_i.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 6614972Sedward for (; c < w->ww_i.r; c++) { 6714829Sedward if (c + 1 >= wwncol) { 6814829Sedward a3 = 1; 6914829Sedward b3 = 1; 7014829Sedward } else { 7114829Sedward a3 = w->ww_index == *smap++; 7214829Sedward b3 = frameok(w, r, c + 1); 7314829Sedward } 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) { 9314972Sedward r = w->ww_i.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 10014972Sedward for (; r < w->ww_i.b; r++) { 10114829Sedward if (r + 1 >= wwnrow) { 10214829Sedward a3 = 1; 10314829Sedward b3 = 1; 10414829Sedward } else { 10514829Sedward a3 = w->ww_index == wwsmap[r + 1][c + 1]; 10614829Sedward b3 = frameok(w, r + 1, c); 10714829Sedward } 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) { 12714972Sedward r = w->ww_i.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 13414972Sedward for (; r < w->ww_i.b; r++) { 13514829Sedward if (r + 1 >= wwnrow) { 13614829Sedward a3 = 1; 13714829Sedward b3 = 1; 13814829Sedward } else { 13914829Sedward a3 = w->ww_index == wwsmap[r + 1][c - 1]; 14014829Sedward b3 = frameok(w, r + 1, c); 14114829Sedward } 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 16114987Sedward wwframec(f, r, c, code) 16214415Sedward register struct ww *f; 16314987Sedward register r, c; 16414756Sedward char code; 16513983Sedward { 16614756Sedward char oldcode; 16715587Sedward register char *smap; 16813983Sedward 16914987Sedward if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r) 17014415Sedward return; 17115587Sedward 17215587Sedward smap = &wwsmap[r][c]; 17315587Sedward 17414591Sedward { 17514591Sedward register struct ww *w; 17614756Sedward 17715587Sedward w = wwindex[*smap]; 17814591Sedward if (w->ww_order > f->ww_order) { 17915587Sedward if (w != &wwnobody && w->ww_win[r][c] == 0) 18015587Sedward w->ww_nvis[r]--; 18115587Sedward *smap = f->ww_index; 18214415Sedward } 18313983Sedward } 18414772Sedward 18514772Sedward if (f->ww_fmap != 0) { 18614591Sedward register char *fmap; 18714756Sedward 18814772Sedward fmap = &f->ww_fmap[r][c]; 18914756Sedward oldcode = *fmap; 19014591Sedward *fmap |= code; 19114591Sedward if (code & WWF_TOP) 19214591Sedward *fmap &= ~WWF_LABEL; 19314756Sedward code = *fmap; 19414756Sedward } else 19514756Sedward oldcode = 0; 19614756Sedward { 19714987Sedward register char *win = &f->ww_win[r][c]; 19814756Sedward 19915587Sedward if (*win == WWM_GLS && *smap == f->ww_index) 20014987Sedward f->ww_nvis[r]++; 20114987Sedward *win &= ~WWM_GLS; 20214987Sedward } 20314987Sedward if (oldcode != code && (code & WWF_LABEL) == 0) { 20414987Sedward register short frame; 20514756Sedward 206*15733Sedward frame = tt.tt_frame[code & WWF_MASK]; 20714987Sedward f->ww_buf[r][c].c_w = frame; 20814987Sedward if (wwsmap[r][c] == f->ww_index) { 20915654Sedward wwtouched[r] |= WWU_TOUCHED; 21014987Sedward wwns[r][c].c_w = frame; 21114756Sedward } 21214591Sedward } 21313983Sedward } 214