/* * 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 #include #include #include #include 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 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); }