do case insensitive comparison on domain name
[unix-history] / usr / src / usr.bin / window / cmd.c
index 833c8e2..6e685da 100644 (file)
@@ -1,38 +1,61 @@
+/*
+ * Copyright (c) 1983 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)cmd.c       3.7 83/08/26";
-#endif
+static char sccsid[] = "@(#)cmd.c      3.38 (Berkeley) %G%";
+#endif /* not lint */
 
 #include "defs.h"
 
 #include "defs.h"
+#include "char.h"
 
 docmd()
 {
        register char c;
        register struct ww *w;
 
 docmd()
 {
        register char c;
        register struct ww *w;
+       char out = 0;
 
 
-       if (!terse)
-               wwadd(cmdwin, &wwhead);
-       if (selwin != 0)
-               wwcursor(selwin, 1);
-top:
-       while ((c = bgetc()) >= 0) {
+       while (!out && !quit) {
+               if ((c = wwgetc()) < 0) {
+                       if (terse)
+                               wwsetcursor(0, 0);
+                       else {
+                               wwputs("Command: ", cmdwin);
+                               wwcurtowin(cmdwin);
+                       }
+                       do
+                               wwiomux();
+                       while ((c = wwgetc()) < 0);
+               }
                if (!terse)
                if (!terse)
-                       (void) wwputs("\r\n", cmdwin);
+                       wwputc('\n', cmdwin);
                switch (c) {
                default:
                switch (c) {
                default:
-                       if (c == escapec)
-                               goto foo;
-                       break;
+                       if (c != escapec)
+                               break;
                case 'h': case 'j': case 'k': case 'l':
                case 'h': case 'j': case 'k': case 'l':
-               case CTRL(y):
-               case CTRL(e):
-               case CTRL(u):
-               case CTRL(d):
-               case CTRL(b):
-               case CTRL(f):
-               case CTRL(s):
-               case CTRL(q):
-               case CTRL([):
-               foo:
+               case ctrl('y'):
+               case ctrl('e'):
+               case ctrl('u'):
+               case ctrl('d'):
+               case ctrl('b'):
+               case ctrl('f'):
+               case ctrl('s'):
+               case ctrl('q'):
+               case ctrl('['):
                        if (selwin == 0) {
                                error("No window.");
                                continue;
                        if (selwin == 0) {
                                error("No window.");
                                continue;
@@ -42,30 +65,47 @@ top:
                case '1': case '2': case '3': case '4': case '5':
                case '6': case '7': case '8': case '9':
                        if ((w = window[c - '1']) == 0) {
                case '1': case '2': case '3': case '4': case '5':
                case '6': case '7': case '8': case '9':
                        if ((w = window[c - '1']) == 0) {
-                               wwbell();
+                               error("%c: No such window.", c);
                                break;
                        }
                        setselwin(w);
                                break;
                        }
                        setselwin(w);
-                       goto out;
+                       if (checkproc(selwin) >= 0)
+                                out = 1;
+                       break;
                case '%':
                        if ((w = getwin()) != 0)
                                setselwin(w);
                        break;
                case '%':
                        if ((w = getwin()) != 0)
                                setselwin(w);
                        break;
+               case ctrl('^'):
+                       if (lastselwin != 0) {
+                               setselwin(lastselwin);
+                               if (checkproc(selwin) >= 0)
+                                       out = 1;
+                       } else
+                               error("No previous window.");
+                       break;
                case 'c':
                        if ((w = getwin()) != 0)
                case 'c':
                        if ((w = getwin()) != 0)
-                               c_close(w);
-                       break;
-               case 'C':
-                       c_close((struct ww *)0);
+                               closewin(w);
                        break;
                case 'w':
                        c_window();
                        break;
                        break;
                case 'w':
                        c_window();
                        break;
-               case 'S':
-                       c_show();
+               case 'm':
+                       if ((w = getwin()) != 0)
+                               c_move(w);
+                       break;
+               case 'M':
+                       if ((w = getwin()) != 0)
+                               movewin(w, w->ww_alt.t, w->ww_alt.l);
+                       break;
+               case 's':
+                       if ((w = getwin()) != 0)
+                               c_size(w);
                        break;
                        break;
-               case 'L':
-                       c_list();
+               case 'S':
+                       if ((w = getwin()) != 0)
+                               sizewin(w, w->ww_alt.nr, w->ww_alt.nc);
                        break;
                case ':':
                        c_colon();
                        break;
                case ':':
                        c_colon();
@@ -82,114 +122,68 @@ top:
                case 'l':
                        (void) wwwrite(selwin, "\033C", 2);
                        break;
                case 'l':
                        (void) wwwrite(selwin, "\033C", 2);
                        break;
-               case CTRL(e):
+               case ctrl('e'):
                        wwscroll(selwin, 1);
                        break;
                        wwscroll(selwin, 1);
                        break;
-               case CTRL(y):
+               case ctrl('y'):
                        wwscroll(selwin, -1);
                        break;
                        wwscroll(selwin, -1);
                        break;
-               case CTRL(d):
+               case ctrl('d'):
                        wwscroll(selwin, selwin->ww_w.nr / 2);
                        break;
                        wwscroll(selwin, selwin->ww_w.nr / 2);
                        break;
-               case CTRL(u):
+               case ctrl('u'):
                        wwscroll(selwin, - selwin->ww_w.nr / 2);
                        break;
                        wwscroll(selwin, - selwin->ww_w.nr / 2);
                        break;
-               case CTRL(f):
+               case ctrl('f'):
                        wwscroll(selwin, selwin->ww_w.nr);
                        break;
                        wwscroll(selwin, selwin->ww_w.nr);
                        break;
-               case CTRL(b):
+               case ctrl('b'):
                        wwscroll(selwin, - selwin->ww_w.nr);
                        break;
                        wwscroll(selwin, - selwin->ww_w.nr);
                        break;
-               case CTRL(s):
-                       (void) write(selwin->ww_pty,
-                               &wwwintty.ww_tchars.t_stopc, 1);
+               case ctrl('s'):
+                       stopwin(selwin);
                        break;
                        break;
-               case CTRL(q):
-                       (void) write(selwin->ww_pty,
-                               &wwwintty.ww_tchars.t_startc, 1);
+               case ctrl('q'):
+                       startwin(selwin);
                        break;
                        break;
-               case CTRL(l):
+               case ctrl('l'):
                        wwredraw();
                        break;
                case '?':
                        c_help();
                        break;
                        wwredraw();
                        break;
                case '?':
                        c_help();
                        break;
-               case CTRL([):
-                       goto out;
-               case CTRL(z):
+               case ctrl('['):
+                       if (checkproc(selwin) >= 0)
+                               out = 1;
+                       break;
+               case ctrl('z'):
                        wwsuspend();
                        break;
                case 'q':
                        c_quit();
                        wwsuspend();
                        break;
                case 'q':
                        c_quit();
-                       if (quit)
-                               goto out;
-                       break;
-               /* undocumented commands */
-               case 's':
-                       c_stat();
-                       break;
-               case 't':
-                       c_time(RUSAGE_SELF);
-                       break;
-               case 'T':
-                       c_time(RUSAGE_CHILDREN);
-                       break;
-               /* debugging commands */
-               case 'M':
-                       if (!debug)
-                               goto badcmd;
-                       wwdumpsmap();
-                       break;
-               case 'V':
-                       if (!debug)
-                               goto badcmd;
-                       if ((w = getwin()) != 0)
-                               wwdumpnvis(w);
-                       break;
-               case 'D':
-                       if (!debug)
-                               goto badcmd;
-                       if ((w = getwin()) != 0)
-                               wwdumpcov(w);
-                       break;
-               case 'W':
-                       if (!debug)
-                               goto badcmd;
-                       if ((w = getwin()) != 0)
-                               wwdumpwin(w);
                        break;
                        break;
+               /* debugging stuff */
+               case '&':
+                       if (debug) {
+                               c_debug();
+                               break;
+                       }
                default:
                default:
-               badcmd:
                        if (c == escapec) {
                        if (c == escapec) {
-                               (void) write(selwin->ww_pty, &escapec, 1);
-                               goto out;
+                               if (checkproc(selwin) >= 0) {
+                                       (void) write(selwin->ww_pty,
+                                               &escapec, 1);
+                                       out = 1;
+                               }
+                       } else {
+                               if (!terse)
+                                       wwbell();
+                               error("Type ? for help.");
                        }
                        }
-                       if (!terse)
-                               wwbell();
-                       error("Type ? for help.");
-                       break;
-               }
-       }
-       if (terse)
-               wwsetcursor(0, 0);
-       else {
-               if (!terse)
-                       (void) wwputs("Command: ", cmdwin);
-               wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin));
-       }
-       while (bpeekc() < 0)
-               bread();
-       goto top;
-out:
-       if (!quit) {
-               curwin = selwin;
-               if (!terse) {
-                       wwdelete(cmdwin);
-                       reframe();
                }
        }
                }
        }
-       if (selwin != 0)
-               wwcursor(selwin, 0);
+       if (!quit)
+               setcmd(0);
 }
 
 struct ww *
 }
 
 struct ww *
@@ -199,10 +193,10 @@ getwin()
        struct ww *w = 0;
 
        if (!terse)
        struct ww *w = 0;
 
        if (!terse)
-               (void) wwputs("Which window? ", cmdwin);
-       wwsetcursor(wwcurrow(cmdwin), wwcurcol(cmdwin));
-       while ((c = bgetc()) < 0)
-               bread();
+               wwputs("Which window? ", cmdwin);
+       wwcurtowin(cmdwin);
+       while ((c = wwgetc()) < 0)
+               wwiomux();
        if (debug && c == 'c')
                w = cmdwin;
        else if (debug && c == 'f')
        if (debug && c == 'c')
                w = cmdwin;
        else if (debug && c == 'f')
@@ -211,65 +205,70 @@ getwin()
                w = boxwin;
        else if (c >= '1' && c < NWINDOW + '1')
                w = window[c - '1'];
                w = boxwin;
        else if (c >= '1' && c < NWINDOW + '1')
                w = window[c - '1'];
+       else if (c == '+')
+               w = selwin;
+       else if (c == '-')
+               w = lastselwin;
        if (w == 0)
                wwbell();
        if (!terse)
        if (w == 0)
                wwbell();
        if (!terse)
-               (void) wwputs("\r\n", cmdwin);
+               wwputc('\n', cmdwin);
        return w;
 }
 
        return w;
 }
 
