xref: /dflybsd-src/contrib/gdb-7/readline/readline.c (revision 16003dcfd2baa152f5dd24794ec9f36e139eaeb8)
1*6b445a62SJohn Marino /* readline.c -- a general facility for reading lines of input
2*6b445a62SJohn Marino    with emacs style editing and completion. */
3*6b445a62SJohn Marino 
4*6b445a62SJohn Marino /* Copyright (C) 1987-2009 Free Software Foundation, Inc.
5*6b445a62SJohn Marino 
6*6b445a62SJohn Marino    This file is part of the GNU Readline Library (Readline), a library
7*6b445a62SJohn Marino    for reading lines of text with interactive input and history editing.
8*6b445a62SJohn Marino 
9*6b445a62SJohn Marino    Readline is free software: you can redistribute it and/or modify
10*6b445a62SJohn Marino    it under the terms of the GNU General Public License as published by
11*6b445a62SJohn Marino    the Free Software Foundation, either version 3 of the License, or
12*6b445a62SJohn Marino    (at your option) any later version.
13*6b445a62SJohn Marino 
14*6b445a62SJohn Marino    Readline is distributed in the hope that it will be useful,
15*6b445a62SJohn Marino    but WITHOUT ANY WARRANTY; without even the implied warranty of
16*6b445a62SJohn Marino    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17*6b445a62SJohn Marino    GNU General Public License for more details.
18*6b445a62SJohn Marino 
19*6b445a62SJohn Marino    You should have received a copy of the GNU General Public License
20*6b445a62SJohn Marino    along with Readline.  If not, see <http://www.gnu.org/licenses/>.
21*6b445a62SJohn Marino */
22*6b445a62SJohn Marino 
23*6b445a62SJohn Marino #define READLINE_LIBRARY
24*6b445a62SJohn Marino 
25*6b445a62SJohn Marino #if defined (HAVE_CONFIG_H)
26*6b445a62SJohn Marino #  include <config.h>
27*6b445a62SJohn Marino #endif
28*6b445a62SJohn Marino 
29*6b445a62SJohn Marino #include <sys/types.h>
30*6b445a62SJohn Marino #include "posixstat.h"
31*6b445a62SJohn Marino #include <fcntl.h>
32*6b445a62SJohn Marino #if defined (HAVE_SYS_FILE_H)
33*6b445a62SJohn Marino #  include <sys/file.h>
34*6b445a62SJohn Marino #endif /* HAVE_SYS_FILE_H */
35*6b445a62SJohn Marino 
36*6b445a62SJohn Marino #if defined (HAVE_UNISTD_H)
37*6b445a62SJohn Marino #  include <unistd.h>
38*6b445a62SJohn Marino #endif /* HAVE_UNISTD_H */
39*6b445a62SJohn Marino 
40*6b445a62SJohn Marino #if defined (HAVE_STDLIB_H)
41*6b445a62SJohn Marino #  include <stdlib.h>
42*6b445a62SJohn Marino #else
43*6b445a62SJohn Marino #  include "ansi_stdlib.h"
44*6b445a62SJohn Marino #endif /* HAVE_STDLIB_H */
45*6b445a62SJohn Marino 
46*6b445a62SJohn Marino #if defined (HAVE_LOCALE_H)
47*6b445a62SJohn Marino #  include <locale.h>
48*6b445a62SJohn Marino #endif
49*6b445a62SJohn Marino 
50*6b445a62SJohn Marino #include <stdio.h>
51*6b445a62SJohn Marino #include "posixjmp.h"
52*6b445a62SJohn Marino #include <errno.h>
53*6b445a62SJohn Marino 
54*6b445a62SJohn Marino #if !defined (errno)
55*6b445a62SJohn Marino extern int errno;
56*6b445a62SJohn Marino #endif /* !errno */
57*6b445a62SJohn Marino 
58*6b445a62SJohn Marino /* System-specific feature definitions and include files. */
59*6b445a62SJohn Marino #include "rldefs.h"
60*6b445a62SJohn Marino #include "rlmbutil.h"
61*6b445a62SJohn Marino 
62*6b445a62SJohn Marino #if defined (__EMX__)
63*6b445a62SJohn Marino #  define INCL_DOSPROCESS
64*6b445a62SJohn Marino #  include <os2.h>
65*6b445a62SJohn Marino #endif /* __EMX__ */
66*6b445a62SJohn Marino 
67*6b445a62SJohn Marino /* Some standard library routines. */
68*6b445a62SJohn Marino #include "readline.h"
69*6b445a62SJohn Marino #include "history.h"
70*6b445a62SJohn Marino 
71*6b445a62SJohn Marino #include "rlprivate.h"
72*6b445a62SJohn Marino #include "rlshell.h"
73*6b445a62SJohn Marino #include "xmalloc.h"
74*6b445a62SJohn Marino 
75*6b445a62SJohn Marino #ifndef RL_LIBRARY_VERSION
76*6b445a62SJohn Marino #  define RL_LIBRARY_VERSION "5.1"
77*6b445a62SJohn Marino #endif
78*6b445a62SJohn Marino 
79*6b445a62SJohn Marino #ifndef RL_READLINE_VERSION
80*6b445a62SJohn Marino #  define RL_READLINE_VERSION	0x0501
81*6b445a62SJohn Marino #endif
82*6b445a62SJohn Marino 
83*6b445a62SJohn Marino extern void _rl_free_history_entry PARAMS((HIST_ENTRY *));
84*6b445a62SJohn Marino 
85*6b445a62SJohn Marino /* Forward declarations used in this file. */
86*6b445a62SJohn Marino static char *readline_internal PARAMS((void));
87*6b445a62SJohn Marino static void readline_initialize_everything PARAMS((void));
88*6b445a62SJohn Marino 
89*6b445a62SJohn Marino static void bind_arrow_keys_internal PARAMS((Keymap));
90*6b445a62SJohn Marino static void bind_arrow_keys PARAMS((void));
91*6b445a62SJohn Marino 
92*6b445a62SJohn Marino static void readline_default_bindings PARAMS((void));
93*6b445a62SJohn Marino static void reset_default_bindings PARAMS((void));
94*6b445a62SJohn Marino 
95*6b445a62SJohn Marino static int _rl_subseq_result PARAMS((int, Keymap, int, int));
96*6b445a62SJohn Marino static int _rl_subseq_getchar PARAMS((int));
97*6b445a62SJohn Marino 
98*6b445a62SJohn Marino /* **************************************************************** */
99*6b445a62SJohn Marino /*								    */
100*6b445a62SJohn Marino /*			Line editing input utility		    */
101*6b445a62SJohn Marino /*								    */
102*6b445a62SJohn Marino /* **************************************************************** */
103*6b445a62SJohn Marino 
104*6b445a62SJohn Marino const char *rl_library_version = RL_LIBRARY_VERSION;
105*6b445a62SJohn Marino 
106*6b445a62SJohn Marino int rl_readline_version = RL_READLINE_VERSION;
107*6b445a62SJohn Marino 
108*6b445a62SJohn Marino /* True if this is `real' readline as opposed to some stub substitute. */
109*6b445a62SJohn Marino int rl_gnu_readline_p = 1;
110*6b445a62SJohn Marino 
111*6b445a62SJohn Marino /* A pointer to the keymap that is currently in use.
112*6b445a62SJohn Marino    By default, it is the standard emacs keymap. */
113*6b445a62SJohn Marino Keymap _rl_keymap = emacs_standard_keymap;
114*6b445a62SJohn Marino 
115*6b445a62SJohn Marino 
116*6b445a62SJohn Marino /* The current style of editing. */
117*6b445a62SJohn Marino int rl_editing_mode = emacs_mode;
118*6b445a62SJohn Marino 
119*6b445a62SJohn Marino /* The current insert mode:  input (the default) or overwrite */
120*6b445a62SJohn Marino int rl_insert_mode = RL_IM_DEFAULT;
121*6b445a62SJohn Marino 
122*6b445a62SJohn Marino /* Non-zero if we called this function from _rl_dispatch().  It's present
123*6b445a62SJohn Marino    so functions can find out whether they were called from a key binding
124*6b445a62SJohn Marino    or directly from an application. */
125*6b445a62SJohn Marino int rl_dispatching;
126*6b445a62SJohn Marino 
127*6b445a62SJohn Marino /* Non-zero if the previous command was a kill command. */
128*6b445a62SJohn Marino int _rl_last_command_was_kill = 0;
129*6b445a62SJohn Marino 
130*6b445a62SJohn Marino /* The current value of the numeric argument specified by the user. */
131*6b445a62SJohn Marino int rl_numeric_arg = 1;
132*6b445a62SJohn Marino 
133*6b445a62SJohn Marino /* Non-zero if an argument was typed. */
134*6b445a62SJohn Marino int rl_explicit_arg = 0;
135*6b445a62SJohn Marino 
136*6b445a62SJohn Marino /* Temporary value used while generating the argument. */
137*6b445a62SJohn Marino int rl_arg_sign = 1;
138*6b445a62SJohn Marino 
139*6b445a62SJohn Marino /* Non-zero means we have been called at least once before. */
140*6b445a62SJohn Marino static int rl_initialized;
141*6b445a62SJohn Marino 
142*6b445a62SJohn Marino #if 0
143*6b445a62SJohn Marino /* If non-zero, this program is running in an EMACS buffer. */
144*6b445a62SJohn Marino static int running_in_emacs;
145*6b445a62SJohn Marino #endif
146*6b445a62SJohn Marino 
147*6b445a62SJohn Marino /* Flags word encapsulating the current readline state. */
148*6b445a62SJohn Marino int rl_readline_state = RL_STATE_NONE;
149*6b445a62SJohn Marino 
150*6b445a62SJohn Marino /* The current offset in the current input line. */
151*6b445a62SJohn Marino int rl_point;
152*6b445a62SJohn Marino 
153*6b445a62SJohn Marino /* Mark in the current input line. */
154*6b445a62SJohn Marino int rl_mark;
155*6b445a62SJohn Marino 
156*6b445a62SJohn Marino /* Length of the current input line. */
157*6b445a62SJohn Marino int rl_end;
158*6b445a62SJohn Marino 
159*6b445a62SJohn Marino /* Make this non-zero to return the current input_line. */
160*6b445a62SJohn Marino int rl_done;
161*6b445a62SJohn Marino 
162*6b445a62SJohn Marino /* The last function executed by readline. */
163*6b445a62SJohn Marino rl_command_func_t *rl_last_func = (rl_command_func_t *)NULL;
164*6b445a62SJohn Marino 
165*6b445a62SJohn Marino /* Top level environment for readline_internal (). */
166*6b445a62SJohn Marino procenv_t _rl_top_level;
167*6b445a62SJohn Marino 
168*6b445a62SJohn Marino /* The streams we interact with. */
169*6b445a62SJohn Marino FILE *_rl_in_stream, *_rl_out_stream;
170*6b445a62SJohn Marino 
171*6b445a62SJohn Marino /* The names of the streams that we do input and output to. */
172*6b445a62SJohn Marino FILE *rl_instream = (FILE *)NULL;
173*6b445a62SJohn Marino FILE *rl_outstream = (FILE *)NULL;
174*6b445a62SJohn Marino 
175*6b445a62SJohn Marino /* Non-zero means echo characters as they are read.  Defaults to no echo;
176*6b445a62SJohn Marino    set to 1 if there is a controlling terminal, we can get its attributes,
177*6b445a62SJohn Marino    and the attributes include `echo'.  Look at rltty.c:prepare_terminal_settings
178*6b445a62SJohn Marino    for the code that sets it. */
179*6b445a62SJohn Marino int _rl_echoing_p = 0;
180*6b445a62SJohn Marino 
181*6b445a62SJohn Marino /* Current prompt. */
182*6b445a62SJohn Marino char *rl_prompt = (char *)NULL;
183*6b445a62SJohn Marino int rl_visible_prompt_length = 0;
184*6b445a62SJohn Marino 
185*6b445a62SJohn Marino /* Set to non-zero by calling application if it has already printed rl_prompt
186*6b445a62SJohn Marino    and does not want readline to do it the first time. */
187*6b445a62SJohn Marino int rl_already_prompted = 0;
188*6b445a62SJohn Marino 
189*6b445a62SJohn Marino /* The number of characters read in order to type this complete command. */
190*6b445a62SJohn Marino int rl_key_sequence_length = 0;
191*6b445a62SJohn Marino 
192*6b445a62SJohn Marino /* If non-zero, then this is the address of a function to call just
193*6b445a62SJohn Marino    before readline_internal_setup () prints the first prompt. */
194*6b445a62SJohn Marino rl_hook_func_t *rl_startup_hook = (rl_hook_func_t *)NULL;
195*6b445a62SJohn Marino 
196*6b445a62SJohn Marino /* If non-zero, this is the address of a function to call just before
197*6b445a62SJohn Marino    readline_internal_setup () returns and readline_internal starts
198*6b445a62SJohn Marino    reading input characters. */
199*6b445a62SJohn Marino rl_hook_func_t *rl_pre_input_hook = (rl_hook_func_t *)NULL;
200*6b445a62SJohn Marino 
201*6b445a62SJohn Marino /* What we use internally.  You should always refer to RL_LINE_BUFFER. */
202*6b445a62SJohn Marino static char *the_line;
203*6b445a62SJohn Marino 
204*6b445a62SJohn Marino /* The character that can generate an EOF.  Really read from
205*6b445a62SJohn Marino    the terminal driver... just defaulted here. */
206*6b445a62SJohn Marino int _rl_eof_char = CTRL ('D');
207*6b445a62SJohn Marino 
208*6b445a62SJohn Marino /* Non-zero makes this the next keystroke to read. */
209*6b445a62SJohn Marino int rl_pending_input = 0;
210*6b445a62SJohn Marino 
211*6b445a62SJohn Marino /* Pointer to a useful terminal name. */
212*6b445a62SJohn Marino const char *rl_terminal_name = (const char *)NULL;
213*6b445a62SJohn Marino 
214*6b445a62SJohn Marino /* Non-zero means to always use horizontal scrolling in line display. */
215*6b445a62SJohn Marino int _rl_horizontal_scroll_mode = 0;
216*6b445a62SJohn Marino 
217*6b445a62SJohn Marino /* Non-zero means to display an asterisk at the starts of history lines
218*6b445a62SJohn Marino    which have been modified. */
219*6b445a62SJohn Marino int _rl_mark_modified_lines = 0;
220*6b445a62SJohn Marino 
221*6b445a62SJohn Marino /* The style of `bell' notification preferred.  This can be set to NO_BELL,
222*6b445a62SJohn Marino    AUDIBLE_BELL, or VISIBLE_BELL. */
223*6b445a62SJohn Marino int _rl_bell_preference = AUDIBLE_BELL;
224*6b445a62SJohn Marino 
225*6b445a62SJohn Marino /* String inserted into the line by rl_insert_comment (). */
226*6b445a62SJohn Marino char *_rl_comment_begin;
227*6b445a62SJohn Marino 
228*6b445a62SJohn Marino /* Keymap holding the function currently being executed. */
229*6b445a62SJohn Marino Keymap rl_executing_keymap;
230*6b445a62SJohn Marino 
231*6b445a62SJohn Marino /* Keymap we're currently using to dispatch. */
232*6b445a62SJohn Marino Keymap _rl_dispatching_keymap;
233*6b445a62SJohn Marino 
234*6b445a62SJohn Marino /* Non-zero means to erase entire line, including prompt, on empty input lines. */
235*6b445a62SJohn Marino int rl_erase_empty_line = 0;
236*6b445a62SJohn Marino 
237*6b445a62SJohn Marino /* Non-zero means to read only this many characters rather than up to a
238*6b445a62SJohn Marino    character bound to accept-line. */
239*6b445a62SJohn Marino int rl_num_chars_to_read;
240*6b445a62SJohn Marino 
241*6b445a62SJohn Marino /* Line buffer and maintenence. */
242*6b445a62SJohn Marino char *rl_line_buffer = (char *)NULL;
243*6b445a62SJohn Marino int rl_line_buffer_len = 0;
244*6b445a62SJohn Marino 
245*6b445a62SJohn Marino /* Key sequence `contexts' */
246*6b445a62SJohn Marino _rl_keyseq_cxt *_rl_kscxt = 0;
247*6b445a62SJohn Marino 
248*6b445a62SJohn Marino /* Forward declarations used by the display, termcap, and history code. */
249*6b445a62SJohn Marino 
250*6b445a62SJohn Marino /* **************************************************************** */
251*6b445a62SJohn Marino /*								    */
252*6b445a62SJohn Marino /*			`Forward' declarations  		    */
253*6b445a62SJohn Marino /*								    */
254*6b445a62SJohn Marino /* **************************************************************** */
255*6b445a62SJohn Marino 
256*6b445a62SJohn Marino /* Non-zero means do not parse any lines other than comments and
257*6b445a62SJohn Marino    parser directives. */
258*6b445a62SJohn Marino unsigned char _rl_parsing_conditionalized_out = 0;
259*6b445a62SJohn Marino 
260*6b445a62SJohn Marino /* Non-zero means to convert characters with the meta bit set to
261*6b445a62SJohn Marino    escape-prefixed characters so we can indirect through
262*6b445a62SJohn Marino    emacs_meta_keymap or vi_escape_keymap. */
263*6b445a62SJohn Marino int _rl_convert_meta_chars_to_ascii = 1;
264*6b445a62SJohn Marino 
265*6b445a62SJohn Marino /* Non-zero means to output characters with the meta bit set directly
266*6b445a62SJohn Marino    rather than as a meta-prefixed escape sequence. */
267*6b445a62SJohn Marino int _rl_output_meta_chars = 0;
268*6b445a62SJohn Marino 
269*6b445a62SJohn Marino /* Non-zero means to look at the termios special characters and bind
270*6b445a62SJohn Marino    them to equivalent readline functions at startup. */
271*6b445a62SJohn Marino int _rl_bind_stty_chars = 1;
272*6b445a62SJohn Marino 
273*6b445a62SJohn Marino /* Non-zero means to go through the history list at every newline (or
274*6b445a62SJohn Marino    whenever rl_done is set and readline returns) and revert each line to
275*6b445a62SJohn Marino    its initial state. */
276*6b445a62SJohn Marino int _rl_revert_all_at_newline = 0;
277*6b445a62SJohn Marino 
278*6b445a62SJohn Marino /* Non-zero means to honor the termios ECHOCTL bit and echo control
279*6b445a62SJohn Marino    characters corresponding to keyboard-generated signals. */
280*6b445a62SJohn Marino int _rl_echo_control_chars = 1;
281*6b445a62SJohn Marino 
282*6b445a62SJohn Marino /* **************************************************************** */
283*6b445a62SJohn Marino /*								    */
284*6b445a62SJohn Marino /*			Top Level Functions			    */
285*6b445a62SJohn Marino /*								    */
286*6b445a62SJohn Marino /* **************************************************************** */
287*6b445a62SJohn Marino 
288*6b445a62SJohn Marino /* Non-zero means treat 0200 bit in terminal input as Meta bit. */
289*6b445a62SJohn Marino int _rl_meta_flag = 0;	/* Forward declaration */
290*6b445a62SJohn Marino 
291*6b445a62SJohn Marino /* Set up the prompt and expand it.  Called from readline() and
292*6b445a62SJohn Marino    rl_callback_handler_install (). */
293*6b445a62SJohn Marino int
rl_set_prompt(prompt)294*6b445a62SJohn Marino rl_set_prompt (prompt)
295*6b445a62SJohn Marino      const char *prompt;
296*6b445a62SJohn Marino {
297*6b445a62SJohn Marino   FREE (rl_prompt);
298*6b445a62SJohn Marino   rl_prompt = prompt ? savestring (prompt) : (char *)NULL;
299*6b445a62SJohn Marino   rl_display_prompt = rl_prompt ? rl_prompt : "";
300*6b445a62SJohn Marino 
301*6b445a62SJohn Marino   rl_visible_prompt_length = rl_expand_prompt (rl_prompt);
302*6b445a62SJohn Marino   return 0;
303*6b445a62SJohn Marino }
304*6b445a62SJohn Marino 
305*6b445a62SJohn Marino /* Read a line of input.  Prompt with PROMPT.  An empty PROMPT means
306*6b445a62SJohn Marino    none.  A return value of NULL means that EOF was encountered. */
307*6b445a62SJohn Marino char *
readline(prompt)308*6b445a62SJohn Marino readline (prompt)
309*6b445a62SJohn Marino      const char *prompt;
310*6b445a62SJohn Marino {
311*6b445a62SJohn Marino   char *value;
312*6b445a62SJohn Marino #if 0
313*6b445a62SJohn Marino   int in_callback;
314*6b445a62SJohn Marino #endif
315*6b445a62SJohn Marino 
316*6b445a62SJohn Marino   /* If we are at EOF return a NULL string. */
317*6b445a62SJohn Marino   if (rl_pending_input == EOF)
318*6b445a62SJohn Marino     {
319*6b445a62SJohn Marino       rl_clear_pending_input ();
320*6b445a62SJohn Marino       return ((char *)NULL);
321*6b445a62SJohn Marino     }
322*6b445a62SJohn Marino 
323*6b445a62SJohn Marino #if 0
324*6b445a62SJohn Marino   /* If readline() is called after installing a callback handler, temporarily
325*6b445a62SJohn Marino      turn off the callback state to avoid ensuing messiness.  Patch supplied
326*6b445a62SJohn Marino      by the gdb folks.  XXX -- disabled.  This can be fooled and readline
327*6b445a62SJohn Marino      left in a strange state by a poorly-timed longjmp. */
328*6b445a62SJohn Marino   if (in_callback = RL_ISSTATE (RL_STATE_CALLBACK))
329*6b445a62SJohn Marino     RL_UNSETSTATE (RL_STATE_CALLBACK);
330*6b445a62SJohn Marino #endif
331*6b445a62SJohn Marino 
332*6b445a62SJohn Marino   rl_set_prompt (prompt);
333*6b445a62SJohn Marino 
334*6b445a62SJohn Marino   rl_initialize ();
335*6b445a62SJohn Marino   if (rl_prep_term_function)
336*6b445a62SJohn Marino     (*rl_prep_term_function) (_rl_meta_flag);
337*6b445a62SJohn Marino 
338*6b445a62SJohn Marino #if defined (HANDLE_SIGNALS)
339*6b445a62SJohn Marino   rl_set_signals ();
340*6b445a62SJohn Marino #endif
341*6b445a62SJohn Marino 
342*6b445a62SJohn Marino   value = readline_internal ();
343*6b445a62SJohn Marino   if (rl_deprep_term_function)
344*6b445a62SJohn Marino     (*rl_deprep_term_function) ();
345*6b445a62SJohn Marino 
346*6b445a62SJohn Marino #if defined (HANDLE_SIGNALS)
347*6b445a62SJohn Marino   rl_clear_signals ();
348*6b445a62SJohn Marino #endif
349*6b445a62SJohn Marino 
350*6b445a62SJohn Marino #if 0
351*6b445a62SJohn Marino   if (in_callback)
352*6b445a62SJohn Marino     RL_SETSTATE (RL_STATE_CALLBACK);
353*6b445a62SJohn Marino #endif
354*6b445a62SJohn Marino 
355*6b445a62SJohn Marino   return (value);
356*6b445a62SJohn Marino }
357*6b445a62SJohn Marino 
358*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
359*6b445a62SJohn Marino #  define STATIC_CALLBACK
360*6b445a62SJohn Marino #else
361*6b445a62SJohn Marino #  define STATIC_CALLBACK static
362*6b445a62SJohn Marino #endif
363*6b445a62SJohn Marino 
364*6b445a62SJohn Marino STATIC_CALLBACK void
readline_internal_setup()365*6b445a62SJohn Marino readline_internal_setup ()
366*6b445a62SJohn Marino {
367*6b445a62SJohn Marino   char *nprompt;
368*6b445a62SJohn Marino 
369*6b445a62SJohn Marino   _rl_in_stream = rl_instream;
370*6b445a62SJohn Marino   _rl_out_stream = rl_outstream;
371*6b445a62SJohn Marino 
372*6b445a62SJohn Marino   if (rl_startup_hook)
373*6b445a62SJohn Marino     (*rl_startup_hook) ();
374*6b445a62SJohn Marino 
375*6b445a62SJohn Marino   /* If we're not echoing, we still want to at least print a prompt, because
376*6b445a62SJohn Marino      rl_redisplay will not do it for us.  If the calling application has a
377*6b445a62SJohn Marino      custom redisplay function, though, let that function handle it. */
378*6b445a62SJohn Marino   if (_rl_echoing_p == 0 && rl_redisplay_function == rl_redisplay)
379*6b445a62SJohn Marino     {
380*6b445a62SJohn Marino       if (rl_prompt && rl_already_prompted == 0)
381*6b445a62SJohn Marino 	{
382*6b445a62SJohn Marino 	  nprompt = _rl_strip_prompt (rl_prompt);
383*6b445a62SJohn Marino 	  fprintf (_rl_out_stream, "%s", nprompt);
384*6b445a62SJohn Marino 	  fflush (_rl_out_stream);
385*6b445a62SJohn Marino 	  xfree (nprompt);
386*6b445a62SJohn Marino 	}
387*6b445a62SJohn Marino     }
388*6b445a62SJohn Marino   else
389*6b445a62SJohn Marino     {
390*6b445a62SJohn Marino       if (rl_prompt && rl_already_prompted)
391*6b445a62SJohn Marino 	rl_on_new_line_with_prompt ();
392*6b445a62SJohn Marino       else
393*6b445a62SJohn Marino 	rl_on_new_line ();
394*6b445a62SJohn Marino       (*rl_redisplay_function) ();
395*6b445a62SJohn Marino     }
396*6b445a62SJohn Marino 
397*6b445a62SJohn Marino #if defined (VI_MODE)
398*6b445a62SJohn Marino   if (rl_editing_mode == vi_mode)
399*6b445a62SJohn Marino     rl_vi_insert_mode (1, 'i');
400*6b445a62SJohn Marino #endif /* VI_MODE */
401*6b445a62SJohn Marino 
402*6b445a62SJohn Marino   if (rl_pre_input_hook)
403*6b445a62SJohn Marino     (*rl_pre_input_hook) ();
404*6b445a62SJohn Marino 
405*6b445a62SJohn Marino   RL_CHECK_SIGNALS ();
406*6b445a62SJohn Marino }
407*6b445a62SJohn Marino 
408*6b445a62SJohn Marino STATIC_CALLBACK char *
readline_internal_teardown(eof)409*6b445a62SJohn Marino readline_internal_teardown (eof)
410*6b445a62SJohn Marino      int eof;
411*6b445a62SJohn Marino {
412*6b445a62SJohn Marino   char *temp;
413*6b445a62SJohn Marino   HIST_ENTRY *entry;
414*6b445a62SJohn Marino 
415*6b445a62SJohn Marino   RL_CHECK_SIGNALS ();
416*6b445a62SJohn Marino 
417*6b445a62SJohn Marino   /* Restore the original of this history line, iff the line that we
418*6b445a62SJohn Marino      are editing was originally in the history, AND the line has changed. */
419*6b445a62SJohn Marino   entry = current_history ();
420*6b445a62SJohn Marino 
421*6b445a62SJohn Marino   if (entry && rl_undo_list)
422*6b445a62SJohn Marino     {
423*6b445a62SJohn Marino       temp = savestring (the_line);
424*6b445a62SJohn Marino       rl_revert_line (1, 0);
425*6b445a62SJohn Marino       entry = replace_history_entry (where_history (), the_line, (histdata_t)NULL);
426*6b445a62SJohn Marino       _rl_free_history_entry (entry);
427*6b445a62SJohn Marino 
428*6b445a62SJohn Marino       strcpy (the_line, temp);
429*6b445a62SJohn Marino       xfree (temp);
430*6b445a62SJohn Marino     }
431*6b445a62SJohn Marino 
432*6b445a62SJohn Marino   if (_rl_revert_all_at_newline)
433*6b445a62SJohn Marino     _rl_revert_all_lines ();
434*6b445a62SJohn Marino 
435*6b445a62SJohn Marino   /* At any rate, it is highly likely that this line has an undo list.  Get
436*6b445a62SJohn Marino      rid of it now. */
437*6b445a62SJohn Marino   if (rl_undo_list)
438*6b445a62SJohn Marino     rl_free_undo_list ();
439*6b445a62SJohn Marino 
440*6b445a62SJohn Marino   /* Restore normal cursor, if available. */
441*6b445a62SJohn Marino   _rl_set_insert_mode (RL_IM_INSERT, 0);
442*6b445a62SJohn Marino 
443*6b445a62SJohn Marino   return (eof ? (char *)NULL : savestring (the_line));
444*6b445a62SJohn Marino }
445*6b445a62SJohn Marino 
446*6b445a62SJohn Marino void
_rl_internal_char_cleanup()447*6b445a62SJohn Marino _rl_internal_char_cleanup ()
448*6b445a62SJohn Marino {
449*6b445a62SJohn Marino #if defined (VI_MODE)
450*6b445a62SJohn Marino   /* In vi mode, when you exit insert mode, the cursor moves back
451*6b445a62SJohn Marino      over the previous character.  We explicitly check for that here. */
452*6b445a62SJohn Marino   if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap)
453*6b445a62SJohn Marino     rl_vi_check ();
454*6b445a62SJohn Marino #endif /* VI_MODE */
455*6b445a62SJohn Marino 
456*6b445a62SJohn Marino   if (rl_num_chars_to_read && rl_end >= rl_num_chars_to_read)
457*6b445a62SJohn Marino     {
458*6b445a62SJohn Marino       (*rl_redisplay_function) ();
459*6b445a62SJohn Marino       _rl_want_redisplay = 0;
460*6b445a62SJohn Marino       rl_newline (1, '\n');
461*6b445a62SJohn Marino     }
462*6b445a62SJohn Marino 
463*6b445a62SJohn Marino   if (rl_done == 0)
464*6b445a62SJohn Marino     {
465*6b445a62SJohn Marino       (*rl_redisplay_function) ();
466*6b445a62SJohn Marino       _rl_want_redisplay = 0;
467*6b445a62SJohn Marino     }
468*6b445a62SJohn Marino 
469*6b445a62SJohn Marino   /* If the application writer has told us to erase the entire line if
470*6b445a62SJohn Marino      the only character typed was something bound to rl_newline, do so. */
471*6b445a62SJohn Marino   if (rl_erase_empty_line && rl_done && rl_last_func == rl_newline &&
472*6b445a62SJohn Marino       rl_point == 0 && rl_end == 0)
473*6b445a62SJohn Marino     _rl_erase_entire_line ();
474*6b445a62SJohn Marino }
475*6b445a62SJohn Marino 
476*6b445a62SJohn Marino STATIC_CALLBACK int
477*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
readline_internal_char()478*6b445a62SJohn Marino readline_internal_char ()
479*6b445a62SJohn Marino #else
480*6b445a62SJohn Marino readline_internal_charloop ()
481*6b445a62SJohn Marino #endif
482*6b445a62SJohn Marino {
483*6b445a62SJohn Marino   static int lastc, eof_found;
484*6b445a62SJohn Marino   int c, code, lk;
485*6b445a62SJohn Marino 
486*6b445a62SJohn Marino   lastc = -1;
487*6b445a62SJohn Marino   eof_found = 0;
488*6b445a62SJohn Marino 
489*6b445a62SJohn Marino #if !defined (READLINE_CALLBACKS)
490*6b445a62SJohn Marino   while (rl_done == 0)
491*6b445a62SJohn Marino     {
492*6b445a62SJohn Marino #endif
493*6b445a62SJohn Marino       lk = _rl_last_command_was_kill;
494*6b445a62SJohn Marino 
495*6b445a62SJohn Marino       code = setjmp (_rl_top_level);
496*6b445a62SJohn Marino 
497*6b445a62SJohn Marino       if (code)
498*6b445a62SJohn Marino 	{
499*6b445a62SJohn Marino 	  (*rl_redisplay_function) ();
500*6b445a62SJohn Marino 	  _rl_want_redisplay = 0;
501*6b445a62SJohn Marino 	  /* If we get here, we're not being called from something dispatched
502*6b445a62SJohn Marino 	     from _rl_callback_read_char(), which sets up its own value of
503*6b445a62SJohn Marino 	     _rl_top_level (saving and restoring the old, of course), so
504*6b445a62SJohn Marino 	     we can just return here. */
505*6b445a62SJohn Marino 	  if (RL_ISSTATE (RL_STATE_CALLBACK))
506*6b445a62SJohn Marino 	    return (0);
507*6b445a62SJohn Marino 	}
508*6b445a62SJohn Marino 
509*6b445a62SJohn Marino       if (rl_pending_input == 0)
510*6b445a62SJohn Marino 	{
511*6b445a62SJohn Marino 	  /* Then initialize the argument and number of keys read. */
512*6b445a62SJohn Marino 	  _rl_reset_argument ();
513*6b445a62SJohn Marino 	  rl_key_sequence_length = 0;
514*6b445a62SJohn Marino 	}
515*6b445a62SJohn Marino 
516*6b445a62SJohn Marino       RL_SETSTATE(RL_STATE_READCMD);
517*6b445a62SJohn Marino       c = rl_read_key ();
518*6b445a62SJohn Marino       RL_UNSETSTATE(RL_STATE_READCMD);
519*6b445a62SJohn Marino 
520*6b445a62SJohn Marino       /* look at input.c:rl_getc() for the circumstances under which this will
521*6b445a62SJohn Marino 	 be returned; punt immediately on read error without converting it to
522*6b445a62SJohn Marino 	 a newline. */
523*6b445a62SJohn Marino       if (c == READERR)
524*6b445a62SJohn Marino 	{
525*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
526*6b445a62SJohn Marino 	  RL_SETSTATE(RL_STATE_DONE);
527*6b445a62SJohn Marino 	  return (rl_done = 1);
528*6b445a62SJohn Marino #else
529*6b445a62SJohn Marino 	  eof_found = 1;
530*6b445a62SJohn Marino 	  break;
531*6b445a62SJohn Marino #endif
532*6b445a62SJohn Marino 	}
533*6b445a62SJohn Marino 
534*6b445a62SJohn Marino       /* EOF typed to a non-blank line is a <NL>. */
535*6b445a62SJohn Marino       if (c == EOF && rl_end)
536*6b445a62SJohn Marino 	c = NEWLINE;
537*6b445a62SJohn Marino 
538*6b445a62SJohn Marino       /* The character _rl_eof_char typed to blank line, and not as the
539*6b445a62SJohn Marino 	 previous character is interpreted as EOF. */
540*6b445a62SJohn Marino       if (((c == _rl_eof_char && lastc != c) || c == EOF) && !rl_end)
541*6b445a62SJohn Marino 	{
542*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
543*6b445a62SJohn Marino 	  RL_SETSTATE(RL_STATE_DONE);
544*6b445a62SJohn Marino 	  return (rl_done = 1);
545*6b445a62SJohn Marino #else
546*6b445a62SJohn Marino 	  eof_found = 1;
547*6b445a62SJohn Marino 	  break;
548*6b445a62SJohn Marino #endif
549*6b445a62SJohn Marino 	}
550*6b445a62SJohn Marino 
551*6b445a62SJohn Marino       lastc = c;
552*6b445a62SJohn Marino       _rl_dispatch ((unsigned char)c, _rl_keymap);
553*6b445a62SJohn Marino       RL_CHECK_SIGNALS ();
554*6b445a62SJohn Marino 
555*6b445a62SJohn Marino       /* If there was no change in _rl_last_command_was_kill, then no kill
556*6b445a62SJohn Marino 	 has taken place.  Note that if input is pending we are reading
557*6b445a62SJohn Marino 	 a prefix command, so nothing has changed yet. */
558*6b445a62SJohn Marino       if (rl_pending_input == 0 && lk == _rl_last_command_was_kill)
559*6b445a62SJohn Marino 	_rl_last_command_was_kill = 0;
560*6b445a62SJohn Marino 
561*6b445a62SJohn Marino       _rl_internal_char_cleanup ();
562*6b445a62SJohn Marino 
563*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
564*6b445a62SJohn Marino       return 0;
565*6b445a62SJohn Marino #else
566*6b445a62SJohn Marino     }
567*6b445a62SJohn Marino 
568*6b445a62SJohn Marino   return (eof_found);
569*6b445a62SJohn Marino #endif
570*6b445a62SJohn Marino }
571*6b445a62SJohn Marino 
572*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
573*6b445a62SJohn Marino static int
readline_internal_charloop()574*6b445a62SJohn Marino readline_internal_charloop ()
575*6b445a62SJohn Marino {
576*6b445a62SJohn Marino   int eof = 1;
577*6b445a62SJohn Marino 
578*6b445a62SJohn Marino   while (rl_done == 0)
579*6b445a62SJohn Marino     eof = readline_internal_char ();
580*6b445a62SJohn Marino   return (eof);
581*6b445a62SJohn Marino }
582*6b445a62SJohn Marino #endif /* READLINE_CALLBACKS */
583*6b445a62SJohn Marino 
584*6b445a62SJohn Marino /* Read a line of input from the global rl_instream, doing output on
585*6b445a62SJohn Marino    the global rl_outstream.
586*6b445a62SJohn Marino    If rl_prompt is non-null, then that is our prompt. */
587*6b445a62SJohn Marino static char *
readline_internal()588*6b445a62SJohn Marino readline_internal ()
589*6b445a62SJohn Marino {
590*6b445a62SJohn Marino   int eof;
591*6b445a62SJohn Marino 
592*6b445a62SJohn Marino   readline_internal_setup ();
593*6b445a62SJohn Marino   eof = readline_internal_charloop ();
594*6b445a62SJohn Marino   return (readline_internal_teardown (eof));
595*6b445a62SJohn Marino }
596*6b445a62SJohn Marino 
597*6b445a62SJohn Marino void
_rl_init_line_state()598*6b445a62SJohn Marino _rl_init_line_state ()
599*6b445a62SJohn Marino {
600*6b445a62SJohn Marino   rl_point = rl_end = rl_mark = 0;
601*6b445a62SJohn Marino   the_line = rl_line_buffer;
602*6b445a62SJohn Marino   the_line[0] = 0;
603*6b445a62SJohn Marino }
604*6b445a62SJohn Marino 
605*6b445a62SJohn Marino void
_rl_set_the_line()606*6b445a62SJohn Marino _rl_set_the_line ()
607*6b445a62SJohn Marino {
608*6b445a62SJohn Marino   the_line = rl_line_buffer;
609*6b445a62SJohn Marino }
610*6b445a62SJohn Marino 
611*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
612*6b445a62SJohn Marino _rl_keyseq_cxt *
_rl_keyseq_cxt_alloc()613*6b445a62SJohn Marino _rl_keyseq_cxt_alloc ()
614*6b445a62SJohn Marino {
615*6b445a62SJohn Marino   _rl_keyseq_cxt *cxt;
616*6b445a62SJohn Marino 
617*6b445a62SJohn Marino   cxt = (_rl_keyseq_cxt *)xmalloc (sizeof (_rl_keyseq_cxt));
618*6b445a62SJohn Marino 
619*6b445a62SJohn Marino   cxt->flags = cxt->subseq_arg = cxt->subseq_retval = 0;
620*6b445a62SJohn Marino 
621*6b445a62SJohn Marino   cxt->okey = 0;
622*6b445a62SJohn Marino   cxt->ocxt = _rl_kscxt;
623*6b445a62SJohn Marino   cxt->childval = 42;		/* sentinel value */
624*6b445a62SJohn Marino 
625*6b445a62SJohn Marino   return cxt;
626*6b445a62SJohn Marino }
627*6b445a62SJohn Marino 
628*6b445a62SJohn Marino void
_rl_keyseq_cxt_dispose(cxt)629*6b445a62SJohn Marino _rl_keyseq_cxt_dispose (cxt)
630*6b445a62SJohn Marino     _rl_keyseq_cxt *cxt;
631*6b445a62SJohn Marino {
632*6b445a62SJohn Marino   xfree (cxt);
633*6b445a62SJohn Marino }
634*6b445a62SJohn Marino 
635*6b445a62SJohn Marino void
_rl_keyseq_chain_dispose()636*6b445a62SJohn Marino _rl_keyseq_chain_dispose ()
637*6b445a62SJohn Marino {
638*6b445a62SJohn Marino   _rl_keyseq_cxt *cxt;
639*6b445a62SJohn Marino 
640*6b445a62SJohn Marino   while (_rl_kscxt)
641*6b445a62SJohn Marino     {
642*6b445a62SJohn Marino       cxt = _rl_kscxt;
643*6b445a62SJohn Marino       _rl_kscxt = _rl_kscxt->ocxt;
644*6b445a62SJohn Marino       _rl_keyseq_cxt_dispose (cxt);
645*6b445a62SJohn Marino     }
646*6b445a62SJohn Marino }
647*6b445a62SJohn Marino #endif
648*6b445a62SJohn Marino 
649*6b445a62SJohn Marino static int
_rl_subseq_getchar(key)650*6b445a62SJohn Marino _rl_subseq_getchar (key)
651*6b445a62SJohn Marino      int key;
652*6b445a62SJohn Marino {
653*6b445a62SJohn Marino   int k;
654*6b445a62SJohn Marino 
655*6b445a62SJohn Marino   if (key == ESC)
656*6b445a62SJohn Marino     RL_SETSTATE(RL_STATE_METANEXT);
657*6b445a62SJohn Marino   RL_SETSTATE(RL_STATE_MOREINPUT);
658*6b445a62SJohn Marino   k = rl_read_key ();
659*6b445a62SJohn Marino   RL_UNSETSTATE(RL_STATE_MOREINPUT);
660*6b445a62SJohn Marino   if (key == ESC)
661*6b445a62SJohn Marino     RL_UNSETSTATE(RL_STATE_METANEXT);
662*6b445a62SJohn Marino 
663*6b445a62SJohn Marino   return k;
664*6b445a62SJohn Marino }
665*6b445a62SJohn Marino 
666*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
667*6b445a62SJohn Marino int
_rl_dispatch_callback(cxt)668*6b445a62SJohn Marino _rl_dispatch_callback (cxt)
669*6b445a62SJohn Marino      _rl_keyseq_cxt *cxt;
670*6b445a62SJohn Marino {
671*6b445a62SJohn Marino   int nkey, r;
672*6b445a62SJohn Marino 
673*6b445a62SJohn Marino   /* For now */
674*6b445a62SJohn Marino   /* The first time this context is used, we want to read input and dispatch
675*6b445a62SJohn Marino      on it.  When traversing the chain of contexts back `up', we want to use
676*6b445a62SJohn Marino      the value from the next context down.  We're simulating recursion using
677*6b445a62SJohn Marino      a chain of contexts. */
678*6b445a62SJohn Marino   if ((cxt->flags & KSEQ_DISPATCHED) == 0)
679*6b445a62SJohn Marino     {
680*6b445a62SJohn Marino       nkey = _rl_subseq_getchar (cxt->okey);
681*6b445a62SJohn Marino       if (nkey < 0)
682*6b445a62SJohn Marino 	{
683*6b445a62SJohn Marino 	  _rl_abort_internal ();
684*6b445a62SJohn Marino 	  return -1;
685*6b445a62SJohn Marino 	}
686*6b445a62SJohn Marino       r = _rl_dispatch_subseq (nkey, cxt->dmap, cxt->subseq_arg);
687*6b445a62SJohn Marino       cxt->flags |= KSEQ_DISPATCHED;
688*6b445a62SJohn Marino     }
689*6b445a62SJohn Marino   else
690*6b445a62SJohn Marino     r = cxt->childval;
691*6b445a62SJohn Marino 
692*6b445a62SJohn Marino   /* For now */
693*6b445a62SJohn Marino   if (r != -3)	/* don't do this if we indicate there will be other matches */
694*6b445a62SJohn Marino     r = _rl_subseq_result (r, cxt->oldmap, cxt->okey, (cxt->flags & KSEQ_SUBSEQ));
695*6b445a62SJohn Marino 
696*6b445a62SJohn Marino   RL_CHECK_SIGNALS ();
697*6b445a62SJohn Marino   if (r == 0)			/* success! */
698*6b445a62SJohn Marino     {
699*6b445a62SJohn Marino       _rl_keyseq_chain_dispose ();
700*6b445a62SJohn Marino       RL_UNSETSTATE (RL_STATE_MULTIKEY);
701*6b445a62SJohn Marino       return r;
702*6b445a62SJohn Marino     }
703*6b445a62SJohn Marino 
704*6b445a62SJohn Marino   if (r != -3)			/* magic value that says we added to the chain */
705*6b445a62SJohn Marino     _rl_kscxt = cxt->ocxt;
706*6b445a62SJohn Marino   if (_rl_kscxt)
707*6b445a62SJohn Marino     _rl_kscxt->childval = r;
708*6b445a62SJohn Marino   if (r != -3)
709*6b445a62SJohn Marino     _rl_keyseq_cxt_dispose (cxt);
710*6b445a62SJohn Marino 
711*6b445a62SJohn Marino   return r;
712*6b445a62SJohn Marino }
713*6b445a62SJohn Marino #endif /* READLINE_CALLBACKS */
714*6b445a62SJohn Marino 
715*6b445a62SJohn Marino /* Do the command associated with KEY in MAP.
716*6b445a62SJohn Marino    If the associated command is really a keymap, then read
717*6b445a62SJohn Marino    another key, and dispatch into that map. */
718*6b445a62SJohn Marino int
_rl_dispatch(key,map)719*6b445a62SJohn Marino _rl_dispatch (key, map)
720*6b445a62SJohn Marino      register int key;
721*6b445a62SJohn Marino      Keymap map;
722*6b445a62SJohn Marino {
723*6b445a62SJohn Marino   _rl_dispatching_keymap = map;
724*6b445a62SJohn Marino   return _rl_dispatch_subseq (key, map, 0);
725*6b445a62SJohn Marino }
726*6b445a62SJohn Marino 
727*6b445a62SJohn Marino int
_rl_dispatch_subseq(key,map,got_subseq)728*6b445a62SJohn Marino _rl_dispatch_subseq (key, map, got_subseq)
729*6b445a62SJohn Marino      register int key;
730*6b445a62SJohn Marino      Keymap map;
731*6b445a62SJohn Marino      int got_subseq;
732*6b445a62SJohn Marino {
733*6b445a62SJohn Marino   int r, newkey;
734*6b445a62SJohn Marino   char *macro;
735*6b445a62SJohn Marino   rl_command_func_t *func;
736*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
737*6b445a62SJohn Marino   _rl_keyseq_cxt *cxt;
738*6b445a62SJohn Marino #endif
739*6b445a62SJohn Marino 
740*6b445a62SJohn Marino   if (META_CHAR (key) && _rl_convert_meta_chars_to_ascii)
741*6b445a62SJohn Marino     {
742*6b445a62SJohn Marino       if (map[ESC].type == ISKMAP)
743*6b445a62SJohn Marino 	{
744*6b445a62SJohn Marino 	  if (RL_ISSTATE (RL_STATE_MACRODEF))
745*6b445a62SJohn Marino 	    _rl_add_macro_char (ESC);
746*6b445a62SJohn Marino 	  map = FUNCTION_TO_KEYMAP (map, ESC);
747*6b445a62SJohn Marino 	  key = UNMETA (key);
748*6b445a62SJohn Marino 	  rl_key_sequence_length += 2;
749*6b445a62SJohn Marino 	  return (_rl_dispatch (key, map));
750*6b445a62SJohn Marino 	}
751*6b445a62SJohn Marino       else
752*6b445a62SJohn Marino 	rl_ding ();
753*6b445a62SJohn Marino       return 0;
754*6b445a62SJohn Marino     }
755*6b445a62SJohn Marino 
756*6b445a62SJohn Marino   if (RL_ISSTATE (RL_STATE_MACRODEF))
757*6b445a62SJohn Marino     _rl_add_macro_char (key);
758*6b445a62SJohn Marino 
759*6b445a62SJohn Marino   r = 0;
760*6b445a62SJohn Marino   switch (map[key].type)
761*6b445a62SJohn Marino     {
762*6b445a62SJohn Marino     case ISFUNC:
763*6b445a62SJohn Marino       func = map[key].function;
764*6b445a62SJohn Marino       if (func)
765*6b445a62SJohn Marino 	{
766*6b445a62SJohn Marino 	  /* Special case rl_do_lowercase_version (). */
767*6b445a62SJohn Marino 	  if (func == rl_do_lowercase_version)
768*6b445a62SJohn Marino 	    return (_rl_dispatch (_rl_to_lower (key), map));
769*6b445a62SJohn Marino 
770*6b445a62SJohn Marino 	  rl_executing_keymap = map;
771*6b445a62SJohn Marino 
772*6b445a62SJohn Marino 	  rl_dispatching = 1;
773*6b445a62SJohn Marino 	  RL_SETSTATE(RL_STATE_DISPATCHING);
774*6b445a62SJohn Marino 	  (*map[key].function)(rl_numeric_arg * rl_arg_sign, key);
775*6b445a62SJohn Marino 	  RL_UNSETSTATE(RL_STATE_DISPATCHING);
776*6b445a62SJohn Marino 	  rl_dispatching = 0;
777*6b445a62SJohn Marino 
778*6b445a62SJohn Marino 	  /* If we have input pending, then the last command was a prefix
779*6b445a62SJohn Marino 	     command.  Don't change the state of rl_last_func.  Otherwise,
780*6b445a62SJohn Marino 	     remember the last command executed in this variable. */
781*6b445a62SJohn Marino 	  if (rl_pending_input == 0 && map[key].function != rl_digit_argument)
782*6b445a62SJohn Marino 	    rl_last_func = map[key].function;
783*6b445a62SJohn Marino 
784*6b445a62SJohn Marino 	  RL_CHECK_SIGNALS ();
785*6b445a62SJohn Marino 	}
786*6b445a62SJohn Marino       else if (map[ANYOTHERKEY].function)
787*6b445a62SJohn Marino 	{
788*6b445a62SJohn Marino 	  /* OK, there's no function bound in this map, but there is a
789*6b445a62SJohn Marino 	     shadow function that was overridden when the current keymap
790*6b445a62SJohn Marino 	     was created.  Return -2 to note  that. */
791*6b445a62SJohn Marino 	  _rl_unget_char  (key);
792*6b445a62SJohn Marino 	  return -2;
793*6b445a62SJohn Marino 	}
794*6b445a62SJohn Marino       else if (got_subseq)
795*6b445a62SJohn Marino 	{
796*6b445a62SJohn Marino 	  /* Return -1 to note that we're in a subsequence, but  we don't
797*6b445a62SJohn Marino 	     have a matching key, nor was one overridden.  This means
798*6b445a62SJohn Marino 	     we need to back up the recursion chain and find the last
799*6b445a62SJohn Marino 	     subsequence that is bound to a function. */
800*6b445a62SJohn Marino 	  _rl_unget_char (key);
801*6b445a62SJohn Marino 	  return -1;
802*6b445a62SJohn Marino 	}
803*6b445a62SJohn Marino       else
804*6b445a62SJohn Marino 	{
805*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
806*6b445a62SJohn Marino 	  RL_UNSETSTATE (RL_STATE_MULTIKEY);
807*6b445a62SJohn Marino 	  _rl_keyseq_chain_dispose ();
808*6b445a62SJohn Marino #endif
809*6b445a62SJohn Marino 	  _rl_abort_internal ();
810*6b445a62SJohn Marino 	  return -1;
811*6b445a62SJohn Marino 	}
812*6b445a62SJohn Marino       break;
813*6b445a62SJohn Marino 
814*6b445a62SJohn Marino     case ISKMAP:
815*6b445a62SJohn Marino       if (map[key].function != 0)
816*6b445a62SJohn Marino 	{
817*6b445a62SJohn Marino #if defined (VI_MODE)
818*6b445a62SJohn Marino 	  /* The only way this test will be true is if a subsequence has been
819*6b445a62SJohn Marino 	     bound starting with ESC, generally the arrow keys.  What we do is
820*6b445a62SJohn Marino 	     check whether there's input in the queue, which there generally
821*6b445a62SJohn Marino 	     will be if an arrow key has been pressed, and, if there's not,
822*6b445a62SJohn Marino 	     just dispatch to (what we assume is) rl_vi_movement_mode right
823*6b445a62SJohn Marino 	     away.  This is essentially an input test with a zero timeout. */
824*6b445a62SJohn Marino 	  if (rl_editing_mode == vi_mode && key == ESC && map == vi_insertion_keymap
825*6b445a62SJohn Marino 	      && _rl_input_queued (0) == 0)
826*6b445a62SJohn Marino 	    return (_rl_dispatch (ANYOTHERKEY, FUNCTION_TO_KEYMAP (map, key)));
827*6b445a62SJohn Marino #endif
828*6b445a62SJohn Marino 
829*6b445a62SJohn Marino 	  rl_key_sequence_length++;
830*6b445a62SJohn Marino 	  _rl_dispatching_keymap = FUNCTION_TO_KEYMAP (map, key);
831*6b445a62SJohn Marino 
832*6b445a62SJohn Marino 	  /* Allocate new context here.  Use linked contexts (linked through
833*6b445a62SJohn Marino 	     cxt->ocxt) to simulate recursion */
834*6b445a62SJohn Marino #if defined (READLINE_CALLBACKS)
835*6b445a62SJohn Marino 	  if (RL_ISSTATE (RL_STATE_CALLBACK))
836*6b445a62SJohn Marino 	    {
837*6b445a62SJohn Marino 	      /* Return 0 only the first time, to indicate success to
838*6b445a62SJohn Marino 		 _rl_callback_read_char.  The rest of the time, we're called
839*6b445a62SJohn Marino 		 from _rl_dispatch_callback, so we return -3 to indicate
840*6b445a62SJohn Marino 		 special handling is necessary. */
841*6b445a62SJohn Marino 	      r = RL_ISSTATE (RL_STATE_MULTIKEY) ? -3 : 0;
842*6b445a62SJohn Marino 	      cxt = _rl_keyseq_cxt_alloc ();
843*6b445a62SJohn Marino 
844*6b445a62SJohn Marino 	      if (got_subseq)
845*6b445a62SJohn Marino 		cxt->flags |= KSEQ_SUBSEQ;
846*6b445a62SJohn Marino 	      cxt->okey = key;
847*6b445a62SJohn Marino 	      cxt->oldmap = map;
848*6b445a62SJohn Marino 	      cxt->dmap = _rl_dispatching_keymap;
849*6b445a62SJohn Marino 	      cxt->subseq_arg = got_subseq || cxt->dmap[ANYOTHERKEY].function;
850*6b445a62SJohn Marino 
851*6b445a62SJohn Marino 	      RL_SETSTATE (RL_STATE_MULTIKEY);
852*6b445a62SJohn Marino 	      _rl_kscxt = cxt;
853*6b445a62SJohn Marino 
854*6b445a62SJohn Marino 	      return r;		/* don't indicate immediate success */
855*6b445a62SJohn Marino 	    }
856*6b445a62SJohn Marino #endif
857*6b445a62SJohn Marino 
858*6b445a62SJohn Marino 	  newkey = _rl_subseq_getchar (key);
859*6b445a62SJohn Marino 	  if (newkey < 0)
860*6b445a62SJohn Marino 	    {
861*6b445a62SJohn Marino 	      _rl_abort_internal ();
862*6b445a62SJohn Marino 	      return -1;
863*6b445a62SJohn Marino 	    }
864*6b445a62SJohn Marino 
865*6b445a62SJohn Marino 	  r = _rl_dispatch_subseq (newkey, _rl_dispatching_keymap, got_subseq || map[ANYOTHERKEY].function);
866*6b445a62SJohn Marino 	  return _rl_subseq_result (r, map, key, got_subseq);
867*6b445a62SJohn Marino 	}
868*6b445a62SJohn Marino       else
869*6b445a62SJohn Marino 	{
870*6b445a62SJohn Marino 	  _rl_abort_internal ();
871*6b445a62SJohn Marino 	  return -1;
872*6b445a62SJohn Marino 	}
873*6b445a62SJohn Marino       break;
874*6b445a62SJohn Marino 
875*6b445a62SJohn Marino     case ISMACR:
876*6b445a62SJohn Marino       if (map[key].function != 0)
877*6b445a62SJohn Marino 	{
878*6b445a62SJohn Marino 	  macro = savestring ((char *)map[key].function);
879*6b445a62SJohn Marino 	  _rl_with_macro_input (macro);
880*6b445a62SJohn Marino 	  return 0;
881*6b445a62SJohn Marino 	}
882*6b445a62SJohn Marino       break;
883*6b445a62SJohn Marino     }
884*6b445a62SJohn Marino #if defined (VI_MODE)
885*6b445a62SJohn Marino   if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap &&
886*6b445a62SJohn Marino       key != ANYOTHERKEY &&
887*6b445a62SJohn Marino       _rl_vi_textmod_command (key))
888*6b445a62SJohn Marino     _rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign);
889*6b445a62SJohn Marino #endif
890*6b445a62SJohn Marino 
891*6b445a62SJohn Marino   return (r);
892*6b445a62SJohn Marino }
893*6b445a62SJohn Marino 
894*6b445a62SJohn Marino static int
_rl_subseq_result(r,map,key,got_subseq)895*6b445a62SJohn Marino _rl_subseq_result (r, map, key, got_subseq)
896*6b445a62SJohn Marino      int r;
897*6b445a62SJohn Marino      Keymap map;
898*6b445a62SJohn Marino      int key, got_subseq;
899*6b445a62SJohn Marino {
900*6b445a62SJohn Marino   Keymap m;
901*6b445a62SJohn Marino   int type, nt;
902*6b445a62SJohn Marino   rl_command_func_t *func, *nf;
903*6b445a62SJohn Marino 
904*6b445a62SJohn Marino   if (r == -2)
905*6b445a62SJohn Marino     /* We didn't match anything, and the keymap we're indexed into
906*6b445a62SJohn Marino        shadowed a function previously bound to that prefix.  Call
907*6b445a62SJohn Marino        the function.  The recursive call to _rl_dispatch_subseq has
908*6b445a62SJohn Marino        already taken care of pushing any necessary input back onto
909*6b445a62SJohn Marino        the input queue with _rl_unget_char. */
910*6b445a62SJohn Marino     {
911*6b445a62SJohn Marino       m = _rl_dispatching_keymap;
912*6b445a62SJohn Marino       type = m[ANYOTHERKEY].type;
913*6b445a62SJohn Marino       func = m[ANYOTHERKEY].function;
914*6b445a62SJohn Marino       if (type == ISFUNC && func == rl_do_lowercase_version)
915*6b445a62SJohn Marino 	r = _rl_dispatch (_rl_to_lower (key), map);
916*6b445a62SJohn Marino       else if (type == ISFUNC && func == rl_insert)
917*6b445a62SJohn Marino 	{
918*6b445a62SJohn Marino 	  /* If the function that was shadowed was self-insert, we
919*6b445a62SJohn Marino 	     somehow need a keymap with map[key].func == self-insert.
920*6b445a62SJohn Marino 	     Let's use this one. */
921*6b445a62SJohn Marino 	  nt = m[key].type;
922*6b445a62SJohn Marino 	  nf = m[key].function;
923*6b445a62SJohn Marino 
924*6b445a62SJohn Marino 	  m[key].type = type;
925*6b445a62SJohn Marino 	  m[key].function = func;
926*6b445a62SJohn Marino 	  r = _rl_dispatch (key, m);
927*6b445a62SJohn Marino 	  m[key].type = nt;
928*6b445a62SJohn Marino 	  m[key].function = nf;
929*6b445a62SJohn Marino 	}
930*6b445a62SJohn Marino       else
931*6b445a62SJohn Marino 	r = _rl_dispatch (ANYOTHERKEY, m);
932*6b445a62SJohn Marino     }
933*6b445a62SJohn Marino   else if (r && map[ANYOTHERKEY].function)
934*6b445a62SJohn Marino     {
935*6b445a62SJohn Marino       /* We didn't match (r is probably -1), so return something to
936*6b445a62SJohn Marino 	 tell the caller that it should try ANYOTHERKEY for an
937*6b445a62SJohn Marino 	 overridden function. */
938*6b445a62SJohn Marino       _rl_unget_char (key);
939*6b445a62SJohn Marino       _rl_dispatching_keymap = map;
940*6b445a62SJohn Marino       return -2;
941*6b445a62SJohn Marino     }
942*6b445a62SJohn Marino   else if (r && got_subseq)
943*6b445a62SJohn Marino     {
944*6b445a62SJohn Marino       /* OK, back up the chain. */
945*6b445a62SJohn Marino       _rl_unget_char (key);
946*6b445a62SJohn Marino       _rl_dispatching_keymap = map;
947*6b445a62SJohn Marino       return -1;
948*6b445a62SJohn Marino     }
949*6b445a62SJohn Marino 
950*6b445a62SJohn Marino   return r;
951*6b445a62SJohn Marino }
952*6b445a62SJohn Marino 
953*6b445a62SJohn Marino /* **************************************************************** */
954*6b445a62SJohn Marino /*								    */
955*6b445a62SJohn Marino /*			Initializations 			    */
956*6b445a62SJohn Marino /*								    */
957*6b445a62SJohn Marino /* **************************************************************** */
958*6b445a62SJohn Marino 
959*6b445a62SJohn Marino /* Initialize readline (and terminal if not already). */
960*6b445a62SJohn Marino int
rl_initialize()961*6b445a62SJohn Marino rl_initialize ()
962*6b445a62SJohn Marino {
963*6b445a62SJohn Marino   /* If we have never been called before, initialize the
964*6b445a62SJohn Marino      terminal and data structures. */
965*6b445a62SJohn Marino   if (!rl_initialized)
966*6b445a62SJohn Marino     {
967*6b445a62SJohn Marino       RL_SETSTATE(RL_STATE_INITIALIZING);
968*6b445a62SJohn Marino       readline_initialize_everything ();
969*6b445a62SJohn Marino       RL_UNSETSTATE(RL_STATE_INITIALIZING);
970*6b445a62SJohn Marino       rl_initialized++;
971*6b445a62SJohn Marino       RL_SETSTATE(RL_STATE_INITIALIZED);
972*6b445a62SJohn Marino     }
973*6b445a62SJohn Marino 
974*6b445a62SJohn Marino   /* Initalize the current line information. */
975*6b445a62SJohn Marino   _rl_init_line_state ();
976*6b445a62SJohn Marino 
977*6b445a62SJohn Marino   /* We aren't done yet.  We haven't even gotten started yet! */
978*6b445a62SJohn Marino   rl_done = 0;
979*6b445a62SJohn Marino   RL_UNSETSTATE(RL_STATE_DONE);
980*6b445a62SJohn Marino 
981*6b445a62SJohn Marino   /* Tell the history routines what is going on. */
982*6b445a62SJohn Marino   _rl_start_using_history ();
983*6b445a62SJohn Marino 
984*6b445a62SJohn Marino   /* Make the display buffer match the state of the line. */
985*6b445a62SJohn Marino   rl_reset_line_state ();
986*6b445a62SJohn Marino 
987*6b445a62SJohn Marino   /* No such function typed yet. */
988*6b445a62SJohn Marino   rl_last_func = (rl_command_func_t *)NULL;
989*6b445a62SJohn Marino 
990*6b445a62SJohn Marino   /* Parsing of key-bindings begins in an enabled state. */
991*6b445a62SJohn Marino   _rl_parsing_conditionalized_out = 0;
992*6b445a62SJohn Marino 
993*6b445a62SJohn Marino #if defined (VI_MODE)
994*6b445a62SJohn Marino   if (rl_editing_mode == vi_mode)
995*6b445a62SJohn Marino     _rl_vi_initialize_line ();
996*6b445a62SJohn Marino #endif
997*6b445a62SJohn Marino 
998*6b445a62SJohn Marino   /* Each line starts in insert mode (the default). */
999*6b445a62SJohn Marino   _rl_set_insert_mode (RL_IM_DEFAULT, 1);
1000*6b445a62SJohn Marino 
1001*6b445a62SJohn Marino   return 0;
1002*6b445a62SJohn Marino }
1003*6b445a62SJohn Marino 
1004*6b445a62SJohn Marino #if 0
1005*6b445a62SJohn Marino #if defined (__EMX__)
1006*6b445a62SJohn Marino static void
1007*6b445a62SJohn Marino _emx_build_environ ()
1008*6b445a62SJohn Marino {
1009*6b445a62SJohn Marino   TIB *tibp;
1010*6b445a62SJohn Marino   PIB *pibp;
1011*6b445a62SJohn Marino   char *t, **tp;
1012*6b445a62SJohn Marino   int c;
1013*6b445a62SJohn Marino 
1014*6b445a62SJohn Marino   DosGetInfoBlocks (&tibp, &pibp);
1015*6b445a62SJohn Marino   t = pibp->pib_pchenv;
1016*6b445a62SJohn Marino   for (c = 1; *t; c++)
1017*6b445a62SJohn Marino     t += strlen (t) + 1;
1018*6b445a62SJohn Marino   tp = environ = (char **)xmalloc ((c + 1) * sizeof (char *));
1019*6b445a62SJohn Marino   t = pibp->pib_pchenv;
1020*6b445a62SJohn Marino   while (*t)
1021*6b445a62SJohn Marino     {
1022*6b445a62SJohn Marino       *tp++ = t;
1023*6b445a62SJohn Marino       t += strlen (t) + 1;
1024*6b445a62SJohn Marino     }
1025*6b445a62SJohn Marino   *tp = 0;
1026*6b445a62SJohn Marino }
1027*6b445a62SJohn Marino #endif /* __EMX__ */
1028*6b445a62SJohn Marino #endif
1029*6b445a62SJohn Marino 
1030*6b445a62SJohn Marino /* Initialize the entire state of the world. */
1031*6b445a62SJohn Marino static void
readline_initialize_everything()1032*6b445a62SJohn Marino readline_initialize_everything ()
1033*6b445a62SJohn Marino {
1034*6b445a62SJohn Marino #if 0
1035*6b445a62SJohn Marino #if defined (__EMX__)
1036*6b445a62SJohn Marino   if (environ == 0)
1037*6b445a62SJohn Marino     _emx_build_environ ();
1038*6b445a62SJohn Marino #endif
1039*6b445a62SJohn Marino #endif
1040*6b445a62SJohn Marino 
1041*6b445a62SJohn Marino #if 0
1042*6b445a62SJohn Marino   /* Find out if we are running in Emacs -- UNUSED. */
1043*6b445a62SJohn Marino   running_in_emacs = sh_get_env_value ("EMACS") != (char *)0;
1044*6b445a62SJohn Marino #endif
1045*6b445a62SJohn Marino 
1046*6b445a62SJohn Marino   /* Set up input and output if they are not already set up. */
1047*6b445a62SJohn Marino   if (!rl_instream)
1048*6b445a62SJohn Marino     rl_instream = stdin;
1049*6b445a62SJohn Marino 
1050*6b445a62SJohn Marino   if (!rl_outstream)
1051*6b445a62SJohn Marino     rl_outstream = stdout;
1052*6b445a62SJohn Marino 
1053*6b445a62SJohn Marino   /* Bind _rl_in_stream and _rl_out_stream immediately.  These values
1054*6b445a62SJohn Marino      may change, but they may also be used before readline_internal ()
1055*6b445a62SJohn Marino      is called. */
1056*6b445a62SJohn Marino   _rl_in_stream = rl_instream;
1057*6b445a62SJohn Marino   _rl_out_stream = rl_outstream;
1058*6b445a62SJohn Marino 
1059*6b445a62SJohn Marino   /* Allocate data structures. */
1060*6b445a62SJohn Marino   if (rl_line_buffer == 0)
1061*6b445a62SJohn Marino     rl_line_buffer = (char *)xmalloc (rl_line_buffer_len = DEFAULT_BUFFER_SIZE);
1062*6b445a62SJohn Marino 
1063*6b445a62SJohn Marino   /* Initialize the terminal interface. */
1064*6b445a62SJohn Marino   if (rl_terminal_name == 0)
1065*6b445a62SJohn Marino     rl_terminal_name = sh_get_env_value ("TERM");
1066*6b445a62SJohn Marino   _rl_init_terminal_io (rl_terminal_name);
1067*6b445a62SJohn Marino 
1068*6b445a62SJohn Marino   /* Bind tty characters to readline functions. */
1069*6b445a62SJohn Marino   readline_default_bindings ();
1070*6b445a62SJohn Marino 
1071*6b445a62SJohn Marino   /* Initialize the function names. */
1072*6b445a62SJohn Marino   rl_initialize_funmap ();
1073*6b445a62SJohn Marino 
1074*6b445a62SJohn Marino   /* Decide whether we should automatically go into eight-bit mode. */
1075*6b445a62SJohn Marino   _rl_init_eightbit ();
1076*6b445a62SJohn Marino 
1077*6b445a62SJohn Marino   /* Read in the init file. */
1078*6b445a62SJohn Marino   rl_read_init_file ((char *)NULL);
1079*6b445a62SJohn Marino 
1080*6b445a62SJohn Marino   /* XXX */
1081*6b445a62SJohn Marino   if (_rl_horizontal_scroll_mode && _rl_term_autowrap)
1082*6b445a62SJohn Marino     {
1083*6b445a62SJohn Marino       _rl_screenwidth--;
1084*6b445a62SJohn Marino       _rl_screenchars -= _rl_screenheight;
1085*6b445a62SJohn Marino     }
1086*6b445a62SJohn Marino 
1087*6b445a62SJohn Marino   /* Override the effect of any `set keymap' assignments in the
1088*6b445a62SJohn Marino      inputrc file. */
1089*6b445a62SJohn Marino   rl_set_keymap_from_edit_mode ();
1090*6b445a62SJohn Marino 
1091*6b445a62SJohn Marino   /* Try to bind a common arrow key prefix, if not already bound. */
1092*6b445a62SJohn Marino   bind_arrow_keys ();
1093*6b445a62SJohn Marino 
1094*6b445a62SJohn Marino   /* Enable the meta key, if this terminal has one. */
1095*6b445a62SJohn Marino   if (_rl_enable_meta)
1096*6b445a62SJohn Marino     _rl_enable_meta_key ();
1097*6b445a62SJohn Marino 
1098*6b445a62SJohn Marino   /* If the completion parser's default word break characters haven't
1099*6b445a62SJohn Marino      been set yet, then do so now. */
1100*6b445a62SJohn Marino   if (rl_completer_word_break_characters == (char *)NULL)
1101*6b445a62SJohn Marino     rl_completer_word_break_characters = (char *)rl_basic_word_break_characters;
1102*6b445a62SJohn Marino }
1103*6b445a62SJohn Marino 
1104*6b445a62SJohn Marino /* If this system allows us to look at the values of the regular
1105*6b445a62SJohn Marino    input editing characters, then bind them to their readline
1106*6b445a62SJohn Marino    equivalents, iff the characters are not bound to keymaps. */
1107*6b445a62SJohn Marino static void
readline_default_bindings()1108*6b445a62SJohn Marino readline_default_bindings ()
1109*6b445a62SJohn Marino {
1110*6b445a62SJohn Marino   if (_rl_bind_stty_chars)
1111*6b445a62SJohn Marino     rl_tty_set_default_bindings (_rl_keymap);
1112*6b445a62SJohn Marino }
1113*6b445a62SJohn Marino 
1114*6b445a62SJohn Marino /* Reset the default bindings for the terminal special characters we're
1115*6b445a62SJohn Marino    interested in back to rl_insert and read the new ones. */
1116*6b445a62SJohn Marino static void
reset_default_bindings()1117*6b445a62SJohn Marino reset_default_bindings ()
1118*6b445a62SJohn Marino {
1119*6b445a62SJohn Marino   if (_rl_bind_stty_chars)
1120*6b445a62SJohn Marino     {
1121*6b445a62SJohn Marino       rl_tty_unset_default_bindings (_rl_keymap);
1122*6b445a62SJohn Marino       rl_tty_set_default_bindings (_rl_keymap);
1123*6b445a62SJohn Marino     }
1124*6b445a62SJohn Marino }
1125*6b445a62SJohn Marino 
1126*6b445a62SJohn Marino /* Bind some common arrow key sequences in MAP. */
1127*6b445a62SJohn Marino static void
bind_arrow_keys_internal(map)1128*6b445a62SJohn Marino bind_arrow_keys_internal (map)
1129*6b445a62SJohn Marino      Keymap map;
1130*6b445a62SJohn Marino {
1131*6b445a62SJohn Marino   Keymap xkeymap;
1132*6b445a62SJohn Marino 
1133*6b445a62SJohn Marino   xkeymap = _rl_keymap;
1134*6b445a62SJohn Marino   _rl_keymap = map;
1135*6b445a62SJohn Marino 
1136*6b445a62SJohn Marino #if defined (__MSDOS__)
1137*6b445a62SJohn Marino   rl_bind_keyseq_if_unbound ("\033[0A", rl_get_previous_history);
1138*6b445a62SJohn Marino   rl_bind_keyseq_if_unbound ("\033[0B", rl_backward_char);
1139*6b445a62SJohn Marino   rl_bind_keyseq_if_unbound ("\033[0C", rl_forward_char);
1140*6b445a62SJohn Marino   rl_bind_keyseq_if_unbound ("\033[0D", rl_get_next_history);
1141*6b445a62SJohn Marino #endif
1142*6b445a62SJohn Marino 
1143*6b445a62SJohn Marino   rl_bind_keyseq_if_unbound ("\033[A", rl_get_previous_history);
1144*6b445a62SJohn Marino   rl_bind_keyseq_if_unbound ("\033[B", rl_get_next_history);
1145*6b445a62SJohn Marino   rl_bind_keyseq_if_unbound ("\033[C", rl_forward_char);
1146*6b445a62SJohn Marino   rl_bind_keyseq_if_unbound ("\033[D", rl_backward_char);
1147*6b445a62SJohn Marino   rl_bind_keyseq_if_unbound ("\033[H", rl_beg_of_line);
1148*6b445a62SJohn Marino   rl_bind_keyseq_if_unbound ("\033[F", rl_end_of_line);
1149*6b445a62SJohn Marino 
1150*6b445a62SJohn Marino   rl_bind_keyseq_if_unbound ("\033OA", rl_get_previous_history);
1151*6b445a62SJohn Marino   rl_bind_keyseq_if_unbound ("\033OB", rl_get_next_history);
1152*6b445a62SJohn Marino   rl_bind_keyseq_if_unbound ("\033OC", rl_forward_char);
1153*6b445a62SJohn Marino   rl_bind_keyseq_if_unbound ("\033OD", rl_backward_char);
1154*6b445a62SJohn Marino   rl_bind_keyseq_if_unbound ("\033OH", rl_beg_of_line);
1155*6b445a62SJohn Marino   rl_bind_keyseq_if_unbound ("\033OF", rl_end_of_line);
1156*6b445a62SJohn Marino 
1157*6b445a62SJohn Marino #if defined (__MINGW32__)
1158*6b445a62SJohn Marino   rl_bind_keyseq_if_unbound ("\340H", rl_get_previous_history);
1159*6b445a62SJohn Marino   rl_bind_keyseq_if_unbound ("\340P", rl_get_next_history);
1160*6b445a62SJohn Marino   rl_bind_keyseq_if_unbound ("\340M", rl_forward_char);
1161*6b445a62SJohn Marino   rl_bind_keyseq_if_unbound ("\340K", rl_backward_char);
1162*6b445a62SJohn Marino #endif
1163*6b445a62SJohn Marino 
1164*6b445a62SJohn Marino   _rl_keymap = xkeymap;
1165*6b445a62SJohn Marino }
1166*6b445a62SJohn Marino 
1167*6b445a62SJohn Marino /* Try and bind the common arrow key prefixes after giving termcap and
1168*6b445a62SJohn Marino    the inputrc file a chance to bind them and create `real' keymaps
1169*6b445a62SJohn Marino    for the arrow key prefix. */
1170*6b445a62SJohn Marino static void
bind_arrow_keys()1171*6b445a62SJohn Marino bind_arrow_keys ()
1172*6b445a62SJohn Marino {
1173*6b445a62SJohn Marino   bind_arrow_keys_internal (emacs_standard_keymap);
1174*6b445a62SJohn Marino 
1175*6b445a62SJohn Marino #if defined (VI_MODE)
1176*6b445a62SJohn Marino   bind_arrow_keys_internal (vi_movement_keymap);
1177*6b445a62SJohn Marino   /* Unbind vi_movement_keymap[ESC] to allow users to repeatedly hit ESC
1178*6b445a62SJohn Marino      in vi command mode while still allowing the arrow keys to work. */
1179*6b445a62SJohn Marino   if (vi_movement_keymap[ESC].type == ISKMAP)
1180*6b445a62SJohn Marino     rl_bind_keyseq_in_map ("\033", (rl_command_func_t *)NULL, vi_movement_keymap);
1181*6b445a62SJohn Marino   bind_arrow_keys_internal (vi_insertion_keymap);
1182*6b445a62SJohn Marino #endif
1183*6b445a62SJohn Marino }
1184*6b445a62SJohn Marino 
1185*6b445a62SJohn Marino /* **************************************************************** */
1186*6b445a62SJohn Marino /*								    */
1187*6b445a62SJohn Marino /*		Saving and Restoring Readline's state		    */
1188*6b445a62SJohn Marino /*								    */
1189*6b445a62SJohn Marino /* **************************************************************** */
1190*6b445a62SJohn Marino 
1191*6b445a62SJohn Marino int
rl_save_state(sp)1192*6b445a62SJohn Marino rl_save_state (sp)
1193*6b445a62SJohn Marino      struct readline_state *sp;
1194*6b445a62SJohn Marino {
1195*6b445a62SJohn Marino   if (sp == 0)
1196*6b445a62SJohn Marino     return -1;
1197*6b445a62SJohn Marino 
1198*6b445a62SJohn Marino   sp->point = rl_point;
1199*6b445a62SJohn Marino   sp->end = rl_end;
1200*6b445a62SJohn Marino   sp->mark = rl_mark;
1201*6b445a62SJohn Marino   sp->buffer = rl_line_buffer;
1202*6b445a62SJohn Marino   sp->buflen = rl_line_buffer_len;
1203*6b445a62SJohn Marino   sp->ul = rl_undo_list;
1204*6b445a62SJohn Marino   sp->prompt = rl_prompt;
1205*6b445a62SJohn Marino 
1206*6b445a62SJohn Marino   sp->rlstate = rl_readline_state;
1207*6b445a62SJohn Marino   sp->done = rl_done;
1208*6b445a62SJohn Marino   sp->kmap = _rl_keymap;
1209*6b445a62SJohn Marino 
1210*6b445a62SJohn Marino   sp->lastfunc = rl_last_func;
1211*6b445a62SJohn Marino   sp->insmode = rl_insert_mode;
1212*6b445a62SJohn Marino   sp->edmode = rl_editing_mode;
1213*6b445a62SJohn Marino   sp->kseqlen = rl_key_sequence_length;
1214*6b445a62SJohn Marino   sp->inf = rl_instream;
1215*6b445a62SJohn Marino   sp->outf = rl_outstream;
1216*6b445a62SJohn Marino   sp->pendingin = rl_pending_input;
1217*6b445a62SJohn Marino   sp->macro = rl_executing_macro;
1218*6b445a62SJohn Marino 
1219*6b445a62SJohn Marino   sp->catchsigs = rl_catch_signals;
1220*6b445a62SJohn Marino   sp->catchsigwinch = rl_catch_sigwinch;
1221*6b445a62SJohn Marino 
1222*6b445a62SJohn Marino   return (0);
1223*6b445a62SJohn Marino }
1224*6b445a62SJohn Marino 
1225*6b445a62SJohn Marino int
rl_restore_state(sp)1226*6b445a62SJohn Marino rl_restore_state (sp)
1227*6b445a62SJohn Marino      struct readline_state *sp;
1228*6b445a62SJohn Marino {
1229*6b445a62SJohn Marino   if (sp == 0)
1230*6b445a62SJohn Marino     return -1;
1231*6b445a62SJohn Marino 
1232*6b445a62SJohn Marino   rl_point = sp->point;
1233*6b445a62SJohn Marino   rl_end = sp->end;
1234*6b445a62SJohn Marino   rl_mark = sp->mark;
1235*6b445a62SJohn Marino   the_line = rl_line_buffer = sp->buffer;
1236*6b445a62SJohn Marino   rl_line_buffer_len = sp->buflen;
1237*6b445a62SJohn Marino   rl_undo_list = sp->ul;
1238*6b445a62SJohn Marino   rl_prompt = sp->prompt;
1239*6b445a62SJohn Marino 
1240*6b445a62SJohn Marino   rl_readline_state = sp->rlstate;
1241*6b445a62SJohn Marino   rl_done = sp->done;
1242*6b445a62SJohn Marino   _rl_keymap = sp->kmap;
1243*6b445a62SJohn Marino 
1244*6b445a62SJohn Marino   rl_last_func = sp->lastfunc;
1245*6b445a62SJohn Marino   rl_insert_mode = sp->insmode;
1246*6b445a62SJohn Marino   rl_editing_mode = sp->edmode;
1247*6b445a62SJohn Marino   rl_key_sequence_length = sp->kseqlen;
1248*6b445a62SJohn Marino   rl_instream = sp->inf;
1249*6b445a62SJohn Marino   rl_outstream = sp->outf;
1250*6b445a62SJohn Marino   rl_pending_input = sp->pendingin;
1251*6b445a62SJohn Marino   rl_executing_macro = sp->macro;
1252*6b445a62SJohn Marino 
1253*6b445a62SJohn Marino   rl_catch_signals = sp->catchsigs;
1254*6b445a62SJohn Marino   rl_catch_sigwinch = sp->catchsigwinch;
1255*6b445a62SJohn Marino 
1256*6b445a62SJohn Marino   return (0);
1257*6b445a62SJohn Marino }
1258