error reporting
[unix-history] / usr / src / usr.bin / window / wwwrite.c
index 484befe..1e44f48 100644 (file)
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwwrite.c   1.5 83/07/27";
+static char *sccsid = "@(#)wwwrite.c   3.9 83/08/26";
 #endif
 
 #include "ww.h"
 
 #endif
 
 #include "ww.h"
 
-int wwnwrite;
-int wwnwritec;
-
 wwwrite(w, p, n)
 register struct ww *w;
 register char *p;
 wwwrite(w, p, n)
 register struct ww *w;
 register char *p;
-register n;
+int n;
 {
 {
-       register char c;
+       char c;
+       char hascursor = 0;
 
 
-       if (w == 0 || w->ww_win == 0)
-               return -1;
        wwnwrite++;
        wwnwritec += n;
        wwnwrite++;
        wwnwritec += n;
-       while (n-- > 0) {
+       if (hascursor = w->ww_hascursor)
+               wwcursor(w, 0);
+       while (--n >= 0) {
                c = *p++ & 0x7f;
                switch (w->ww_wstate) {
                case 0:
                c = *p++ & 0x7f;
                switch (w->ww_wstate) {
                case 0:
-                       if (c >= ' ' && c < 0x7f) {
-                               if (w->ww_insert)
-                                       Winschars(w->ww_win, 1);
-                               Wputc(c, w->ww_win);
+                       if (!ISCTRL(c)) {
+                               int i, j;
+                               register union ww_char *bp;
+                               union ww_char *bq;
+                               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) {
+                                       if (*smap++ == w->ww_index) {
+                                               *touched = 1;
+                                               ns++->c_w = bp++->c_w
+                                                       ^ *win++ << WWC_MSHIFT;
+                                       } else {
+                                               ns++;
+                                               bp++;
+                                               win++;
+                                       }
+                               }
+                               if ((w->ww_cur.c += j) >= w->ww_w.nc) {
+                                       w->ww_cur.c = 0;
+                                       goto lf;
+                               }
                                break;
                        }
                        switch (c) {
                        case '\n':
                                break;
                        }
                        switch (c) {
                        case '\n':
-                               Wputc(c, w->ww_win);
-                               if (w->ww_refresh)
-                                       Wrefresh(1);
+                               if (w->ww_mapnl)
+                                       w->ww_cur.c = 0;
+               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);
+                               }
                                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;
+                                       goto lf;
+                               }
+                               break;
                        case '\b':
                        case '\b':
+                               if (--w->ww_cur.c < 0) {
+                                       w->ww_cur.c = w->ww_w.nc - 1;
+                                       goto up;
+                               }
+                               break;
                        case '\r':
                        case '\r':
+                               w->ww_cur.c = 0;
+                               break;
                        case CTRL(g):
                        case CTRL(g):
-                               Wputc(c, w->ww_win);
+                               wwbell();
                                break;
                        case CTRL([):
                                w->ww_wstate = 1;
                                break;
                        case CTRL([):
                                w->ww_wstate = 1;
@@ -52,41 +115,44 @@ register n;
                                w->ww_insert = 1;
                                break;
                        case 'A':
                                w->ww_insert = 1;
                                break;
                        case 'A':
-                               Wcurup(w->ww_win, 1);
+               up:
+                               if (--w->ww_cur.r < 0) {
+                                       w->ww_cur.r = 0;
+                                       if (w->ww_scroll > 0)
+                                               wwscroll(w, -1);
+                                       else
+                                               wwinsline(w, 0);
+                               }
                                break;
                        case 'B':
                                break;
                        case 'B':
-                               Wcurdown(w->ww_win, 1);
-                               break;
+                               goto lf;
                        case 'C':
                        case 'C':
-                               Wcurright(w->ww_win, 1);
-                               break;
+                               goto right;
                        case 'E':
                        case 'E':
-                               WWcursor(w->ww_win, 0, 0);
-                               Wclear(w->ww_win, 2);
-                               /* always refresh */
-                               Wrefresh(1);
+                               w->ww_scroll = 0;
+                               w->ww_cur.c = w->ww_cur.r = 0;
+                               wwclreos(w, 0, 0);
                                break;
                        case 'H':
                                break;
                        case 'H':
-                               WWcursor(w->ww_win, 0, 0);
+                               w->ww_cur.c = w->ww_cur.r = 0;
                                break;
                        case 'J':
                                break;
                        case 'J':
-                               Wclear(w->ww_win, 0);
+                               wwclreos(w, w->ww_scroll + w->ww_cur.r,
+                                       w->ww_cur.c);
                                break;
                        case 'K':
                                break;
                        case 'K':
-                               Wclearline(w->ww_win, 0);
+                               wwclreol(w, w->ww_scroll + w->ww_cur.r,
+                                       w->ww_cur.c);
                                break;
                        case 'L':
                                break;
                        case 'L':
-                               Winslines(w->ww_win, 1);
-                               if (w->ww_refresh)
-                                       Wrefresh(1);
+                               wwinsline(w, w->ww_scroll + w->ww_cur.r);
                                break;
                        case 'M':
                                break;
                        case 'M':
-                               Wdellines(w->ww_win, 1);
-                               if (w->ww_refresh)
-                                       Wrefresh(1);
+                               wwdelline(w, w->ww_scroll + w->ww_cur.r);
                                break;
                        case 'N':
                                break;
                        case 'N':
-                               Wdelchars(w->ww_win, 1);
+                               wwdelchar(w, w->ww_scroll + w->ww_cur.r,
+                                       w->ww_cur.c);
                                break;
                        case 'O':
                                w->ww_insert = 0;
                                break;
                        case 'O':
                                w->ww_insert = 0;
@@ -94,18 +160,31 @@ register n;
                        case 'Y':
                                w->ww_wstate = 2;
                                break;
                        case 'Y':
                                w->ww_wstate = 2;
                                break;
+                       case 'p':
+                               w->ww_modes |= WWM_REV;
+                               break;
+                       case 'q':
+                               w->ww_modes &= ~WWM_REV;
+                               break;
+                       case 'r':
+                               w->ww_modes |= WWM_UL;
+                               break;
+                       case 's':
+                               w->ww_modes &= ~WWM_UL;
+                               break;
                        }
                        break;
                case 2:
                        }
                        break;
                case 2:
-                       WWcursor(w->ww_win, (c - ' ') % w->ww_i.nrow,
-                               w->ww_win->w_cursor.col);
+                       w->ww_cur.r = (c - ' ') % w->ww_w.nr;
                        w->ww_wstate++;
                        break;
                case 3:
                        w->ww_wstate++;
                        break;
                case 3:
-                       WWcursor(w->ww_win, w->ww_win->w_cursor.row,
-                               (c - ' ') % w->ww_i.ncol);
+                       w->ww_cur.c = (c - ' ') % w->ww_w.nc;
                        w->ww_wstate = 0;
                        break;
                }
        }
                        w->ww_wstate = 0;
                        break;
                }
        }
+       if (hascursor)
+               wwcursor(w, 1);
+       return 0;
 }
 }