home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / CLIPPER / MISC / EMXLIB8F.ZIP / EMX / LIB / SYS / READ_KBD.C < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-02  |  1.5 KB  |  76 lines

  1. /* sys/read_kbd.c (emx+gcc) -- Copyright (c) 1993 by Eberhard Mattes */
  2.  
  3. #include <sys/emx.h>
  4. #define INCL_DOSFILEMGR
  5. #define INCL_KBD
  6. #include <os2emx.h>
  7. #include "syscalls.h"
  8.  
  9. static KBDINFO info;
  10. static KBDKEYINFO key;
  11.  
  12. int __read_kbd (int echo, int wait, int sig)
  13. {
  14.   USHORT info_rc, rc;
  15.   USHORT info_mask;
  16.   ULONG n;
  17.   int ret;
  18.   char c;
  19.   static int more = -1;
  20.  
  21.   if (more >= 0)
  22.     {
  23.       ret = more;
  24.       more = -1;
  25.       return (ret);
  26.     }
  27.   info_mask = 0;                /* Keep the compiler happy */
  28.   info.cb = sizeof (info);
  29.   info_rc = KbdGetStatus (&info, 0);
  30.   if (info_rc == 0)
  31.     {
  32.       info_mask = info.fsMask;
  33.       info.fsMask &= ~0x7f;
  34.       if (sig)
  35.         info.fsMask |= KEYBOARD_ASCII_MODE;
  36.       else
  37.         info.fsMask |= KEYBOARD_BINARY_MODE;
  38.       info.cb = sizeof (info);
  39.       KbdSetStatus (&info, 0);
  40.     }
  41.  
  42. again:
  43.   rc = KbdCharIn (&key, (wait ? IO_WAIT : IO_NOWAIT), 0);
  44.   if (rc != 0)
  45.     ret = -1;
  46.   else if (!(key.fbStatus & KBDTRF_FINAL_CHAR_IN))
  47.     {
  48.       if (wait)
  49.         goto again;
  50.       ret = -1;
  51.     }
  52.   else if ((key.chChar == 0 || key.chChar == 0xe0)
  53.            && key.fbStatus & KBDTRF_EXTENDED_CODE)
  54.     {
  55.       more = key.chScan;
  56.       ret = 0;
  57.     }
  58.   else
  59.     {
  60.       ret = key.chChar;
  61.       if (echo)
  62.         {
  63.           c = (char)ret;
  64.           DosWrite (1, &c, 1, &n);
  65.         }
  66.     }
  67.  
  68.   if (info_rc == 0)
  69.     {
  70.       info.cb = sizeof (info);
  71.       info.fsMask = info_mask;
  72.       KbdSetStatus (&info, 0);
  73.     }
  74.   return (ret);
  75. }
  76.