Off screen windows!!!!!!
authorEdward Wang <edward@ucbvax.Berkeley.EDU>
Thu, 15 Sep 1983 05:17:22 +0000 (21:17 -0800)
committerEdward Wang <edward@ucbvax.Berkeley.EDU>
Thu, 15 Sep 1983 05:17:22 +0000 (21:17 -0800)
SCCS-vsn: usr.bin/window/wwopen.c 3.11
SCCS-vsn: usr.bin/window/ww.h 3.13
SCCS-vsn: usr.bin/window/cmd1.c 3.11
SCCS-vsn: usr.bin/window/wwwrite.c 3.10
SCCS-vsn: usr.bin/window/wwframe.c 3.9
SCCS-vsn: usr.bin/window/cmd5.c 3.5
SCCS-vsn: usr.bin/window/:ww 1.3
SCCS-vsn: usr.bin/window/wwadd.c 3.4
SCCS-vsn: usr.bin/window/wwdelete.c 3.4
SCCS-vsn: usr.bin/window/wwinsline.c 3.4
SCCS-vsn: usr.bin/window/wwdelline.c 3.4
SCCS-vsn: usr.bin/window/wwclreol.c 3.8
SCCS-vsn: usr.bin/window/wwflush.c 3.4
SCCS-vsn: usr.bin/window/wwinschar.c 3.7
SCCS-vsn: usr.bin/window/wwdelchar.c 3.5
SCCS-vsn: usr.bin/window/wwscroll.c 3.9
SCCS-vsn: usr.bin/window/wwredrawwin.c 3.4
SCCS-vsn: usr.bin/window/wwcursor.c 3.2

18 files changed:
usr/src/usr.bin/window/:ww
usr/src/usr.bin/window/cmd1.c
usr/src/usr.bin/window/cmd5.c
usr/src/usr.bin/window/ww.h
usr/src/usr.bin/window/wwadd.c
usr/src/usr.bin/window/wwclreol.c
usr/src/usr.bin/window/wwcursor.c
usr/src/usr.bin/window/wwdelchar.c
usr/src/usr.bin/window/wwdelete.c
usr/src/usr.bin/window/wwdelline.c
usr/src/usr.bin/window/wwflush.c
usr/src/usr.bin/window/wwframe.c
usr/src/usr.bin/window/wwinschar.c
usr/src/usr.bin/window/wwinsline.c
usr/src/usr.bin/window/wwopen.c
usr/src/usr.bin/window/wwredrawwin.c
usr/src/usr.bin/window/wwscroll.c
usr/src/usr.bin/window/wwwrite.c

index 3b61ee9..64a726d 100644 (file)
@@ -2,6 +2,8 @@
 +/"xxx"8t"index"8t"order"nbbb++
 +/"w.nr"16t"w.nc"nDDn
 +/"w.t"16t"w.b"16t"w.l"16t"w.r"nDDDD
 +/"xxx"8t"index"8t"order"nbbb++
 +/"w.nr"16t"w.nc"nDDn
 +/"w.t"16t"w.b"16t"w.l"16t"w.r"nDDDD
++/"i.nr"16t"i.nc"nDDn
++/"i.t"16t"i.b"16t"i.l"16t"i.r"nDDDD
 +/"nline"16t"scroll"16t"cur.r"16t"cur.c"nDDDD
 +/"win"16t"buf"16t"cov"16t"fmap"16tnpppp
 +/"nvis"np
 +/"nline"16t"scroll"16t"cur.r"16t"cur.c"nDDDD
 +/"win"16t"buf"16t"cov"16t"fmap"16tnpppp
 +/"nvis"np
index cdc9f28..b4ae41a 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)cmd1.c      3.10 83/08/31";
+static char *sccsid = "@(#)cmd1.c      3.11 83/09/14";
 #endif
 
 #include "defs.h"
 #endif
 
 #include "defs.h"
@@ -149,8 +149,9 @@ int id, nrow, ncol, row, col;
 
        if (id < 0 && (id = findid()) < 0)
                return 0;
 
        if (id < 0 && (id = findid()) < 0)
                return 0;
