[comp.sys.amiga] Need help reading single character from keyboard without waiting

frank@altera.UUCP (Frank Heile) (01/28/88)

Problem:  How to read a single character from the keyboard without
            blocking the task to wait for input, and WITHOUT REQUIRING THE
            USER TO TYPE A TERMINATING <RETURN>.

My Current Solution:   (using Manx 3.4b)
-----------------------------------------------------------------
#include <stdio.h>

struct FileHandle * Input();

main()
{
    struct FileHandle * InHandle;
    char ch;

    InHandle = Input(); /* get the input file handle from DOS */
    setbuf(stdin,NULL); /* don't let the stdio package buffer the input */

    while (1)
    {
        /* this returns true if a character is available */
        if (WaitForChar(InHandle,1L)) /* I'm afraid to use 0L */
        {                             /* because of the Delay(0L) bug */
            ch = getchar();
            ...do something with this character...
            ...like change the mode...or like EXIT...
        }
        else
        {
            ...continue to do something else...
        }
    }
}
-----------------------------------------------------------------
(This is from memory...please excuse any errors)

THE PROBLEM:

Apparently WaitForChar() and the DOS Read() function will NOT recognise
keyboard input until a <RETURN> has been typed by the user.   The above 
code works just fine except that no characters are returned by getchar() 
until after a return is typed.  DOS must be buffering up the input till 
a <RETURN> is typed.

The getchar() eventually calls the DOS library Read() routine (I know 
because looked at the source since I bought the commercial package with
library source included).  So it appears that the DOS WaitForChar() and
Read() are the culprits.  I can't find anywhere in the RKM about how to 
make DOS not buffer the input - can anyone help?

What I need is a simple technique to read a single character from the 
keyboard.  This is for a very simple CLI type task that doesn't use
intuition.  I am sure that by using the intuition IDCMP port it could be
done. But I would like a simpler method which doesn't require opening a
window or interfacing to intuition.

louie@trantor.umd.edu (Louis A. Mamakos) (01/28/88)

Why don't you put the CLI console (or whatever, it sounds like you're trying to
read from a CON: window) into RAW mode.  Then the characters will be returned
one at a time.

Don't forget to return it to normal mode before you exit.

Louis A. Mamakos  WA3YMH    Internet: louie@TRANTOR.UMD.EDU
University of Maryland, Computer Science Center - Systems Programming

cherry@husc4.HARVARD.EDU (michael cherry) (01/29/88)

This is what I use.

----
#include <sgtty.h>
#include <stdio.h>

main()
{
struct sgttyb stty;
struct sgttyb ostty;
char c;

/* put the console in RAW mode */
ioctl(0, TIOCGETP,&stty);
ostty = stty;
stty.sg_flags |= RAW;
ioctl(0,TIOCSETP,&stty);

while(1) {
c = getchar(); /* read a character. Will get each character as they are typed */
/*  do something with the character */
}

/* return the console to its original state */
ioctl(0,TIOCSETP,&ostty);
}