home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume17 / e2 / part02 / terminal.c < prev   
C/C++ Source or Header  |  1989-02-08  |  3KB  |  123 lines

  1. #include "e.h"
  2.  
  3. /*
  4.  * terminal()
  5.  *
  6.  * Handles the terminal. Must be first called as terminal(TERM_RECORD)
  7.  * which remembers the initial terminal charcteristics and sets up the
  8.  * "erase" variable. Thereafter can be called either as
  9.  *
  10.  * terminal(TERM_SET)  --  to turn on CBREAK and ECHO off.
  11.  * terminal(TERM_RESET)  --  to set the terminal to its original state.
  12.  *
  13.  * This code is definitely a mess. If you don't have Sysv defined it does 
  14.  * things which are known to work for BSD, SUN, ULTRIX and DYNIX.
  15.  *
  16.  */
  17. void
  18. terminal(what)
  19. int what;
  20. {
  21. #ifdef Sysv
  22.     static struct termio initial_blk;
  23.     static struct termio set_blk;
  24. #else
  25.     static struct sgttyb initial_blk;
  26.     static struct sgttyb set_blk;
  27. #endif /* Sysv */
  28.  
  29.  
  30.  
  31.     switch(what){
  32.  
  33.         case TERM_RECORD:{
  34. #ifdef Sysv
  35.             if (ioctl(0, TCGETA, (char *)&initial_blk) == -1){
  36.                 e_error("Could not ioctl stdin.");
  37.             }
  38.  
  39. #ifdef STRUCT_ASST
  40.             /* Copy the structure in one hit. */
  41.             set_blk = initial_blk;
  42. #else
  43.             /* Copy the structure field by field. */
  44.             set_blk.c_iflag = initial_blk.c_iflag;
  45.             set_blk.c_oflag = initial_blk.c_oflag;
  46.             set_blk.c_cflag = initial_blk.c_cflag;
  47.             set_blk.c_line = initial_blk.c_line;
  48.  
  49.             for (i = 0; i < NCC; i++){
  50.                 set_blk.c_cc[i] = initial_blk.c_cc[i];
  51.             }
  52. #endif /* STRUCT_ASST */
  53.  
  54.             /* And now set up the set_blk. */
  55.             set_blk.c_lflag = (initial_blk.c_lflag &= ~(ICANON|ECHO|ECHONL));
  56.             set_blk.c_lflag &= ICANON;
  57.             erase = set_blk.c_cc[VERASE];
  58.             set_blk.c_cc[VMIN] = 1;
  59.             set_blk.c_cc[VTIME] = 0;
  60. #else
  61.             if (ioctl(0, TIOCGETP, (char *)&initial_blk) == -1){
  62.                 e_error("Could not ioctl stdin.");
  63.             }
  64.  
  65. #ifdef STRUCT_ASST
  66.             /* Copy the structure in one hit. */
  67.             set_blk = initial_blk;
  68. #else
  69.             /* Copy the structure field by field. */
  70.             set_blk.sg_ispeed = initial_blk.sg_ispeed;
  71.             set_blk.sg_ospeed = initial_blk.sg_ospeed;
  72.             set_blk.sg_erase = initial_blk.sg_erase;
  73.             set_blk.sg_kill = initial_blk.sg_kill;
  74.             set_blk.sg_flags = initial_blk.sg_flags;
  75. #endif /* STRUCT_ASST */
  76.  
  77.             /* And now set up the set_blk. */
  78.             erase = set_blk.sg_erase;
  79.  
  80.             /* Go into CBREAK mode or stay that way if we are already. */
  81.             set_blk.sg_flags |= CBREAK;
  82.  
  83.             /* Turn off echo. */
  84.             set_blk.sg_flags &= ~ECHO;
  85. #endif /* Sysv */
  86.             break;
  87.         }
  88.  
  89.         case TERM_SET:{
  90. #ifdef Sysv
  91.             if (ioctl(0, TCSETA, (char *)&set_blk) == -1){
  92.                 e_error("Could not ioctl stdin.");
  93.             }
  94. #else
  95.             if (ioctl(0, TIOCSETP, (char *)&set_blk) == -1){
  96.                 e_error("Could not ioctl stdin.");
  97.             };
  98. #endif /* Sysv */
  99.             break;
  100.         }
  101.  
  102.         case TERM_RESET:{
  103. #ifdef Sysv
  104.             if (ioctl(0, TCSETA, (char *)&initial_blk) == -1){
  105.                 e_error("Could not ioctl stdin.");
  106.             }
  107. #else
  108.             if (ioctl(0, TIOCSETP, (char *)&initial_blk) == -1){
  109.                 e_error("Could not ioctl stdin.");
  110.             }
  111. #endif /* Sysv */
  112.             break;
  113.         }
  114.  
  115.         default:{
  116.             /* Look! - no ifdefs here. */
  117.             e_error("terminal() called with unknown parameter (%d).", what);
  118.         }
  119.     }
  120.     return;
  121. }
  122.  
  123.