date and time created 83/07/20 19:32:21 by edward
authorEdward Wang <edward@ucbvax.Berkeley.EDU>
Thu, 21 Jul 1983 10:32:21 +0000 (02:32 -0800)
committerEdward Wang <edward@ucbvax.Berkeley.EDU>
Thu, 21 Jul 1983 10:32:21 +0000 (02:32 -0800)
SCCS-vsn: usr.bin/window/cmd5.c 1.1

usr/src/usr.bin/window/cmd5.c [new file with mode: 0644]

diff --git a/usr/src/usr.bin/window/cmd5.c b/usr/src/usr.bin/window/cmd5.c
new file mode 100644 (file)
index 0000000..1fe0618
--- /dev/null
@@ -0,0 +1,144 @@
+#ifndef lint
+static char *sccsid = "@(#)cmd5.c      1.1 83/07/20";
+#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;
+{
+       register FILE *f;
+       register char **pp;
+       char buf[BUFSIZ];
+       int id, row, col, nrow, ncol;
+       struct ww *w;
+
+       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);
+                       break;
+               default:
+                       if (error("%s: Unknown command.", *argv) < 0)
+                               goto bad;
+               }
+       }
+       if (errwin != 0) {
+               waitnl(errwin);
+               closewin(errwin);
+               errwin = 0;
+       }
+bad:
+       return 0;
+}
+
+static
+breakup(p)
+register char *p;
+{
+       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;
+       }
+       wwprintf(errwin, "line %d: ", lineno);
+       wwprintf(errwin, fmt, a, b, c, d, e, f, g, h);
+       wwprintf(errwin, "\r\n");
+       return 0;
+}