BSD 4 release
[unix-history] / usr / src / cmd / stty.c
index 969e8cb..7639887 100644 (file)
@@ -1,3 +1,4 @@
+static char *sccsid ="@(#)stty.c       4.2 (Berkeley) 10/11/80";
 /*
  * set teletype modes
  */
 /*
  * set teletype modes
  */
@@ -34,236 +35,244 @@ struct
        char    *string;
        int     set;
        int     reset;
        char    *string;
        int     set;
        int     reset;
+       int     lset;
+       int     lreset;
 } modes[] = {
 } modes[] = {
-       "even",
-       EVENP, 0,
-
-       "-even",
-       0, EVENP,
-
-       "odd",
-       ODDP, 0,
-
-       "-odd",
-       0, ODDP,
-
-       "raw",
-       RAW, 0,
-
-       "-raw",
-       0, RAW,
-
-       "cooked",
-       0, RAW,
-
-       "-nl",
-       CRMOD, 0,
-
-       "nl",
-       0, CRMOD,
-
-       "echo",
-       ECHO, 0,
-
-       "-echo",
-       0, ECHO,
-
-       "LCASE",
-       LCASE, 0,
-
-       "lcase",
-       LCASE, 0,
-
-       "-LCASE",
-       0, LCASE,
-
-       "-lcase",
-       0, LCASE,
-
-       "-tabs",
-       XTABS, 0,
-
-       "tabs",
-       0, XTABS,
-
-
-       "cbreak",
-       CBREAK, 0,
-
-       "-cbreak",
-       0, CBREAK,
-
-       "cr0",
-       CR0, CR3,
-
-       "cr1",
-       CR1, CR3,
-
-       "cr2",
-       CR2, CR3,
-
-       "cr3",
-       CR3, CR3,
-
-       "tab0",
-       TAB0, XTABS,
-
-       "tab1",
-       TAB1, XTABS,
-
-       "tab2",
-       TAB2, XTABS,
-
-       "nl0",
-       NL0, NL3,
-
-       "nl1",
-       NL1, NL3,
-
-       "nl2",
-       NL2, NL3,
-
-       "nl3",
-       NL3, NL3,
-
-       "ff0",
-       FF0, FF1,
-
-       "ff1",
-       FF1, FF1,
-
-       "bs0",
-       BS0, BS1,
-
-       "bs1",
-       BS1, BS1,
-
-       "33",
-       CR1, ALLDELAY,
-
-       "tty33",
-       CR1, ALLDELAY,
-
-       "37",
-       FF1+CR2+TAB1+NL1, ALLDELAY,
-
-       "tty37",
-       FF1+CR2+TAB1+NL1, ALLDELAY,
-
-       "05",
-       NL2, ALLDELAY,
-
-       "vt05",
-       NL2, ALLDELAY,
-
-       "tn",
-       CR1, ALLDELAY,
-
-       "tn300",
-       CR1, ALLDELAY,
-
-       "ti",
-       CR2, ALLDELAY,
-
-       "ti700",
-       CR2, ALLDELAY,
-
-       "tek",
-       FF1, ALLDELAY,
-
+       "even",         EVENP, 0, 0, 0,
+       "-even",        0, EVENP, 0, 0,
+       "odd",          ODDP, 0, 0, 0,
+       "-odd",         0, ODDP, 0, 0,
+       "raw",          RAW, 0, 0, 0,
+       "-raw",         0, RAW, 0, 0,
+       "cooked",       0, RAW, 0, 0,
+       "-nl",          CRMOD, 0, 0, 0,
+       "nl",           0, CRMOD, 0, 0,
+       "echo",         ECHO, 0, 0, 0,
+       "-echo",        0, ECHO, 0, 0,
+       "LCASE",        LCASE, 0, 0, 0,
+       "lcase",        LCASE, 0, 0, 0,
+       "-LCASE",       0, LCASE, 0, 0,
+       "-lcase",       0, LCASE, 0, 0,
+       "-tabs",        XTABS, 0, 0, 0,
+       "tabs",         0, XTABS, 0, 0,
+       "tandem",       TANDEM, 0, 0, 0,
+       "-tandem",      0, TANDEM, 0, 0,
+       "cbreak",       CBREAK, 0, 0, 0,
+       "-cbreak",      0, CBREAK, 0, 0,
+       "cr0",          CR0, CR3, 0, 0,
+       "cr1",          CR1, CR3, 0, 0,
+       "cr2",          CR2, CR3, 0, 0,
+       "cr3",          CR3, CR3, 0, 0,
+       "tab0",         TAB0, XTABS, 0, 0,
+       "tab1",         TAB1, XTABS, 0, 0,
+       "tab2",         TAB2, XTABS, 0, 0,
+       "nl0",          NL0, NL3, 0, 0,
+       "nl1",          NL1, NL3, 0, 0,
+       "nl2",          NL2, NL3, 0, 0,
+       "nl3",          NL3, NL3, 0, 0,
+       "ff0",          FF0, FF1, 0, 0,
+       "ff1",          FF1, FF1, 0, 0,
+       "bs0",          BS0, BS1, 0, 0,
+       "bs1",          BS1, BS1, 0, 0,
+       "33",           CR1, ALLDELAY, 0, 0,
+       "tty33",        CR1, ALLDELAY, 0, 0,
+       "37",           FF1+CR2+TAB1+NL1, ALLDELAY, 0, 0,
+       "tty37",        FF1+CR2+TAB1+NL1, ALLDELAY, 0, 0,
+       "05",           NL2, ALLDELAY, 0, 0,
+       "vt05",         NL2, ALLDELAY, 0, 0,
+       "tn",           CR1, ALLDELAY, 0, 0,
+       "tn300",        CR1, ALLDELAY, 0, 0,
+       "ti",           CR2, ALLDELAY, 0, 0,
+       "ti700",        CR2, ALLDELAY, 0, 0,
+       "tek",          FF1, ALLDELAY, 0, 0,
+       "crtbs",        0, 0, LCRTBS, LPRTERA,
+       "-crtbs",       0, 0, 0, LCRTBS,
+       "prterase",     0, 0, LPRTERA, LCRTBS+LCRTKIL+LCRTERA,
+       "-prterase",    0, 0, 0, LPRTERA,
+       "crterase",     0, 0, LCRTERA, LPRTERA,
+       "-crterase",    0, 0, 0, LCRTERA,
+       "crtkill",      0, 0, LCRTKIL, LPRTERA,
+       "-crtkill",     0, 0, 0, LCRTKIL,
+       "tilde",        0, 0, LTILDE, 0,
+       "-tilde",       0, 0, 0, LTILDE,
+       "mdmbuf",       0, 0, LMDMBUF, 0,
+       "-mdmbuf",      0, 0, 0, LMDMBUF,
+       "litout",       0, 0, LLITOUT, 0,
+       "-litout",      0, 0, 0, LLITOUT,
+       "tostop",       0, 0, LTOSTOP, 0,
+       "-tostop",      0, 0, 0, LTOSTOP,
+       "flusho",       0, 0, LFLUSHO, 0,
+       "-flusho",      0, 0, 0, LFLUSHO,
+       "nohang",       0, 0, LNOHANG, 0,
+       "-nohang",      0, 0, 0, LNOHANG,
+       "etxack",       0, 0, LETXACK, 0,
+       "-etxack",      0, 0, 0, LETXACK,
+       "intrup",       0, 0, LINTRUP, 0,
+       "-intrup",      0, 0, 0, LINTRUP,
+       "ctlecho",      0, 0, LCTLECH, 0,
+       "-ctlecho",     0, 0, 0, LCTLECH,
+       "pendin",       0, 0, LPENDIN, 0,
+       "-pendin",      0, 0, 0, LPENDIN,
        0,
        0,
-       };
+};
 
 
-char   *arg;
 struct tchars tc;
 struct tchars tc;