-setselwin(w)
+checkproc(w)
 struct ww *w;
 {
 struct ww *w;
 {
-       if ((selwin = w) != 0)
-               front(w);
+       if (w->ww_state != WWS_HASPROC) {
+               error("No process in window.");
+               return -1;
+       }
+       return 0;
 }
 
 }
 
-front(w)
-register struct ww *w;
+setcmd(new)
+char new;
 {
 {
-       char moved = 0;
-
-       while (w->ww_back != framewin) {
-               wwmoveup(w);
-               moved = 1;
+       if (new && !incmd) {
+               if (!terse)
+                       wwadd(cmdwin, &wwhead);
+               if (selwin != 0)
+                       wwcursor(selwin, 1);
+               wwcurwin = 0;
+       } else if (!new && incmd) {
+               if (!terse) {
+                       wwdelete(cmdwin);
+                       reframe();
+               }
+               if (selwin != 0)
+                       wwcursor(selwin, 0);
+               wwcurwin = selwin;
        }
        }
-       if (moved)
-               reframe();
+       incmd = new;
 }
 
 }
 
-reframe()
+setterse(new)
+char new;
 {
 {
-       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);
-               }
+       if (incmd)
+               if (new && !terse) {
+                       wwdelete(cmdwin);
+                       reframe();
+               } else if (!new && terse)
+                       wwadd(cmdwin, &wwhead);
+       terse = new;
 }
 
 }
 
-labelwin(w)
-register struct ww *w;
+/*
+ * Set the current window.
+ */
+setselwin(w)
+struct ww *w;
 {
 {
-       int mode = w == selwin ? WWM_REV : 0;
-
-       if (w->ww_id >= 0) {
-               char buf[2];
-
-               buf[0] = w->ww_id + '1';
-               buf[1] = 0;
-               (void) wwlabel(w, framewin, 1, buf, mode);
-       }
-       if (w->ww_label) {
-               int col;
-
-               if (w->ww_center) {
-                       col = (w->ww_w.nc - strlen(w->ww_label)) / 2;
-                       col = MAX(3, col);
-               } else
-                       col = 3;
-               (void) wwlabel(w, framewin, col, w->ww_label, mode);
-       }
+       if (selwin == w)
+               return;
+       if (selwin != 0)
+               lastselwin = selwin;
+       if ((selwin = w) != 0)
+               front(selwin, 1);
 }
 }