diff options
Diffstat (limited to 'readline/readline.c')
-rw-r--r-- | readline/readline.c | 207 |
1 files changed, 138 insertions, 69 deletions
diff --git a/readline/readline.c b/readline/readline.c index 2c6aef6..6bd25f7 100644 --- a/readline/readline.c +++ b/readline/readline.c @@ -8,7 +8,7 @@ The GNU Readline Library is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2, or + as published by the Free Software Foundation; either version 1, or (at your option) any later version. The GNU Readline Library is distributed in the hope that it will be @@ -19,7 +19,7 @@ The GNU General Public License is often shipped with GNU software, and is generally kept in a file called COPYING or LICENSE. If you do not have a copy of the license, write to the Free Software Foundation, - 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ + 675 Mass Ave, Cambridge, MA 02139, USA. */ #define READLINE_LIBRARY #if defined (HAVE_CONFIG_H) @@ -47,6 +47,7 @@ # include <locale.h> #endif +#include <signal.h> #include <stdio.h> #include "posixjmp.h" @@ -62,27 +63,119 @@ #include "readline.h" #include "history.h" -#include "rlprivate.h" -#include "rlshell.h" -#include "xmalloc.h" - #ifndef RL_LIBRARY_VERSION -# define RL_LIBRARY_VERSION "4.1" +# define RL_LIBRARY_VERSION "4.0" #endif /* Evaluates its arguments multiple times. */ #define SWAP(s, e) do { int t; t = s; s = e; e = t; } while (0) +/* NOTE: Functions and variables prefixed with `_rl_' are + pseudo-global: they are global so they can be shared + between files in the readline library, but are not intended + to be visible to readline callers. */ + +/* Variables and functions imported from terminal.c */ +extern int _rl_init_terminal_io (); +extern void _rl_enable_meta_key (); +#ifdef _MINIX +extern void _rl_output_character_function (); +#else +extern int _rl_output_character_function (); +#endif + +extern int _rl_enable_meta; +extern int _rl_term_autowrap; +extern int screenwidth, screenheight, screenchars; + +/* Variables and functions imported from rltty.c. */ +extern void rl_prep_terminal (), rl_deprep_terminal (); +extern void rltty_set_default_bindings (); + +/* Functions imported from util.c. */ +extern void _rl_abort_internal (); +extern void rl_extend_line_buffer (); +extern int alphabetic (); + +/* Functions imported from bind.c. */ +extern void _rl_bind_if_unbound (); + +/* Functions imported from input.c. */ +extern int _rl_any_typein (); +extern void _rl_insert_typein (); +extern int rl_read_key (); + +/* Functions imported from nls.c */ +extern int _rl_init_eightbit (); + +/* Functions imported from shell.c */ +extern char *get_env_value (); + +/* External redisplay functions and variables from display.c */ +extern void _rl_move_vert (); +extern void _rl_update_final (); +extern void _rl_clear_to_eol (); +extern void _rl_clear_screen (); +extern void _rl_erase_entire_line (); + +extern void _rl_erase_at_end_of_line (); +extern void _rl_move_cursor_relative (); + +extern int _rl_vis_botlin; +extern int _rl_last_c_pos; +extern int _rl_horizontal_scroll_mode; +extern int rl_display_fixed; +extern int _rl_suppress_redisplay; +extern char *rl_display_prompt; + +/* Variables imported from complete.c. */ +extern char *rl_completer_word_break_characters; +extern char *rl_basic_word_break_characters; +extern int rl_completion_query_items; +extern int rl_complete_with_tilde_expansion; + +/* Variables and functions from macro.c. */ +extern void _rl_add_macro_char (); +extern void _rl_with_macro_input (); +extern int _rl_next_macro_key (); +extern int _rl_defining_kbd_macro; + +#if defined (VI_MODE) +/* Functions imported from vi_mode.c. */ +extern void _rl_vi_set_last (); +extern void _rl_vi_reset_last (); +extern void _rl_vi_done_inserting (); +extern int _rl_vi_textmod_command (); +extern void _rl_vi_initialize_line (); +#endif /* VI_MODE */ + +extern UNDO_LIST *rl_undo_list; +extern int _rl_doing_an_undo; + /* Forward declarations used in this file. */ -void _rl_free_history_entry __P((HIST_ENTRY *)); +void _rl_free_history_entry (); -static char *readline_internal __P((void)); -static void readline_initialize_everything __P((void)); -static void start_using_history __P((void)); -static void bind_arrow_keys __P((void)); -static int rl_change_case __P((int, int)); +int _rl_dispatch (); +int _rl_init_argument (); -static void readline_default_bindings __P((void)); +static char *readline_internal (); +static void readline_initialize_everything (); +static void start_using_history (); +static void bind_arrow_keys (); + +#if !defined (__GO32__) || defined (HAVE_TERMIOS_H) +static void readline_default_bindings (); +#endif /* !__GO32__ */ + +#if defined (__GO32__) +# include <go32.h> +# include <pc.h> +# if !defined (__DJGPP__) +# undef HANDLE_SIGNALS +# endif /* !__DJGPP__ */ +#endif /* __GO32__ */ + +extern char *xmalloc (), *xrealloc (); /* **************************************************************** */ /* */ @@ -92,8 +185,6 @@ static void readline_default_bindings __P((void)); char *rl_library_version = RL_LIBRARY_VERSION; -int rl_gnu_readline_p = 1; - /* A pointer to the keymap that is currently in use. By default, it is the standard emacs keymap. */ Keymap _rl_keymap = emacs_standard_keymap; @@ -156,10 +247,6 @@ int readline_echoing_p = 1; char *rl_prompt; int rl_visible_prompt_length = 0; -/* Set to non-zero by calling application if it has already printed rl_prompt - and does not want readline to do it the first time. */ -int rl_already_prompted = 0; - /* The number of characters read in order to type this complete command. */ int rl_key_sequence_length = 0; @@ -205,10 +292,6 @@ Keymap rl_executing_keymap; /* Non-zero means to erase entire line, including prompt, on empty input lines. */ int rl_erase_empty_line = 0; -/* Non-zero means to read only this many characters rather than up to a - character bound to accept-line. */ -int rl_num_chars_to_read; - /* Line buffer and maintenence. */ char *rl_line_buffer = (char *)NULL; int rl_line_buffer_len = 0; @@ -288,8 +371,6 @@ readline (prompt) STATIC_CALLBACK void readline_internal_setup () { - char *nprompt; - _rl_in_stream = rl_instream; _rl_out_stream = rl_outstream; @@ -298,20 +379,15 @@ readline_internal_setup () if (readline_echoing_p == 0) { - if (rl_prompt && rl_already_prompted == 0) + if (rl_prompt) { - nprompt = _rl_strip_prompt (rl_prompt); - fprintf (_rl_out_stream, "%s", nprompt); + fprintf (_rl_out_stream, "%s", rl_prompt); fflush (_rl_out_stream); - free (nprompt); } } else { - if (rl_prompt && rl_already_prompted) - rl_on_new_line_with_prompt (); - else - rl_on_new_line (); + rl_on_new_line (); (*rl_redisplay_function) (); #if defined (VI_MODE) if (rl_editing_mode == vi_mode) @@ -403,7 +479,7 @@ readline_internal_charloop () } lastc = c; - _rl_dispatch ((unsigned char)c, _rl_keymap); + _rl_dispatch (c, _rl_keymap); /* If there was no change in _rl_last_command_was_kill, then no kill has taken place. Note that if input is pending we are reading @@ -418,12 +494,6 @@ readline_internal_charloop () rl_vi_check (); #endif /* VI_MODE */ - if (rl_num_chars_to_read && rl_end >= rl_num_chars_to_read) - { - (*rl_redisplay_function) (); - rl_newline (1, '\n'); - } - if (rl_done == 0) (*rl_redisplay_function) (); @@ -621,7 +691,6 @@ rl_initialize () return 0; } -#if 0 #if defined (__EMX__) static void _emx_build_environ () @@ -645,18 +714,15 @@ _emx_build_environ () *tp = 0; } #endif /* __EMX__ */ -#endif /* Initialize the entire state of the world. */ static void readline_initialize_everything () { -#if 0 #if defined (__EMX__) if (environ == 0) _emx_build_environ (); #endif -#endif /* Find out if we are running in Emacs. */ running_in_emacs = get_env_value ("EMACS") != (char *)0; @@ -681,8 +747,10 @@ readline_initialize_everything () /* Initialize the terminal interface. */ _rl_init_terminal_io ((char *)NULL); +#if !defined (__GO32__) || defined (HAVE_TERMIOS_H) /* Bind tty characters to readline functions. */ readline_default_bindings (); +#endif /* !__GO32__ || HAVE_TERMIOS_H */ /* Initialize the function names. */ rl_initialize_funmap (); @@ -731,17 +799,6 @@ bind_arrow_keys_internal () { Function *f; -#if defined (__MSDOS__) - f = rl_function_of_keyseq ("\033[0A", _rl_keymap, (int *)NULL); - if (!f || f == rl_do_lowercase_version) - { - _rl_bind_if_unbound ("\033[0A", rl_get_previous_history); - _rl_bind_if_unbound ("\033[0B", rl_backward); - _rl_bind_if_unbound ("\033[0C", rl_forward); - _rl_bind_if_unbound ("\033[0D", rl_get_next_history); - } -#endif - f = rl_function_of_keyseq ("\033[A", _rl_keymap, (int *)NULL); if (!f || f == rl_do_lowercase_version) { @@ -1066,10 +1123,6 @@ rl_forward (count, key) else rl_point = end; } - - if (rl_end < 0) - rl_end = 0; - return 0; } @@ -1204,14 +1257,35 @@ int rl_refresh_line (ignore1, ignore2) int ignore1, ignore2; { - int curr_line; + int curr_line, nleft; - curr_line = _rl_current_display_line (); + /* Find out whether or not there might be invisible characters in the + editing buffer. */ + if (rl_display_prompt == rl_prompt) + nleft = _rl_last_c_pos - screenwidth - rl_visible_prompt_length; + else + nleft = _rl_last_c_pos - screenwidth; + + if (nleft > 0) + curr_line = 1 + nleft / screenwidth; + else + curr_line = 0; _rl_move_vert (curr_line); _rl_move_cursor_relative (0, the_line); /* XXX is this right */ +#if defined (__GO32__) && !defined (__DJGPP__) + { + int row, col, width, row_start; + + ScreenGetCursor (&row, &col); + width = ScreenCols (); + row_start = ScreenPrimary + (row * width); + memset (row_start + col, 0, (width - col) * 2); + } +#else /* !__GO32__ || __DJGPP__ */ _rl_clear_to_eol (0); /* arg of 0 means to not use spaces */ +#endif /* !__GO32__ || __DJGPP__ */ rl_forced_update_display (); rl_display_fixed = 1; @@ -1349,14 +1423,7 @@ rl_quoted_insert (count, key) { int c; -#if defined (HANDLE_SIGNALS) - _rl_disable_tty_signals (); -#endif c = rl_read_key (); -#if defined (HANDLE_SIGNALS) - _rl_restore_tty_signals (); -#endif - return (rl_insert (count, c)); } @@ -1550,6 +1617,8 @@ rl_insert_comment (count, key) #define DownCase 2 #define CapCase 3 +static int rl_change_case (); + /* Uppercase the word at point. */ int rl_upcase_word (count, key) |