+struct ltchars ltc;
 struct sgttyb mode;
 struct sgttyb mode;
+int    lmode;
+int    oldisc, ldisc;
+
+#define        CTRL(x)         ('x'&037)
+
+struct special {
+       char    *name;
+       char    *cp;
+       char    def;
+} special[] = {
+       "erase",        &mode.sg_erase,         CTRL(h),
+       "kill",         &mode.sg_kill,          '@',
+       "intr",         &tc.t_intrc,            0177,
+       "quit",         &tc.t_quitc,            CTRL(\\\\),
+       "start",        &tc.t_startc,           CTRL(q),
+       "stop",         &tc.t_stopc,            CTRL(s),
+       "eof",          &tc.t_eofc,             CTRL(d),
+       "brk",          &tc.t_brkc,             0377,
+       "susp",         &ltc.t_suspc,           CTRL(z),
+       "dsusp",        &ltc.t_dsuspc,          CTRL(y),
+       "rprnt",        &ltc.t_rprntc,          CTRL(r),
+       "flush",        &ltc.t_flushc,          CTRL(o),
+       "werase",       &ltc.t_werasc,          CTRL(w),
+       "lnext",        &ltc.t_lnextc,          CTRL(v),
+       0
+};
+char   *arg;
 
 
-main(argc, argv)
-char   *argv[];
+int    argc;
+char   **argv;
+main(iargc, iargv)
+char   **iargv;
 {
        int i;
 {
        int i;
+       register struct special *sp;
+       char obuf[BUFSIZ];
 
 
+       setbuf(stderr, obuf);
+       argc = iargc;
+       argv = iargv;
        gtty(1, &mode);
        gtty(1, &mode);
+       ioctl(1, TIOCGETD, &ldisc);
+       oldisc = ldisc;
        ioctl(1, TIOCGETC, &tc);
        ioctl(1, TIOCGETC, &tc);
+       ioctl(1, TIOCLGET, &lmode);
+       ioctl(1, TIOCGLTC, &ltc);
        if(argc == 1) {
        if(argc == 1) {
-               prmodes();
+               prmodes(0);
+               exit(0);
+       }
+       if (argc == 2 && !strcmp(argv[1], "all")) {
+               prmodes(1);
                exit(0);
        }
                exit(0);
        }
+       if (argc == 2 && !strcmp(argv[1], "everything")) {
+               prmodes(2);
+               exit(0);
+       }
+/*
+       if (argc == 2 && !strcmp(argv[1], "all")) {
+               prmodes(2);
+               exit(0);
+       }
+*/
        while(--argc > 0) {
        while(--argc > 0) {
-
                arg = *++argv;
                if (eq("ek")){
                        mode.sg_erase = '#';
                        mode.sg_kill = '@';
                arg = *++argv;
                if (eq("ek")){
                        mode.sg_erase = '#';
                        mode.sg_kill = '@';
+                       continue;
                }
                }
-               if (eq("erase") && --argc) {
-                       if (**++argv == '^')
-                               mode.sg_erase = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
-                       else
-                               mode.sg_erase = **argv;
-               }
-               if (eq("intr") && --argc) {
-                       if (**++argv == '^')
-                               tc.t_intrc = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
-                       else
-                               tc.t_intrc = **argv;
+               if (eq("new")){
+                       ldisc = NTTYDISC;
+                       if (ioctl(1, TIOCSETD, &ldisc)<0)
+                               perror("ioctl");
+                       continue;
                }
                }
-               if (eq("quit") && --argc) {
-                       if (**++argv == '^')
-                               tc.t_quitc = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
-                       else
-                               tc.t_quitc = **argv;
+               if (eq("newcrt")){
+                       ldisc = NTTYDISC;
+                       lmode &= ~LPRTERA;
+                       lmode |= LCRTBS|LCTLECH;
+                       if (mode.sg_ospeed >= B1200)
+                               lmode |= LCRTERA|LCRTKIL;
+                       if (ioctl(1, TIOCSETD, &ldisc)<0)
+                               perror("ioctl");
+                       continue;
                }
                }
-               if (eq("start") && --argc) {
-                       if (**++argv == '^')
-                               tc.t_startc = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
-                       else
-                               tc.t_startc = **argv;
+               if (eq("crt")){
+                       lmode &= ~LPRTERA;
+                       lmode |= LCRTBS|LCTLECH;
+                       if (mode.sg_ospeed >= B1200)
+                               lmode |= LCRTERA|LCRTKIL;
+                       continue;
                }
                }
-               if (eq("stop") && --argc) {
-                       if (**++argv == '^')
-                               tc.t_stopc = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
-                       else
-                               tc.t_stopc = **argv;
-               }
-               if (eq("eof") && --argc) {
-                       if (**++argv == '^')
-                               tc.t_eofc = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
-                       else
-                               tc.t_eofc = **argv;
-               }
-               if (eq("brk") && --argc) {
-                       if (**++argv == '^')
-                               tc.t_brkc = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
-                       else
-                               tc.t_brkc = **argv;
-               }
-               if (eq("kill") && --argc) {
-                       if (**++argv == '^')
-                               mode.sg_kill = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
-                       else
-                               mode.sg_kill = **argv;
+               if (eq("old")){
+                       ldisc = 0;
+                       if (ioctl(1, TIOCSETD, &ldisc)<0)
+                               perror("ioctl");
+                       continue;
                }
                }
+               for (sp = special; sp->name; sp++)
+                       if (eq(sp->name)) {
+                               if (--argc == 0)
+                                       goto done;
+                               if (**++argv == 'u')
+                                       *sp->cp = 0377;
+                               else if (**argv == '^')
+                                       *sp->cp = (*(argv[1]) == '?') ?
+                                           0177 : (*argv)[1] & 037;
+                               else
+                                       *sp->cp = **argv;
+                               goto cont;
+                       }
                if (eq("gspeed")) {
                        mode.sg_ispeed = B300;
                        mode.sg_ospeed = B9600;
                if (eq("gspeed")) {
                        mode.sg_ispeed = B300;
                        mode.sg_ospeed = B9600;
+                       continue;
                }
                if (eq("hup")) {
                        ioctl(1, TIOCHPCL, NULL);
                }
                if (eq("hup")) {
                        ioctl(1, TIOCHPCL, NULL);
-               } else
+                       continue;
+               }
                for(i=0; speeds[i].string; i++)
                for(i=0; speeds[i].string; i++)
-                       if(eq(speeds[i].string))
+                       if(eq(speeds[i].string)) {
                                mode.sg_ispeed = mode.sg_ospeed = speeds[i].speed;
                                mode.sg_ispeed = mode.sg_ospeed = speeds[i].speed;
+                               goto cont;
+                       }
+               if (eq("speed")) {
+                       gtty(open("/dev/tty", 0), &mode);
+                       for(i=0; speeds[i].string; i++)
+                               if (mode.sg_ospeed == speeds[i].speed) {
+                                       printf("%s\n", speeds[i].string);
+                                       exit(0);
+                               }
+                       printf("unknown\n");
+                       exit(1);
+               }
                for(i=0; modes[i].string; i++)
                        if(eq(modes[i].string)) {
                                mode.sg_flags &= ~modes[i].reset;
                                mode.sg_flags |= modes[i].set;
                for(i=0; modes[i].string; i++)
                        if(eq(modes[i].string)) {
                                mode.sg_flags &= ~modes[i].reset;
                                mode.sg_flags |= modes[i].set;
+                               lmode &= ~modes[i].lreset;
+                               lmode |= modes[i].lset;
                        }
                if(arg)
                        fprintf(stderr,"unknown mode: %s\n", arg);
                        }
                if(arg)
                        fprintf(stderr,"unknown mode: %s\n", arg);
+cont:
+               ;
        }
        }
-       stty(1,&mode);
+done:
+       ioctl(1, TIOCSETN, &mode);
        ioctl(1, TIOCSETC, &tc);
        ioctl(1, TIOCSETC, &tc);
+       ioctl(1, TIOCSLTC, &ltc);
+       ioctl(1, TIOCLSET, &lmode);
 }
 
 eq(string)
 }
 
 eq(string)
