add directory study
This commit is contained in:
290
study/linux-travel/MINIX-1.5/1.5/Source/commands/de/de_stdin.c
Normal file
290
study/linux-travel/MINIX-1.5/1.5/Source/commands/de/de_stdin.c
Normal file
@@ -0,0 +1,290 @@
|
||||
/****************************************************************/
|
||||
/* */
|
||||
/* de_stdin.c */
|
||||
/* */
|
||||
/* Processing input from the "de" user. */
|
||||
/* */
|
||||
/****************************************************************/
|
||||
/* origination 1989-Jan-15 Terrence W. Holm */
|
||||
/****************************************************************/
|
||||
|
||||
|
||||
#include <minix/config.h>
|
||||
#include <sys/types.h>
|
||||
#include <sgtty.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "../../fs/const.h"
|
||||
|
||||
#include "de.h"
|
||||
|
||||
|
||||
|
||||
/****************************************************************/
|
||||
/* */
|
||||
/* Save_Term() */
|
||||
/* */
|
||||
/* Save the current terminal characteristics. */
|
||||
/* */
|
||||
/* */
|
||||
/* Set_Term() */
|
||||
/* */
|
||||
/* Set up the terminal characteristics. */
|
||||
/* */
|
||||
/* */
|
||||
/* Reset_Term() */
|
||||
/* */
|
||||
/* Restore the terminal characteristics. */
|
||||
/* */
|
||||
/****************************************************************/
|
||||
|
||||
|
||||
static struct sgttyb saved_mode;
|
||||
static struct tchars saved_chars;
|
||||
void Timed_Out();
|
||||
|
||||
|
||||
void Save_Term()
|
||||
|
||||
{
|
||||
ioctl( 0, TIOCGETP, &saved_mode );
|
||||
ioctl( 0, TIOCGETC, (struct sgttyb *) &saved_chars );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void Set_Term()
|
||||
|
||||
{
|
||||
struct sgttyb mode;
|
||||
struct tchars chars;
|
||||
|
||||
mode = saved_mode;
|
||||
chars = saved_chars;
|
||||
|
||||
|
||||
/* No tab expansion, no echo, don't map ^M to ^J, cbreak mode */
|
||||
|
||||
mode.sg_flags = mode.sg_flags & ~XTABS & ~ECHO & ~CRMOD | CBREAK;
|
||||
|
||||
|
||||
/* Change the interrupt character to ^C */
|
||||
|
||||
chars.t_intrc = '\003';
|
||||
|
||||
ioctl( 0, TIOCSETP, &mode );
|
||||
ioctl( 0, TIOCSETC, (struct sgttyb *) &chars );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void Reset_Term()
|
||||
|
||||
{
|
||||
ioctl( 0, TIOCSETP, &saved_mode );
|
||||
ioctl( 0, TIOCSETC, (struct sgttyb *) &saved_chars );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/****************************************************************/
|
||||
/* */
|
||||
/* Get_Char() */
|
||||
/* */
|
||||
/* Return the next input character. Escape */
|
||||
/* sequences are mapped to special codes. */
|
||||
/* */
|
||||
/****************************************************************/
|
||||
|
||||
|
||||
int Get_Char()
|
||||
{
|
||||
int c;
|
||||
static int unget_char = EOF;
|
||||
|
||||
|
||||
/* Flush the output to the screen before waiting */
|
||||
/* for input from the user. */
|
||||
|
||||
fflush( stdout );
|
||||
|
||||
if ( unget_char == EOF )
|
||||
{
|
||||
while ( (c = Timed_Get_Char( 60 * 60 )) < EOF )
|
||||
printf( "%c", BELL );
|
||||
}
|
||||
else
|
||||
{
|
||||
c = unget_char;
|
||||
unget_char = EOF;
|
||||
}
|
||||
|
||||
if ( c == EOF )
|
||||
return( EOF );
|
||||
|
||||
if ( c != ESCAPE )
|
||||
return( c );
|
||||
|
||||
if ( (c = Timed_Get_Char( 1 )) <= EOF )
|
||||
return( ESCAPE );
|
||||
|
||||
if ( c != '[' )
|
||||
{
|
||||
unget_char = c;
|
||||
return( ESCAPE );
|
||||
}
|
||||
|
||||
if ( (c = Timed_Get_Char( 1 )) <= EOF )
|
||||
{
|
||||
unget_char = '[';
|
||||
return( ESCAPE );
|
||||
}
|
||||
|
||||
return( c | 0x80 ); /* Flag ESC [ x */
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int Timed_Get_Char( time )
|
||||
int time;
|
||||
|
||||
{
|
||||
char c;
|
||||
int count;
|
||||
|
||||
signal( SIGALRM, Timed_Out );
|
||||
|
||||
alarm( time );
|
||||
count = read( 0, &c, 1 );
|
||||
alarm( 0 );
|
||||
|
||||
if ( count <= 0 )
|
||||
return( EOF + count );
|
||||
|
||||
return( c & 0x7f );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/****************************************************************/
|
||||
/* */
|
||||
/* Get_Line() */
|
||||
/* */
|
||||
/* Read a line from the user. Returns a pointer */
|
||||
/* to a local buffer, or NULL if DEL or a non- */
|
||||
/* ASCII character was typed. Processes ^H and */
|
||||
/* ^U. ^M terminates the input. */
|
||||
/* */
|
||||
/****************************************************************/
|
||||
|
||||
|
||||
char *Get_Line()
|
||||
|
||||
{
|
||||
int c;
|
||||
int i;
|
||||
static char line[ MAX_STRING + 1 ];
|
||||
|
||||
for ( i = 0; i <= MAX_STRING; ++i )
|
||||
{
|
||||
c = Get_Char();
|
||||
|
||||
if ( c == EOF || c == DEL || (c & 0x80) )
|
||||
return( NULL );
|
||||
|
||||
if ( c == BS )
|
||||
{
|
||||
if ( --i >= 0 )
|
||||
{
|
||||
printf( "\b \b" );
|
||||
--i;
|
||||
}
|
||||
}
|
||||
|
||||
else if ( c == CTRL_U )
|
||||
{
|
||||
for ( --i; i >= 0; --i )
|
||||
printf( "\b \b" );
|
||||
}
|
||||
|
||||
else if ( c == '\r' )
|
||||
{
|
||||
line[ i ] = '\0';
|
||||
return( line );
|
||||
}
|
||||
|
||||
else if ( i < MAX_STRING )
|
||||
{
|
||||
line[ i ] = c;
|
||||
Print_Ascii( c );
|
||||
}
|
||||
|
||||
else /* Line buffer is full, don't add any more to it. */
|
||||
{
|
||||
putchar( BELL );
|
||||
--i;
|
||||
}
|
||||
}
|
||||
|
||||
Error( "Internal fault (line buffer overflow)" );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/****************************************************************/
|
||||
/* */
|
||||
/* Arrow_Esc( char ) */
|
||||
/* */
|
||||
/* If the keyboard does not generate Ansi escape */
|
||||
/* codes for the arrow keys, but does generate */
|
||||
/* single byte control codes, then map these */
|
||||
/* codes to the special characters we are using */
|
||||
/* to denote the Ansi escape codes. */
|
||||
/* */
|
||||
/****************************************************************/
|
||||
|
||||
|
||||
extern char Kup; /* (ku) - Up arrow key */
|
||||
extern char Kdown; /* (kd) - Down arrow key */
|
||||
extern char Kleft; /* (kl) - Left arrow key */
|
||||
extern char Kright; /* (kr) - Right arrow key */
|
||||
|
||||
|
||||
int Arrow_Esc( c )
|
||||
int c;
|
||||
|
||||
{
|
||||
if ( c == Kup )
|
||||
return( ESC_UP );
|
||||
|
||||
if ( c == Kdown )
|
||||
return( ESC_DOWN );
|
||||
|
||||
if ( c == Kleft )
|
||||
return( ESC_LEFT );
|
||||
|
||||
if ( c == Kright )
|
||||
return( ESC_RIGHT );
|
||||
|
||||
return( c );
|
||||
}
|
||||
|
||||
void Timed_Out()
|
||||
{}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user