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

📄 rlfe.c

📁 gdb-6.8 Linux下的调试程序 最新版本
💻 C
📖 第 1 页 / 共 2 页
字号:
    {      if (argv[arg_base][0] != '-')	break;      if (arg_base+1 >= argc )	usage_exit();      switch(argv[arg_base][1])	{	case 'h':	  arg_base++;	  hist_file = argv[arg_base];	  break;	case 's':	  arg_base++;	  hist_size = atoi(argv[arg_base]);	  if (hist_size<0)	    usage_exit();	  break;	default:	  usage_exit();	}      arg_base++;    }  if (hist_file)    read_history (hist_file);  set_edit_mode ();  rl_readline_name = APPLICATION_NAME;    if ((master = OpenPTY (&name)) < 0)    {      perror("ptypair: could not open master pty");      exit(1);    }  DPRINT1("pty name: '%s'\n", name);  /* set up SIGWINCH handler */  act.sa_handler = sigwinch_handler;  sigemptyset(&(act.sa_mask));  act.sa_flags = 0;  if (sigaction(SIGWINCH, &act, NULL) < 0)    {      perror("ptypair: could not handle SIGWINCH ");      exit(1);    }  if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) < 0)    {      perror("ptypair: could not get window size");      exit(1);    }  if ((child = fork()) < 0)    {      perror("cannot fork");      exit(1);    }  if (child == 0)    {       int slave;  /* file descriptor for slave pty */      /* We are in the child process */      close(master);#ifdef TIOCSCTTY      if ((slave = get_slave_pty(name)) < 0)	{	  perror("ptypair: could not open slave pty");	  exit(1);	}#endif      /* We need to make this process a session group leader, because       * it is on a new PTY, and things like job control simply will       * not work correctly unless there is a session group leader       * and process group leader (which a session group leader       * automatically is). This also disassociates us from our old       * controlling tty.        */      if (setsid() < 0)	{	  perror("could not set session leader");	}      /* Tie us to our new controlling tty. */#ifdef TIOCSCTTY      if (ioctl(slave, TIOCSCTTY, NULL))	{	  perror("could not set new controlling tty");	}#else      if ((slave = get_slave_pty(name)) < 0)	{	  perror("ptypair: could not open slave pty");	  exit(1);	}#endif      /* make slave pty be standard in, out, and error */      dup2(slave, STDIN_FILENO);      dup2(slave, STDOUT_FILENO);      dup2(slave, STDERR_FILENO);      /* at this point the slave pty should be standard input */      if (slave > 2)	{	  close(slave);	}      /* Try to restore window size; failure isn't critical */      if (ioctl(STDOUT_FILENO, TIOCSWINSZ, &ws) < 0)	{	  perror("could not restore window size");	}      /* now start the shell */      {	static char* command_args[] = { COMMAND_ARGS, NULL };	static char* alt_command_args[] = { ALT_COMMAND_ARGS, NULL };	if (argc <= 1)	  {	    execvp (COMMAND, command_args);	    execvp (ALT_COMMAND, alt_command_args);	  }	else	  execvp (argv[arg_base], &argv[arg_base]);      }      /* should never be reached */      exit(1);    }  /* parent */  signal (SIGCHLD, sig_child);  /* Note that we only set termios settings for standard input;   * the master side of a pty is NOT a tty.   */  tcgetattr(STDIN_FILENO, &orig_term);  t = orig_term;  eof_char = t.c_cc[VEOF];  /*  add_special_char(t.c_cc[VEOF]);*/  add_special_char(t.c_cc[VINTR]);  add_special_char(t.c_cc[VQUIT]);  add_special_char(t.c_cc[VSUSP]);#if defined (VDISCARD)  add_special_char(t.c_cc[VDISCARD]);#endif  t.c_lflag &= ~(ICANON | ISIG | ECHO | ECHOCTL | ECHOE | \		 ECHOK | ECHOKE | ECHONL | ECHOPRT );  t.c_iflag &= ~ICRNL;  t.c_iflag |= IGNBRK;  t.c_cc[VMIN] = 1;  t.c_cc[VTIME] = 0;  tcsetattr(STDIN_FILENO, TCSANOW, &t);  in_from_inferior_fd = master;  out_to_inferior_fd = master;  rl_instream = fdopen (master, "r");  rl_getc_function = my_rl_getc;  rl_prep_term_function = null_prep_terminal;   rl_deprep_term_function = null_deprep_terminal;  rl_pre_input_hook = pre_input_change_mode;  rl_callback_handler_install (prompt, line_handler);  in_from_tty_fd = STDIN_FILENO;  FD_ZERO (&in_set);  maxfd = in_from_inferior_fd > in_from_tty_fd ? in_from_inferior_fd    : in_from_tty_fd;  for (;;)    {      int num;      FD_SET (in_from_inferior_fd, &in_set);      FD_SET (in_from_tty_fd, &in_set);      num = select(maxfd+1, &in_set, NULL, NULL, NULL);      if (propagate_sigwinch)	{	  struct winsize ws;	  if (ioctl (STDIN_FILENO, TIOCGWINSZ, &ws) >= 0)	    {	      ioctl (master, TIOCSWINSZ, &ws);	    }	  propagate_sigwinch = 0;	  continue;	}      if (num <= 0)	{	  perror ("select");	  exit (-1);	}      if (FD_ISSET (in_from_tty_fd, &in_set))	{	  extern int readline_echoing_p;	  struct termios term_master;	  int do_canon = 1;	  int do_icrnl = 1;	  int ioctl_ret;	  DPRINT1("[tty avail num_keys:%d]\n", num_keys);	  /* If we can't get tty modes for the master side of the pty, we	     can't handle non-canonical-mode programs.  Always assume the	     master is in canonical echo mode if we can't tell. */	  ioctl_ret = tcgetattr(master, &term_master);	  if (ioctl_ret >= 0)	    {	      do_canon = (term_master.c_lflag & ICANON) != 0;	      do_icrnl = (term_master.c_lflag & ICRNL) != 0;	      readline_echoing_p = (term_master.c_lflag & ECHO) != 0;	      DPRINT1 ("echo,canon,crnl:%03d\n",		       100 * readline_echoing_p		       + 10 * do_canon		       + 1 * do_icrnl);	    }	  else	    {	      if (ioctl_err == 0)		DPRINT1("tcgetattr on master fd failed: errno = %d\n", errno);	      ioctl_err = 1;	    }	  if (do_canon == 0 && num_keys == 0)	    {	      char ch[10];	      int count = read (STDIN_FILENO, ch, sizeof(ch));	      DPRINT1("[read %d chars from stdin: ", count);	      DPRINT2(" \"%.*s\"]\n", count, ch);	      if (do_icrnl)		{		  int i = count;		  while (--i >= 0)		    {		      if (ch[i] == '\r')			ch[i] = '\n';		    }		}	      maybe_emphasize_input (1);	      write (out_to_inferior_fd, ch, count);	    }	  else	    {	      if (num_keys == 0)		{		  int i;		  /* Re-install callback handler for new prompt. */		  if (prompt != empty_string)		    free (prompt);		  if (prompt == NULL)		    {		      DPRINT0("New empty prompt\n");		      prompt = empty_string;		    }		  else		    {		      if (do_emphasize_input && buf_count > 0)			{			  prompt = malloc (buf_count + strlen (end_input_mode)					   + strlen (start_input_mode) + 5);			  sprintf (prompt, "\001%s\002%.*s\001%s\002",				   end_input_mode,				   buf_count, buf,				   start_input_mode);			}		      else			{			  prompt = malloc (buf_count + 1);			  memcpy (prompt, buf, buf_count);			  prompt[buf_count] = '\0';			}		      DPRINT1("New prompt '%s'\n", prompt);#if 0 /* ifdef HAVE_RL_ALREADY_PROMPTED */		      /* Doesn't quite work when do_emphasize_input is 1. */		      rl_already_prompted = buf_count > 0;#else		      if (buf_count > 0)			write (1, "\r", 1);#endif		    }		  rl_callback_handler_install (prompt, line_handler);		}	      num_keys++;	      maybe_emphasize_input (1);	      rl_callback_read_char ();	    }	}      else /* output from inferior. */	{	  int i;	  int count;	  int old_count;	  if (buf_count > (sizeof(buf) >> 2))	    buf_count = 0;	  count = read (in_from_inferior_fd, buf+buf_count,			sizeof(buf) - buf_count);          DPRINT2("read %d from inferior, buf_count=%d", count, buf_count);	  DPRINT2(": \"%.*s\"", count, buf+buf_count);	  maybe_emphasize_input (0);	  if (count <= 0)	    {	      DPRINT0 ("(Connection closed by foreign host.)\n");	      tcsetattr(STDIN_FILENO, TCSANOW, &orig_term);	      exit (0);	    }	  old_count = buf_count;          /* Look for any pending echo that we need to suppress. */	  while (echo_suppress_start < echo_suppress_limit		 && count > 0		 && buf[buf_count] == echo_suppress_buffer[echo_suppress_start])	    {	      count--;	      buf_count++;	      echo_suppress_start++;	    }	  DPRINT1("suppressed %d characters of echo.\n", buf_count-old_count);          /* Write to the terminal anything that was not suppressed. */          if (count > 0)            write (1, buf + buf_count, count);          /* Finally, look for a prompt candidate.           * When we get around to going input (from the keyboard),           * we will consider the prompt to be anything since the last           * line terminator.  So we need to save that text in the           * initial part of buf.  However, anything before the           * most recent end-of-line is not interesting. */	  buf_count += count;#if 1	  for (i = buf_count;  --i >= old_count; )#else	  for (i = buf_count - 1;  i-- >= buf_count - count; )#endif	    {	      if (buf[i] == '\n' || buf[i] == '\r')		{		  i++;		  memmove (buf, buf+i, buf_count - i);		  buf_count -= i;		  break;		}	    }	  DPRINT2("-> i: %d, buf_count: %d\n", i, buf_count);	}    }}static void set_edit_mode (){  int vi = 0;  char *shellopts;  shellopts = getenv ("SHELLOPTS");  while (shellopts != 0)    {      if (strncmp ("vi", shellopts, 2) == 0)	{	  vi = 1;	  break;	}      shellopts = index (shellopts + 1, ':');    }  if (!vi)    {      if (getenv ("EDITOR") != 0)	vi |= strcmp (getenv ("EDITOR"), "vi") == 0;    }  if (vi)    rl_variable_bind ("editing-mode", "vi");  else    rl_variable_bind ("editing-mode", "emacs");}static void usage_exit (){  fprintf (stderr, "Usage: rlfe [-h histfile] [-s size] cmd [arg1] [arg2] ...\n\n");  exit (1);}

⌨️ 快捷键说明

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