@@ -283,49 +292,189 @@ loop:
        return(1);
 }
 
        return(1);
 }
 
-prmodes()
+prmodes(all)
 {
        register m;
 {
        register m;
-
+       int any;
+
+       if(ldisc==NETLDISC)
+               fprintf(stderr, "net discipline, ");
+       else if(ldisc==NTTYDISC)
+               fprintf(stderr, "new tty, ");
+       else if(all==2)
+               fprintf(stderr, "old tty, ");
        if(mode.sg_ispeed != mode.sg_ospeed) {
        if(mode.sg_ispeed != mode.sg_ospeed) {
-               prspeed("input speed  ", mode.sg_ispeed);
+               prspeed("input speed ", mode.sg_ispeed);
                prspeed("output speed ", mode.sg_ospeed);
        } else
                prspeed("speed ", mode.sg_ispeed);
                prspeed("output speed ", mode.sg_ospeed);
        } else
                prspeed("speed ", mode.sg_ispeed);
-       pit(mode.sg_erase, "erase", "; ");
-       pit(mode.sg_kill, "kill", "; ");
-       pit(tc.t_intrc, "intr", "; ");
-       pit(tc.t_quitc, "quit", "\n");
-       pit(tc.t_startc, "start", "; ");
-       pit(tc.t_stopc, "stop", "; ");
-       pit(tc.t_eofc, "eof", "; ");
-       pit(tc.t_brkc, "brk", "\n");
+       fprintf(stderr, all==2 ? "\n" : "; ");
        m = mode.sg_flags;
        m = mode.sg_flags;
-       if(m & EVENP)   fprintf(stderr,"even ");
-       if(m & ODDP)    fprintf(stderr,"odd ");
-       fprintf(stderr,"-raw "+((m&RAW)!=0));
-       fprintf(stderr,"-nl "+((m&CRMOD)==0));
-       fprintf(stderr,"-echo "+((m&ECHO)!=0));
-       fprintf(stderr,"-lcase "+((m&LCASE)!=0));
+       if(all==2 || (m&(EVENP|ODDP))!=(EVENP|ODDP)) {
+               if(m & EVENP)   fprintf(stderr,"even ");
+               if(m & ODDP)    fprintf(stderr,"odd ");
+       }
+       if(all==2 || m&RAW)
+               fprintf(stderr,"-raw "+((m&RAW)!=0));
+       if(all==2 || (m&CRMOD)==0)
+               fprintf(stderr,"-nl "+((m&CRMOD)==0));
+       if(all==2 || (m&ECHO)==0)
+               fprintf(stderr,"-echo "+((m&ECHO)!=0));
+       if(all==2 || (m&LCASE))
+               fprintf(stderr,"-lcase "+((m&LCASE)!=0));
+       if(all==2 || (m&TANDEM))
+               fprintf(stderr,"-tandem "+((m&TANDEM)!=0));
        fprintf(stderr,"-tabs "+((m&XTABS)!=XTABS));
        fprintf(stderr,"-tabs "+((m&XTABS)!=XTABS));
-       fprintf(stderr,"-cbreak "+((m&CBREAK)!=0));
-       delay((m&NLDELAY)/NL1,  "nl");
+       if(all==2 || (m&CBREAK))
+               fprintf(stderr,"-cbreak "+((m&CBREAK)!=0));
+       if(all==2 || (m&NLDELAY))
+               delay((m&NLDELAY)/NL1,  "nl");
        if ((m&TBDELAY)!=XTABS)
                delay((m&TBDELAY)/TAB1, "tab");
        if ((m&TBDELAY)!=XTABS)
                delay((m&TBDELAY)/TAB1, "tab");
-       delay((m&CRDELAY)/CR1,  "cr");
-       delay((m&VTDELAY)/FF1,  "ff");
-       delay((m&BSDELAY)/BS1,  "bs");
-       fprintf(stderr,"\n");
+       if(all==2 || (m&CRDELAY))
+               delay((m&CRDELAY)/CR1,  "cr");
+       if(all==2 || (m&VTDELAY))
+               delay((m&VTDELAY)/FF1,  "ff");
+       if(all==2 || (m&BSDELAY))
+               delay((m&BSDELAY)/BS1,  "bs");
+       if (all)
+               fprintf(stderr,"\n");
+#define        lpit(what,str) \
+       if (all==2||(lmode&what)) { \
+               fprintf(stderr,str+((lmode&what)!=0)); any++; \
+       }
+       if (ldisc == NTTYDISC) {
+               int newcrt = (lmode&(LCTLECH|LCRTBS)) == (LCTLECH|LCRTBS) &&
+                   (lmode&(LCRTERA|LCRTKIL)) ==
+                     ((mode.sg_ospeed > B300) ? LCRTERA|LCRTKIL : 0);
+               if (newcrt) {
+                       if (all==2)
+                               fprintf(stderr, "crt: (crtbs crterase crtkill ctlecho) ");
+                       else
+                               fprintf(stderr, "crt ");
+                       any++;
+               } else {
+                       lpit(LCRTBS, "-crtbs ");
+                       lpit(LCRTERA, "-crterase ");
+                       lpit(LCRTKIL, "-crtkill ");
+                       lpit(LCTLECH, "-ctlecho ");
+                       lpit(LPRTERA, "-prterase ");
+               }
+               lpit(LTOSTOP, "-tostop ");
+               lpit(LINTRUP, "-intrup ");
+               if (all==2) {
+                       fprintf(stderr, "\n");
+                       any = 0;
+               }
+               lpit(LTILDE, "-tilde ");
+               lpit(LFLUSHO, "-flusho ");
+               lpit(LMDMBUF, "-mdmbuf ");
+               lpit(LLITOUT, "-litout ");
+               lpit(LNOHANG, "-nohang ");
+               lpit(LETXACK, "-etxack ");
+               lpit(LPENDIN, "-pendin ");
+               if (any)
+                       fprintf(stderr,"\n");
+       } else if (!all)
+               fprintf(stderr,"\n");
+       if (all) {
+               switch (ldisc) {
+
+               case 0:
+                       fprintf(stderr,"\
+erase  kill   intr   quit   stop   eof\
+\n");
+                       pcol(mode.sg_erase, -1);
+                       pcol(mode.sg_kill, -1);
+                       pcol(tc.t_intrc, -1);
+                       pcol(tc.t_quitc, -1);
+                       pcol(tc.t_stopc, tc.t_startc);
+                       pcol(tc.t_eofc, tc.t_brkc);
+                       fprintf(stderr,"\n");
+                       break;
+
+               case NTTYDISC:
+                       fprintf(stderr,"\
+erase  kill   werase rprnt  flush  lnext  susp   intr   quit   stop   eof\
+\n"); 
+                       pcol(mode.sg_erase, -1);
+                       pcol(mode.sg_kill, -1);
+                       pcol(ltc.t_werasc, -1);
+                       pcol(ltc.t_rprntc, -1);
+                       pcol(ltc.t_flushc, -1);
+                       pcol(ltc.t_lnextc, -1);
+                       pcol(ltc.t_suspc, ltc.t_dsuspc);
+                       pcol(tc.t_intrc, -1);
+                       pcol(tc.t_quitc, -1);
+                       pcol(tc.t_stopc, tc.t_startc);
+                       pcol(tc.t_eofc, tc.t_brkc);
+                       fprintf(stderr,"\n");
+                       break;
+               }
+       } else if (ldisc != NETLDISC) {
+               register struct special *sp;
+               int first = 1;
+               for (sp = special; sp->name; sp++) {
+                       if ((*sp->cp&0377) != (sp->def&0377)) {
+                               pit(*sp->cp, sp->name, first ? "" : ", ");
+                               first = 0;
+                       };
+                       if (sp->cp == &tc.t_brkc && ldisc == 0)
+                               break;
+               }
+               if (first == 0)
+                       fprintf(stderr, "\n");
+       }
+}
+
+pcol(ch1, ch2)
+       int ch1, ch2;
+{
+       int nout = 0;
+
+       ch1 &= 0377;
+       ch2 &= 0377;
+       if (ch1 == ch2)
+               ch2 = 0377;
+       for (; ch1 != 0377 || ch2 != 0377; ch1 = ch2, ch2 = 0377) {
+               if (ch1 == 0377)
+                       continue;
+               if (ch1 & 0200) {
+                       fprintf(stderr, "M-");
+                       nout += 2;
+                       ch1 &= ~ 0200;
+               }
+               if (ch1 == 0177) {
+                       fprintf(stderr, "^");
+                       nout++;
+                       ch1 = '?';
+               } else if (ch1 < ' ') {
+                       fprintf(stderr, "^");
+                       nout++;
+                       ch1 += '@';
+               }
+               fprintf(stderr, "%c", ch1);
+               nout++;
+               if (ch2 != 0377) {
+                       fprintf(stderr, "/");
+                       nout++;
+               }
+       }
+       while (nout < 7) {
+               fprintf(stderr, " ");
+               nout++;
+       }
 }
 
 pit(what, itsname, sep)
 }
 
 pit(what, itsname, sep)
-       unsigned char what;
+       unsigned what;
        char *itsname, *sep;
 {
 
        char *itsname, *sep;
 {
 
-       fprintf(stderr, "%s", itsname);
+       what &= 0377;
+       fprintf(stderr, "%s%s", sep, itsname);
        if (what == 0377) {
        if (what == 0377) {
-               fprintf(stderr, " <undef>%s", sep);
+               fprintf(stderr, " <undef>");
                return;
        }
        fprintf(stderr, " = ");
                return;
        }
        fprintf(stderr, " = ");
@@ -340,7 +489,7 @@ pit(what, itsname, sep)
                fprintf(stderr, "^");
                what += '@';
        }
                fprintf(stderr, "^");
                what += '@';
        }
-       fprintf(stderr, "%c%s", what, sep);
+       fprintf(stderr, "%c", what);
 }
 
 delay(m, s)
 }
 
 delay(m, s)
@@ -359,5 +508,5 @@ prspeed(c, s)
 char *c;
 {
 
 char *c;
 {
 
-       fprintf(stderr,"%s%d baud\n", c, speed[s]);
+       fprintf(stderr,"%s%d baud",  c, speed[s]);
 }
 }