BSD 3 development
[unix-history] / usr / src / cmd / stty.c
index a5da235..969e8cb 100644 (file)
@@ -175,6 +175,7 @@ struct
        };
 
 char   *arg;
        };
 
 char   *arg;
+struct tchars tc;
 struct sgttyb mode;
 
 main(argc, argv)
 struct sgttyb mode;
 
 main(argc, argv)
@@ -183,6 +184,7 @@ char        *argv[];
        int i;
 
        gtty(1, &mode);
        int i;
 
        gtty(1, &mode);
+       ioctl(1, TIOCGETC, &tc);
        if(argc == 1) {
                prmodes();
                exit(0);
        if(argc == 1) {
                prmodes();
                exit(0);
@@ -194,19 +196,53 @@ char      *argv[];
                        mode.sg_erase = '#';
                        mode.sg_kill = '@';
                }
                        mode.sg_erase = '#';
                        mode.sg_kill = '@';
                }
-               if (eq("erase")) {
+               if (eq("erase") && --argc) {
                        if (**++argv == '^')
                        if (**++argv == '^')
-                               mode.sg_erase = (*argv)[1] & 037;
+                               mode.sg_erase = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
                        else
                                mode.sg_erase = **argv;
                        else
                                mode.sg_erase = **argv;
-                       argc--;
                }
                }
-               if (eq("kill")) {
+               if (eq("intr") && --argc) {
                        if (**++argv == '^')
                        if (**++argv == '^')
-                               mode.sg_kill = (*argv)[1] & 037;
+                               tc.t_intrc = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
+                       else
+                               tc.t_intrc = **argv;
+               }
+               if (eq("quit") && --argc) {
+                       if (**++argv == '^')
+                               tc.t_quitc = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
+                       else
+                               tc.t_quitc = **argv;
+               }
+               if (eq("start") && --argc) {
+                       if (**++argv == '^')
+                               tc.t_startc = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
+                       else
+                               tc.t_startc = **argv;
+               }
+               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;
                        else
                                mode.sg_kill = **argv;
-                       argc--;
                }
                if (eq("gspeed")) {
                        mode.sg_ispeed = B300;
                }
                if (eq("gspeed")) {
                        mode.sg_ispeed = B300;
@@ -227,6 +263,7 @@ char        *argv[];
                        fprintf(stderr,"unknown mode: %s\n", arg);
        }
        stty(1,&mode);
                        fprintf(stderr,"unknown mode: %s\n", arg);
        }
        stty(1,&mode);
+       ioctl(1, TIOCSETC, &tc);
 }
 
 eq(string)
 }
 
 eq(string)
@@ -255,23 +292,23 @@ prmodes()
                prspeed("output speed ", mode.sg_ospeed);
        } else
                prspeed("speed ", mode.sg_ispeed);
                prspeed("output speed ", mode.sg_ospeed);
        } else
                prspeed("speed ", mode.sg_ispeed);
-       if (mode.sg_erase < ' ')
-               fprintf(stderr, "erase = '^%c'; ", '@' + mode.sg_erase);
-       else
-               fprintf(stderr, "erase = '%c'; ", mode.sg_erase);
-       if (mode.sg_kill < ' ')
-               fprintf(stderr, "kill = '^%c'\n", '@' + mode.sg_kill);
-       else
-               fprintf(stderr, "kill = '%c'\n", mode.sg_kill);
+       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");
        m = mode.sg_flags;
        if(m & EVENP)   fprintf(stderr,"even ");
        if(m & ODDP)    fprintf(stderr,"odd ");
        m = mode.sg_flags;
        if(m & EVENP)   fprintf(stderr,"even ");
        if(m & ODDP)    fprintf(stderr,"odd ");
-       if(m & RAW)     fprintf(stderr,"raw ");
-       if(m & CRMOD)   fprintf(stderr,"-nl ");
-       if(m & ECHO)    fprintf(stderr,"echo ");
-       if(m & LCASE)   fprintf(stderr,"lcase ");
-       if((m & XTABS)==XTABS)  fprintf(stderr,"-tabs ");
-       if (m & CBREAK) fprintf(stderr,"cbreak ");
+       fprintf(stderr,"-raw "+((m&RAW)!=0));
+       fprintf(stderr,"-nl "+((m&CRMOD)==0));
+       fprintf(stderr,"-echo "+((m&ECHO)!=0));
+       fprintf(stderr,"-lcase "+((m&LCASE)!=0));
+       fprintf(stderr,"-tabs "+((m&XTABS)!=XTABS));
+       fprintf(stderr,"-cbreak "+((m&CBREAK)!=0));
        delay((m&NLDELAY)/NL1,  "nl");
        if ((m&TBDELAY)!=XTABS)
                delay((m&TBDELAY)/TAB1, "tab");
        delay((m&NLDELAY)/NL1,  "nl");
        if ((m&TBDELAY)!=XTABS)
                delay((m&TBDELAY)/TAB1, "tab");
@@ -281,6 +318,31 @@ prmodes()
        fprintf(stderr,"\n");
 }
 
        fprintf(stderr,"\n");
 }
 
+pit(what, itsname, sep)
+       unsigned char what;
+       char *itsname, *sep;
+{
+
+       fprintf(stderr, "%s", itsname);
+       if (what == 0377) {
+               fprintf(stderr, " <undef>%s", sep);
+               return;
+       }
+       fprintf(stderr, " = ");
+       if (what & 0200) {
+               fprintf(stderr, "M-");
+               what &= ~ 0200;
+       }
+       if (what == 0177) {
+               fprintf(stderr, "^");
+               what = '?';
+       } else if (what < ' ') {
+               fprintf(stderr, "^");
+               what += '@';
+       }
+       fprintf(stderr, "%c%s", what, sep);
+}
+
 delay(m, s)
 char *s;
 {
 delay(m, s)
 char *s;
 {