-       if (row <= 0) {
-               error("Bad row number.");
+       if (row + nrow <= 0 || row > wwnrow - 1
+           || col + ncol <= 0 || col > wwncol - 1) {
+               error("Illegal window size or position.");
                return 0;
        }
        if ((w = wwopen(WWO_PTY, nrow, ncol, row, col, nline)) == 0) {
                return 0;
        }
        if ((w = wwopen(WWO_PTY, nrow, ncol, row, col, nline)) == 0) {
index 6d27abd..022cb69 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)cmd5.c      3.4 83/09/01";
+static char *sccsid = "@(#)cmd5.c      3.5 83/09/14";
 #endif
 
 #include "defs.h"
 #endif
 
 #include "defs.h"
@@ -11,6 +11,9 @@ c_move(w)
 register struct ww *w;
 {
        int col, row;
 register struct ww *w;
 {
        int col, row;
+       int mincol, minrow;
+       int maxcol, maxrow;
+       int curcol, currow;
        struct ww *back = w->ww_back;
 
        col = w->ww_w.l;
        struct ww *back = w->ww_back;
 
        col = w->ww_w.l;
@@ -18,12 +21,15 @@ register struct ww *w;
        wwadd(boxwin, framewin->ww_back);
        for (;;) {
                wwbox(boxwin, row - 1, col - 1, w->ww_w.nr + 2, w->ww_w.nc + 2);
        wwadd(boxwin, framewin->ww_back);
        for (;;) {
                wwbox(boxwin, row - 1, col - 1, w->ww_w.nr + 2, w->ww_w.nc + 2);
-               wwsetcursor(row, col);
+               getminmax(row, w->ww_w.nr, 1, wwnrow,
+                       &currow, &minrow, &maxrow);
+               getminmax(col, w->ww_w.nc, 0, wwncol,
+                       &curcol, &mincol, &maxcol);
+               wwsetcursor(currow, curcol);
                while (bpeekc() < 0)
                        bread();
                wwunbox(boxwin);
                while (bpeekc() < 0)
                        bread();
                wwunbox(boxwin);
-               switch (getpos(&row, &col, 1, 0,
-                       wwnrow - w->ww_w.nr, wwncol - w->ww_w.nc)) {
+               switch (getpos(&row, &col, minrow, mincol, maxrow, maxcol)) {
                case -1:
                        wwdelete(boxwin);
                        if (!terse)
                case -1:
                        wwdelete(boxwin);
                        if (!terse)
@@ -41,10 +47,37 @@ register struct ww *w;
                (void) wwputs("\r\n", cmdwin);
        wwcurtowin(cmdwin);
        wwdelete(w);
                (void) wwputs("\r\n", cmdwin);
        wwcurtowin(cmdwin);
        wwdelete(w);
-       w->ww_w.t = row;
-       w->ww_w.l = col;
-       w->ww_w.b = row + w->ww_w.nr;
-       w->ww_w.r = col + w->ww_w.nc;
+       wwmove(w, row, col);
        wwadd(w, back);
        reframe();
 }
        wwadd(w, back);
        reframe();
 }
+
+/*
+ * Weird stufff, don't ask.
+ */
+getminmax(x, n, a, b, curx, minx, maxx)
+register x, n, a, b;
+int *curx, *minx, *maxx;
+{
+       if (x < a) {
+               *curx = x + n - 1;
+               *minx = 1 - n;
+               *maxx = a;
+       } else if (x == a) {
+               *curx = x;
+               *minx = 1 - n;
+               *maxx = b - n;
+       } else if (x < b - n) {
+               *curx = x;
+               *minx = a;
+               *maxx = b - n;
+       } else if (x == b - n) {
+               *curx = x;
+               *minx = a;
+               *maxx = b - 1;
+       } else {
+               *curx = x;
+               *minx = b - n;
+               *maxx = b - 1;
+       }
+}
index b45f11c..a722bf5 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- *     @(#)ww.h        3.12 83/09/01   
+ *     @(#)ww.h        3.13 83/09/14   
  */
 
 #include <stdio.h>
  */
 
 #include <stdio.h>
@@ -33,6 +33,7 @@ struct ww {
        char ww_index;          /* the index, for wwindex[] */
        char ww_order;          /* the overlapping order */
        struct ww_dim ww_w;     /* window dimemsions */
        char ww_index;          /* the index, for wwindex[] */
        char ww_order;          /* the overlapping order */
        struct ww_dim ww_w;     /* window dimemsions */
+       struct ww_dim ww_i;     /* the part inside the screen */
        int ww_nline;           /* size of the buffer */
        int ww_scroll;          /* where the window is relative to the buffer */
        struct ww_pos ww_cur;   /* the cursor position, relative to ww_w */
        int ww_nline;           /* size of the buffer */
        int ww_scroll;          /* where the window is relative to the buffer */
        struct ww_pos ww_cur;   /* the cursor position, relative to ww_w */
index ad012d9..f564983 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwadd.c     3.3 83/08/16";
+static char *sccsid = "@(#)wwadd.c     3.4 83/09/14";
 #endif
 
 #include "ww.h"
 #endif
 
 #include "ww.h"
@@ -12,12 +12,14 @@ wwadd(w1, w2)
 register struct ww *w1, *w2;
 {
        if (w1->ww_forw != 0 || w1->ww_back != 0)
 register struct ww *w1, *w2;
 {
        if (w1->ww_forw != 0 || w1->ww_back != 0)
-               abort();
+               return;                         /* sanity */
+
        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;
 
        {
                register struct ww *wp;
 
@@ -29,16 +31,18 @@ register struct ww *w1, *w2;
                }
        }
        {
                }
        }
        {
-               int i = w1->ww_w.t;
+               int i = w1->ww_i.t;
                char *touched = &wwtouched[i];
 
                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 (; i < w1->ww_i.b; i++, touched++) {
+                       int j = w1->ww_i.nc;
+                       register char *win = &w1->ww_win[i - w1->ww_w.t]
+                                       [w1->ww_i.l - w1->ww_w.l];
+                       register char *smap = &wwsmap[i][w1->ww_i.l];
+                       register union ww_char *ns = &wwns[i][w1->ww_i.l];
+                       register union ww_char *buf
+                               = &w1->ww_buf[w1->ww_scroll + i - w1->ww_w.t]
+                                       [w1->ww_i.l - w1->ww_w.l];
 
                        while (--j >= 0) {
                                if ((*win & (WWM_GLS|WWM_COV)) == 0) {
 
                        while (--j >= 0) {
                                if ((*win & (WWM_GLS|WWM_COV)) == 0) {
index ccc1cb7..5052d66 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwclreol.c  3.7 83/08/18";
+static char *sccsid = "@(#)wwclreol.c  3.8 83/09/14";
 #endif
 
 #include "ww.h"
 #endif
 
 #include "ww.h"
@@ -25,44 +25,70 @@ char cleared;
        int row = line - w->ww_scroll;
        int srow = w->ww_w.t + row;
        int scol = w->ww_w.l + col;
        int row = line - w->ww_scroll;
        int srow = w->ww_w.t + row;
        int scol = w->ww_w.l + col;
-       register union ww_char *s, *buf;
-       register char *smap, *win;
-       char *touched;
        int nblank, ncleared;
 
        int nblank, ncleared;
 
-       if (row < 0 || row >= w->ww_w.nr) {
-               /* can't even see it, so just clear the buffer */
+       /*
+        * Clear the buffer right off
+        */
+       {
+               register union ww_char *buf;
+
                buf = &w->ww_buf[line][col]; 
                for (i = w->ww_w.nc - col; --i >= 0;)
                        buf++->c_w = ' ';
                buf = &w->ww_buf[line][col]; 
                for (i = w->ww_w.nc - col; --i >= 0;)
                        buf++->c_w = ' ';
-               return;
        }
        }
-       smap = &wwsmap[srow][scol];
-       s = &wwns[srow][scol];
-       touched = &wwtouched[srow];
-       win = &w->ww_win[row][col];
-       buf = &w->ww_buf[line][col];
-       ncleared = nblank = 0;
-       for (i = w->ww_w.nc - col; --i >= 0;) {
-               buf++->c_w = ' ';
-               if (*smap++ != w->ww_index) {
-                       if (s++->c_w == ' ')
+
+       /*
+        * If can't see it, just return.
+        */
+       if (srow < w->ww_i.t || srow >= w->ww_i.b
+           || w->ww_i.r <= 0 || w->ww_i.r <= scol)
+               return;
+
+       if (scol < w->ww_i.l)
+               scol = w->ww_i.l;
+       col = scol - w->ww_w.l;
+
+       /*
+        * Now find out how much is actually cleared, and fix wwns.
+        */
+       {
+               register union ww_char *s;
+               register char *smap, *win;
+               register char *touched;
+
+               smap = &wwsmap[srow][scol];
+               s = &wwns[srow][scol];
+               touched = &wwtouched[srow];
+               win = &w->ww_win[row][col];
+               ncleared = nblank = 0;
+
+               for (i = w->ww_i.r - scol; --i >= 0;) {
+                       if (*smap++ != w->ww_index) {
+                               if (s++->c_w == ' ')
+                                       nblank++;
+                               win++;
+                               continue;
+                       }
+                       ncleared++; 
+                       *touched = 1;
+                       if (*win == 0) {
                                nblank++;
                                nblank++;
-                       win++;
-                       continue;
+                               s++->c_w = ' ';
+                               win++;
+                       } else
+                               s++->c_w = ' ' | *win++ << WWC_MSHIFT;
                }
                }
-               ncleared++; 
-               *touched = 1;
-               if (*win == 0) {
-                       nblank++;
-                       s++->c_w = ' ';
-                       win++;
-               } else
-                       s++->c_w = ' ' | *win++ << WWC_MSHIFT;
        }
        }
+
+       /*
+        * Can/Should we use clear eol?
+        */
        if (!cleared && tt.tt_clreol != 0
            && ncleared > wwncol - scol - nblank
            && nblank > (wwncol - scol) / 2) {
        if (!cleared && tt.tt_clreol != 0
            && ncleared > wwncol - scol - nblank
            && nblank > (wwncol - scol) / 2) {
+               register union ww_char *s;
+
                /* clear to the end */
                (*tt.tt_move)(srow, scol);
                (*tt.tt_clreol)();
                /* clear to the end */
                (*tt.tt_move)(srow, scol);
                (*tt.tt_clreol)();
index fdb331d..86e1545 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwcursor.c  3.1 83/08/19";
+static char *sccsid = "@(#)wwcursor.c  3.2 83/09/14";
 #endif
 
 #include "ww.h"
 #endif
 
 #include "ww.h"
@@ -26,11 +26,14 @@ register struct ww *w;
                else if (*win == wwcursormodes)
                        w->ww_nvis[w->ww_cur.r]++;
                *win ^= wwcursormodes;
                else if (*win == wwcursormodes)
                        w->ww_nvis[w->ww_cur.r]++;
                *win ^= wwcursormodes;
-       }
-       r = wwcurrow(w);
-       c = wwcurcol(w);
-       if (wwsmap[r][c] == w->ww_index) {
-               wwns[r][c].c_m ^= wwcursormodes;
-               wwtouched[r] = 1;
+               r = wwcurrow(w);
+               c = wwcurcol(w);
+               if (r < w->ww_i.t || r >= w->ww_i.b
+                   || c < w->ww_i.l || c >= w->ww_i.r)
+                       return;
+               if (wwsmap[r][c] == w->ww_index) {
+                       wwns[r][c].c_m ^= wwcursormodes;
+                       wwtouched[r] = 1;
+               }
        }
 }
        }
 }
index 2ff08e0..2a28c74 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwdelchar.c 3.4 83/08/16";
+static char *sccsid = "@(#)wwdelchar.c 3.5 83/09/14";
 #endif
 
 #include "ww.h"
 #endif
 
 #include "ww.h"
@@ -10,8 +10,13 @@ register struct ww *w;
 {
        register i;
        int row = line - w->ww_scroll;
 {
        register i;
        int row = line - w->ww_scroll;
+       int srow = row + w->ww_w.t;
+       int scol = col + w->ww_w.l;
        int nvis;
 
        int nvis;
 
+       /*
+        * First, shift the line.
+        */
        {
                register union ww_char *p, *q;
 
        {
                register union ww_char *p, *q;
 
@@ -21,8 +26,21 @@ register struct ww *w;
                        *p++ = *q++;
                p->c_w = ' ';
        }
                        *p++ = *q++;
                p->c_w = ' ';
        }
-       if (row < 0 || row >= w->ww_w.nr)
+
+       /*
+        * If can't see it, just return.
+        */
+       if (srow < w->ww_i.t || srow >= w->ww_i.b
+           || w->ww_i.r <= 0 || w->ww_i.r <= scol)
                return;
                return;
+
+       if (scol < w->ww_i.l)
+               scol = w->ww_i.l;
+       col = scol - w->ww_w.l;
+
+       /*
+        * Now find out how much is actually changed, and fix wwns.
+        */
        {
                register union ww_char *buf;
                register char *win;
        {
                register union ww_char *buf;
                register char *win;
@@ -31,20 +49,15 @@ register struct ww *w;
                char *touched;
 
                nvis = 0;
                char *touched;
 
                nvis = 0;
-               smap = &wwsmap[row + w->ww_w.t][col + w->ww_w.l];
-               for (i = w->ww_w.nc - col; i > 0; i--)
-                       if (*smap == w->ww_index)
-                               break;
-                       else {
-                               smap++;
-                               col++;
-                       }
+               smap = &wwsmap[srow][scol];
+               for (i = w->ww_i.r - scol; i > 0 && *smap++ != w->ww_index; i--)
+                       col++, scol++;
                if (i <= 0)
                        return;
                buf = &w->ww_buf[line][col];
                win = &w->ww_win[row][col];
                if (i <= 0)
                        return;
                buf = &w->ww_buf[line][col];
                win = &w->ww_win[row][col];
-               ns = &wwns[row + w->ww_w.t][col + w->ww_w.l];
-               touched = &wwtouched[row + w->ww_w.t];
+               ns = &wwns[srow][scol];
+               touched = &wwtouched[srow];
                for (; --i >= 0;) {
                        if (*win) {
                                if ((*win & (WWM_COV|WWM_GLS)) != 0) {
                for (; --i >= 0;) {
                        if (*win) {
                                if ((*win & (WWM_COV|WWM_GLS)) != 0) {
@@ -63,17 +76,19 @@ register struct ww *w;
                        }
                }
        }
                        }
                }
        }
-       col += w->ww_w.l;
-       row += w->ww_w.t;
-       if (nvis > (wwncol - col) / 2) {
+
+       /*
+        * Can/Should we use delete character?
+        */
+       if (tt.tt_delchar != 0 && nvis > (wwncol - scol) / 2) {
                register union ww_char *p, *q;
 
                register union ww_char *p, *q;
 
-               (*tt.tt_move)(row, col);
+               (*tt.tt_move)(srow, scol);
                (*tt.tt_delchar)();
 
                (*tt.tt_delchar)();
 
-               p = &wwos[row][col];
+               p = &wwos[srow][scol];
                q = p + 1;
                q = p + 1;
-               for (i = wwncol - col - 1; --i >= 0;)
+               for (i = wwncol - scol; --i > 0;)
                        *p++ = *q++;
                p->c_w = ' ';
        }
                        *p++ = *q++;
                p->c_w = ' ';
        }
index b7089e0..a1d6500 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwdelete.c  3.3 83/08/16";
+static char *sccsid = "@(#)wwdelete.c  3.4 83/09/14";
 #endif
 
 #include "ww.h"
 #endif
 
 #include "ww.h"
@@ -10,16 +10,19 @@ static      char *sccsid = "@(#)wwdelete.c  3.3 83/08/16";
 wwdelete(w)
 register struct ww *w;
 {
 wwdelete(w)
 register struct ww *w;
 {
+       if (w->ww_forw == 0 || w->ww_back == 0)
+               return;                         /* sanity */
+
        {
        {
-               register i = w->ww_w.t;
+               register i = w->ww_i.t;
                register char *touched = &wwtouched[i];
 
                register char *touched = &wwtouched[i];
 
-               for (; i < w->ww_w.b; i++, touched++) {
-                       register int j = w->ww_w.l;
+               for (; i < w->ww_i.b; i++, touched++) {
+                       register int j = w->ww_i.l;
                        register char *smap = &wwsmap[i][j];
                        register union ww_char *ns = &wwns[i][j];
 
                        register char *smap = &wwsmap[i][j];
                        register union ww_char *ns = &wwns[i][j];
 
-                       for (j = w->ww_w.nc; --j >= 0;) {
+                       for (j = w->ww_i.nc; --j >= 0;) {
                                if (*smap == w->ww_index) {
                                        *touched = 1;
                                        *smap++ = WWX_NOBODY;
                                if (*smap == w->ww_index) {
                                        *touched = 1;
                                        *smap++ = WWX_NOBODY;
@@ -42,14 +45,17 @@ register struct ww *w;
        {
                register i;
 
        {
                register i;
 
-               for (i = 0; i < w->ww_w.nr; i++) {
+               for (i = w->ww_i.t; i < w->ww_i.b; i++) {
                        register j;
                        register j;
-                       register char *win = w->ww_win[i];
-                       register char *cov = w->ww_cov[i];
-                       for (j = w->ww_w.nc; --j >= 0;) {
+                       register char *win = &w->ww_win[i - w->ww_w.t]
+                                       [w->ww_i.l - w->ww_w.l];
+                       register char *cov = &w->ww_cov[i - w->ww_w.t]
+                                       [w->ww_i.l - w->ww_w.l];
+
+                       for (j = w->ww_i.nc; --j >= 0;) {
                                if (*win != 0) {
                                        if ((*win++ &= ~WWM_COV) == 0)
                                if (*win != 0) {
                                        if ((*win++ &= ~WWM_COV) == 0)
-                                               w->ww_nvis[i]++;
+                                               w->ww_nvis[i - w->ww_w.t]++;
                                } else
                                        win++;
                                *cov++ = WWX_NOBODY;
                                } else
                                        win++;
                                *cov++ = WWX_NOBODY;
index 151b1ed..fc57420 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwdelline.c 3.3 83/08/18";
+static char *sccsid = "@(#)wwdelline.c 3.4 83/09/14";
 #endif
 
 #include "ww.h"
 #endif
 
 #include "ww.h"
@@ -11,21 +11,21 @@ int line;
        register i;
        register union ww_char **cpp, **cqq;
        register union ww_char *cp;
        register i;
        register union ww_char **cpp, **cqq;
        register union ww_char *cp;
-       int srow, erow;
+       int row1, row2;
        char deleted;
        int visible;
 
        /*
         * Scroll first.
         */
        char deleted;
        int visible;
 
        /*
         * Scroll first.
         */
-       if ((srow = line - w->ww_scroll) < 0)
-               srow = 0;
-       if ((erow = w->ww_nline - w->ww_scroll - 1) >= w->ww_w.nr) {
-               erow = w->ww_w.nr - 1;
+       if ((row1 = line - w->ww_scroll) < w->ww_i.t - w->ww_w.t)
+               row1 = w->ww_i.t - w->ww_w.t;
+       if ((row2 = w->ww_nline - w->ww_scroll) > w->ww_i.b - w->ww_w.t) {
+               row2 = w->ww_i.b - w->ww_w.t;
                visible = 0;
        } else
                visible = 1;
                visible = 0;
        } else
                visible = 1;
-       deleted = wwscroll1(w, srow, erow, 1, visible);
+       deleted = wwscroll1(w, row1, row2, 1, visible);
 
        /*
         * Fix the buffer.
 
        /*
         * Fix the buffer.
@@ -34,7 +34,7 @@ int line;
        cpp = &w->ww_buf[line];
        cqq = cpp + 1;
        cp = *cpp;
        cpp = &w->ww_buf[line];
        cqq = cpp + 1;
        cp = *cpp;
-       for (i = w->ww_nline - line - 1; --i >= 0;)
+       for (i = w->ww_nline - line; --i > 0;)
                *cpp++ = *cqq++;
        *cpp = cp;
 
                *cpp++ = *cqq++;
        *cpp = cp;
 
index f37dd6f..2c1a83a 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwflush.c   3.3 83/08/15";
+static char *sccsid = "@(#)wwflush.c   3.4 83/09/14";
 #endif
 
 #include "ww.h"
 #endif
 
 #include "ww.h"
@@ -7,6 +7,10 @@ static char *sccsid = "@(#)wwflush.c   3.3 83/08/15";
 
 wwflush()
 {
 
 wwflush()
 {
-       (*tt.tt_move)(wwcursorrow, wwcursorcol);
+       if (wwcursorrow < 0 || wwcursorrow >= wwnrow
+           || wwcursorcol < 0 || wwcursorcol >= wwncol)
+               (*tt.tt_move)(0, 0);
+       else
+               (*tt.tt_move)(wwcursorrow, wwcursorcol);
        (void) fflush(stdout);
 }
        (void) fflush(stdout);
 }
index 0ecbd87..833ae24 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwframe.c   3.8 83/08/23";
+static char *sccsid = "@(#)wwframe.c   3.9 83/09/14";
 #endif
 
 #include "ww.h"
 #endif
 
 #include "ww.h"
@@ -21,14 +21,14 @@ struct ww *wframe;
 
        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;
                b2 = c < 0 || frameok(w, r, c);
 
                smap = &wwsmap[r + 1][c + 1];
                a1 = 0;
                a2 = 0;
                b1 = 0;
                b2 = c < 0 || frameok(w, r, c);
 
-               for (; c < w->ww_w.r; c++) {
+               for (; c < w->ww_i.r; c++) {
                        if (c + 1 >= wwncol) {
                                a3 = 1;
                                b3 = 1;
                        if (c + 1 >= wwncol) {
                                a3 = 1;
                                b3 = 1;
@@ -56,14 +56,14 @@ struct ww *wframe;
 
        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;
                b2 = c < 0 || frameok(w, r, c);
 
                smap = &wwsmap[r - 1][c + 1];
                a1 = 0;
                a2 = 0;
                b1 = 0;
                b2 = c < 0 || frameok(w, r, c);
 
-               for (; c < w->ww_w.r; c++) {
+               for (; c < w->ww_i.r; c++) {
                        if (c + 1 >= wwncol) {
                                a3 = 1;
                                b3 = 1;
                        if (c + 1 >= wwncol) {
                                a3 = 1;
                                b3 = 1;
@@ -90,14 +90,14 @@ struct ww *wframe;
        }
 
        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;
                b2 = r < 0 || frameok(w, r, c);
 
                c = w->ww_w.l - 1;
                a1 = 0;
                a2 = 0;
                b1 = 0;
                b2 = r < 0 || frameok(w, r, c);
 
-               for (; r < w->ww_w.b; r++) {
+               for (; r < w->ww_i.b; r++) {
                        if (r + 1 >= wwnrow) {
                                a3 = 1;
                                b3 = 1;
                        if (r + 1 >= wwnrow) {
                                a3 = 1;
                                b3 = 1;
@@ -124,14 +124,14 @@ struct ww *wframe;
        }
 
        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;
                b2 = r < 0 || frameok(w, r, c);
 
                c = w->ww_w.r;
                a1 = 0;
                a2 = 0;
                b1 = 0;
                b2 = r < 0 || frameok(w, r, c);
 
-               for (; r < w->ww_w.b; r++) {
+               for (; r < w->ww_i.b; r++) {
                        if (r + 1 >= wwnrow) {
                                a3 = 1;
                                b3 = 1;
                        if (r + 1 >= wwnrow) {
                                a3 = 1;
                                b3 = 1;
@@ -166,8 +166,8 @@ char code;
        register r, c;
        char oldcode;
 
        register r, c;
        char oldcode;
 
-       if (rr < f->ww_w.t || rr >= f->ww_w.b
-           || cc < f->ww_w.l || cc >= f->ww_w.r)
+       if (rr < f->ww_i.t || rr >= f->ww_i.b
+           || cc < f->ww_i.l || cc >= f->ww_i.r)
                return;
        {
                register struct ww *w;
                return;
        {
                register struct ww *w;
index 53a17ce..3f81496 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwinschar.c 3.6 83/08/17";
+static char *sccsid = "@(#)wwinschar.c 3.7 83/09/14";
 #endif
 
 #include "ww.h"
 #endif
 
 #include "ww.h"
@@ -11,8 +11,13 @@ short c;
 {
        register i;
        int row = line - w->ww_scroll;
 {
        register i;
        int row = line - w->ww_scroll;
+       int srow = row + w->ww_w.t;
+       int scol = col + w->ww_w.l;
        int nvis;
 
        int nvis;
 
+       /*
+        * First, shift the line.
+        */
        {
                register union ww_char *p, *q;
 
        {
                register union ww_char *p, *q;
 
@@ -22,8 +27,21 @@ short c;
                        *--p = *--q;
                q->c_w = c;
        }
                        *--p = *--q;
                q->c_w = c;
        }
-       if (row < 0 || row >= w->ww_w.nr)
+
+       /*
+        * If can't see it, just return.
+        */
+       if (srow < w->ww_i.t || srow >= w->ww_i.b
+           || w->ww_i.r <= 0 || w->ww_i.r <= scol)
                return;
                return;
+
+       if (scol < w->ww_i.l)
+               scol = w->ww_i.l;
+       col = scol - w->ww_w.l;
+
+       /*
+        * Now find out how much is actually changed, and fix wwns.
+        */
        {
                register union ww_char *buf;
                register char *win;
        {
                register union ww_char *buf;
                register char *win;
@@ -32,20 +50,15 @@ short c;
                char *touched;
 
                nvis = 0;
                char *touched;
 
                nvis = 0;
-               smap = &wwsmap[row + w->ww_w.t][col + w->ww_w.l];
-               for (i = w->ww_w.nc - col; i > 0; i--)
-                       if (*smap == w->ww_index)
-                               break;
-                       else {
-                               smap++;
-                               col++;
-                       }
+               smap = &wwsmap[srow][scol];
+               for (i = w->ww_i.r - scol; i > 0 && *smap++ != w->ww_index; i--)
+                       col++, scol++;
                if (i <= 0)
                        return;
                buf = &w->ww_buf[line][col];
                win = &w->ww_win[row][col];
                if (i <= 0)
                        return;
                buf = &w->ww_buf[line][col];
                win = &w->ww_win[row][col];
-               ns = &wwns[row + w->ww_w.t][col + w->ww_w.l];
-               touched = &wwtouched[row + w->ww_w.t];
+               ns = &wwns[srow][scol];
+               touched = &wwtouched[srow];
                c = buf->c_w ^ *win << WWC_MSHIFT;
                for (; --i >= 0;) {
                        if (*win) {
                c = buf->c_w ^ *win << WWC_MSHIFT;
                for (; --i >= 0;) {
                        if (*win) {
@@ -65,21 +78,22 @@ short c;
                        }
                }
        }
                        }
                }
        }
-       col += w->ww_w.l;
-       row += w->ww_w.t;
-       if (tt.tt_setinsert != 0 && nvis > (wwncol - col) / 2
-           && col != wwncol - 1) {
+
+       /*
+        * Can/Should we use delete character?
+        */
+       if (tt.tt_setinsert != 0 && nvis > (wwncol - scol) / 2) {
                register union ww_char *p, *q;
 
                (*tt.tt_setinsert)(1);
                register union ww_char *p, *q;
 
                (*tt.tt_setinsert)(1);
-               (*tt.tt_move)(row, col);
+               (*tt.tt_move)(srow, scol);
                (*tt.tt_setmodes)(c >> WWC_MSHIFT);
                (*tt.tt_putc)(c & WWC_CMASK);
                (*tt.tt_setinsert)(0);
 
                (*tt.tt_setmodes)(c >> WWC_MSHIFT);
                (*tt.tt_putc)(c & WWC_CMASK);
                (*tt.tt_setinsert)(0);
 
-               p = &wwos[row][wwncol];
+               p = &wwos[srow][wwncol];
                q = p - 1;
                q = p - 1;
-               for (i = wwncol - col - 1; --i >= 0;)
+               for (i = wwncol - scol; --i > 0;)
                        *--p = *--q;
                q->c_w = c;
        }
                        *--p = *--q;
                q->c_w = c;
        }
index e5a1051..79fc6bb 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwinsline.c 3.3 83/08/18";
+static char *sccsid = "@(#)wwinsline.c 3.4 83/09/14";
 #endif
 
 #include "ww.h"
 #endif
 
 #include "ww.h"
@@ -11,21 +11,21 @@ int line;
        register i;
        register union ww_char **cpp, **cqq;
        register union ww_char *cp;
        register i;
        register union ww_char **cpp, **cqq;
        register union ww_char *cp;
-       int srow, erow;
+       int row11, row2;
        char deleted;
        int visible;
 
        /*
         * Scroll first.
         */
        char deleted;
        int visible;
 
        /*
         * Scroll first.
         */
-       if ((srow = line - w->ww_scroll) < 0) {
-               srow = 0;
+       if ((row11 = line - w->ww_scroll) < w->ww_i.t - w->ww_w.t) {
+               row11 = 0;
                visible = 0;
        } else
                visible = 1;
                visible = 0;
        } else
                visible = 1;
-       if ((erow = w->ww_nline - w->ww_scroll - 1) >= w->ww_w.nr)
-               erow = w->ww_w.nr - 1;
-       deleted = wwscroll1(w, srow, erow, -1, visible);
+       if ((row2 = w->ww_nline - w->ww_scroll) > w->ww_i.b - w->ww_w.t)
+               row2 = w->ww_i.b - w->ww_w.t;
+       deleted = wwscroll1(w, row11, row2, -1, visible);
 
        /*
         * Fix the buffer.
 
        /*
         * Fix the buffer.
index dc0cee7..39abe3b 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwopen.c    3.10 83/08/26";
+static char *sccsid = "@(#)wwopen.c    3.11 83/09/14";
 #endif
 
 #include "ww.h"
 #endif
 
 #include "ww.h"
@@ -26,15 +26,19 @@ wwopen(flags, nrow, ncol, row, col, nline)
        }
        w->ww_index = i;
 
        }
        w->ww_index = i;
 
-       if ((w->ww_w.nr = nrow) <= 0
-           || (w->ww_w.nc = ncol) <= 0
-           || (w->ww_w.l = col) < 0
-           || (w->ww_w.r = col + ncol) > wwncol
-           || (w->ww_w.t = row) < 0
-           || (w->ww_w.b = row + nrow) > wwnrow) {
-               wwerrno = WWE_SIZE;
-               goto bad;
-       }
+       w->ww_w.t = row;
+       w->ww_w.b = row + nrow;
+       w->ww_w.l = col;
+       w->ww_w.r = col + ncol;
+       w->ww_w.nr = nrow;
+       w->ww_w.nc = ncol;
+       w->ww_i.t = MAX(w->ww_w.t, 0);
+       w->ww_i.b = MIN(w->ww_w.b, wwnrow);
+       w->ww_i.l = MAX(w->ww_w.l, 0);
+       w->ww_i.r = MIN(w->ww_w.r, wwncol);
+       w->ww_i.nr = w->ww_i.b - w->ww_i.t;
+       w->ww_i.nc = w->ww_i.r - w->ww_i.l;
+
        w->ww_nline = MAX(nline, w->ww_w.nr);
 
        if (flags & WWO_PTY) {
        w->ww_nline = MAX(nline, w->ww_w.nr);
 
        if (flags & WWO_PTY) {
index 58cc246..2d684ab 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwredrawwin.c       3.3 83/08/18";
+static char *sccsid = "@(#)wwredrawwin.c       3.4 83/09/14";
 #endif
 
 #include "ww.h"
 #endif
 
 #include "ww.h"
@@ -7,12 +7,13 @@ static        char *sccsid = "@(#)wwredrawwin.c       3.3 83/08/18";
 wwredrawwin(w)
 register struct ww *w;
 {
 wwredrawwin(w)
 register struct ww *w;
 {
-       wwredrawwin1(w, 0, w->ww_w.nr - 1, w->ww_scroll);
+       wwredrawwin1(w, w->ww_i.t - w->ww_w.t, w->ww_i.b - w->ww_w.t,
+               w->ww_scroll);
 }
 
 }
 
-wwredrawwin1(w, srow, erow, offset)
+wwredrawwin1(w, row1, row2, scroll)
 register struct ww *w;
 register struct ww *w;
-int srow, erow, offset;
+int row1, row2, scroll;
 {
        int i;
        register j;
 {
        int i;
        register j;
@@ -22,13 +23,13 @@ int srow, erow, offset;
        register union ww_char *ns;
        char *touched;
 
        register union ww_char *ns;
        char *touched;
 
-       touched = &wwtouched[srow + w->ww_w.t];
-       for (i = srow; i <= erow; i++, touched++) {
-               ns = &wwns[i + w->ww_w.t][w->ww_w.l];
-               smap = &wwsmap[i + w->ww_w.t][w->ww_w.l];
-               buf = w->ww_buf[offset + i];
-               win = w->ww_win[i];
-               for (j = w->ww_w.nc; --j >= 0;)
+       touched = &wwtouched[row1 + w->ww_w.t];
+       for (i = row1; i < row2; i++, touched++) {
+               ns = &wwns[i + w->ww_w.t][w->ww_i.l];
+               smap = &wwsmap[i + w->ww_w.t][w->ww_i.l];
+               buf = &w->ww_buf[scroll + i][w->ww_i.l - w->ww_w.l];
+               win = &w->ww_win[i][w->ww_i.l - w->ww_w.l];
+               for (j = w->ww_i.nc; --j >= 0;)
                        if (*smap++ != w->ww_index)
                                win++, ns++, buf++;
                        else {
                        if (*smap++ != w->ww_index)
                                win++, ns++, buf++;
                        else {
index accaa10..e2f4f82 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwscroll.c  3.8 83/08/24";
+static char *sccsid = "@(#)wwscroll.c  3.9 83/09/14";
 #endif
 
 #include "ww.h"
 #endif
 
 #include "ww.h"
@@ -21,9 +21,10 @@ register n;
        else if (scroll > w->ww_nline - w->ww_w.nr)
                scroll = w->ww_nline - w->ww_w.nr;
        n = abs(scroll - w->ww_scroll);
        else if (scroll > w->ww_nline - w->ww_w.nr)
                scroll = w->ww_nline - w->ww_w.nr;
        n = abs(scroll - w->ww_scroll);
-       if (n < w->ww_w.nr) {
+       if (n < w->ww_i.nr) {
                while (--n >= 0) {
                while (--n >= 0) {
-                       (void) wwscroll1(w, 0, w->ww_w.nr - 1, dir, 0);
+                       (void) wwscroll1(w, w->ww_i.t - w->ww_w.t,
+                               w->ww_i.b - w->ww_w.t, dir, 0);
                        w->ww_scroll += dir;
                }
        } else {
                        w->ww_scroll += dir;
                }
        } else {
@@ -33,43 +34,42 @@ register n;
 }
 
 /*
 }
 
 /*
- * Scroll one line, between 'srow' and 'erow', in direction 'dir'.
+ * Scroll one line, between 'row1' and 'row2', in direction 'dir'.
  * Don't adjust ww_scroll.
  * And don't redraw 'leaveit' lines.
  */
  * Don't adjust ww_scroll.
  * And don't redraw 'leaveit' lines.
  */
-wwscroll1(w, srow, erow, dir, leaveit)
+wwscroll1(w, row1, row2, dir, leaveit)
 register struct ww *w;
 register struct ww *w;
-int srow, erow, dir;
+int row1, row2, dir;
 int leaveit;
 {
        register i;
 int leaveit;
 {
        register i;
-       int srow1, erow1;
+       int row1x, row2x;
        int nvis;
        int nvismax;
        int deleted = 0;
 
        /*
         * See how many lines on the screen are affected.
        int nvis;
        int nvismax;
        int deleted = 0;
 
        /*
         * See how many lines on the screen are affected.
-        * And calculate srow, erow, and left at the same time.
+        * And calculate row1x, row2x, and left at the same time.
         */
         */
-       for (i = srow; i <= erow && w->ww_nvis[i] == 0; i++)
+       for (i = row1; i < row2 && w->ww_nvis[i] == 0; i++)
                ;
                ;
-       if ((srow1 = i) > erow) {
-               /* can't do any fancy stuff */
-               erow1 = srow1 - 1;
+       if (i >= row2)                  /* can't do any fancy stuff */
                goto out;
                goto out;
-       }
-       for (i = erow; i >= srow && w->ww_nvis[i] == 0; i--)
+       row1x = i;
+       for (i = row2 - 1; i >= row1 && w->ww_nvis[i] == 0; i--)
                ;
                ;
-       if ((erow1 = i) == srow1)
+       if (i <= row1x)
                goto out;               /* just one line is easy */
                goto out;               /* just one line is easy */
+       row2x = i + 1;
 
        /*
         * See how much of this window is visible.
         */
 
        /*
         * See how much of this window is visible.
         */
-       nvismax = wwncol * (erow1 - srow1 + 1);
+       nvismax = wwncol * (row2x - row1x);
        nvis = 0;
        nvis = 0;
-       for (i = srow1; i <= erow1; i++)
+       for (i = row1x; i < row2x; i++)
                nvis += w->ww_nvis[i];
 
        /*
                nvis += w->ww_nvis[i];
 
        /*
@@ -85,37 +85,37 @@ int leaveit;
                 * But do worry when scrolling up.  For hp2621.
                 */
                if (dir > 0) {
                 * But do worry when scrolling up.  For hp2621.
                 */
                if (dir > 0) {
-                       (*tt.tt_move)(srow1 + w->ww_w.t, 0);
+                       (*tt.tt_move)(row1x + w->ww_w.t, 0);
                        (*tt.tt_delline)();
                        (*tt.tt_delline)();
-                       if (erow1 + w->ww_w.t != wwnrow - 1) {
-                               (*tt.tt_move)(erow1 + w->ww_w.t, 0);
+                       if (row2x + w->ww_w.t < wwnrow) {
+                               (*tt.tt_move)(row2x + w->ww_w.t - 1, 0);
                                (*tt.tt_insline)();
                        }
                        /*
                         * Fix up the old screen.
                         */
                                (*tt.tt_insline)();
                        }
                        /*
                         * Fix up the old screen.
                         */
-                       cpp = &wwos[srow1 + w->ww_w.t];
+                       cpp = &wwos[row1x + w->ww_w.t];
                        cqq = cpp + 1;
                        tmp = *cpp;
                        cqq = cpp + 1;
                        tmp = *cpp;
-                       for (i = erow1 - srow1; --i >= 0;)
+                       for (i = row2x - row1x; --i > 0;)
                                *cpp++ = *cqq++;
                        *cpp = tmp;
                        for (i = wwncol; --i >= 0;)
                                tmp++->c_w = ' ';
                } else {
                                *cpp++ = *cqq++;
                        *cpp = tmp;
                        for (i = wwncol; --i >= 0;)
                                tmp++->c_w = ' ';
                } else {
-                       if (tt.tt_retain || erow1 + w->ww_w.t != wwnrow - 1) {
-                               (*tt.tt_move)(erow1 + w->ww_w.t, 0);
+                       if (tt.tt_retain || row2x + w->ww_w.t != wwnrow) {
+                               (*tt.tt_move)(row2x + w->ww_w.t - 1, 0);
                                (*tt.tt_delline)();
                        }
                                (*tt.tt_delline)();
                        }
-                       (*tt.tt_move)(srow1 + w->ww_w.t, 0);
+                       (*tt.tt_move)(row1x + w->ww_w.t, 0);
                        (*tt.tt_insline)();
                        /*
                         * Fix up the old screen.
                         */
                        (*tt.tt_insline)();
                        /*
                         * Fix up the old screen.
                         */
-                       cqq = &wwos[erow1 + w->ww_w.t];
-                       cpp = cqq + 1;
+                       cpp = &wwos[row2x + w->ww_w.t];
+                       cqq = cpp - 1;
                        tmp = *cqq;
                        tmp = *cqq;
-                       for (i = erow1 - srow1; --i >= 0;)
+                       for (i = row2x - row1x; --i > 0;)
                                *--cpp = *--cqq;
                        *cqq = tmp;
                        for (i = wwncol; --i >= 0;)
                                *--cpp = *--cqq;
                        *cqq = tmp;
                        for (i = wwncol; --i >= 0;)
@@ -136,69 +136,69 @@ int leaveit;
                                register union ww_char *tmp;
                                register union ww_char **cpp, **cqq;
 
                                register union ww_char *tmp;
                                register union ww_char **cpp, **cqq;
 
-                               cpp = &wwns[srow1 + w->ww_w.t];
+                               cpp = &wwns[row1x + w->ww_w.t];
                                cqq = cpp + 1;
                                tmp = *cpp;
                                cqq = cpp + 1;
                                tmp = *cpp;
-                               for (i = erow1 - srow1; --i >= 0;)
+                               for (i = row2x - row1x; --i > 0;)
                                        *cpp++ = *cqq++;
                                *cpp = tmp;
                        }
                        if (deleted) {
                                register char *p, *q;
 
                                        *cpp++ = *cqq++;
                                *cpp = tmp;
                        }
                        if (deleted) {
                                register char *p, *q;
 
-                               p = &wwtouched[srow1 + w->ww_w.t];
+                               p = &wwtouched[row1x + w->ww_w.t];
                                q = p + 1;
                                q = p + 1;
-                               for (i = erow1 - srow1; --i >= 0;)
+                               for (i = row2x - row1x; --i > 0;)
                                        *p++ = *q++;
                                *p = 1;
                        } else {
                                register char *p;
 
                                        *p++ = *q++;
                                *p = 1;
                        } else {
                                register char *p;
 
-                               p = &wwtouched[srow1 + w->ww_w.t];
-                               for (i = erow1 - srow1 + 1; --i >= 0;)
+                               p = &wwtouched[row1x + w->ww_w.t];
+                               for (i = row2x - row1x; --i >= 0;)
                                        *p++ = 1;
                        }
                                        *p++ = 1;
                        }
-                       wwredrawwin1(w, srow, srow1 - 1, w->ww_scroll + dir);
-                       wwredrawwin1(w, erow1, erow - leaveit,
+                       wwredrawwin1(w, row1, row1x, w->ww_scroll + dir);
+                       wwredrawwin1(w, row2x - 1, row2 - leaveit,
                                w->ww_scroll + dir);
                } else {
                        {
                                register union ww_char *tmp;
                                register union ww_char **cpp, **cqq;
 
                                w->ww_scroll + dir);
                } else {
                        {
                                register union ww_char *tmp;
                                register union ww_char **cpp, **cqq;
 
-                               cqq = &wwns[erow1 + w->ww_w.t];
-                               cpp = cqq + 1;
+                               cpp = &wwns[row2x + w->ww_w.t];
+                               cqq = cpp - 1;
                                tmp = *cqq;
                                tmp = *cqq;
-                               for (i = erow1 - srow1; --i >= 0;)
+                               for (i = row2x - row1x; --i > 0;)
                                        *--cpp = *--cqq;
                                *cqq = tmp;
                        }
                        if (deleted) {
                                register char *p, *q;
 
                                        *--cpp = *--cqq;
                                *cqq = tmp;
                        }
                        if (deleted) {
                                register char *p, *q;
 
-                               q = &wwtouched[erow1 + w->ww_w.t];
-                               p = q + 1;
-                               for (i = erow1 - srow1; --i >= 0;)
+                               p = &wwtouched[row2x + w->ww_w.t];
+                               q = p - 1;
+                               for (i = row2x - row1x; --i > 0;)
                                        *--p = *--q;
                                *q = 1;
                        } else {
                                register char *p;
 
                                        *--p = *--q;
                                *q = 1;
                        } else {
                                register char *p;
 
-                               p = &wwtouched[srow1 + w->ww_w.t];
-                               for (i = erow1 - srow1 + 1; --i >= 0;)
+                               p = &wwtouched[row1x + w->ww_w.t];
+                               for (i = row2x - row1x; --i >= 0;)
                                        *p++ = 1;
                        }
                                        *p++ = 1;
                        }
-                       wwredrawwin1(w, srow + leaveit, srow1,
+                       wwredrawwin1(w, row1 + leaveit, row1x - 1,
                                w->ww_scroll + dir);
                                w->ww_scroll + dir);
-                       wwredrawwin1(w, erow1 + 1, erow, w->ww_scroll + dir);
+                       wwredrawwin1(w, row2x, row2, w->ww_scroll + dir);
                }
        } else {
 out:
                if (dir > 0)
                }
        } else {
 out:
                if (dir > 0)
-                       wwredrawwin1(w, srow, erow - leaveit,
+                       wwredrawwin1(w, row1, row2 - leaveit,
                                w->ww_scroll + dir);
                else
                                w->ww_scroll + dir);
                else
-                       wwredrawwin1(w, srow + leaveit, erow,
+                       wwredrawwin1(w, row1 + leaveit, row2,
                                w->ww_scroll + dir);
        }
        return deleted;
                                w->ww_scroll + dir);
        }
        return deleted;
index 1e44f48..a6e8bae 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwwrite.c   3.9 83/08/26";
+static char *sccsid = "@(#)wwwrite.c   3.10 83/09/14";
 #endif
 
 #include "ww.h"
 #endif
 
 #include "ww.h"
@@ -9,50 +9,57 @@ register struct ww *w;
 register char *p;
 int n;
 {
 register char *p;
 int n;
 {
-       char c;
-       char hascursor = 0;
+       char hascursor;
 
        wwnwrite++;
        wwnwritec += n;
        if (hascursor = w->ww_hascursor)
                wwcursor(w, 0);
 
        wwnwrite++;
        wwnwritec += n;
        if (hascursor = w->ww_hascursor)
                wwcursor(w, 0);
-       while (--n >= 0) {
-               c = *p++ & 0x7f;
-               switch (w->ww_wstate) {
-               case 0:
-                       if (!ISCTRL(c)) {
-                               int i, j;
-                               register union ww_char *bp;
-                               union ww_char *bq;
+       while (n > 0) {
+               if (w->ww_wstate == 0 && !ISCTRL(*p)) {
+                       register i;
+                       int crow, ccol;
+                       register union ww_char *bp;
+                       union ww_char *bq;
+
+                       if (w->ww_insert) {
+                               n--;
+                               wwinschar(w, w->ww_scroll + w->ww_cur.r,
+                                       w->ww_cur.c,
+                                       *p++ | w->ww_modes << WWC_MSHIFT);
+                               goto right;
+                       }
+
+                       bp = bq = &w->ww_buf[w->ww_scroll+w->ww_cur.r]
+                               [w->ww_cur.c];
+                       if ((i = w->ww_w.nc - w->ww_cur.c) > n)
+                               i = n;
+                       while (--i >= 0 && !ISCTRL(*p))
+                               bp++->c_w = *p++ | w->ww_modes << WWC_MSHIFT;
+                       i = bp - bq;
+                       n -= i;
+                       bp = bq;
+
+                       crow = wwcurrow(w);
+                       ccol = wwcurcol(w);
+                       if (ccol < w->ww_i.l) {
+                               bp += w->ww_i.l - ccol;
+                               ccol = w->ww_i.l;
+                       }
+                       w->ww_cur.c += i;
+                       if (crow >= w->ww_i.t && crow < w->ww_i.b) {
                                register union ww_char *ns;
                                register char *smap;
                                register char *win;
                                char *touched;
 
                                register union ww_char *ns;
                                register char *smap;
                                register char *win;
                                char *touched;
 
-                               if (w->ww_insert) {
-                                       wwinschar(w, w->ww_scroll + w->ww_cur.r,
-                                               w->ww_cur.c,
-                                               c | w->ww_modes << WWC_MSHIFT);
-                                       goto right;
-                               }
-                               i = w->ww_w.nc - w->ww_cur.c - 1;
-                               bp = bq = &w->ww_buf[w->ww_scroll+w->ww_cur.r]
-                                       [w->ww_cur.c];
-                               bp++->c_w = c | w->ww_modes << WWC_MSHIFT;
-                               while (n > 0 && --i >= 0 && !ISCTRL(*p)) {
-                                       n--;
-                                       bp++->c_w = *p++ & 0x7f
-                                               | w->ww_modes << WWC_MSHIFT;
-                               }
-                               win = &w->ww_win[w->ww_cur.r][w->ww_cur.c];
-                               i = wwcurrow(w);
-                               j = wwcurcol(w);
-                               smap = &wwsmap[i][j];
-                               ns = &wwns[i][j];
-                               touched = &wwtouched[i];
-                               j = i = bp - bq;
-                               bp = bq;
-                               while (--i >= 0) {
+                               win = &w->ww_win[w->ww_cur.r][ccol - w->ww_w.l];
+                               smap = &wwsmap[crow][ccol];
+                               ns = &wwns[crow][ccol];
+                               touched = &wwtouched[crow];
+                               if (i > w->ww_i.r - ccol)
+                                       i = w->ww_i.r - ccol;
+                               while (--i >= 0)
                                        if (*smap++ == w->ww_index) {
                                                *touched = 1;
                                                ns++->c_w = bp++->c_w
                                        if (*smap++ == w->ww_index) {
                                                *touched = 1;
                                                ns++->c_w = bp++->c_w
@@ -62,14 +69,17 @@ int n;
                                                bp++;
                                                win++;
                                        }
                                                bp++;
                                                win++;
                                        }
-                               }
-                               if ((w->ww_cur.c += j) >= w->ww_w.nc) {
-                                       w->ww_cur.c = 0;
-                                       goto lf;
-                               }
-                               break;
                        }
                        }
-                       switch (c) {
+                       if (w->ww_cur.c >= w->ww_w.nc) {
+                               w->ww_cur.c = 0;
+                               goto lf;
+                       }
+                       continue;
+               }
+               n--;
+               switch (w->ww_wstate) {
+               case 0:
+                       switch (*p++) {
                        case '\n':
                                if (w->ww_mapnl)
                                        w->ww_cur.c = 0;
                        case '\n':
                                if (w->ww_mapnl)
                                        w->ww_cur.c = 0;
@@ -110,7 +120,7 @@ int n;
                        break;
                case 1:
                        w->ww_wstate = 0;
                        break;
                case 1:
                        w->ww_wstate = 0;
-                       switch (c) {
+                       switch (*p++) {
                        case '@':
                                w->ww_insert = 1;
                                break;
                        case '@':
                                w->ww_insert = 1;
                                break;
@@ -175,11 +185,11 @@ int n;
                        }
                        break;
                case 2:
                        }
                        break;
                case 2:
-                       w->ww_cur.r = (c - ' ') % w->ww_w.nr;
+                       w->ww_cur.r = (*p++ - ' ') % w->ww_w.nr;
                        w->ww_wstate++;
                        break;
                case 3:
                        w->ww_wstate++;
                        break;
                case 3:
-                       w->ww_cur.c = (c - ' ') % w->ww_w.nc;
+                       w->ww_cur.c = (*p++ - ' ') % w->ww_w.nc;
                        w->ww_wstate = 0;
                        break;
                }
                        w->ww_wstate = 0;
                        break;
                }