home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional / OS2PRO194.ISO / os2 / editor / less / ttyin.c < prev    next >
C/C++ Source or Header  |  1994-01-31  |  2KB  |  122 lines

  1. /*
  2.  * Routines dealing with getting input from the keyboard (i.e. from the user).
  3.  */
  4.  
  5. #include "less.h"
  6. #if __MSDOS__
  7. #include <io.h>
  8. #include <stdio.h>
  9. #include <fcntl.h>
  10. #include <signal.h>
  11. #endif
  12.  
  13. #ifdef OS2
  14. #undef NULL
  15. #undef VOID
  16. #undef CONTROL
  17. #define INCL_DOSPROCESS
  18. #define INCL_SUB
  19. #define INCL_NOPM
  20. #include <os2.h>
  21. #include <stdio.h>
  22. #endif
  23.  
  24. static int tty;
  25.  
  26. /*
  27.  * Open keyboard for input.
  28.  */
  29.     public void
  30. open_getchr()
  31. {
  32. #if __MSDOS__
  33.     /*
  34.      * Open a new handle to CON: in binary mode
  35.      * for unbuffered keyboard read.
  36.      */
  37.     tty = open("CON", O_RDONLY|O_BINARY);
  38. #else
  39.     /*
  40.      * Just use file descriptor 2, which in Unix
  41.      * is usually attached to the screen and keyboard.
  42.      */
  43.     tty = 2;
  44. #endif
  45. }
  46.  
  47. /*
  48.  * Get a character from the keyboard.
  49.  */
  50.     public int
  51. getchr()
  52. {
  53.         int c;
  54.     int result;
  55.  
  56.         flush();
  57.  
  58.     do
  59.     {
  60. #ifdef OS2
  61.                 static int ext, scan;
  62.                 KBDKEYINFO ki;
  63.  
  64.                 if ( ext )
  65.                 {
  66.                   ext = 0;
  67.                   c = scan;
  68.                 }
  69.                 else
  70.                 {
  71.                   KbdCharIn(&ki, IO_WAIT, 0);
  72.                   c = ki.chChar;
  73.  
  74.                   if ( c == 0 || c == 0xE0 )
  75.                   {
  76.                     c = 0xE0;
  77.                     ext = 1;
  78.                     scan = ki.chScan;
  79.                   }
  80.                 }
  81.                 result = 1;
  82. #else
  83.         result = iread(tty, &c, sizeof(char));
  84.         if (result == READ_INTR)
  85.             return (READ_INTR);
  86. #endif
  87.         if (result < 0)
  88.         {
  89.             /*
  90.              * Don't call error() here,
  91.              * because error calls getchr!
  92.              */
  93.             quit(1);
  94.         }
  95. #if __MSDOS__
  96.         /*
  97.          * In raw read, we don't see ^C so look here for it.
  98.          */
  99.         if (c == '\003')
  100.             raise(SIGINT);
  101. #endif
  102.         /*
  103.          * Various parts of the program cannot handle
  104.          * an input character of '\0'.
  105.          * If a '\0' was actually typed, convert it to '\200' here.
  106.          */
  107.         if (c == '\0')
  108.             c = '\200';
  109.     } while (result != 1);
  110.  
  111.     return (c);
  112. }
  113.  
  114.  
  115. #ifdef OS2
  116. sleep(x)
  117. int x;
  118. {
  119.   DosSleep(1000L * x);
  120. }
  121. #endif
  122.