added "more" command
[unix-history] / usr / src / usr.bin / window / cmd1.c
index f508fb2..0962c4b 100644 (file)
@@ -1,95 +1,95 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)cmd1.c      3.7 83/08/25";
+static char sccsid[] = "@(#)cmd1.c     3.29 %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 "defs.h"
 #include "defs.h"
+#include "char.h"
 
 c_window()
 {
        int col, row, xcol, xrow;
        int id;
 
 
 c_window()
 {
        int col, row, xcol, xrow;
        int id;
 
-       if ((id = findid()) < 0) {
-               error("Too many windows.");
+       if ((id = findid()) < 0)
                return;
                return;
-       }
        if (!terse)
        if (!terse)
-               (void) wwputs("Upper left corner: ", cmdwin);
+               wwputs("New window (upper left corner): ", cmdwin);
        col = 0;
        row = 1;
        wwadd(boxwin, framewin->ww_back);
        for (;;) {
        col = 0;
        row = 1;
        wwadd(boxwin, framewin->ww_back);
        for (;;) {
-               wwunbox(boxwin);
                wwbox(boxwin, row - 1, col - 1, 3, 3);
                wwsetcursor(row, col);
                wwbox(boxwin, row - 1, col - 1, 3, 3);
                wwsetcursor(row, col);
-               while (bpeekc() < 0)
-                       bread();
-               switch (getpos(&row, &col, 1, 0)) {
-               case -1:
+               while (wwpeekc() < 0)
+                       wwiomux();
+               switch (getpos(&row, &col, row > 1, 0,
+                       wwnrow - 1, wwncol - 1)) {
+               case 3:
                        wwunbox(boxwin);
                        wwdelete(boxwin);
                        wwunbox(boxwin);
                        wwdelete(boxwin);
-                       if (!terse)
-                               (void) wwputs("\r\nCancelled.  ", cmdwin);
                        return;
                        return;
-               case 1:
+               case 2:
+                       wwunbox(boxwin);
                        break;
                        break;
+               case 1:
+                       wwunbox(boxwin);
                case 0:
                        continue;
                }
                break;
        }
        if (!terse)
                case 0:
                        continue;
                }
                break;
        }
        if (!terse)
-               (void) wwputs("\r\nLower right corner: ", cmdwin);
+               wwputs("\nNew window (lower right corner): ", cmdwin);
        xcol = col;
        xrow = row;
        for (;;) {
        xcol = col;
        xrow = row;
        for (;;) {
-               wwunbox(boxwin);
                wwbox(boxwin, row - 1, col - 1,
                        xrow - row + 3, xcol - col + 3);
                wwsetcursor(xrow, xcol);
                wwflush();
                wwbox(boxwin, row - 1, col - 1,
                        xrow - row + 3, xcol - col + 3);
                wwsetcursor(xrow, xcol);
                wwflush();
-               while (bpeekc() < 0)
-                       bread();
-               switch (getpos(&xrow, &xcol, row, col)) {
-               case -1:
+               while (wwpeekc() < 0)
+                       wwiomux();
+               switch (getpos(&xrow, &xcol, row, col, wwnrow - 1, wwncol - 1))
+               {
+               case 3:
                        wwunbox(boxwin);
                        wwdelete(boxwin);
                        wwunbox(boxwin);
                        wwdelete(boxwin);
-                       if (!terse)
-                               (void) wwputs("\r\nCancelled.  ", cmdwin);
                        return;
                        return;
-               case 1:
+               case 2:
+                       wwunbox(boxwin);
                        break;
                        break;
+               case 1:
+                       wwunbox(boxwin);
                case 0:
                        continue;
                }
                break;
        }
                case 0:
                        continue;
                }
                break;
        }
-       wwunbox(boxwin);
        wwdelete(boxwin);
        if (!terse)
        wwdelete(boxwin);
        if (!terse)
-               (void) wwputs("\r\n", cmdwin);
+               wwputc('\n', cmdwin);
        wwcurtowin(cmdwin);
        wwcurtowin(cmdwin);
-       if (openwin(id, row, col, xrow-row+1, xcol-col+1, nbufline) == 0)
-               error("Can't open window.");
+       (void) openwin(id, row, col, xrow-row+1, xcol-col+1, nbufline,
+               (char *) 0, 1, 1, shellfile, shell);
 }
 
 }
 
