copyright messages
[unix-history] / usr / src / usr.bin / window / wwadd.c
index ad012d9..2b33397 100644 (file)
@@ -1,58 +1,60 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwadd.c     3.3 83/08/16";
+static char sccsid[] = "@(#)wwadd.c    3.9 %G%";
 #endif
 
 #endif
 
+/*
+ * Copyright (c) 1983 Regents of the University of California,
+ * All rights reserved.  Redistribution permitted subject to
+ * the terms of the Berkeley Software License Agreement.
+ */
+
 #include "ww.h"
 
 /*
 #include "ww.h"
 
 /*
- * Stick w1 behind w2
- * W1 should have an empty ww_cov map.
+ * Stick w1 behind w2.
  */
 wwadd(w1, w2)
  */
 wwadd(w1, w2)
-register struct ww *w1, *w2;
+register struct ww *w1;
+struct ww *w2;
 {
 {
-       if (w1->ww_forw != 0 || w1->ww_back != 0)
-               abort();
+       register i;
+       register struct ww *w;
+
        w1->ww_order = w2->ww_order + 1;
        w1->ww_back = w2;
        w1->ww_forw = w2->ww_forw;
        w2->ww_forw->ww_back = w1;
        w2->ww_forw = w1;
        w1->ww_order = w2->ww_order + 1;
        w1->ww_back = w2;
        w1->ww_forw = w2->ww_forw;
        w2->ww_forw->ww_back = w1;
        w2->ww_forw = w1;
-       {
-               register struct ww *wp;
-
-               for (wp = w2; wp != &wwhead; wp = wp->ww_back)
-                       wwcover(wp, w1);
-               for (wp = w1->ww_forw; wp != &wwhead; wp = wp->ww_forw) {
-                       wp->ww_order++;
-                       wwcover(w1, wp);
-               }
-       }
-       {
-               int i = w1->ww_w.t;
-               char *touched = &wwtouched[i];
 
 
-               for (; i < w1->ww_w.b; i++, touched++) {
-                       int j = w1->ww_w.nc;
-                       register char *win = w1->ww_win[i - w1->ww_w.t];
-                       register char *smap = &wwsmap[i][w1->ww_w.l];
-                       register union ww_char *ns = &wwns[i][w1->ww_w.l];
-                       register union ww_char *buf = w1->ww_buf[w1->ww_scroll
-                                                       + i - w1->ww_w.t];
+       for (w = w1->ww_forw; w != &wwhead; w = w->ww_forw)
+               w->ww_order++;
+       for (i = w1->ww_i.t; i < w1->ww_i.b; i++) {
+               register j;
+               register char *smap = wwsmap[i];
+               register char *win = w1->ww_win[i];
+               union ww_char *ns = wwns[i];
+               union ww_char *buf = w1->ww_buf[i];
+               int nvis = 0;
+               int nchanged = 0;
 
 
-                       while (--j >= 0) {
-                               if ((*win & (WWM_GLS|WWM_COV)) == 0) {
-                                       *touched = 1;
-                                       *smap++ = w1->ww_index;
-                                       ns++->c_w = buf++->c_w
-                                               ^ *win++ << WWC_MSHIFT;
-                               } else {
-                                       smap++;
-                                       ns++;
-                                       win++;
-                                       buf++;
-                               }
-                       }
+               for (j = w1->ww_i.l; j < w1->ww_i.r; j++) {
+                       w = wwindex[smap[j]];
+                       if (w1->ww_order > w->ww_order)
+                               continue;
+                       if (win[j] & WWM_GLS)
+                               continue;
+                       if (w != &wwnobody && w->ww_win[i][j] == 0)
+                               w->ww_nvis[i]--;
+                       smap[j] = w1->ww_index;
+                       if (win[j] == 0)
+                               nvis++;
+                       ns[j].c_w = buf[j].c_w ^ win[j] << WWC_MSHIFT;
+                       nchanged++;
                }
                }
+               if (nchanged > 4)
+                       wwtouched[i] |= WWU_MAJOR|WWU_TOUCHED;
+               else if (nchanged > 0)
+                       wwtouched[i] |= WWU_TOUCHED;
+               w1->ww_nvis[i] = nvis;
        }
 }
        }
 }