inline expand some function calls
[unix-history] / usr / src / usr.bin / window / wwwrite.c
index 1e44f48..d1c282e 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.13 83/09/15";
 #endif
 
 #include "ww.h"
 #endif
 
 #include "ww.h"
@@ -9,50 +9,59 @@ 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;
+                       register union ww_char *bp;
+                       union ww_char *bq;
+                       int col;
+
+                       if (w->ww_insert) {
+                               n--;
+                               wwinschar(w, w->ww_cur.r, w->ww_cur.c,
+                                       *p++ | w->ww_modes << WWC_MSHIFT);
+                               goto right;
+                       }
+
+                       bp = bq = &w->ww_buf[w->ww_cur.r][w->ww_cur.c];
+                       if ((i = w->ww_b.r - 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;
+                       col = w->ww_cur.c;
+                       w->ww_cur.c += i;
+                       bp = bq;
+                       if (col < w->ww_i.l) {
+                               /* use col as a temporary */
+                               col = w->ww_i.l - col;
+                               bp += col;
+                               i -= col;
+                               col = w->ww_i.l;
+                       }
+                       if (i > w->ww_i.r - col)
+                               i = w->ww_i.r - col;
+
+                       if (w->ww_cur.r >= w->ww_i.t && w->ww_cur.r < 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][col];
+                               smap = &wwsmap[w->ww_cur.r][col];
+                               ns = &wwns[w->ww_cur.r][col];
+                               touched = &wwtouched[w->ww_cur.r];
+                               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,43 +71,49 @@ 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.r) {
+                               w->ww_cur.c = w->ww_w.l;
+                               goto lf;
+                       }
+                       continue;
+               }
+               n--;
+               switch (w->ww_wstate) {
+               case 0:
+                       switch (*p++) {
                        case '\n':
                                if (w->ww_mapnl)
                        case '\n':
                                if (w->ww_mapnl)
-                                       w->ww_cur.c = 0;
+                                       w->ww_cur.c = w->ww_w.l;
                lf:
                lf:
-                               if (++w->ww_cur.r >= w->ww_w.nr) {
-                                       w->ww_cur.r = w->ww_w.nr - 1;
-                                       if (w->ww_scroll + w->ww_w.nr
-                                           < w->ww_nline)
-                                               wwscroll(w, 1);
-                                       else
-                                               wwdelline(w, 0);
+                               if (++w->ww_cur.r >= w->ww_w.b) {
+                                       w->ww_cur.r = w->ww_w.b - 1;
+                                       if (w->ww_w.b < w->ww_b.b) {
+                                               (void) wwscroll1(w, w->ww_i.t,
+                                                       w->ww_i.b, 1, 0);
+                                               w->ww_buf++;
+                                               w->ww_b.t--;
+                                               w->ww_b.b--;
+                                       } else
+                                               wwdelline(w, w->ww_b.t);
                                }
                                break;
                        case '\t':
                                }
                                break;
                        case '\t':
-                               w->ww_cur.c |= 7;
-               right:
-                               if (++w->ww_cur.c >= w->ww_w.nc) {
-                                       w->ww_cur.c = 0;
+                               w->ww_cur.c +=
+                                       8 - (w->ww_cur.c - w->ww_w.l & 7);
+                               if (w->ww_cur.c >= w->ww_w.r) {
+                                       w->ww_cur.c = w->ww_w.l;
                                        goto lf;
                                }
                                break;
                        case '\b':
                                        goto lf;
                                }
                                break;
                        case '\b':
-                               if (--w->ww_cur.c < 0) {
-                                       w->ww_cur.c = w->ww_w.nc - 1;
+                               if (--w->ww_cur.c < w->ww_w.l) {
+                                       w->ww_cur.c = w->ww_w.r - 1;
                                        goto up;
                                }
                                break;
                        case '\r':
                                        goto up;
                                }
                                break;
                        case '\r':
-                               w->ww_cur.c = 0;
+                               w->ww_cur.c = w->ww_w.l;
                                break;
                        case CTRL(g):
                                wwbell();
                                break;
                        case CTRL(g):
                                wwbell();
@@ -110,49 +125,59 @@ 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 'A':
                up:
                        case '@':
                                w->ww_insert = 1;
                                break;
                        case 'A':
                up:
-                               if (--w->ww_cur.r < 0) {
-                                       w->ww_cur.r = 0;
-                                       if (w->ww_scroll > 0)
-                                               wwscroll(w, -1);
-                                       else
-                                               wwinsline(w, 0);
+                               if (--w->ww_cur.r < w->ww_w.t) {
+                                       w->ww_cur.r = w->ww_w.t;
+                                       if (w->ww_w.t > w->ww_b.t) {
+                                               (void) wwscroll1(w, w->ww_i.t,
+                                                       w->ww_i.b, -1, 0);
+                                               w->ww_buf--;
+                                               w->ww_b.t++;
+                                               w->ww_b.b++;
+                                       } else
+                                               wwinsline(w, w->ww_b.t);
                                }
                                break;
                        case 'B':
                                goto lf;
                        case 'C':
                                }
                                break;
                        case 'B':
                                goto lf;
                        case 'C':
-                               goto right;
+               right:
+                               if (++w->ww_cur.c >= w->ww_w.r) {
+                                       w->ww_cur.c = w->ww_w.l;
+                                       goto lf;
+                               }
+                               break;
                        case 'E':
                        case 'E':
-                               w->ww_scroll = 0;
-                               w->ww_cur.c = w->ww_cur.r = 0;
-                               wwclreos(w, 0, 0);
+                               w->ww_buf -= w->ww_w.t - w->ww_b.t;
+                               w->ww_b.t = w->ww_w.t;
+                               w->ww_b.b = w->ww_b.t + w->ww_b.nr;
+                               w->ww_cur.r = w->ww_w.t;
+                               w->ww_cur.c = w->ww_w.l;
+                               wwclreos(w, w->ww_w.t, w->ww_w.l);
                                break;
                        case 'H':
                                break;
                        case 'H':
-                               w->ww_cur.c = w->ww_cur.r = 0;
+                               w->ww_cur.r = w->ww_w.t;
+                               w->ww_cur.c = w->ww_w.l;
                                break;
                        case 'J':
                                break;
                        case 'J':
-                               wwclreos(w, w->ww_scroll + w->ww_cur.r,
-                                       w->ww_cur.c);
+                               wwclreos(w, w->ww_cur.r, w->ww_cur.c);
                                break;
                        case 'K':
                                break;
                        case 'K':
-                               wwclreol(w, w->ww_scroll + w->ww_cur.r,
-                                       w->ww_cur.c);
+                               wwclreol(w, w->ww_cur.r, w->ww_cur.c);
                                break;
                        case 'L':
                                break;
                        case 'L':
-                               wwinsline(w, w->ww_scroll + w->ww_cur.r);
+                               wwinsline(w, w->ww_cur.r);
                                break;
                        case 'M':
                                break;
                        case 'M':
-                               wwdelline(w, w->ww_scroll + w->ww_cur.r);
+                               wwdelline(w, w->ww_cur.r);
                                break;
                        case 'N':
                                break;
                        case 'N':
-                               wwdelchar(w, w->ww_scroll + w->ww_cur.r,
-                                       w->ww_cur.c);
+                               wwdelchar(w, w->ww_cur.r, w->ww_cur.c);
                                break;
                        case 'O':
                                w->ww_insert = 0;
                                break;
                        case 'O':
                                w->ww_insert = 0;
@@ -175,11 +200,11 @@ int n;
                        }
                        break;
                case 2:
                        }
                        break;
                case 2:
-                       w->ww_cur.r = (c - ' ') % w->ww_w.nr;
-                       w->ww_wstate++;
+                       w->ww_cur.r = w->ww_w.t + (*p++ - ' ') % w->ww_w.nr;
+                       w->ww_wstate = 3;
                        break;
                case 3:
                        break;
                case 3:
-                       w->ww_cur.c = (c - ' ') % w->ww_w.nc;
+                       w->ww_cur.c = w->ww_w.l + (*p++ - ' ') % w->ww_w.nc;
                        w->ww_wstate = 0;
                        break;
                }
                        w->ww_wstate = 0;
                        break;
                }