home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / stty.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  3.8 KB  |  302 lines

  1. /*
  2.  * set teletype modes
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <sgtty.h>
  7.  
  8. struct
  9. {
  10.     char    *string;
  11.     int    speed;
  12. } speeds[] = {
  13.     "0",    B0,
  14.     "50",    B50,
  15.     "75",    B75,
  16.     "110",    B110,
  17.     "134",    B134,
  18.     "134.5",B134,
  19.     "150",    B150,
  20.     "200",    B200,
  21.     "300",    B300,
  22.     "600",    B600,
  23.     "1200",    B1200,
  24.     "1800",    B1800,
  25.     "2400",    B2400,
  26.     "4800",    B4800,
  27.     "9600",    B9600,
  28.     "exta",    EXTA,
  29.     "extb",    EXTB,
  30.     0,
  31. };
  32. struct
  33. {
  34.     char    *string;
  35.     int    set;
  36.     int    reset;
  37. } modes[] = {
  38.     "even",
  39.     EVENP, 0,
  40.  
  41.     "-even",
  42.     0, EVENP,
  43.  
  44.     "odd",
  45.     ODDP, 0,
  46.  
  47.     "-odd",
  48.     0, ODDP,
  49.  
  50.     "raw",
  51.     RAW, 0,
  52.  
  53.     "-raw",
  54.     0, RAW,
  55.  
  56.     "cooked",
  57.     0, RAW,
  58.  
  59.     "-nl",
  60.     CRMOD, 0,
  61.  
  62.     "nl",
  63.     0, CRMOD,
  64.  
  65.     "echo",
  66.     ECHO, 0,
  67.  
  68.     "-echo",
  69.     0, ECHO,
  70.  
  71.     "LCASE",
  72.     LCASE, 0,
  73.  
  74.     "lcase",
  75.     LCASE, 0,
  76.  
  77.     "-LCASE",
  78.     0, LCASE,
  79.  
  80.     "-lcase",
  81.     0, LCASE,
  82.  
  83.     "-tabs",
  84.     XTABS, 0,
  85.  
  86.     "tabs",
  87.     0, XTABS,
  88.  
  89.  
  90.     "cbreak",
  91.     CBREAK, 0,
  92.  
  93.     "-cbreak",
  94.     0, CBREAK,
  95.  
  96.     "cr0",
  97.     CR0, CR3,
  98.  
  99.     "cr1",
  100.     CR1, CR3,
  101.  
  102.     "cr2",
  103.     CR2, CR3,
  104.  
  105.     "cr3",
  106.     CR3, CR3,
  107.  
  108.     "tab0",
  109.     TAB0, XTABS,
  110.  
  111.     "tab1",
  112.     TAB1, XTABS,
  113.  
  114.     "tab2",
  115.     TAB2, XTABS,
  116.  
  117.     "nl0",
  118.     NL0, NL3,
  119.  
  120.     "nl1",
  121.     NL1, NL3,
  122.  
  123.     "nl2",
  124.     NL2, NL3,
  125.  
  126.     "nl3",
  127.     NL3, NL3,
  128.  
  129.     "ff0",
  130.     FF0, FF1,
  131.  
  132.     "ff1",
  133.     FF1, FF1,
  134.  
  135.     "bs0",
  136.     BS0, BS1,
  137.  
  138.     "bs1",
  139.     BS1, BS1,
  140.  
  141.     "33",
  142.     CR1, ALLDELAY,
  143.  
  144.     "tty33",
  145.     CR1, ALLDELAY,
  146.  
  147.     "37",
  148.     FF1+CR2+TAB1+NL1, ALLDELAY,
  149.  
  150.     "tty37",
  151.     FF1+CR2+TAB1+NL1, ALLDELAY,
  152.  
  153.     "05",
  154.     NL2, ALLDELAY,
  155.  
  156.     "vt05",
  157.     NL2, ALLDELAY,
  158.  
  159.     "tn",
  160.     CR1, ALLDELAY,
  161.  
  162.     "tn300",
  163.     CR1, ALLDELAY,
  164.  
  165.     "ti",
  166.     CR2, ALLDELAY,
  167.  
  168.     "ti700",
  169.     CR2, ALLDELAY,
  170.  
  171.     "tek",
  172.     FF1, ALLDELAY,
  173.  
  174.     0,
  175.     };
  176.  
  177. char    *arg;
  178. struct sgttyb mode;
  179.  
  180. main(argc, argv)
  181. char    *argv[];
  182. {
  183.     int i;
  184.  
  185.     gtty(1, &mode);
  186.     if(argc == 1) {
  187.         prmodes();
  188.         exit(0);
  189.     }
  190.     while(--argc > 0) {
  191.  
  192.         arg = *++argv;
  193.         if (eq("ek")){
  194.             mode.sg_erase = '#';
  195.             mode.sg_kill = '@';
  196.         }
  197.         if (eq("erase")) {
  198.             if (**++argv == '^')
  199.                 mode.sg_erase = (*argv)[1] & 037;
  200.             else
  201.                 mode.sg_erase = **argv;
  202.             argc--;
  203.         }
  204.         if (eq("kill")) {
  205.             if (**++argv == '^')
  206.                 mode.sg_kill = (*argv)[1] & 037;
  207.             else
  208.                 mode.sg_kill = **argv;
  209.             argc--;
  210.         }
  211.         if (eq("gspeed")) {
  212.             mode.sg_ispeed = B300;
  213.             mode.sg_ospeed = B9600;
  214.         }
  215.         if (eq("hup")) {
  216.             ioctl(1, TIOCHPCL, NULL);
  217.         } else
  218.         for(i=0; speeds[i].string; i++)
  219.             if(eq(speeds[i].string))
  220.                 mode.sg_ispeed = mode.sg_ospeed = speeds[i].speed;
  221.         for(i=0; modes[i].string; i++)
  222.             if(eq(modes[i].string)) {
  223.                 mode.sg_flags &= ~modes[i].reset;
  224.                 mode.sg_flags |= modes[i].set;
  225.             }
  226.         if(arg)
  227.             fprintf(stderr,"unknown mode: %s\n", arg);
  228.     }
  229.     stty(1,&mode);
  230. }
  231.  
  232. eq(string)
  233. char *string;
  234. {
  235.     int i;
  236.  
  237.     if(!arg)
  238.         return(0);
  239.     i = 0;
  240. loop:
  241.     if(arg[i] != string[i])
  242.         return(0);
  243.     if(arg[i++] != '\0')
  244.         goto loop;
  245.     arg = 0;
  246.     return(1);
  247. }
  248.  
  249. prmodes()
  250. {
  251.     register m;
  252.  
  253.     if(mode.sg_ispeed != mode.sg_ospeed) {
  254.         prspeed("input speed  ", mode.sg_ispeed);
  255.         prspeed("output speed ", mode.sg_ospeed);
  256.     } else
  257.         prspeed("speed ", mode.sg_ispeed);
  258.     if (mode.sg_erase < ' ')
  259.         fprintf(stderr, "erase = '^%c'; ", '@' + mode.sg_erase);
  260.     else
  261.         fprintf(stderr, "erase = '%c'; ", mode.sg_erase);
  262.     if (mode.sg_kill < ' ')
  263.         fprintf(stderr, "kill = '^%c'\n", '@' + mode.sg_kill);
  264.     else
  265.         fprintf(stderr, "kill = '%c'\n", mode.sg_kill);
  266.     m = mode.sg_flags;
  267.     if(m & EVENP)    fprintf(stderr,"even ");
  268.     if(m & ODDP)    fprintf(stderr,"odd ");
  269.     if(m & RAW)    fprintf(stderr,"raw ");
  270.     if(m & CRMOD)    fprintf(stderr,"-nl ");
  271.     if(m & ECHO)    fprintf(stderr,"echo ");
  272.     if(m & LCASE)    fprintf(stderr,"lcase ");
  273.     if((m & XTABS)==XTABS)    fprintf(stderr,"-tabs ");
  274.     if (m & CBREAK)    fprintf(stderr,"cbreak ");
  275.     delay((m&NLDELAY)/NL1,    "nl");
  276.     if ((m&TBDELAY)!=XTABS)
  277.         delay((m&TBDELAY)/TAB1,    "tab");
  278.     delay((m&CRDELAY)/CR1,    "cr");
  279.     delay((m&VTDELAY)/FF1,    "ff");
  280.     delay((m&BSDELAY)/BS1,    "bs");
  281.     fprintf(stderr,"\n");
  282. }
  283.  
  284. delay(m, s)
  285. char *s;
  286. {
  287.  
  288.     if(m)
  289.         fprintf(stderr,"%s%d ", s, m);
  290. }
  291.  
  292. int    speed[] = {
  293.     0,50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,0,0
  294. };
  295.  
  296. prspeed(c, s)
  297. char *c;
  298. {
  299.  
  300.     fprintf(stderr,"%s%d baud\n", c, speed[s]);
  301. }
  302.