⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 de_stdin.c

📁 操作系统源代码
💻 C
字号:
/****************************************************************//*								*//*	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 "../../fs/const.h"#include "../../fs/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 $ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -