gno/bin/less/ttyin.c
gdr-ftp 784e3de7cd Initial checkin of aroff, binprint, center, less, ls, make, makemake,
passwd, ps, purge, shutdown, stty, upper, and vi.  These sources are
for the versions of the utils shipped with GNO v2.0.4.
1998-03-09 08:30:21 +00:00

87 lines
1.4 KiB
C

/*
* Routines dealing with getting input from the keyboard (i.e. from the user).
*/
#pragma noroot
#include "less.h"
#include <fcntl.h>
#include <stdio.h>
#if __MSDOS__
#include <io.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#endif
#ifdef _ORCAC_
segment "LoadSegONE";
#endif
static int tty;
/*
* Open keyboard for input.
*/
public void
open_getchr(void)
{
#if __MDDOS__
/*
* Open a new handle to CON: in binary mode
* for unbuffered keyboard read.
*/
tty = open("CON", O_RDONLY|O_BINARY);
#else
/*
* Try /dev/tty.
* If that doesn't work, use file descriptor 2,
* which in Unix is usually attached to the screen,
* but also usually lets you read from the keyboard.
*/
tty = open(".tty", O_RDWR);
if (tty < 0)
tty = 2;
#endif
}
/*
* Get a character from the keyboard.
*/
public int
getchr(void)
{
char c;
int result;
do
{
result = iread(tty, &c, sizeof(char));
if (result == READ_INTR)
return (READ_INTR);
if (result < 0)
{
/*
* Don't call error() here,
* because error calls getchr!
*/
quit(1);
}
#if __MSDOS__
/*
* In raw read, we don't see ^C so look here for it.
*/
if (c == '\003')
raise(SIGINT);
#endif
/*
* Various parts of the program cannot handle
* an input character of '\0'.
* If a '\0' was actually typed, convert it to '\200' here.
*/
if (c == '\0')
c = '\200';
} while (result != 1);
return (c);
}