118735Sedward /* 233514Sbostic * Copyright (c) 1983 Regents of the University of California. 333514Sbostic * All rights reserved. 433514Sbostic * 5*42835Sbostic * %sccs.include.redist.c% 618735Sedward */ 718735Sedward 833514Sbostic #ifndef lint 9*42835Sbostic static char sccsid[] = "@(#)wwframe.c 3.19 (Berkeley) 06/02/90"; 1033514Sbostic #endif /* not lint */ 1133514Sbostic 1213983Sedward #include "ww.h" 1314649Sedward #include "tt.h" 1413983Sedward 1514756Sedward #define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \ 1617406Sedward w1->ww_fmap || w1->ww_order > (w)->ww_order) 1714756Sedward 1814415Sedward wwframe(w, wframe) 1914591Sedward register struct ww *w; 2014591Sedward struct ww *wframe; 2113983Sedward { 2214591Sedward register r, c; 2314591Sedward char a1, a2, a3; 2414591Sedward char b1, b2, b3; 2514591Sedward register char *smap; 2614591Sedward register code; 2714756Sedward register struct ww *w1; 2813983Sedward 2914591Sedward if (w->ww_w.t > 0) { 3014591Sedward r = w->ww_w.t - 1; 3114972Sedward c = w->ww_i.l - 1; 3214591Sedward smap = &wwsmap[r + 1][c + 1]; 3314591Sedward a1 = 0; 3414591Sedward a2 = 0; 3514591Sedward b1 = 0; 3614756Sedward b2 = c < 0 || frameok(w, r, c); 3713983Sedward 3814972Sedward for (; c < w->ww_i.r; c++) { 3914829Sedward if (c + 1 >= wwncol) { 4014829Sedward a3 = 1; 4114829Sedward b3 = 1; 4214829Sedward } else { 4314829Sedward a3 = w->ww_index == *smap++; 4414829Sedward b3 = frameok(w, r, c + 1); 4514829Sedward } 4614591Sedward if (b2) { 4714591Sedward code = 0; 4814591Sedward if ((a1 || a2) && b1) 4914591Sedward code |= WWF_L; 5014591Sedward if ((a2 || a3) && b3) 5114591Sedward code |= WWF_R; 5214591Sedward if (code) 5314772Sedward wwframec(wframe, r, c, code|WWF_TOP); 5414591Sedward } 5514591Sedward a1 = a2; 5614591Sedward a2 = a3; 5714591Sedward b1 = b2; 5814591Sedward b2 = b3; 5914591Sedward } 6014591Sedward if ((a1 || a2) && b1 && b2) 6114772Sedward wwframec(wframe, r, c, WWF_L|WWF_TOP); 6213983Sedward } 6313983Sedward 6414591Sedward if (w->ww_w.b < wwnrow) { 6514591Sedward r = w->ww_w.b; 6614972Sedward c = w->ww_i.l - 1; 6714591Sedward smap = &wwsmap[r - 1][c + 1]; 6814591Sedward a1 = 0; 6914591Sedward a2 = 0; 7014591Sedward b1 = 0; 7114756Sedward b2 = c < 0 || frameok(w, r, c); 7213983Sedward 7314972Sedward for (; c < w->ww_i.r; c++) { 7414829Sedward if (c + 1 >= wwncol) { 7514829Sedward a3 = 1; 7614829Sedward b3 = 1; 7714829Sedward } else { 7814829Sedward a3 = w->ww_index == *smap++; 7914829Sedward b3 = frameok(w, r, c + 1); 8014829Sedward } 8114591Sedward if (b2) { 8214591Sedward code = 0; 8314591Sedward if ((a1 || a2) && b1) 8414591Sedward code |= WWF_L; 8514591Sedward if ((a2 || a3) && b3) 8614591Sedward code |= WWF_R; 8714591Sedward if (code) 8814772Sedward wwframec(wframe, r, c, code); 8914591Sedward } 9014591Sedward a1 = a2; 9114591Sedward a2 = a3; 9214591Sedward b1 = b2; 9314591Sedward b2 = b3; 9414591Sedward } 9514591Sedward if ((a1 || a2) && b1 && b2) 9614772Sedward wwframec(wframe, r, c, WWF_L); 9713983Sedward } 9813983Sedward 9914591Sedward if (w->ww_w.l > 0) { 10014972Sedward r = w->ww_i.t - 1; 10114591Sedward c = w->ww_w.l - 1; 10214591Sedward a1 = 0; 10314591Sedward a2 = 0; 10414591Sedward b1 = 0; 10514756Sedward b2 = r < 0 || frameok(w, r, c); 10614591Sedward 10714972Sedward for (; r < w->ww_i.b; r++) { 10814829Sedward if (r + 1 >= wwnrow) { 10914829Sedward a3 = 1; 11014829Sedward b3 = 1; 11114829Sedward } else { 11214829Sedward a3 = w->ww_index == wwsmap[r + 1][c + 1]; 11314829Sedward b3 = frameok(w, r + 1, c); 11414829Sedward } 11514591Sedward if (b2) { 11614591Sedward code = 0; 11714591Sedward if ((a1 || a2) && b1) 11814591Sedward code |= WWF_U; 11914591Sedward if ((a2 || a3) && b3) 12014591Sedward code |= WWF_D; 12114591Sedward if (code) 12214772Sedward wwframec(wframe, r, c, code); 12314591Sedward } 12414591Sedward a1 = a2; 12514591Sedward a2 = a3; 12614591Sedward b1 = b2; 12714591Sedward b2 = b3; 12814591Sedward } 12914591Sedward if ((a1 || a2) && b1 && b2) 13014772Sedward wwframec(wframe, r, c, WWF_U); 13113983Sedward } 13213983Sedward 13314591Sedward if (w->ww_w.r < wwncol) { 13414972Sedward r = w->ww_i.t - 1; 13514591Sedward c = w->ww_w.r; 13614591Sedward a1 = 0; 13714591Sedward a2 = 0; 13814591Sedward b1 = 0; 13914756Sedward b2 = r < 0 || frameok(w, r, c); 14014415Sedward 14114972Sedward for (; r < w->ww_i.b; r++) { 14214829Sedward if (r + 1 >= wwnrow) { 14314829Sedward a3 = 1; 14414829Sedward b3 = 1; 14514829Sedward } else { 14614829Sedward a3 = w->ww_index == wwsmap[r + 1][c - 1]; 14714829Sedward b3 = frameok(w, r + 1, c); 14814829Sedward } 14914591Sedward if (b2) { 15014591Sedward code = 0; 15114591Sedward if ((a1 || a2) && b1) 15214591Sedward code |= WWF_U; 15314591Sedward if ((a2 || a3) && b3) 15414591Sedward code |= WWF_D; 15514591Sedward if (code) 15614772Sedward wwframec(wframe, r, c, code); 15714591Sedward } 15814591Sedward a1 = a2; 15914591Sedward a2 = a3; 16014591Sedward b1 = b2; 16114591Sedward b2 = b3; 16214591Sedward } 16314591Sedward if ((a1 || a2) && b1 && b2) 16414772Sedward wwframec(wframe, r, c, WWF_U); 16514415Sedward } 16613983Sedward } 16713983Sedward 16814987Sedward wwframec(f, r, c, code) 16914415Sedward register struct ww *f; 17014987Sedward register r, c; 17114756Sedward char code; 17213983Sedward { 17314756Sedward char oldcode; 17415587Sedward register char *smap; 17513983Sedward 17614987Sedward if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r) 17714415Sedward return; 17815587Sedward 17915587Sedward smap = &wwsmap[r][c]; 18015587Sedward 18114591Sedward { 18214591Sedward register struct ww *w; 18314756Sedward 18415587Sedward w = wwindex[*smap]; 18514591Sedward if (w->ww_order > f->ww_order) { 18615587Sedward if (w != &wwnobody && w->ww_win[r][c] == 0) 18715587Sedward w->ww_nvis[r]--; 18815587Sedward *smap = f->ww_index; 18914415Sedward } 19013983Sedward } 19114772Sedward 19214772Sedward if (f->ww_fmap != 0) { 19314591Sedward register char *fmap; 19414756Sedward 19514772Sedward fmap = &f->ww_fmap[r][c]; 19614756Sedward oldcode = *fmap; 19714591Sedward *fmap |= code; 19814591Sedward if (code & WWF_TOP) 19914591Sedward *fmap &= ~WWF_LABEL; 20014756Sedward code = *fmap; 20114756Sedward } else 20214756Sedward oldcode = 0; 20314756Sedward { 20414987Sedward register char *win = &f->ww_win[r][c]; 20514756Sedward 20615587Sedward if (*win == WWM_GLS && *smap == f->ww_index) 20714987Sedward f->ww_nvis[r]++; 20814987Sedward *win &= ~WWM_GLS; 20914987Sedward } 21014987Sedward if (oldcode != code && (code & WWF_LABEL) == 0) { 21114987Sedward register short frame; 21214756Sedward 21315733Sedward frame = tt.tt_frame[code & WWF_MASK]; 21414987Sedward f->ww_buf[r][c].c_w = frame; 21514987Sedward if (wwsmap[r][c] == f->ww_index) { 21615654Sedward wwtouched[r] |= WWU_TOUCHED; 21714987Sedward wwns[r][c].c_w = frame; 21814756Sedward } 21914591Sedward } 22013983Sedward } 221