299 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			299 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /****************************************************************/
 | |
| /*								*/
 | |
| /*	de_stdin.c						*/
 | |
| /*								*/
 | |
| /*		Processing input from the "de" user.		*/
 | |
| /*								*/
 | |
| /****************************************************************/
 | |
| /*  origination         1989-Jan-15        Terrence W. Holm	*/
 | |
| /****************************************************************/
 | |
| 
 | |
| 
 | |
| #include <sys/types.h>
 | |
| #include <termios.h>
 | |
| #include <signal.h>
 | |
| #include <unistd.h>
 | |
| #include <stdio.h>
 | |
| 
 | |
| #include <minix/config.h>
 | |
| #include <minix/const.h>
 | |
| #include "../../servers/mfs/const.h"
 | |
| #include "../../servers/mfs/inode.h"
 | |
| 
 | |
| #include "de.h"
 | |
| 
 | |
| FORWARD _PROTOTYPE(int Timed_Get_Char , (int time ));
 | |
| FORWARD _PROTOTYPE(void Timed_Out , (int sig));
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| /****************************************************************/
 | |
| /*								*/
 | |
| /*	Save_Term()						*/
 | |
| /*								*/
 | |
| /*		Save the current terminal characteristics.	*/
 | |
| /*								*/
 | |
| /*								*/
 | |
| /*	Set_Term()						*/
 | |
| /*								*/
 | |
| /*		Set up the terminal characteristics.		*/
 | |
| /*								*/
 | |
| /*								*/
 | |
| /*	Reset_Term()						*/
 | |
| /*								*/
 | |
| /*		Restore the terminal characteristics.		*/
 | |
| /*								*/
 | |
| /****************************************************************/
 | |
| 
 | |
| 
 | |
| static struct termios saved_term;
 | |
| 
 | |
| 
 | |
| void Save_Term()
 | |
| 
 | |
|   {
 | |
|   tcgetattr( 0, &saved_term );
 | |
|   }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| void Set_Term()
 | |
| 
 | |
|   {
 | |
|   struct termios term;
 | |
| 
 | |
|   term = saved_term;
 | |
| 
 | |
| 
 | |
|   /*  No tab expansion, no echo, don't map ^M to ^J, cbreak mode  */
 | |
| 
 | |
|   term.c_iflag &= ~ICRNL;
 | |
|   term.c_oflag &= ~OPOST;
 | |
|   term.c_lflag &= ~ICANON & ~ECHO;
 | |
| 
 | |
| 
 | |
|   /*  Change the interrupt character to ^C  */
 | |
| 
 | |
|   term.c_cc[VINTR] = '\003';
 | |
| 
 | |
|   tcsetattr( 0, TCSANOW, &term );
 | |
|   }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| void Reset_Term()
 | |
| 
 | |
|   {
 | |
|   tcsetattr( 0, TCSANOW, &saved_term );
 | |
|   }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| /****************************************************************/
 | |
| /*								*/
 | |
| /*	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)" );
 | |
| 
 | |
|   /* NOTREACHED */
 | |
|   return( NULL );
 | |
|   }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| /****************************************************************/
 | |
| /*								*/
 | |
| /*	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(sig)
 | |
| int sig;
 | |
|   {}
 | |
| 
 | |
| /*
 | |
|  * $PchHeader: /mount/hd2/minix/sys/cmd/de/RCS/de_stdin.c,v 1.3 1995/02/10 08:01:30 philip Exp $
 | |
|  */
 | 
