#ifndef lint
-static char *sccsid = "@(#)cmd5.c 1.1 83/07/20";
+static char *sccsid = "@(#)cmd5.c 3.5 83/09/14";
#endif
#include "defs.h"
-#include <ctype.h>
-struct ww *openwin();
-struct ww *doopen();
-
-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 */
-
-dosource(filename)
-char *filename;
+/*
+ * Window movement.
+ */
+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;
+ struct ww *back = w->ww_back;
- 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;
- }
+ 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 (bpeekc() < 0)
+ bread();
+ wwunbox(boxwin);
+ switch (getpos(&row, &col, minrow, mincol, maxrow, maxcol)) {
+ case -1:
+ wwdelete(boxwin);
+ if (!terse)
+ (void) wwputs("\r\nCancelled. ", cmdwin);
+ return;
+ case 1:
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);
- break;
- default:
- if (error("%s: Unknown command.", *argv) < 0)
- goto bad;
+ case 0:
+ continue;
}
+ break;
}
- if (errwin != 0) {
- waitnl(errwin);
- closewin(errwin);
- errwin = 0;
- }
-bad:
- return 0;
+ wwdelete(boxwin);
+ if (!terse)
+ (void) wwputs("\r\n", cmdwin);
+ wwcurtowin(cmdwin);
+ wwdelete(w);
+ wwmove(w, row, col);
+ wwadd(w, back);
+ reframe();
}
-static
-breakup(p)
-register char *p;
+/*
+ * Weird stufff, don't ask.
+ */
+getminmax(x, n, a, b, curx, minx, maxx)
+register x, n, a, b;
+int *curx, *minx, *maxx;
{
- static char buf[BUFSIZ];
- register char *q = buf, **pp = argv;
-
- 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;
-}
-
-/*VARARGS1*/
-static
-error(fmt, a, b, c, d, e, f, g, h)
-char *fmt;
-{
-#define ERRLINES 10
- if (errwin == 0) {
- char buf[512];
-
- (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;
+ 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;
}
- wwprintf(errwin, "line %d: ", lineno);
- wwprintf(errwin, fmt, a, b, c, d, e, f, g, h);
- wwprintf(errwin, "\r\n");
- return 0;
}