113983Sedward #ifndef lint 2*18735Sedward static char sccsid[] = "@(#)wwframe.c 3.16 04/24/85"; 313983Sedward #endif 413983Sedward 5*18735Sedward /* 6*18735Sedward * Copyright (c) 1983 Regents of the University of California, 7*18735Sedward * All rights reserved. Redistribution permitted subject to 8*18735Sedward * the terms of the Berkeley Software License Agreement. 9*18735Sedward */ 10*18735Sedward 1113983Sedward #include "ww.h" 1214649Sedward #include "tt.h" 1313983Sedward 1414756Sedward #define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \ 1517406Sedward w1->ww_fmap || w1->ww_order > (w)->ww_order) 1614756Sedward 1714415Sedward wwframe(w, wframe) 1814591Sedward register struct ww *w; 1914591Sedward struct ww *wframe; 2013983Sedward { 2114591Sedward register r, c; 2214591Sedward char a1, a2, a3; 2314591Sedward char b1, b2, b3; 2414591Sedward register char *smap; 2514591Sedward register code; 2614756Sedward register struct ww *w1; 2713983Sedward 2814591Sedward if (w->ww_w.t > 0) { 2914591Sedward r = w->ww_w.t - 1; 3014972Sedward c = w->ww_i.l - 1; 3114591Sedward smap = &wwsmap[r + 1][c + 1]; 3214591Sedward a1 = 0; 3314591Sedward a2 = 0; 3414591Sedward b1 = 0; 3514756Sedward b2 = c < 0 || frameok(w, r, c); 3613983Sedward 3714972Sedward for (; c < w->ww_i.r; c++) { 3814829Sedward if (c + 1 >= wwncol) { 3914829Sedward a3 = 1; 4014829Sedward b3 = 1; 4114829Sedward } else { 4214829Sedward a3 = w->ww_index == *smap++; 4314829Sedward b3 = frameok(w, r, c + 1); 4414829Sedward } 4514591Sedward if (b2) { 4614591Sedward code = 0; 4714591Sedward if ((a1 || a2) && b1) 4814591Sedward code |= WWF_L; 4914591Sedward if ((a2 || a3) && b3) 5014591Sedward code |= WWF_R; 5114591Sedward if (code) 5214772Sedward wwframec(wframe, r, c, code|WWF_TOP); 5314591Sedward } 5414591Sedward a1 = a2; 5514591Sedward a2 = a3; 5614591Sedward b1 = b2; 5714591Sedward b2 = b3; 5814591Sedward } 5914591Sedward if ((a1 || a2) && b1 && b2) 6014772Sedward wwframec(wframe, r, c, WWF_L|WWF_TOP); 6113983Sedward } 6213983Sedward 6314591Sedward if (w->ww_w.b < wwnrow) { 6414591Sedward r = w->ww_w.b; 6514972Sedward c = w->ww_i.l - 1; 6614591Sedward smap = &wwsmap[r - 1][c + 1]; 6714591Sedward a1 = 0; 6814591Sedward a2 = 0; 6914591Sedward b1 = 0; 7014756Sedward b2 = c < 0 || frameok(w, r, c); 7113983Sedward 7214972Sedward for (; c < w->ww_i.r; c++) { 7314829Sedward if (c + 1 >= wwncol) { 7414829Sedward a3 = 1; 7514829Sedward b3 = 1; 7614829Sedward } else { 7714829Sedward a3 = w->ww_index == *smap++; 7814829Sedward b3 = frameok(w, r, c + 1); 7914829Sedward } 8014591Sedward if (b2) { 8114591Sedward code = 0; 8214591Sedward if ((a1 || a2) && b1) 8314591Sedward code |= WWF_L; 8414591Sedward if ((a2 || a3) && b3) 8514591Sedward code |= WWF_R; 8614591Sedward if (code) 8714772Sedward wwframec(wframe, r, c, code); 8814591Sedward } 8914591Sedward a1 = a2; 9014591Sedward a2 = a3; 9114591Sedward b1 = b2; 9214591Sedward b2 = b3; 9314591Sedward } 9414591Sedward if ((a1 || a2) && b1 && b2) 9514772Sedward wwframec(wframe, r, c, WWF_L); 9613983Sedward } 9713983Sedward 9814591Sedward if (w->ww_w.l > 0) { 9914972Sedward r = w->ww_i.t - 1; 10014591Sedward c = w->ww_w.l - 1; 10114591Sedward a1 = 0; 10214591Sedward a2 = 0; 10314591Sedward b1 = 0; 10414756Sedward b2 = r < 0 || frameok(w, r, c); 10514591Sedward 10614972Sedward for (; r < w->ww_i.b; r++) { 10714829Sedward if (r + 1 >= wwnrow) { 10814829Sedward a3 = 1; 10914829Sedward b3 = 1; 11014829Sedward } else { 11114829Sedward a3 = w->ww_index == wwsmap[r + 1][c + 1]; 11214829Sedward b3 = frameok(w, r + 1, c); 11314829Sedward } 11414591Sedward if (b2) { 11514591Sedward code = 0; 11614591Sedward if ((a1 || a2) && b1) 11714591Sedward code |= WWF_U; 11814591Sedward if ((a2 || a3) && b3) 11914591Sedward code |= WWF_D; 12014591Sedward if (code) 12114772Sedward wwframec(wframe, r, c, code); 12214591Sedward } 12314591Sedward a1 = a2; 12414591Sedward a2 = a3; 12514591Sedward b1 = b2; 12614591Sedward b2 = b3; 12714591Sedward } 12814591Sedward if ((a1 || a2) && b1 && b2) 12914772Sedward wwframec(wframe, r, c, WWF_U); 13013983Sedward } 13113983Sedward 13214591Sedward if (w->ww_w.r < wwncol) { 13314972Sedward r = w->ww_i.t - 1; 13414591Sedward c = w->ww_w.r; 13514591Sedward a1 = 0; 13614591Sedward a2 = 0; 13714591Sedward b1 = 0; 13814756Sedward b2 = r < 0 || frameok(w, r, c); 13914415Sedward 14014972Sedward for (; r < w->ww_i.b; r++) { 14114829Sedward if (r + 1 >= wwnrow) { 14214829Sedward a3 = 1; 14314829Sedward b3 = 1; 14414829Sedward } else { 14514829Sedward a3 = w->ww_index == wwsmap[r + 1][c - 1]; 14614829Sedward b3 = frameok(w, r + 1, c); 14714829Sedward } 14814591Sedward if (b2) { 14914591Sedward code = 0; 15014591Sedward if ((a1 || a2) && b1) 15114591Sedward code |= WWF_U; 15214591Sedward if ((a2 || a3) && b3) 15314591Sedward code |= WWF_D; 15414591Sedward if (code) 15514772Sedward wwframec(wframe, r, c, code); 15614591Sedward } 15714591Sedward a1 = a2; 15814591Sedward a2 = a3; 15914591Sedward b1 = b2; 16014591Sedward b2 = b3; 16114591Sedward } 16214591Sedward if ((a1 || a2) && b1 && b2) 16314772Sedward wwframec(wframe, r, c, WWF_U); 16414415Sedward } 16513983Sedward } 16613983Sedward 16714987Sedward wwframec(f, r, c, code) 16814415Sedward register struct ww *f; 16914987Sedward register r, c; 17014756Sedward char code; 17113983Sedward { 17214756Sedward char oldcode; 17315587Sedward register char *smap; 17413983Sedward 17514987Sedward if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r) 17614415Sedward return; 17715587Sedward 17815587Sedward smap = &wwsmap[r][c]; 17915587Sedward 18014591Sedward { 18114591Sedward register struct ww *w; 18214756Sedward 18315587Sedward w = wwindex[*smap]; 18414591Sedward if (w->ww_order > f->ww_order) { 18515587Sedward if (w != &wwnobody && w->ww_win[r][c] == 0) 18615587Sedward w->ww_nvis[r]--; 18715587Sedward *smap = f->ww_index; 18814415Sedward } 18913983Sedward } 19014772Sedward 19114772Sedward if (f->ww_fmap != 0) { 19214591Sedward register char *fmap; 19314756Sedward 19414772Sedward fmap = &f->ww_fmap[r][c]; 19514756Sedward oldcode = *fmap; 19614591Sedward *fmap |= code; 19714591Sedward if (code & WWF_TOP) 19814591Sedward *fmap &= ~WWF_LABEL; 19914756Sedward code = *fmap; 20014756Sedward } else 20114756Sedward oldcode = 0; 20214756Sedward { 20314987Sedward register char *win = &f->ww_win[r][c]; 20414756Sedward 20515587Sedward if (*win == WWM_GLS && *smap == f->ww_index) 20614987Sedward f->ww_nvis[r]++; 20714987Sedward *win &= ~WWM_GLS; 20814987Sedward } 20914987Sedward if (oldcode != code && (code & WWF_LABEL) == 0) { 21014987Sedward register short frame; 21114756Sedward 21215733Sedward frame = tt.tt_frame[code & WWF_MASK]; 21314987Sedward f->ww_buf[r][c].c_w = frame; 21414987Sedward if (wwsmap[r][c] == f->ww_index) { 21515654Sedward wwtouched[r] |= WWU_TOUCHED; 21614987Sedward wwns[r][c].c_w = frame; 21714756Sedward } 21814591Sedward } 21913983Sedward } 220