OSDN Git Service

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