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

📄 readline.c

📁 linux下bash的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
  rl_pending_input = key;  return (rl_digit_loop ());}/* What to do when you abort reading an argument. */rl_discard_argument (){  ding ();  rl_clear_message ();  rl_init_argument ();  return 0;}/* Create a default argument. */rl_init_argument (){  rl_numeric_arg = rl_arg_sign = 1;  rl_explicit_arg = 0;  return 0;}/* C-u, universal argument.  Multiply the current argument by 4.   Read a key.  If the key has nothing to do with arguments, then   dispatch on it.  If the key is the abort character then abort. */rl_universal_argument (){  rl_numeric_arg *= 4;  return (rl_digit_loop ());}/* **************************************************************** *//*								    *//*			Terminal and Termcap			    *//*								    *//* **************************************************************** */static char *term_buffer = (char *)NULL;static char *term_string_buffer = (char *)NULL;static int tcap_initialized = 0;/* Non-zero means this terminal can't really do anything. */int dumb_term = 0;/* On Solaris2, sys/types.h #includes sys/reg.h, which #defines PC.   Unfortunately, PC is a global variable used by the termcap library. */#undef PC#if !defined (__linux__)/* If this causes problems, add back the `extern'. *//*extern*/ char PC, *BC, *UP;#endif /* __linux__ *//* Some strings to control terminal actions.  These are output by tputs (). */char *term_goto, *term_clreol, *term_cr, *term_clrpag, *term_backspace;char *term_pc;/* Non-zero if we determine that the terminal can do character insertion. */int terminal_can_insert = 0;/* How to insert characters. */char *term_im, *term_ei, *term_ic, *term_ip, *term_IC;/* How to delete characters. */char *term_dc, *term_DC;#if defined (HACK_TERMCAP_MOTION)char *term_forward_char;#endif  /* HACK_TERMCAP_MOTION *//* How to go up a line. */char *term_up;/* A visible bell, if the terminal can be made to flash the screen. */char *visible_bell;/* Non-zero means that this terminal has a meta key. */int term_has_meta;/* The string to write to turn on the meta key, if this term has one. */char *term_mm;/* The string to write to turn off the meta key, if this term has one. */char *term_mo;/* The key sequences output by the arrow keys, if this terminal has any. */char *term_ku, *term_kd, *term_kr, *term_kl;/* How to initialize and reset the arrow keys, if this terminal has any. */char *term_ks, *term_ke;/* Re-initialize the terminal considering that the TERM/TERMCAP variable   has changed. */rl_reset_terminal (terminal_name)     char *terminal_name;{  init_terminal_io (terminal_name);  return 0;}/* Set readline's idea of the screen size.  TTY is a file descriptor open   to the terminal.  If IGNORE_ENV is true, we do not pay attention to the   values of $LINES and $COLUMNS.  The tests for TERM_STRING_BUFFER being   non-null serve to check whether or not we have initialized termcap. */void_rl_set_screen_size (tty, ignore_env)     int tty, ignore_env;{#if defined (TIOCGWINSZ)  struct winsize window_size;#endif /* TIOCGWINSZ */#if defined (TIOCGWINSZ)  if (ioctl (tty, TIOCGWINSZ, &window_size) == 0)    {      screenwidth = (int) window_size.ws_col;      screenheight = (int) window_size.ws_row;    }#endif /* TIOCGWINSZ */  /* Environment variable COLUMNS overrides setting of "co" if IGNORE_ENV     is unset. */  if (screenwidth <= 0)    {      char *sw;      if (!ignore_env && (sw = getenv ("COLUMNS")))	screenwidth = atoi (sw);      if (screenwidth <= 0 && term_string_buffer)	screenwidth = tgetnum ("co");    }  /* Environment variable LINES overrides setting of "li" if IGNORE_ENV     is unset. */  if (screenheight <= 0)    {      char *sh;      if (!ignore_env && (sh = getenv ("LINES")))	screenheight = atoi (sh);      if (screenheight <= 0 && term_string_buffer)	screenheight = tgetnum ("li");    }  /* If all else fails, default to 80x24 terminal. */  if (screenwidth <= 1)    screenwidth = 80;  if (screenheight <= 0)    screenheight = 24;#if defined (SHELL)  /* If we're being compiled as part of bash, set the environment     variables $LINES and $COLUMNS to new values. */  set_lines_and_columns (screenheight, screenwidth);#endif  if (!term_xn)    screenwidth--;  screenchars = screenwidth * screenheight;}struct _tc_string {     char *tc_var;     char **tc_value;};/* This should be kept sorted, just in case we decide to change the   search algorithm to something smarter. */static struct _tc_string tc_strings[] ={  "DC", &term_DC,  "IC", &term_IC,  "ce", &term_clreol,  "cl", &term_clrpag,  "cr", &term_cr,  "dc", &term_dc,  "ei", &term_ei,  "ic", &term_ic,  "im", &term_im,  "kd", &term_kd,  "kl", &term_kl,  "kr", &term_kr,  "ku", &term_ku,  "ks", &term_ks,  "ke", &term_ke,  "le", &term_backspace,  "mm", &term_mm,  "mo", &term_mo,#if defined (HACK_TERMCAP_MOTION)  "nd", &term_forward_char,#endif  "pc", &term_pc,  "up", &term_up,  "vb", &visible_bell,};#define NUM_TC_STRINGS (sizeof (tc_strings) / sizeof (struct _tc_string))/* Read the desired terminal capability strings into BP.  The capabilities   are described in the TC_STRINGS table. */static voidget_term_capabilities (bp)     char **bp;{  register int i;  for (i = 0; i < NUM_TC_STRINGS; i++)    *(tc_strings[i].tc_value) = tgetstr (tc_strings[i].tc_var, bp);  tcap_initialized = 1;}static intinit_terminal_io (terminal_name)     char *terminal_name;{#if defined (__GO32__)  screenwidth = ScreenCols ();  screenheight = ScreenRows ();  screenchars = screenwidth * screenheight;  term_cr = "\r";  term_im = term_ei = term_ic = term_IC = (char *)NULL;  term_up = term_dc = term_DC = visible_bell = (char *)NULL;  /* Does the __GO32__ have a meta key?  I don't know. */  term_has_meta = 0;  term_mm = term_mo = (char *)NULL;  /* It probably has arrow keys, but I don't know what they are. */  term_ku = term_kd = term_kr = term_kl = (char *)NULL;#if defined (HACK_TERMCAP_MOTION)  term_forward_char = (char *)NULL;#endif /* HACK_TERMCAP_MOTION */  terminal_can_insert = term_xn = 0;  return;#else /* !__GO32__ */  char *term, *buffer;  int tty;  Keymap xkeymap;  term = terminal_name ? terminal_name : getenv ("TERM");  if (!term_string_buffer)    term_string_buffer = xmalloc (2048);  if (!term_buffer)    term_buffer = xmalloc (2048);  buffer = term_string_buffer;  term_clrpag = term_cr = term_clreol = (char *)NULL;  if (!term)    term = "dumb";  if (tgetent (term_buffer, term) <= 0)    {      dumb_term = 1;      screenwidth = 79;      screenheight = 24;      screenchars = 79 * 24;      term_cr = "\r";      term_im = term_ei = term_ic = term_IC = (char *)NULL;      term_up = term_dc = term_DC = visible_bell = (char *)NULL;      term_ku = term_kd = term_kl = term_kr = (char *)NULL;#if defined (HACK_TERMCAP_MOTION)      term_forward_char = (char *)NULL;#endif      terminal_can_insert = 0;      return 0;    }  get_term_capabilities (&buffer);  /* Set up the variables that the termcap library expects the application     to provide. */  PC = term_pc ? *term_pc : 0;  BC = term_backspace;  UP = term_up;  if (!term_cr)    term_cr =  "\r";  if (rl_instream)    tty = fileno (rl_instream);  else    tty = 0;  screenwidth = screenheight = 0;  term_xn = tgetflag ("am") && tgetflag ("xn");  _rl_set_screen_size (tty, 0);  /* "An application program can assume that the terminal can do      character insertion if *any one of* the capabilities `IC',      `im', `ic' or `ip' is provided."  But we can't do anything if      only `ip' is provided, so... */  terminal_can_insert = (term_IC || term_im || term_ic);  /* Check to see if this terminal has a meta key and clear the capability     variables if there is none. */  term_has_meta = (tgetflag ("km") || tgetflag ("MT"));  if (!term_has_meta)    {      term_mm = (char *)NULL;      term_mo = (char *)NULL;    }  /* Attempt to find and bind the arrow keys.  Do not override already     bound keys in an overzealous attempt, however. */  xkeymap = _rl_keymap;  _rl_keymap = emacs_standard_keymap;  _rl_bind_if_unbound (term_ku, rl_get_previous_history);  _rl_bind_if_unbound (term_kd, rl_get_next_history);  _rl_bind_if_unbound (term_kr, rl_forward);  _rl_bind_if_unbound (term_kl, rl_backward);#if defined (VI_MODE)  _rl_keymap = vi_movement_keymap;  _rl_bind_if_unbound (term_ku, rl_get_previous_history);  _rl_bind_if_unbound (term_kd, rl_get_next_history);  _rl_bind_if_unbound (term_kr, rl_forward);  _rl_bind_if_unbound (term_kl, rl_backward);#endif /* VI_MODE */  _rl_keymap = xkeymap;#endif /* !__GO32__ */  return 0;}char *rl_get_termcap (cap)     char *cap;{  register int i;  if (tcap_initialized == 0)    return ((char *)NULL);  for (i = 0; i < NUM_TC_STRINGS; i++)    {      if (tc_strings[i].tc_var[0] == cap[0] && strcmp (tc_strings[i].tc_var, cap) == 0)        return *(tc_strings[i].tc_value);    }  return ((char *)NULL);}/* A function for the use of tputs () */int_rl_output_character_function (c)     int c;{  return putc (c, out_stream);}/* Write COUNT characters from STRING to the output stream. */void_rl_output_some_chars (string, count)     char *string;     int count;{  fwrite (string, 1, count, out_stream);}/* Move the cursor back. */backspace (count)     int count;{  register int i;#if !defined (__GO32__)  if (term_backspace)    for (i = 0; i < count; i++)      tputs (term_backspace, 1, _rl_output_character_function);  else#endif /* !__GO32__ */    for (i = 0; i < count; i++)      putc ('\b', out_stream);  return 0;}/* Move to the start of the next line. */crlf (){#if defined (NEW_TTY_DRIVER)  tputs (term_cr, 1, _rl_output_character_function);#endif /* NEW_TTY_DRIVER */  putc ('\n', out_stream);  return 0;}rl_tty_status (count, key)     int count, key;{#if defined (TIOCSTAT)  ioctl (1, TIOCSTAT, (char *)0);  rl_refresh_line ();#else  ding ();#endif  return 0;}/* **************************************************************** *//*								    *//*			Utility Functions			    *//*								    *//* **************************************************************** *//* Return 0 if C is not a member of the class of characters that belong   in words, or 1 if it is. */int allow_pathname_alphabetic_chars = 0;char *pathname_alphabetic_chars = "/-_=~.#$";intalphabetic (c)     int c;{  if (pure_alphabetic (c) || (digit_p (c)))    return (1);  if (allow_pathname_alphabetic_chars)    return (strchr (pathname_alphabetic_chars, c) != NULL);  else    return (0);}/* Ring the terminal bell. */intding (){  if (readline_echoing_p)    {#if !defined (__GO32__)      switch (_rl_bell_preference)        {	case NO_BELL:	default:	  break;	case VISIBLE_BELL:	  if (visible_bell)	    {	      tputs (visible_bell, 1, _rl_output_character_function);	      break;	    }	  /* FALLTHROUGH */	case AUDIBLE_BELL:	  fprintf (stderr, "\007");	  fflush (stderr);	  break;        }#else /* __GO32__ */      fprintf (stderr, "\007");      fflush (stderr);#endif /* __GO32__ */      return (0);    }  return (-1);}/* How to abort things. */rl_abort (count, key)     int count, key;{  ding ();  rl_clear_message ();  rl_init_argument ();  rl_pending_input = 0;  defining_kbd_macro = 0;  while (executing_macro)    pop_executing_macro ();  rl_last_func = (Function *)NULL;  longjmp (readline_top_level, 1);}/* Return a copy of the string between FROM and TO.   FROM is inclusive, TO is not. */char *rl_copy_text (from, to)     int from, to;{  register int length;  char *copy;  /* Fix it if the caller is confused. */  if (from > to)    {      int t = from;      from = to;      to = t;    }  length = to - from;  copy = xmalloc (1 + length);  strncpy (copy, the_line + from, length);  copy[length] = '\0';  return (copy);}/* Increase the size of RL_LINE_BUFFER until it has enough space to hold   LEN characters. */voidrl_extend_line_buffer (len)     int len;{  while (len >= rl_line_buffer_len)    {      rl_line_buffer_len += DEFAULT_BUFFER_SIZE;      rl_line_buffer = xrealloc (rl_line_buffer, rl_line_buffer_len);    }  the_line = rl_line_buffer;}/* **************************************************************** *//*								    *//*			Insert and Delete			    *//*								    *//* **************************************************************** *//* Insert a string of text into the line at point.  This is the only   way that you should do insertion.  rl_insert () calls this   function. */rl_insert_text (string)     char *string;{  register int i, l = strlen (string);  if (rl_end + l >= rl_line_buffer_len)    rl_extend_line_buffer (rl_end + l);  for (i = rl_end; i >= rl_point; i--)    the_line[i + l] = the_line[i];  strncpy (the_line + rl_point, string, l);  /* Remember how to undo this if we aren't undoing something. */  if (!doing_an_undo)    {      /* If possible and desirable, concatenate the undos. */      if ((l == 1) &&	  rl_undo_list &&	  (rl_undo_list->what == UNDO_INSERT) &&	  (rl_undo_list->end == rl_point) &&	  (rl_undo_list->end - rl_undo_list->start < 20))	rl_undo_list->end++;      else	rl_add_undo (UNDO_INSERT, rl_point, rl_point + l, (char *)NULL);    }  rl_point += l;  rl_end += l;  the_line[rl_end] = '\0';  return l;}/* Delete the string between FROM and TO.  FROM is   inclusive, TO is not. */

⌨️ 快捷键说明

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