home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_200 / 201_01 / keybd.c < prev    next >
Text File  |  1979-12-31  |  2KB  |  111 lines

  1. #define TRUE    1
  2. #define FALSE   0
  3. #define CNTL_C  3
  4.  
  5. #define STOPPED 1
  6. #define RUNNING 2
  7.  
  8. char got_char = FALSE;
  9.        /* either true or false */
  10. char gotten_char;
  11.  
  12. int state = STOPPED;
  13.  
  14. /* keyboard ready -- Returns true
  15.    or false, according to whether not a character
  16.    is available from the keyboard.  It can be
  17.    called repeatedly before calling kbd_in() */
  18.  
  19. kbd_rdy()
  20. {
  21. if (got_char)
  22.     return TRUE;
  23.  
  24. #asm
  25.     mov dl,255
  26.     mov ah,6
  27.     int 21h
  28.     mov sp,bp
  29.     jz  not_rdy
  30.     mov byte got_char_,1
  31.     mov byte gotten_char_,al
  32.    not_rdy:
  33. #
  34.  
  35. return (int) got_char;
  36. }
  37.  
  38. /* keyboard in -- Returns a character,
  39.    as raw input, from the keyboard.  The NULL
  40.    character, 0 (CNTL @), can be returned */
  41.  
  42. kbd_in()
  43. {
  44. while ( ! kbd_rdy())
  45.    {}
  46. got_char = FALSE;
  47. return (int) gotten_char;
  48. }
  49.  
  50. /* keyboard character -- Returns a character,
  51.    as raw input, from the keyboard.  Control-C is
  52.    flagged for exiting the program. This routine
  53.    includes a background process of putting
  54.    periods to the console.  */
  55.  
  56. kbd_ch()
  57. {
  58. int ci;
  59.  
  60. for (;;) {
  61.     if (kbd_rdy()) {
  62.         if ((ci = kbd_in()) == CNTL_C)
  63.             exit();
  64.         return ci;
  65.         }
  66.     
  67.     /* Virtually any background process could
  68.        be carried out here.  It could be driven
  69.        as a finite state machine.  The current
  70.        state of the process could be stored in
  71.        a state variable and examined with a switch
  72.        statement.     */
  73.     
  74.     if (state == RUNNING)
  75.         co('.');
  76.     }
  77. }
  78.  
  79.  
  80. /* keyboard purge -- Eliminates any buffered
  81.    keystrokes.  It uses raw input. */
  82.  
  83. kbd_purge()
  84. {
  85.  
  86. while (kbd_rdy())
  87.     kbd_in();
  88. }
  89.  
  90. /******************************************/
  91.  
  92. main()
  93. {
  94. int ci;
  95.  
  96. kbd_purge();
  97. for (;;) {
  98.     ci = kbd_ch();
  99.     if (ci == '.') {
  100.         if (state == STOPPED)
  101.             state = RUNNING;
  102.         else
  103.             state = STOPPED;
  104.         }
  105.     co(ci);
  106.     /* co(...) is a DesMet C library function
  107.        for direct console output
  108.        (teletypewriter-style) */
  109.     }
  110. }
  111.