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