added "more" command
[unix-history] / usr / src / usr.bin / window / cmd5.c
index 1fe0618..23fb50e 100644 (file)
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)cmd5.c      1.1 83/07/20";
+static char sccsid[] = "@(#)cmd5.c     3.14 %G%";
 #endif
 
 #endif
 
-#include "defs.h"
-#include <ctype.h>
+/*
+ * Copyright (c) 1983 Regents of the University of California,
+ * All rights reserved.  Redistribution permitted subject to
+ * the terms of the Berkeley Software License Agreement.
+ */
 
 
-struct ww *openwin();
-struct ww *doopen();
+#include "defs.h"
 
 
-static char *sourcefilename;
-static int lineno;                     /* current line number in source file */
-static char *argv[100];                        /* one line broken up into words */
-static int argc;
-static struct ww *errwin;              /* window for error reporting */
-static int errlineno;                  /* lineno in errwin */
+/*
+ * Window movement.
+ */
 
 
-dosource(filename)
-char *filename;
+c_move(w)
+register struct ww *w;
 {
 {
-       register FILE *f;
-       register char **pp;
-       char buf[BUFSIZ];
-       int id, row, col, nrow, ncol;
-       struct ww *w;
+       int col, row;
+       int mincol, minrow;
+       int maxcol, maxrow;
+       int curcol, currow;
 
 
-       if ((f = fopen(filename, "r")) == 0)
-               return -1;
-       sourcefilename = filename;
-       for (lineno = 1; fgets(buf, sizeof buf, f) != 0; lineno++) {
-               if (*buf == '#')
-                       continue;
-               breakup(buf);
-               if (argc == 0)
-                       continue;
-               pp = argv;
-               switch (**pp++) {
-               case 'w':
-                       if ((id = findid()) < 0) {
-                               if (error("Too many windows.") < 0)
-                                       goto bad;
-                               break;
-                       }
-                       if (argc < 5) {
-                               if (error("Syntax error.") < 0)
-                                       goto bad;
-                               break;
-                       }
-                       if (**pp == '*')
-                               row = 0;
-                       else
-                               row = atoi(*pp);
-                       if (**++pp == '*')
-                               col = 0;
-                       else
-                               col = atoi(*pp);
-                       if (**++pp == '*')
-                               nrow = WRows - row;
-                       else
-                               nrow = atoi(*pp);
-                       if (**++pp == '*')
-                               ncol = WCols - col;
-                       else
-                               ncol = atoi(*pp);
-                       w = doopen(id, nrow, ncol, row, col);
-                       if (w == 0) {
-                               if (error("Can't open window: row %d col %d, %d rows %d cols.", row, col, nrow, ncol) < 0)
-                                       goto bad;
-                               break;
-                       }
-                       break;
-               case '%':
-                       id = atoi(*pp);
-                       if (id < 1 || id > 9 || (w = wwfind(id)) == 0) {
-                               if (error("%d: No such window.", id) < 0)
-                                       goto bad;
-                               break;
-                       }
-                       setselwin(w);
+       if (!terse)
+               wwputs("New window position: ", cmdwin);
+       col = w->ww_w.l;
+       row = w->ww_w.t;
+       wwadd(boxwin, framewin->ww_back);
+       for (;;) {
+               wwbox(boxwin, row - 1, col - 1, w->ww_w.nr + 2, w->ww_w.nc + 2);
+               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 (wwpeekc() < 0)
+                       wwiomux();
+               switch (getpos(&row, &col, minrow, mincol, maxrow, maxcol)) {
+               case 3:
+                       wwunbox(boxwin);
+                       wwdelete(boxwin);
+                       return;
+               case 2:
+                       wwunbox(boxwin);
                        break;
                        break;
-               default:
-                       if (error("%s: Unknown command.", *argv) < 0)
-                               goto bad;
+               case 1:
+                       wwunbox(boxwin);
+               case 0:
+                       continue;
                }
                }
+               break;
        }
        }
-       if (errwin != 0) {
-               waitnl(errwin);
-               closewin(errwin);
-               errwin = 0;
-       }
-bad:
-       return 0;
+       wwdelete(boxwin);
+       if (!terse)
+               wwputc('\n', cmdwin);
+       wwcurtowin(cmdwin);
+       movewin(w, row, col);
 }
 
 }
 
-static
-breakup(p)
-register char *p;
+movewin(w, row, col)
+register struct ww *w;
 {
 {
-       static char buf[BUFSIZ];
-       register char *q = buf, **pp = argv;
+       struct ww *back = w->ww_back;
 
 
-       for (; *p && *p != '\n' && (*p == ' ' || *p == '\t'); p++)
-               ;
-       while (*p && *p != '\n' && pp < &argv[sizeof argv/sizeof *argv - 1]) {
-               *pp++ = q;
-               if (isalnum(*p)) {
-                       while (*p && *p != '\n' && *p != ' ' && *p != '\t')
-                               *q++ = *p++;
-               } else
-                       *q++ = *p++;
-               *q++ = 0;
-               for (; *p && *p != '\n' && (*p == ' ' || *p == '\t'); p++)
-                       ;
-       }
-       *pp = 0;
-       argc = pp - argv;
+       w->ww_alt.t = w->ww_w.t;
+       w->ww_alt.l = w->ww_w.l;
+       wwdelete(w);
+       wwmove(w, row, col);
+       wwadd(w, back);
+       reframe();
 }
 
 }
 
-/*VARARGS1*/
-static
-error(fmt, a, b, c, d, e, f, g, h)
-char *fmt;
+/*
+ * Weird stufff, don't ask.
+ */
+getminmax(x, n, a, b, curx, minx, maxx)
+register x, n, a, b;
+int *curx, *minx, *maxx;
 {
 {
-#define ERRLINES 10
-       if (errwin == 0) {
-               char buf[512];
+       if (x < 0)
+               *curx = x + n - 1;
+       else
+               *curx = x;
 
 
-               (void) sprintf(buf, "Errors from %s", sourcefilename);
-               if ((errwin = openwin(ERRLINES, buf)) == 0) {
-                       wwprintf(cmdwin, "Can't open error window.  ");
-                       return -1;
-               }
-               errlineno = 0;
-       }
-       if (errlineno++ > ERRLINES - 4) {
-               waitnl(errwin);
-               wwprintf(errwin, "\r\n");
-               errlineno = 0;
-       }
-       wwprintf(errwin, "line %d: ", lineno);
-       wwprintf(errwin, fmt, a, b, c, d, e, f, g, h);
-       wwprintf(errwin, "\r\n");
-       return 0;
+       if (x <= a)
+               *minx = 1 - n;
+       else if (x <= b - n)
+               *minx = a;
+       else
+               *minx = b - n;
+
+       if (x >= b - n)
+               *maxx = b - 1;
+       else if (x >= a)
+               *maxx = b - n;
+       else
+               *maxx = a;
 }
 }