-findid()
+getpos(row, col, minrow, mincol, maxrow, maxcol)
+register int *row, *col;
+int minrow, mincol;
+int maxrow, maxcol;
 {
 {
-       register i;
-
-       for (i = 0; i < NWINDOW && window[i] != 0; i++)
-               ;
-       return i < NWINDOW ? i : -1;
-}
-
-getpos(row, col, minrow, mincol)
-register int *row, *col, minrow, mincol;
-{
-       static int scount = 0;
+       static int scount;
        int count;
        char c;
        int count;
        char c;
+       int oldrow = *row, oldcol = *col;
 
 
-       while ((c = bgetc()) >= 0) {
+       while ((c = wwgetc()) >= 0) {
                switch (c) {
                case '0': case '1': case '2': case '3': case '4':
                case '5': case '6': case '7': case '8': case '9':
                switch (c) {
                case '0': case '1': case '2': case '3': case '4':
                case '5': case '6': case '7': case '8': case '9':
@@ -107,18 +107,18 @@ register int *row, *col, minrow, mincol;
                        *col = mincol;
                        break;
                case 'l':
                        *col = mincol;
                        break;
                case 'l':
-                       if ((*col += count) >= wwncol)
-                               *col = wwncol - 1;
+                       if ((*col += count) > maxcol)
+                               *col = maxcol;
                        break;
                case 'L':
                        break;
                case 'L':
-                       *col = wwncol - 1;
+                       *col = maxcol;
                        break;
                case 'j':
                        break;
                case 'j':
-                       if ((*row += count) >= wwnrow)
-                               *row = wwnrow - 1;
+                       if ((*row += count) > maxrow)
+                               *row = maxrow;
                        break;
                case 'J':
                        break;
                case 'J':
-                       *row = wwnrow - 1;
+                       *row = maxrow;
                        break;
                case 'k':
                        if ((*row -= count) < minrow)
                        break;
                case 'k':
                        if ((*row -= count) < minrow)
@@ -127,59 +127,17 @@ register int *row, *col, minrow, mincol;
                case 'K':
                        *row = minrow;
                        break;
                case 'K':
                        *row = minrow;
                        break;
-               case CTRL([):
-                       return -1;
+               case ctrl([):
+                       if (!terse)
+                               wwputs("\nCanceled.  ", cmdwin);
+                       return 3;
                case '\r':
                case '\r':
-                       return 1;
+                       return 2;
                default:
                        if (!terse)
                default:
                        if (!terse)
-                               (void) wwputs("\r\nType [hjklHJKL] to move, return to enter position, escape to cancel.", cmdwin);
+                               wwputs("\nType [hjklHJKL] to move, return to enter position, escape to cancel.", cmdwin);
                        wwbell();
                }
        }
                        wwbell();
                }
        }
-       return 0;
-}
-
-struct ww *
-openwin(id, row, col, nrow, ncol, nline)
-int id, nrow, ncol, row, col;
-{
-       register struct ww *w;
-
-       if (row <= 0)
-               return 0;
-       if (id < 0 && (id = findid()) < 0)
-               return 0;
-       if ((w = wwopen(WWO_PTY, nrow, ncol, row, col, nline)) == 0)
-               return 0;
-       w->ww_id = id;
-       window[id] = w;
-       w->ww_hasframe = 1;
-       wwcursor(w, 1);
-       wwadd(w, (selwin ? selwin : wwhead.ww_back));
-       setselwin(w);
-       wwupdate();
-       wwflush();
-       switch (wwfork(w)) {
-       case -1:
-               c_close(w);
-               return 0;
-       case 0:
-               execl(shell, shellname, 0);
-               perror(shell);
-               exit(1);
-       }
-       return w;
-}
-
-reframe()
-{
-       register struct ww *w;
-
-       wwunframe(framewin);
-       for (w = wwhead.ww_back; w != &wwhead; w = w->ww_back)
-               if (w->ww_hasframe) {
-                       wwframe(w, framewin);
-                       labelwin(w);
-               }
+       return oldrow != *row || oldcol != *col;
 }
 }