118735Sedward /* 2*33514Sbostic * Copyright (c) 1983 Regents of the University of California. 3*33514Sbostic * All rights reserved. 4*33514Sbostic * 5*33514Sbostic * Redistribution and use in source and binary forms are permitted 6*33514Sbostic * provided that this notice is preserved and that due credit is given 7*33514Sbostic * to the University of California at Berkeley. The name of the University 8*33514Sbostic * may not be used to endorse or promote products derived from this 9*33514Sbostic * software without specific prior written permission. This software 10*33514Sbostic * is provided ``as is'' without express or implied warranty. 1118735Sedward */ 1218735Sedward 13*33514Sbostic #ifndef lint 14*33514Sbostic static char sccsid[] = "@(#)wwframe.c 3.17 (Berkeley) 02/21/88"; 15*33514Sbostic #endif /* not lint */ 16*33514Sbostic 1713983Sedward #include "ww.h" 1814649Sedward #include "tt.h" 1913983Sedward 2014756Sedward #define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \ 2117406Sedward w1->ww_fmap || w1->ww_order > (w)->ww_order) 2214756Sedward 2314415Sedward wwframe(w, wframe) 2414591Sedward register struct ww *w; 2514591Sedward struct ww *wframe; 2613983Sedward { 2714591Sedward register r, c; 2814591Sedward char a1, a2, a3; 2914591Sedward char b1, b2, b3; 3014591Sedward register char *smap; 3114591Sedward register code; 3214756Sedward register struct ww *w1; 3313983Sedward 3414591Sedward if (w->ww_w.t > 0) { 3514591Sedward r = w->ww_w.t - 1; 3614972Sedward c = w->ww_i.l - 1; 3714591Sedward smap = &wwsmap[r + 1][c + 1]; 3814591Sedward a1 = 0; 3914591Sedward a2 = 0; 4014591Sedward b1 = 0; 4114756Sedward b2 = c < 0 || frameok(w, r, c); 4213983Sedward 4314972Sedward for (; c < w->ww_i.r; c++) { 4414829Sedward if (c + 1 >= wwncol) { 4514829Sedward a3 = 1; 4614829Sedward b3 = 1; 4714829Sedward } else { 4814829Sedward a3 = w->ww_index == *smap++; 4914829Sedward b3 = frameok(w, r, c + 1); 5014829Sedward } 5114591Sedward if (b2) { 5214591Sedward code = 0; 5314591Sedward if ((a1 || a2) && b1) 5414591Sedward code |= WWF_L; 5514591Sedward if ((a2 || a3) && b3) 5614591Sedward code |= WWF_R; 5714591Sedward if (code) 5814772Sedward wwframec(wframe, r, c, code|WWF_TOP); 5914591Sedward } 6014591Sedward a1 = a2; 6114591Sedward a2 = a3; 6214591Sedward b1 = b2; 6314591Sedward b2 = b3; 6414591Sedward } 6514591Sedward if ((a1 || a2) && b1 && b2) 6614772Sedward wwframec(wframe, r, c, WWF_L|WWF_TOP); 6713983Sedward } 6813983Sedward 6914591Sedward if (w->ww_w.b < wwnrow) { 7014591Sedward r = w->ww_w.b; 7114972Sedward c = w->ww_i.l - 1; 7214591Sedward smap = &wwsmap[r - 1][c + 1]; 7314591Sedward a1 = 0; 7414591Sedward a2 = 0; 7514591Sedward b1 = 0; 7614756Sedward b2 = c < 0 || frameok(w, r, c); 7713983Sedward 7814972Sedward for (; c < w->ww_i.r; c++) { 7914829Sedward if (c + 1 >= wwncol) { 8014829Sedward a3 = 1; 8114829Sedward b3 = 1; 8214829Sedward } else { 8314829Sedward a3 = w->ww_index == *smap++; 8414829Sedward b3 = frameok(w, r, c + 1); 8514829Sedward } 8614591Sedward if (b2) { 8714591Sedward code = 0; 8814591Sedward if ((a1 || a2) && b1) 8914591Sedward code |= WWF_L; 9014591Sedward if ((a2 || a3) && b3) 9114591Sedward code |= WWF_R; 9214591Sedward if (code) 9314772Sedward wwframec(wframe, r, c, code); 9414591Sedward } 9514591Sedward a1 = a2; 9614591Sedward a2 = a3; 9714591Sedward b1 = b2; 9814591Sedward b2 = b3; 9914591Sedward } 10014591Sedward if ((a1 || a2) && b1 && b2) 10114772Sedward wwframec(wframe, r, c, WWF_L); 10213983Sedward } 10313983Sedward 10414591Sedward if (w->ww_w.l > 0) { 10514972Sedward r = w->ww_i.t - 1; 10614591Sedward c = w->ww_w.l - 1; 10714591Sedward a1 = 0; 10814591Sedward a2 = 0; 10914591Sedward b1 = 0; 11014756Sedward b2 = r < 0 || frameok(w, r, c); 11114591Sedward 11214972Sedward for (; r < w->ww_i.b; r++) { 11314829Sedward if (r + 1 >= wwnrow) { 11414829Sedward a3 = 1; 11514829Sedward b3 = 1; 11614829Sedward } else { 11714829Sedward a3 = w->ww_index == wwsmap[r + 1][c + 1]; 11814829Sedward b3 = frameok(w, r + 1, c); 11914829Sedward } 12014591Sedward if (b2) { 12114591Sedward code = 0; 12214591Sedward if ((a1 || a2) && b1) 12314591Sedward code |= WWF_U; 12414591Sedward if ((a2 || a3) && b3) 12514591Sedward code |= WWF_D; 12614591Sedward if (code) 12714772Sedward wwframec(wframe, r, c, code); 12814591Sedward } 12914591Sedward a1 = a2; 13014591Sedward a2 = a3; 13114591Sedward b1 = b2; 13214591Sedward b2 = b3; 13314591Sedward } 13414591Sedward if ((a1 || a2) && b1 && b2) 13514772Sedward wwframec(wframe, r, c, WWF_U); 13613983Sedward } 13713983Sedward 13814591Sedward if (w->ww_w.r < wwncol) { 13914972Sedward r = w->ww_i.t - 1; 14014591Sedward c = w->ww_w.r; 14114591Sedward a1 = 0; 14214591Sedward a2 = 0; 14314591Sedward b1 = 0; 14414756Sedward b2 = r < 0 || frameok(w, r, c); 14514415Sedward 14614972Sedward for (; r < w->ww_i.b; r++) { 14714829Sedward if (r + 1 >= wwnrow) { 14814829Sedward a3 = 1; 14914829Sedward b3 = 1; 15014829Sedward } else { 15114829Sedward a3 = w->ww_index == wwsmap[r + 1][c - 1]; 15214829Sedward b3 = frameok(w, r + 1, c); 15314829Sedward } 15414591Sedward if (b2) { 15514591Sedward code = 0; 15614591Sedward if ((a1 || a2) && b1) 15714591Sedward code |= WWF_U; 15814591Sedward if ((a2 || a3) && b3) 15914591Sedward code |= WWF_D; 16014591Sedward if (code) 16114772Sedward wwframec(wframe, r, c, code); 16214591Sedward } 16314591Sedward a1 = a2; 16414591Sedward a2 = a3; 16514591Sedward b1 = b2; 16614591Sedward b2 = b3; 16714591Sedward } 16814591Sedward if ((a1 || a2) && b1 && b2) 16914772Sedward wwframec(wframe, r, c, WWF_U); 17014415Sedward } 17113983Sedward } 17213983Sedward 17314987Sedward wwframec(f, r, c, code) 17414415Sedward register struct ww *f; 17514987Sedward register r, c; 17614756Sedward char code; 17713983Sedward { 17814756Sedward char oldcode; 17915587Sedward register char *smap; 18013983Sedward 18114987Sedward if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r) 18214415Sedward return; 18315587Sedward 18415587Sedward smap = &wwsmap[r][c]; 18515587Sedward 18614591Sedward { 18714591Sedward register struct ww *w; 18814756Sedward 18915587Sedward w = wwindex[*smap]; 19014591Sedward if (w->ww_order > f->ww_order) { 19115587Sedward if (w != &wwnobody && w->ww_win[r][c] == 0) 19215587Sedward w->ww_nvis[r]--; 19315587Sedward *smap = f->ww_index; 19414415Sedward } 19513983Sedward } 19614772Sedward 19714772Sedward if (f->ww_fmap != 0) { 19814591Sedward register char *fmap; 19914756Sedward 20014772Sedward fmap = &f->ww_fmap[r][c]; 20114756Sedward oldcode = *fmap; 20214591Sedward *fmap |= code; 20314591Sedward if (code & WWF_TOP) 20414591Sedward *fmap &= ~WWF_LABEL; 20514756Sedward code = *fmap; 20614756Sedward } else 20714756Sedward oldcode = 0; 20814756Sedward { 20914987Sedward register char *win = &f->ww_win[r][c]; 21014756Sedward 21115587Sedward if (*win == WWM_GLS && *smap == f->ww_index) 21214987Sedward f->ww_nvis[r]++; 21314987Sedward *win &= ~WWM_GLS; 21414987Sedward } 21514987Sedward if (oldcode != code && (code & WWF_LABEL) == 0) { 21614987Sedward register short frame; 21714756Sedward 21815733Sedward frame = tt.tt_frame[code & WWF_MASK]; 21914987Sedward f->ww_buf[r][c].c_w = frame; 22014987Sedward if (wwsmap[r][c] == f->ww_index) { 22115654Sedward wwtouched[r] |= WWU_TOUCHED; 22214987Sedward wwns[r][c].c_w = frame; 22314756Sedward } 22414591Sedward } 22513983Sedward } 226