home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / zip / mint / mntutl95.lzh / MNTUTL95 / STTY.C < prev    next >
C/C++ Source or Header  |  1993-08-03  |  5KB  |  277 lines

  1. #include <stdio.h>
  2. #include <ioctl.h>
  3. #include <ctype.h>
  4.  
  5. #ifndef B0
  6. #define B0 0
  7. #endif
  8. #ifndef B134
  9. #define B134 B135
  10. #endif
  11.  
  12. struct {
  13.     char *name;
  14.     short bits;
  15. } modes[] = {
  16.     { "crmod", CRMOD },
  17.     { "cbreak", CBREAK },
  18.     { "echo", ECHO },
  19.     { "even", EVENP },
  20.     { "odd", ODDP },
  21.     { "raw", RAW },
  22.     { "tandem", TANDEM },
  23.     { "tostop", TOSTOP },
  24.     { "xkey", XKEY }
  25. };
  26.  
  27. #define NMODES (sizeof(modes) / sizeof(modes[0]))
  28.  
  29. struct {
  30.     int num;
  31.     int baud;
  32. } bauds[] = {
  33.     {     B0,     0 },
  34.     {    B50,    50 },
  35.     {    B75,    75 },
  36.     {   B110,   110 },
  37.     {   B134,   134 },
  38.     {   B150,   150 },
  39.     {   B200,   200 },
  40.      {   B300,   300 },
  41.     {   B600,   600 },
  42.     {  B1200,  1200 },
  43.     {  B1800,  1800 },
  44.     {  B2400,  2400 },
  45.      {  B4800,  4800 },
  46.     {  B9600,  9600 },
  47.     { B19200, 19200 }
  48. };
  49.  
  50. #define NBAUDS (sizeof(bauds) / sizeof(bauds[0]))
  51.  
  52. void prchar(s,c)
  53. char *s;
  54. char c;
  55. {
  56.     printf("%s ",s);
  57.     if (c < ' ') printf("^%c ",c + '@');
  58.     else if (c == 127) printf("^? ");
  59.     else printf("%c ",c);
  60. }
  61.  
  62. void prmode(s,f)
  63. char *s;
  64. int f;
  65. {
  66.     printf("%s%s ",(f ? "" : "-"),s);
  67. }
  68.  
  69. int speed(sp)
  70. int sp;
  71. {
  72.   int i;
  73.  
  74.   for (i = 0; i<NBAUDS; i++) {
  75.     if (bauds[i].num == sp)
  76.       return (bauds[i].baud);
  77.   }
  78.   return -1;
  79. }
  80.  
  81. int baudnum(bs)
  82. char *bs;
  83. {
  84.   int bv;
  85.   int i;
  86.  
  87.   if (!(isdigit(*bs)))
  88.     return -1;
  89.   bv = atoi(bs);  
  90.   for (i = 0; i<NBAUDS; i++) {
  91.      if (bauds[i].baud == bv)
  92.       return (bauds[i].num);
  93.    }
  94.   return -1;
  95. }
  96.  
  97. /*
  98.  * atok: turns a string into an ASCII value.  ^x yields control-x
  99.  * for X in @A-Za-z[\]^_ as long as there are only two chars.
  100.  * ^? yields DEL (127) and other single chars yield themselves.
  101.  */
  102.  
  103. int atok(s)
  104. char *s;
  105. {
  106.     char c;
  107.  
  108.     if (!s || !*s) return -1;
  109.     c = *s++;
  110.     if (c == '^') {
  111.     c = *s++;
  112.     if (*s) return -1;
  113.     if (c == '?') return 127;
  114.     else if (c >= '@' && c <= '_') return (c - '@');
  115.     else if (c >= 'a' && c <= 'z') return (c - '`');
  116.     else return -1;
  117.     }
  118.     else if (*s) return -1;
  119.     else return c;
  120. }
  121.  
  122. main(argc,argv)
  123. int argc;
  124. char *argv[];
  125. {
  126.     int fd;
  127.     int i;
  128.     char *kp;
  129.     long err;
  130.     struct sgttyb sg;
  131.     struct tchars tc;
  132.     struct ltchars ltc;
  133.     int b;
  134.  
  135.     fd = 0;
  136.     if (!(isatty(fd))) {
  137.         if ((fd = open("U:\\dev\\tty",0)) < 0) {
  138.             perror("can't open tty");
  139.             exit(1);
  140.         }
  141.     }
  142.  
  143.     if (ioctl(fd,TIOCGETP,&sg) ||
  144.         ioctl(fd,TIOCGETC,&tc) ||
  145.         ioctl(fd,TIOCGLTC,<c)) {
  146.         perror("can't do ioctl");
  147.         exit(1);
  148.     }
  149.  
  150.     --argc, ++argv;
  151.  
  152.     if (!argc) {
  153.         /* print current state */
  154.         prchar("intr",tc.t_intrc);
  155.         prchar("quit",tc.t_quitc);
  156.         prchar("start",tc.t_startc);
  157.         prchar("stop",tc.t_stopc);
  158.         prchar("eof",tc.t_eofc);
  159.         prchar("brk",tc.t_brkc);
  160.         putchar('\n');
  161.  
  162.         prchar("susp",ltc.t_suspc);
  163.         prchar("dsusp",ltc.t_dsuspc);
  164.         prchar("rprnt",ltc.t_rprntc);
  165.         prchar("flush",ltc.t_flushc);
  166.         prchar("werase",ltc.t_werasc);
  167.         prchar("lnext",ltc.t_lnextc);
  168.         putchar('\n');
  169.  
  170.         printf("ispeed %d ospeed %d ",
  171.             speed(sg.sg_ispeed),
  172.             speed(sg.sg_ospeed));
  173.         prchar("erase",sg.sg_erase);
  174.         prchar("kill",sg.sg_kill);
  175.         putchar('\n');
  176.  
  177.         for (i=0; i<NMODES; i++) {
  178.             prmode(modes[i].name,sg.sg_flags & modes[i].bits);
  179.         }
  180.         putchar('\n');
  181.         exit(0);
  182.         }
  183.     while (argc) {
  184.         if ((b = baudnum(argv[0])) != -1) {
  185.         sg.sg_ispeed = sg.sg_ospeed = b;
  186.         }
  187.         else if (strcmp("intr",argv[0]) == 0) {
  188.         kp = &tc.t_intrc;
  189.         goto key;
  190.         }
  191.         else if (strcmp("quit",argv[0]) == 0) {
  192.         kp = &tc.t_quitc;
  193.         goto key;
  194.         }
  195.         else if (strcmp("start",argv[0]) == 0) {
  196.         kp = &tc.t_startc;
  197.         goto key;
  198.         }
  199.         else if (strcmp("stop",argv[0]) == 0) {
  200.         kp = &tc.t_stopc;
  201.         goto key;
  202.         }
  203.         else if (strcmp("eof",argv[0]) == 0) {
  204.         kp = &tc.t_eofc;
  205.         goto key;
  206.         }
  207.         else if (strcmp("brk",argv[0]) == 0) {
  208.         kp = &tc.t_brkc;
  209.         goto key;
  210.         }
  211.         else if (strcmp("susp",argv[0]) == 0) {
  212.         kp = <c.t_suspc;
  213.         goto key;
  214.         }
  215.         else if (strcmp("dsusp",argv[0]) == 0) {
  216.         kp = <c.t_dsuspc;
  217.         goto key;
  218.         }
  219.         else if (strcmp("rprnt",argv[0]) == 0) {
  220.         kp = <c.t_rprntc;
  221.         goto key;
  222.         }
  223.         else if (strcmp("flush",argv[0]) == 0) {
  224.         kp = <c.t_flushc;
  225.         goto key;
  226.         }
  227.         else if (strcmp("werase",argv[0]) == 0) {
  228.         kp = <c.t_werasc;
  229.         goto key;
  230.         }
  231.         else if (strcmp("lnext",argv[0]) == 0) {
  232.         kp = <c.t_lnextc;
  233. key:
  234.         if (argc == 1) {
  235.             printf("%s requires a key-name argument\n",argv[0]);
  236.             exit(1);
  237.         }
  238.         if ((*kp = atok(argv[1])) == -1) {
  239.             printf("Invalid key name for %s: %s\n",argv[0],argv[1]);
  240.             exit(1);
  241.         }
  242.         ++argv, --argc;
  243.         }
  244.         else if (**argv == '-') {
  245.         /* check against each mode */
  246.         for (i=0; i<NMODES; i++) {
  247.             if (strcmp(modes[i].name,&argv[0][1]) == 0) {
  248.             sg.sg_flags &= ~modes[i].bits;
  249.             goto ok1;
  250.             }
  251.         }
  252.         printf("No such mode: %c\n",argv[0][1]);
  253.         exit(1);
  254. ok1:        ;
  255.         }
  256.         else {
  257.         for (i=0; i<NMODES; i++) {
  258.             if (strcmp(modes[i].name,*argv) == 0) {
  259.             sg.sg_flags |= modes[i].bits;
  260.             goto ok2;
  261.             }
  262.         }
  263.         printf("No such mode: %s\n",*argv);
  264.         exit(1);
  265. ok2:        ;
  266.         }
  267.         ++argv, --argc;
  268.     } /* end of "while (argc)" */
  269.  
  270.     if (ioctl(fd,TIOCSETP,&sg) ||
  271.         ioctl(fd,TIOCSETC,&tc) ||
  272.         ioctl(fd,TIOCSLTC,<c)) {
  273.         perror("Can not set tty modes");
  274.     }
  275.     exit(0);
  276. }
  277.