New cover scheme
[unix-history] / usr / src / usr.bin / window / wwframe.c
index f3e030c..5190cce 100644 (file)
@@ -1,10 +1,13 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwframe.c   3.4 83/08/16";
+static char *sccsid = "@(#)wwframe.c   3.11 83/11/23";
 #endif
 
 #include "ww.h"
 #include "tt.h"
 
 #endif
 
 #include "ww.h"
 #include "tt.h"
 
+#define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \
+       !w1->ww_hasframe || w1->ww_order > (w)->ww_order)
+
 wwframe(w, wframe)
 register struct ww *w;
 struct ww *wframe;
 wwframe(w, wframe)
 register struct ww *w;
 struct ww *wframe;
@@ -14,19 +17,25 @@ struct ww *wframe;
        char b1, b2, b3;
        register char *smap;
        register code;
        char b1, b2, b3;
        register char *smap;
        register code;
+       register struct ww *w1;
 
        if (w->ww_w.t > 0) {
                r = w->ww_w.t - 1;
 
        if (w->ww_w.t > 0) {
                r = w->ww_w.t - 1;
-               c = w->ww_w.l - 1;
+               c = w->ww_i.l - 1;
                smap = &wwsmap[r + 1][c + 1];
                a1 = 0;
                a2 = 0;
                b1 = 0;
                smap = &wwsmap[r + 1][c + 1];
                a1 = 0;
                a2 = 0;
                b1 = 0;
-               b2 = wwframeok(w, r, c);
-
-               for (; c < w->ww_w.r; c++) {
-                       a3 = w->ww_index == *smap++;
-                       b3 = wwframeok(w, r, c + 1);
+               b2 = c < 0 || frameok(w, r, c);
+
+               for (; c < w->ww_i.r; c++) {
+                       if (c + 1 >= wwncol) {
+                               a3 = 1;
+                               b3 = 1;
+                       } else {
+                               a3 = w->ww_index == *smap++;
+                               b3 = frameok(w, r, c + 1);
+                       }
                        if (b2) {
                                code = 0;
                                if ((a1 || a2) && b1)
                        if (b2) {
                                code = 0;
                                if ((a1 || a2) && b1)
@@ -34,7 +43,7 @@ struct ww *wframe;
                                if ((a2 || a3) && b3)
                                        code |= WWF_R;
                                if (code)
                                if ((a2 || a3) && b3)
                                        code |= WWF_R;
                                if (code)
-                                       wwframec(r, c, wframe, code|WWF_TOP);
+                                       wwframec(wframe, r, c, code|WWF_TOP);
                        }
                        a1 = a2;
                        a2 = a3;
                        }
                        a1 = a2;
                        a2 = a3;
@@ -42,21 +51,26 @@ struct ww *wframe;
                        b2 = b3;
                }
                if ((a1 || a2) && b1 && b2)
                        b2 = b3;
                }
                if ((a1 || a2) && b1 && b2)
-                       wwframec(r, c, wframe, WWF_L|WWF_TOP);
+                       wwframec(wframe, r, c, WWF_L|WWF_TOP);
        }
 
        if (w->ww_w.b < wwnrow) {
                r = w->ww_w.b;
        }
 
        if (w->ww_w.b < wwnrow) {
                r = w->ww_w.b;
-               c = w->ww_w.l - 1;
+               c = w->ww_i.l - 1;
                smap = &wwsmap[r - 1][c + 1];
                a1 = 0;
                a2 = 0;
                b1 = 0;
                smap = &wwsmap[r - 1][c + 1];
                a1 = 0;
                a2 = 0;
                b1 = 0;
-               b2 = wwframeok(w, r, c);
-
-               for (; c < w->ww_w.r; c++) {
-                       a3 = w->ww_index == *smap++;
-                       b3 = wwframeok(w, r, c + 1);
+               b2 = c < 0 || frameok(w, r, c);
+
+               for (; c < w->ww_i.r; c++) {
+                       if (c + 1 >= wwncol) {
+                               a3 = 1;
+                               b3 = 1;
+                       } else {
+                               a3 = w->ww_index == *smap++;
+                               b3 = frameok(w, r, c + 1);
+                       }
                        if (b2) {
                                code = 0;
                                if ((a1 || a2) && b1)
                        if (b2) {
                                code = 0;
                                if ((a1 || a2) && b1)
@@ -64,7 +78,7 @@ struct ww *wframe;
                                if ((a2 || a3) && b3)
                                        code |= WWF_R;
                                if (code)
                                if ((a2 || a3) && b3)
                                        code |= WWF_R;
                                if (code)
-                                       wwframec(r, c, wframe, code);
+                                       wwframec(wframe, r, c, code);
                        }
                        a1 = a2;
                        a2 = a3;
                        }
                        a1 = a2;
                        a2 = a3;
@@ -72,20 +86,25 @@ struct ww *wframe;
                        b2 = b3;
                }
                if ((a1 || a2) && b1 && b2)
                        b2 = b3;
                }
                if ((a1 || a2) && b1 && b2)
-                       wwframec(r, c, wframe, WWF_L);
+                       wwframec(wframe, r, c, WWF_L);
        }
 
        if (w->ww_w.l > 0) {
        }
 
        if (w->ww_w.l > 0) {
-               r = w->ww_w.t - 1;
+               r = w->ww_i.t - 1;
                c = w->ww_w.l - 1;
                a1 = 0;
                a2 = 0;
                b1 = 0;
                c = w->ww_w.l - 1;
                a1 = 0;
                a2 = 0;
                b1 = 0;
-               b2 = wwframeok(w, r, c);
-
-               for (; r < w->ww_w.b; r++) {
-                       a3 = w->ww_index == wwsmap[r + 1][c + 1];
-                       b3 = wwframeok(w, r + 1, c);
+               b2 = r < 0 || frameok(w, r, c);
+
+               for (; r < w->ww_i.b; r++) {
+                       if (r + 1 >= wwnrow) {
+                               a3 = 1;
+                               b3 = 1;
+                       } else {
+                               a3 = w->ww_index == wwsmap[r + 1][c + 1];
+                               b3 = frameok(w, r + 1, c);
+                       }
                        if (b2) {
                                code = 0;
                                if ((a1 || a2) && b1)
                        if (b2) {
                                code = 0;
                                if ((a1 || a2) && b1)
@@ -93,7 +112,7 @@ struct ww *wframe;
                                if ((a2 || a3) && b3)
                                        code |= WWF_D;
                                if (code)
                                if ((a2 || a3) && b3)
                                        code |= WWF_D;
                                if (code)
-                                       wwframec(r, c, wframe, code);
+                                       wwframec(wframe, r, c, code);
                        }
                        a1 = a2;
                        a2 = a3;
                        }
                        a1 = a2;
                        a2 = a3;
@@ -101,20 +120,25 @@ struct ww *wframe;
                        b2 = b3;
                }
                if ((a1 || a2) && b1 && b2)
                        b2 = b3;
                }
                if ((a1 || a2) && b1 && b2)
-                       wwframec(r, c, wframe, WWF_U);
+                       wwframec(wframe, r, c, WWF_U);
        }
 
        if (w->ww_w.r < wwncol) {
        }
 
        if (w->ww_w.r < wwncol) {
-               r = w->ww_w.t - 1;
+               r = w->ww_i.t - 1;
                c = w->ww_w.r;
                a1 = 0;
                a2 = 0;
                b1 = 0;
                c = w->ww_w.r;
                a1 = 0;
                a2 = 0;
                b1 = 0;
-               b2 = wwframeok(w, r, c);
-
-               for (; r < w->ww_w.b; r++) {
-                       a3 = w->ww_index == wwsmap[r + 1][c - 1];
-                       b3 = wwframeok(w, r + 1, c);
+               b2 = r < 0 || frameok(w, r, c);
+
+               for (; r < w->ww_i.b; r++) {
+                       if (r + 1 >= wwnrow) {
+                               a3 = 1;
+                               b3 = 1;
+                       } else {
+                               a3 = w->ww_index == wwsmap[r + 1][c - 1];
+                               b3 = frameok(w, r + 1, c);
+                       }
                        if (b2) {
                                code = 0;
                                if ((a1 || a2) && b1)
                        if (b2) {
                                code = 0;
                                if ((a1 || a2) && b1)
@@ -122,7 +146,7 @@ struct ww *wframe;
                                if ((a2 || a3) && b3)
                                        code |= WWF_D;
                                if (code)
                                if ((a2 || a3) && b3)
                                        code |= WWF_D;
                                if (code)
-                                       wwframec(r, c, wframe, code);
+                                       wwframec(wframe, r, c, code);
                        }
                        a1 = a2;
                        a2 = a3;
                        }
                        a1 = a2;
                        a2 = a3;
@@ -130,78 +154,60 @@ struct ww *wframe;
                        b2 = b3;
                }
                if ((a1 || a2) && b1 && b2)
                        b2 = b3;
                }
                if ((a1 || a2) && b1 && b2)
-                       wwframec(r, c, wframe, WWF_U);
+                       wwframec(wframe, r, c, WWF_U);
        }
 }
 
        }
 }
 
