mirror of
https://github.com/GnoConsortium/gno.git
synced 2024-12-28 07:29:34 +00:00
87 lines
1.4 KiB
C
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);
|
||
|
}
|