/*
 * raw.c 
 *
 * This is a routine for setting a given stream to raw or cooked mode on the
 * Amiga . This is useful when you are using Lattice C to produce programs
 * that want to read single characters with the "getch()" or "fgetc" call. 
 *
 * Written : 18-Jun-87 By Chuck McManis.
 */

#include <proto/exec.h>
#include <proto/dos.h>
#include <stdio.h>
#include <ios1.h>
#include <error.h>

extern int      errno;		/* The error variable */

/*
 * Function raw() - Convert the specified file pointer to 'raw' mode. This
 * only works on TTY's and essentially keeps DOS from translating keys for
 * you, also (BIG WIN) it means getch() will return immediately rather than
 * wait for a return. You lose editing features though. 
 */
long
raw(fp)
    FILE           *fp;

{
    struct MsgPort *mp;		/* The File Handle message port */
    struct FileHandle *afh;
    struct UFB     *ufb;
    long            Arg[1], res;

    ufb = (struct UFB *) chkufb(fileno(fp));	/* Step one, get the file
						 * handle */
    afh = (struct FileHandle *) (ufb->ufbfh);

    if (!IsInteractive(afh)) {	/* Step two, check to see if it's a console */
	errno = ENOTTY;
	return (-1);
    }
    /* Step three, get it's message port. */
    mp = ((struct FileHandle *) (BADDR(afh)))->fh_Type;
    Arg[0] = -1L;
    res = SendPacket(mp, ACTION_SCREEN_MODE, Arg, 1);	/* Put it in RAW: mode */
    if (res == 0) {
	errno = ENXIO;
	return (-1);
    }
    return (0);
}

/*
 * Function - cooked() this function returns the designate file pointer to
 * it's normal, wait for a <CR> mode. This is exactly like raw() except that
 * it sends a 0 to the console to make it back into a CON: from a RAW: 
 */

long
cooked(fp)
    FILE           *fp;

{
    struct MsgPort *mp;		/* The File Handle message port */
    struct FileHandle *afh;
    struct UFB     *ufb;
    long            Arg[1], res;

    ufb = (struct UFB *) chkufb(fileno(fp));
    afh = (struct FileHandle *) (ufb->ufbfh);
    if (!IsInteractive(afh)) {
	errno = ENOTTY;
	return (-1);
    }
    mp = ((struct FileHandle *) (BADDR(afh)))->fh_Type;
    Arg[0] = 0;
    res = SendPacket(mp, ACTION_SCREEN_MODE, Arg, 1);
    if (res == 0) {
	errno = ENXIO;
	return (-1);
    }
    return (0);
}