-wwframeok(w, r, c)
-struct ww *w;
+wwframec(f, r, c, code)
+register struct ww *f;
 register r, c;
 register r, c;
+char code;
 {
 {
-       register struct ww *w1;
+       char oldcode;
+       register char *smap;
 
 
-       if (r < 0 || r >= wwnrow || c < 0 || c >= wwncol)
-               return 1;
-       w1 = wwindex[wwsmap[r][c]];
-       return !w1->ww_hasframe || w1->ww_order > w->ww_order;
-}
+       if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r)
+               return;
 
 
-wwframec(rr, cc, f, code)
-register struct ww *f;
-register rr, cc;
-int code;
-{
-       register r, c;
+       smap = &wwsmap[r][c];
 
 
-       if (rr < 0 || rr >= wwnrow || cc < 0 || cc >= wwncol)
-               return;
        {
                register struct ww *w;
        {
                register struct ww *w;
-               w = wwindex[wwsmap[rr][cc]];
+
+               w = wwindex[*smap];
                if (w->ww_order > f->ww_order) {
                if (w->ww_order > f->ww_order) {
-                       if (w != &wwnobody) {
-                               r = rr - w->ww_w.t;
-                               c = cc - w->ww_w.l;
-                               if ((w->ww_win[r][c] |= WWM_COV) == WWM_COV)
-                                       w->ww_nvis[r]--;
-                               w->ww_cov[r][c] = f->ww_index;
-                       }
-                       wwsmap[rr][cc] = f->ww_index;
+                       if (w != &wwnobody && w->ww_win[r][c] == 0)
+                               w->ww_nvis[r]--;
+                       *smap = f->ww_index;
                }
        }
                }
        }
-       {
+
+       if (f->ww_fmap != 0) {
                register char *fmap;
                register char *fmap;
-               fmap = &wwfmap[rr][cc];
+
+               fmap = &f->ww_fmap[r][c];
+               oldcode = *fmap;
                *fmap |= code;
                if (code & WWF_TOP)
                        *fmap &= ~WWF_LABEL;
                *fmap |= code;
                if (code & WWF_TOP)
                        *fmap &= ~WWF_LABEL;
-               code = *(unsigned char *)fmap;
+               code = *fmap;
+       } else
+               oldcode = 0;
+       {
+               register char *win = &f->ww_win[r][c];
+
+               if (*win == WWM_GLS && *smap == f->ww_index)
+                       f->ww_nvis[r]++;
+               *win &= ~WWM_GLS;
        }
        }
-       r = rr - f->ww_w.t;
-       c = cc - f->ww_w.l;
-       if (f->ww_win[r][c] == WWM_GLS)
-               f->ww_nvis[r]++;
-       f->ww_win[r][c] &= ~WWM_GLS;
-       if ((code & WWF_LABEL) == 0) {
-               register tmp;
-
-               tmp = tt.tt_frame[code & WWF_MASK] & WWC_CMASK;
-               f->ww_buf[f->ww_scroll + r][c].c_w = tmp;
-               if (wwsmap[rr][cc] == f->ww_index) {
-                       wwtouched[rr] = 1;
-                       wwns[rr][cc].c_w = tmp;
+       if (oldcode != code && (code & WWF_LABEL) == 0) {
+               register short frame;
+
+               frame = tt.tt_frame[code & WWF_MASK] & WWC_CMASK;
+               f->ww_buf[r][c].c_w = frame;
+               if (wwsmap[r][c] == f->ww_index) {
+                       wwtouched[r] = 1;
+                       wwns[r][c].c_w = frame;
                }
        }
 }
                }
        }
 }
-
-/*
-wwckns()
-{
-       register i, j;
-
-       for (i = 0; i < wwnrow; i++)
-               for (j = 0; j < wwncol; j++)
-                       if ((wwns[i][j].c_c & 0x7f) < ' ')
-                               abort();
-}
-*/