836f837b91ed5abfb1b2b8b1598bd0b2c33cc6f3
[platform/upstream/bash.git] / lib / readline / bind.c
1 /* bind.c -- key binding and startup file support for the readline library. */
2
3 /* Copyright (C) 1987-2009 Free Software Foundation, Inc.
4
5    This file is part of the GNU Readline Library (Readline), a library
6    for reading lines of text with interactive input and history editing.
7
8    Readline is free software: you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation, either version 3 of the License, or
11    (at your option) any later version.
12
13    Readline is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with Readline.  If not, see <http://www.gnu.org/licenses/>.
20 */
21
22 #define READLINE_LIBRARY
23
24 #if defined (__TANDEM)
25 #  include <floss.h>
26 #endif
27
28 #if defined (HAVE_CONFIG_H)
29 #  include <config.h>
30 #endif
31
32 #include <stdio.h>
33 #include <sys/types.h>
34 #include <fcntl.h>
35 #if defined (HAVE_SYS_FILE_H)
36 #  include <sys/file.h>
37 #endif /* HAVE_SYS_FILE_H */
38
39 #if defined (HAVE_UNISTD_H)
40 #  include <unistd.h>
41 #endif /* HAVE_UNISTD_H */
42
43 #if defined (HAVE_STDLIB_H)
44 #  include <stdlib.h>
45 #else
46 #  include "ansi_stdlib.h"
47 #endif /* HAVE_STDLIB_H */
48
49 #include <errno.h>
50
51 #if !defined (errno)
52 extern int errno;
53 #endif /* !errno */
54
55 #include "posixstat.h"
56
57 /* System-specific feature definitions and include files. */
58 #include "rldefs.h"
59
60 /* Some standard library routines. */
61 #include "readline.h"
62 #include "history.h"
63
64 #include "rlprivate.h"
65 #include "rlshell.h"
66 #include "xmalloc.h"
67
68 #if !defined (strchr) && !defined (__STDC__)
69 extern char *strchr (), *strrchr ();
70 #endif /* !strchr && !__STDC__ */
71
72 /* Variables exported by this file. */
73 Keymap rl_binding_keymap;
74
75 static char *_rl_read_file PARAMS((char *, size_t *));
76 static void _rl_init_file_error PARAMS((const char *));
77 static int _rl_read_init_file PARAMS((const char *, int));
78 static int glean_key_from_name PARAMS((char *));
79 static int find_boolean_var PARAMS((const char *));
80
81 static char *_rl_get_string_variable_value PARAMS((const char *));
82 static int substring_member_of_array PARAMS((const char *, const char * const *));
83
84 static int currently_reading_init_file;
85
86 /* used only in this file */
87 static int _rl_prefer_visible_bell = 1;
88
89 /* **************************************************************** */
90 /*                                                                  */
91 /*                      Binding keys                                */
92 /*                                                                  */
93 /* **************************************************************** */
94
95 /* rl_add_defun (char *name, rl_command_func_t *function, int key)
96    Add NAME to the list of named functions.  Make FUNCTION be the function
97    that gets called.  If KEY is not -1, then bind it. */
98 int
99 rl_add_defun (name, function, key)
100      const char *name;
101      rl_command_func_t *function;
102      int key;
103 {
104   if (key != -1)
105     rl_bind_key (key, function);
106   rl_add_funmap_entry (name, function);
107   return 0;
108 }
109
110 /* Bind KEY to FUNCTION.  Returns non-zero if KEY is out of range. */
111 int
112 rl_bind_key (key, function)
113      int key;
114      rl_command_func_t *function;
115 {
116   if (key < 0)
117     return (key);
118
119   if (META_CHAR (key) && _rl_convert_meta_chars_to_ascii)
120     {
121       if (_rl_keymap[ESC].type == ISKMAP)
122         {
123           Keymap escmap;
124
125           escmap = FUNCTION_TO_KEYMAP (_rl_keymap, ESC);
126           key = UNMETA (key);
127           escmap[key].type = ISFUNC;
128           escmap[key].function = function;
129           return (0);
130         }
131       return (key);
132     }
133
134   _rl_keymap[key].type = ISFUNC;
135   _rl_keymap[key].function = function;
136   rl_binding_keymap = _rl_keymap;
137   return (0);
138 }
139
140 /* Bind KEY to FUNCTION in MAP.  Returns non-zero in case of invalid
141    KEY. */
142 int
143 rl_bind_key_in_map (key, function, map)
144      int key;
145      rl_command_func_t *function;
146      Keymap map;
147 {
148   int result;
149   Keymap oldmap;
150
151   oldmap = _rl_keymap;
152   _rl_keymap = map;
153   result = rl_bind_key (key, function);
154   _rl_keymap = oldmap;
155   return (result);
156 }
157
158 /* Bind key sequence KEYSEQ to DEFAULT_FUNC if KEYSEQ is unbound.  Right
159    now, this is always used to attempt to bind the arrow keys, hence the
160    check for rl_vi_movement_mode. */
161 int
162 rl_bind_key_if_unbound_in_map (key, default_func, kmap)
163      int key;
164      rl_command_func_t *default_func;
165      Keymap kmap;
166 {
167   char keyseq[2];
168
169   keyseq[0] = (unsigned char)key;
170   keyseq[1] = '\0';
171   return (rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, kmap));
172 }
173
174 int
175 rl_bind_key_if_unbound (key, default_func)
176      int key;
177      rl_command_func_t *default_func;
178 {
179   char keyseq[2];
180
181   keyseq[0] = (unsigned char)key;
182   keyseq[1] = '\0';
183   return (rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, _rl_keymap));
184 }
185
186 /* Make KEY do nothing in the currently selected keymap.
187    Returns non-zero in case of error. */
188 int
189 rl_unbind_key (key)
190      int key;
191 {
192   return (rl_bind_key (key, (rl_command_func_t *)NULL));
193 }
194
195 /* Make KEY do nothing in MAP.
196    Returns non-zero in case of error. */
197 int
198 rl_unbind_key_in_map (key, map)
199      int key;
200      Keymap map;
201 {
202   return (rl_bind_key_in_map (key, (rl_command_func_t *)NULL, map));
203 }
204
205 /* Unbind all keys bound to FUNCTION in MAP. */
206 int
207 rl_unbind_function_in_map (func, map)
208      rl_command_func_t *func;
209      Keymap map;
210 {
211   register int i, rval;
212
213   for (i = rval = 0; i < KEYMAP_SIZE; i++)
214     {
215       if (map[i].type == ISFUNC && map[i].function == func)
216         {
217           map[i].function = (rl_command_func_t *)NULL;
218           rval = 1;
219         }
220     }
221   return rval;
222 }
223
224 int
225 rl_unbind_command_in_map (command, map)
226      const char *command;
227      Keymap map;
228 {
229   rl_command_func_t *func;
230
231   func = rl_named_function (command);
232   if (func == 0)
233     return 0;
234   return (rl_unbind_function_in_map (func, map));
235 }
236
237 /* Bind the key sequence represented by the string KEYSEQ to
238    FUNCTION, starting in the current keymap.  This makes new
239    keymaps as necessary. */
240 int
241 rl_bind_keyseq (keyseq, function)
242      const char *keyseq;
243      rl_command_func_t *function;
244 {
245   return (rl_generic_bind (ISFUNC, keyseq, (char *)function, _rl_keymap));
246 }
247
248 /* Bind the key sequence represented by the string KEYSEQ to
249    FUNCTION.  This makes new keymaps as necessary.  The initial
250    place to do bindings is in MAP. */
251 int
252 rl_bind_keyseq_in_map (keyseq, function, map)
253      const char *keyseq;
254      rl_command_func_t *function;
255      Keymap map;
256 {
257   return (rl_generic_bind (ISFUNC, keyseq, (char *)function, map));
258 }
259
260 /* Backwards compatibility; equivalent to rl_bind_keyseq_in_map() */
261 int
262 rl_set_key (keyseq, function, map)
263      const char *keyseq;
264      rl_command_func_t *function;
265      Keymap map;
266 {
267   return (rl_generic_bind (ISFUNC, keyseq, (char *)function, map));
268 }
269
270 /* Bind key sequence KEYSEQ to DEFAULT_FUNC if KEYSEQ is unbound.  Right
271    now, this is always used to attempt to bind the arrow keys, hence the
272    check for rl_vi_movement_mode. */
273 int
274 rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, kmap)
275      const char *keyseq;
276      rl_command_func_t *default_func;
277      Keymap kmap;
278 {
279   rl_command_func_t *func;
280
281   if (keyseq)
282     {
283       func = rl_function_of_keyseq (keyseq, kmap, (int *)NULL);
284 #if defined (VI_MODE)
285       if (!func || func == rl_do_lowercase_version || func == rl_vi_movement_mode)
286 #else
287       if (!func || func == rl_do_lowercase_version)
288 #endif
289         return (rl_bind_keyseq_in_map (keyseq, default_func, kmap));
290       else
291         return 1;
292     }
293   return 0;
294 }
295
296 int
297 rl_bind_keyseq_if_unbound (keyseq, default_func)
298      const char *keyseq;
299      rl_command_func_t *default_func;
300 {
301   return (rl_bind_keyseq_if_unbound_in_map (keyseq, default_func, _rl_keymap));
302 }
303
304 /* Bind the key sequence represented by the string KEYSEQ to
305    the string of characters MACRO.  This makes new keymaps as
306    necessary.  The initial place to do bindings is in MAP. */
307 int
308 rl_macro_bind (keyseq, macro, map)
309      const char *keyseq, *macro;
310      Keymap map;
311 {
312   char *macro_keys;
313   int macro_keys_len;
314
315   macro_keys = (char *)xmalloc ((2 * strlen (macro)) + 1);
316
317   if (rl_translate_keyseq (macro, macro_keys, &macro_keys_len))
318     {
319       xfree (macro_keys);
320       return -1;
321     }
322   rl_generic_bind (ISMACR, keyseq, macro_keys, map);
323   return 0;
324 }
325
326 /* Bind the key sequence represented by the string KEYSEQ to
327    the arbitrary pointer DATA.  TYPE says what kind of data is
328    pointed to by DATA, right now this can be a function (ISFUNC),
329    a macro (ISMACR), or a keymap (ISKMAP).  This makes new keymaps
330    as necessary.  The initial place to do bindings is in MAP. */
331 int
332 rl_generic_bind (type, keyseq, data, map)
333      int type;
334      const char *keyseq;
335      char *data;
336      Keymap map;
337 {
338   char *keys;
339   int keys_len;
340   register int i;
341   KEYMAP_ENTRY k;
342
343   k.function = 0;
344
345   /* If no keys to bind to, exit right away. */
346   if (keyseq == 0 || *keyseq == 0)
347     {
348       if (type == ISMACR)
349         xfree (data);
350       return -1;
351     }
352
353   keys = (char *)xmalloc (1 + (2 * strlen (keyseq)));
354
355   /* Translate the ASCII representation of KEYSEQ into an array of
356      characters.  Stuff the characters into KEYS, and the length of
357      KEYS into KEYS_LEN. */
358   if (rl_translate_keyseq (keyseq, keys, &keys_len))
359     {
360       xfree (keys);
361       return -1;
362     }
363
364   /* Bind keys, making new keymaps as necessary. */
365   for (i = 0; i < keys_len; i++)
366     {
367       unsigned char uc = keys[i];
368       int ic;
369
370       ic = uc;
371       if (ic < 0 || ic >= KEYMAP_SIZE)
372         {
373           xfree (keys);
374           return -1;
375         }
376
377       if (META_CHAR (ic) && _rl_convert_meta_chars_to_ascii)
378         {
379           ic = UNMETA (ic);
380           if (map[ESC].type == ISKMAP)
381             map = FUNCTION_TO_KEYMAP (map, ESC);
382         }
383
384       if ((i + 1) < keys_len)
385         {
386           if (map[ic].type != ISKMAP)
387             {
388               /* We allow subsequences of keys.  If a keymap is being
389                  created that will `shadow' an existing function or macro
390                  key binding, we save that keybinding into the ANYOTHERKEY
391                  index in the new map.  The dispatch code will look there
392                  to find the function to execute if the subsequence is not
393                  matched.  ANYOTHERKEY was chosen to be greater than
394                  UCHAR_MAX. */
395               k = map[ic];
396
397               map[ic].type = ISKMAP;
398               map[ic].function = KEYMAP_TO_FUNCTION (rl_make_bare_keymap());
399             }
400           map = FUNCTION_TO_KEYMAP (map, ic);
401           /* The dispatch code will return this function if no matching
402              key sequence is found in the keymap.  This (with a little
403              help from the dispatch code in readline.c) allows `a' to be
404              mapped to something, `abc' to be mapped to something else,
405              and the function bound  to `a' to be executed when the user
406              types `abx', leaving `bx' in the input queue. */
407           if (k.function && ((k.type == ISFUNC && k.function != rl_do_lowercase_version) || k.type == ISMACR))
408             {
409               map[ANYOTHERKEY] = k;
410               k.function = 0;
411             }
412         }
413       else
414         {
415           if (map[ic].type == ISMACR)
416             xfree ((char *)map[ic].function);
417           else if (map[ic].type == ISKMAP)
418             {
419               map = FUNCTION_TO_KEYMAP (map, ic);
420               ic = ANYOTHERKEY;
421             }
422
423           map[ic].function = KEYMAP_TO_FUNCTION (data);
424           map[ic].type = type;
425         }
426
427       rl_binding_keymap = map;
428     }
429   xfree (keys);
430   return 0;
431 }
432
433 /* Translate the ASCII representation of SEQ, stuffing the values into ARRAY,
434    an array of characters.  LEN gets the final length of ARRAY.  Return
435    non-zero if there was an error parsing SEQ. */
436 int
437 rl_translate_keyseq (seq, array, len)
438      const char *seq;
439      char *array;
440      int *len;
441 {
442   register int i, c, l, temp;
443
444   for (i = l = 0; c = seq[i]; i++)
445     {
446       if (c == '\\')
447         {
448           c = seq[++i];
449
450           if (c == 0)
451             break;
452
453           /* Handle \C- and \M- prefixes. */
454           if ((c == 'C' || c == 'M') && seq[i + 1] == '-')
455             {
456               /* Handle special case of backwards define. */
457               if (strncmp (&seq[i], "C-\\M-", 5) == 0)
458                 {
459                   array[l++] = ESC;     /* ESC is meta-prefix */
460                   i += 5;
461                   array[l++] = CTRL (_rl_to_upper (seq[i]));
462                   if (seq[i] == '\0')
463                     i--;
464                 }
465               else if (c == 'M')
466                 {
467                   i++;          /* seq[i] == '-' */
468                   /* XXX - obey convert-meta setting */
469                   if (_rl_convert_meta_chars_to_ascii && _rl_keymap[ESC].type == ISKMAP)
470                     array[l++] = ESC;   /* ESC is meta-prefix */
471                   else if (seq[i+1] == '\\' && seq[i+2] == 'C' && seq[i+3] == '-')
472                     {
473                       i += 4;
474                       temp = (seq[i] == '?') ? RUBOUT : CTRL (_rl_to_upper (seq[i]));
475                       array[l++] = META (temp);
476                     }
477                   else
478                     {
479                       /* This doesn't yet handle things like \M-\a, which may
480                          or may not have any reasonable meaning.  You're
481                          probably better off using straight octal or hex. */
482                       i++;
483                       array[l++] = META (seq[i]);
484                     }
485                 }
486               else if (c == 'C')
487                 {
488                   i += 2;
489                   /* Special hack for C-?... */
490                   array[l++] = (seq[i] == '?') ? RUBOUT : CTRL (_rl_to_upper (seq[i]));
491                 }
492               continue;
493             }         
494
495           /* Translate other backslash-escaped characters.  These are the
496              same escape sequences that bash's `echo' and `printf' builtins
497              handle, with the addition of \d -> RUBOUT.  A backslash
498              preceding a character that is not special is stripped. */
499           switch (c)
500             {
501             case 'a':
502               array[l++] = '\007';
503               break;
504             case 'b':
505               array[l++] = '\b';
506               break;
507             case 'd':
508               array[l++] = RUBOUT;      /* readline-specific */
509               break;
510             case 'e':
511               array[l++] = ESC;
512               break;
513             case 'f':
514               array[l++] = '\f';
515               break;
516             case 'n':
517               array[l++] = NEWLINE;
518               break;
519             case 'r':
520               array[l++] = RETURN;
521               break;
522             case 't':
523               array[l++] = TAB;
524               break;
525             case 'v':
526               array[l++] = 0x0B;
527               break;
528             case '\\':
529               array[l++] = '\\';
530               break;
531             case '0': case '1': case '2': case '3':
532             case '4': case '5': case '6': case '7':
533               i++;
534               for (temp = 2, c -= '0'; ISOCTAL (seq[i]) && temp--; i++)
535                 c = (c * 8) + OCTVALUE (seq[i]);
536               i--;      /* auto-increment in for loop */
537               array[l++] = c & largest_char;
538               break;
539             case 'x':
540               i++;
541               for (temp = 2, c = 0; ISXDIGIT ((unsigned char)seq[i]) && temp--; i++)
542                 c = (c * 16) + HEXVALUE (seq[i]);
543               if (temp == 2)
544                 c = 'x';
545               i--;      /* auto-increment in for loop */
546               array[l++] = c & largest_char;
547               break;
548             default:    /* backslashes before non-special chars just add the char */
549               array[l++] = c;
550               break;    /* the backslash is stripped */
551             }
552           continue;
553         }
554
555       array[l++] = c;
556     }
557
558   *len = l;
559   array[l] = '\0';
560   return (0);
561 }
562
563 char *
564 rl_untranslate_keyseq (seq)
565      int seq;
566 {
567   static char kseq[16];
568   int i, c;
569
570   i = 0;
571   c = seq;
572   if (META_CHAR (c))
573     {
574       kseq[i++] = '\\';
575       kseq[i++] = 'M';
576       kseq[i++] = '-';
577       c = UNMETA (c);
578     }
579   else if (c == ESC)
580     {
581       kseq[i++] = '\\';
582       c = 'e';
583     }
584   else if (CTRL_CHAR (c))
585     {
586       kseq[i++] = '\\';
587       kseq[i++] = 'C';
588       kseq[i++] = '-';
589       c = _rl_to_lower (UNCTRL (c));
590     }
591   else if (c == RUBOUT)
592     {
593       kseq[i++] = '\\';
594       kseq[i++] = 'C';
595       kseq[i++] = '-';
596       c = '?';
597     }
598
599   if (c == ESC)
600     {
601       kseq[i++] = '\\';
602       c = 'e';
603     }
604   else if (c == '\\' || c == '"')
605     {
606       kseq[i++] = '\\';
607     }
608
609   kseq[i++] = (unsigned char) c;
610   kseq[i] = '\0';
611   return kseq;
612 }
613
614 static char *
615 _rl_untranslate_macro_value (seq)
616      char *seq;
617 {
618   char *ret, *r, *s;
619   int c;
620
621   r = ret = (char *)xmalloc (7 * strlen (seq) + 1);
622   for (s = seq; *s; s++)
623     {
624       c = *s;
625       if (META_CHAR (c))
626         {
627           *r++ = '\\';
628           *r++ = 'M';
629           *r++ = '-';
630           c = UNMETA (c);
631         }
632       else if (c == ESC)
633         {
634           *r++ = '\\';
635           c = 'e';
636         }
637       else if (CTRL_CHAR (c))
638         {
639           *r++ = '\\';
640           *r++ = 'C';
641           *r++ = '-';
642           c = _rl_to_lower (UNCTRL (c));
643         }
644       else if (c == RUBOUT)
645         {
646           *r++ = '\\';
647           *r++ = 'C';
648           *r++ = '-';
649           c = '?';
650         }
651
652       if (c == ESC)
653         {
654           *r++ = '\\';
655           c = 'e';
656         }
657       else if (c == '\\' || c == '"')
658         *r++ = '\\';
659
660       *r++ = (unsigned char)c;
661     }
662   *r = '\0';
663   return ret;
664 }
665
666 /* Return a pointer to the function that STRING represents.
667    If STRING doesn't have a matching function, then a NULL pointer
668    is returned. */
669 rl_command_func_t *
670 rl_named_function (string)
671      const char *string;
672 {
673   register int i;
674
675   rl_initialize_funmap ();
676
677   for (i = 0; funmap[i]; i++)
678     if (_rl_stricmp (funmap[i]->name, string) == 0)
679       return (funmap[i]->function);
680   return ((rl_command_func_t *)NULL);
681 }
682
683 /* Return the function (or macro) definition which would be invoked via
684    KEYSEQ if executed in MAP.  If MAP is NULL, then the current keymap is
685    used.  TYPE, if non-NULL, is a pointer to an int which will receive the
686    type of the object pointed to.  One of ISFUNC (function), ISKMAP (keymap),
687    or ISMACR (macro). */
688 rl_command_func_t *
689 rl_function_of_keyseq (keyseq, map, type)
690      const char *keyseq;
691      Keymap map;
692      int *type;
693 {
694   register int i;
695
696   if (map == 0)
697     map = _rl_keymap;
698
699   for (i = 0; keyseq && keyseq[i]; i++)
700     {
701       unsigned char ic = keyseq[i];
702
703       if (META_CHAR (ic) && _rl_convert_meta_chars_to_ascii)
704         {
705           if (map[ESC].type == ISKMAP)
706             {
707               map = FUNCTION_TO_KEYMAP (map, ESC);
708               ic = UNMETA (ic);
709             }
710           /* XXX - should we just return NULL here, since this obviously
711              doesn't match? */
712           else
713             {
714               if (type)
715                 *type = map[ESC].type;
716
717               return (map[ESC].function);
718             }
719         }
720
721       if (map[ic].type == ISKMAP)
722         {
723           /* If this is the last key in the key sequence, return the
724              map. */
725           if (keyseq[i + 1] == '\0')
726             {
727               if (type)
728                 *type = ISKMAP;
729
730               return (map[ic].function);
731             }
732           else
733             map = FUNCTION_TO_KEYMAP (map, ic);
734         }
735       /* If we're not at the end of the key sequence, and the current key
736          is bound to something other than a keymap, then the entire key
737          sequence is not bound. */
738       else if (map[ic].type != ISKMAP && keyseq[i+1])
739         return ((rl_command_func_t *)NULL);
740       else      /* map[ic].type != ISKMAP && keyseq[i+1] == 0 */
741         {
742           if (type)
743             *type = map[ic].type;
744
745           return (map[ic].function);
746         }
747     }
748   return ((rl_command_func_t *) NULL);
749 }
750
751 /* The last key bindings file read. */
752 static char *last_readline_init_file = (char *)NULL;
753
754 /* The file we're currently reading key bindings from. */
755 static const char *current_readline_init_file;
756 static int current_readline_init_include_level;
757 static int current_readline_init_lineno;
758
759 /* Read FILENAME into a locally-allocated buffer and return the buffer.
760    The size of the buffer is returned in *SIZEP.  Returns NULL if any
761    errors were encountered. */
762 static char *
763 _rl_read_file (filename, sizep)
764      char *filename;
765      size_t *sizep;
766 {
767   struct stat finfo;
768   size_t file_size;
769   char *buffer;
770   int i, file;
771
772   if ((stat (filename, &finfo) < 0) || (file = open (filename, O_RDONLY, 0666)) < 0)
773     return ((char *)NULL);
774
775   file_size = (size_t)finfo.st_size;
776
777   /* check for overflow on very large files */
778   if (file_size != finfo.st_size || file_size + 1 < file_size)
779     {
780       if (file >= 0)
781         close (file);
782 #if defined (EFBIG)
783       errno = EFBIG;
784 #endif
785       return ((char *)NULL);
786     }
787
788   /* Read the file into BUFFER. */
789   buffer = (char *)xmalloc (file_size + 1);
790   i = read (file, buffer, file_size);
791   close (file);
792
793   if (i < 0)
794     {
795       xfree (buffer);
796       return ((char *)NULL);
797     }
798
799   RL_CHECK_SIGNALS ();
800
801   buffer[i] = '\0';
802   if (sizep)
803     *sizep = i;
804
805   return (buffer);
806 }
807
808 /* Re-read the current keybindings file. */
809 int
810 rl_re_read_init_file (count, ignore)
811      int count, ignore;
812 {
813   int r;
814   r = rl_read_init_file ((const char *)NULL);
815   rl_set_keymap_from_edit_mode ();
816   return r;
817 }
818
819 /* Do key bindings from a file.  If FILENAME is NULL it defaults
820    to the first non-null filename from this list:
821      1. the filename used for the previous call
822      2. the value of the shell variable `INPUTRC'
823      3. ~/.inputrc
824      4. /etc/inputrc
825    If the file existed and could be opened and read, 0 is returned,
826    otherwise errno is returned. */
827 int
828 rl_read_init_file (filename)
829      const char *filename;
830 {
831   /* Default the filename. */
832   if (filename == 0)
833     filename = last_readline_init_file;
834   if (filename == 0)
835     filename = sh_get_env_value ("INPUTRC");
836   if (filename == 0 || *filename == 0)
837     {
838       filename = DEFAULT_INPUTRC;
839       /* Try to read DEFAULT_INPUTRC; fall back to SYS_INPUTRC on failure */
840       if (_rl_read_init_file (filename, 0) == 0)
841         return 0;
842       filename = SYS_INPUTRC;
843     }
844
845 #if defined (__MSDOS__)
846   if (_rl_read_init_file (filename, 0) == 0)
847     return 0;
848   filename = "~/_inputrc";
849 #endif
850   return (_rl_read_init_file (filename, 0));
851 }
852
853 static int
854 _rl_read_init_file (filename, include_level)
855      const char *filename;
856      int include_level;
857 {
858   register int i;
859   char *buffer, *openname, *line, *end;
860   size_t file_size;
861
862   current_readline_init_file = filename;
863   current_readline_init_include_level = include_level;
864
865   openname = tilde_expand (filename);
866   buffer = _rl_read_file (openname, &file_size);
867   xfree (openname);
868
869   RL_CHECK_SIGNALS ();
870   if (buffer == 0)
871     return (errno);
872   
873   if (include_level == 0 && filename != last_readline_init_file)
874     {
875       FREE (last_readline_init_file);
876       last_readline_init_file = savestring (filename);
877     }
878
879   currently_reading_init_file = 1;
880
881   /* Loop over the lines in the file.  Lines that start with `#' are
882      comments; all other lines are commands for readline initialization. */
883   current_readline_init_lineno = 1;
884   line = buffer;
885   end = buffer + file_size;
886   while (line < end)
887     {
888       /* Find the end of this line. */
889       for (i = 0; line + i != end && line[i] != '\n'; i++);
890
891 #if defined (__CYGWIN__)
892       /* ``Be liberal in what you accept.'' */
893       if (line[i] == '\n' && line[i-1] == '\r')
894         line[i - 1] = '\0';
895 #endif
896
897       /* Mark end of line. */
898       line[i] = '\0';
899
900       /* Skip leading whitespace. */
901       while (*line && whitespace (*line))
902         {
903           line++;
904           i--;
905         }
906
907       /* If the line is not a comment, then parse it. */
908       if (*line && *line != '#')
909         rl_parse_and_bind (line);
910
911       /* Move to the next line. */
912       line += i + 1;
913       current_readline_init_lineno++;
914     }
915
916   xfree (buffer);
917   currently_reading_init_file = 0;
918   return (0);
919 }
920
921 static void
922 _rl_init_file_error (msg)
923      const char *msg;
924 {
925   if (currently_reading_init_file)
926     _rl_errmsg ("%s: line %d: %s\n", current_readline_init_file,
927                      current_readline_init_lineno, msg);
928   else
929     _rl_errmsg ("%s", msg);
930 }
931
932 /* **************************************************************** */
933 /*                                                                  */
934 /*                      Parser Directives                           */
935 /*                                                                  */
936 /* **************************************************************** */
937
938 typedef int _rl_parser_func_t PARAMS((char *));
939
940 /* Things that mean `Control'. */
941 const char * const _rl_possible_control_prefixes[] = {
942   "Control-", "C-", "CTRL-", (const char *)NULL
943 };
944
945 const char * const _rl_possible_meta_prefixes[] = {
946   "Meta", "M-", (const char *)NULL
947 };
948
949 /* Conditionals. */
950
951 /* Calling programs set this to have their argv[0]. */
952 const char *rl_readline_name = "other";
953
954 /* Stack of previous values of parsing_conditionalized_out. */
955 static unsigned char *if_stack = (unsigned char *)NULL;
956 static int if_stack_depth;
957 static int if_stack_size;
958
959 /* Push _rl_parsing_conditionalized_out, and set parser state based
960    on ARGS. */
961 static int
962 parser_if (args)
963      char *args;
964 {
965   register int i;
966
967   /* Push parser state. */
968   if (if_stack_depth + 1 >= if_stack_size)
969     {
970       if (!if_stack)
971         if_stack = (unsigned char *)xmalloc (if_stack_size = 20);
972       else
973         if_stack = (unsigned char *)xrealloc (if_stack, if_stack_size += 20);
974     }
975   if_stack[if_stack_depth++] = _rl_parsing_conditionalized_out;
976
977   /* If parsing is turned off, then nothing can turn it back on except
978      for finding the matching endif.  In that case, return right now. */
979   if (_rl_parsing_conditionalized_out)
980     return 0;
981
982   /* Isolate first argument. */
983   for (i = 0; args[i] && !whitespace (args[i]); i++);
984
985   if (args[i])
986     args[i++] = '\0';
987
988   /* Handle "$if term=foo" and "$if mode=emacs" constructs.  If this
989      isn't term=foo, or mode=emacs, then check to see if the first
990      word in ARGS is the same as the value stored in rl_readline_name. */
991   if (rl_terminal_name && _rl_strnicmp (args, "term=", 5) == 0)
992     {
993       char *tem, *tname;
994
995       /* Terminals like "aaa-60" are equivalent to "aaa". */
996       tname = savestring (rl_terminal_name);
997       tem = strchr (tname, '-');
998       if (tem)
999         *tem = '\0';
1000
1001       /* Test the `long' and `short' forms of the terminal name so that
1002          if someone has a `sun-cmd' and does not want to have bindings
1003          that will be executed if the terminal is a `sun', they can put
1004          `$if term=sun-cmd' into their .inputrc. */
1005       _rl_parsing_conditionalized_out = _rl_stricmp (args + 5, tname) &&
1006                                         _rl_stricmp (args + 5, rl_terminal_name);
1007       xfree (tname);
1008     }
1009 #if defined (VI_MODE)
1010   else if (_rl_strnicmp (args, "mode=", 5) == 0)
1011     {
1012       int mode;
1013
1014       if (_rl_stricmp (args + 5, "emacs") == 0)
1015         mode = emacs_mode;
1016       else if (_rl_stricmp (args + 5, "vi") == 0)
1017         mode = vi_mode;
1018       else
1019         mode = no_mode;
1020
1021       _rl_parsing_conditionalized_out = mode != rl_editing_mode;
1022     }
1023 #endif /* VI_MODE */
1024   /* Check to see if the first word in ARGS is the same as the
1025      value stored in rl_readline_name. */
1026   else if (_rl_stricmp (args, rl_readline_name) == 0)
1027     _rl_parsing_conditionalized_out = 0;
1028   else
1029     _rl_parsing_conditionalized_out = 1;
1030   return 0;
1031 }
1032
1033 /* Invert the current parser state if there is anything on the stack. */
1034 static int
1035 parser_else (args)
1036      char *args;
1037 {
1038   register int i;
1039
1040   if (if_stack_depth == 0)
1041     {
1042       _rl_init_file_error ("$else found without matching $if");
1043       return 0;
1044     }
1045
1046 #if 0
1047   /* Check the previous (n - 1) levels of the stack to make sure that
1048      we haven't previously turned off parsing. */
1049   for (i = 0; i < if_stack_depth - 1; i++)
1050 #else
1051   /* Check the previous (n) levels of the stack to make sure that
1052      we haven't previously turned off parsing. */
1053   for (i = 0; i < if_stack_depth; i++)
1054 #endif
1055     if (if_stack[i] == 1)
1056       return 0;
1057
1058   /* Invert the state of parsing if at top level. */
1059   _rl_parsing_conditionalized_out = !_rl_parsing_conditionalized_out;
1060   return 0;
1061 }
1062
1063 /* Terminate a conditional, popping the value of
1064    _rl_parsing_conditionalized_out from the stack. */
1065 static int
1066 parser_endif (args)
1067      char *args;
1068 {
1069   if (if_stack_depth)
1070     _rl_parsing_conditionalized_out = if_stack[--if_stack_depth];
1071   else
1072     _rl_init_file_error ("$endif without matching $if");
1073   return 0;
1074 }
1075
1076 static int
1077 parser_include (args)
1078      char *args;
1079 {
1080   const char *old_init_file;
1081   char *e;
1082   int old_line_number, old_include_level, r;
1083
1084   if (_rl_parsing_conditionalized_out)
1085     return (0);
1086
1087   old_init_file = current_readline_init_file;
1088   old_line_number = current_readline_init_lineno;
1089   old_include_level = current_readline_init_include_level;
1090
1091   e = strchr (args, '\n');
1092   if (e)
1093     *e = '\0';
1094   r = _rl_read_init_file ((const char *)args, old_include_level + 1);
1095
1096   current_readline_init_file = old_init_file;
1097   current_readline_init_lineno = old_line_number;
1098   current_readline_init_include_level = old_include_level;
1099
1100   return r;
1101 }
1102   
1103 /* Associate textual names with actual functions. */
1104 static const struct {
1105   const char * const name;
1106   _rl_parser_func_t *function;
1107 } parser_directives [] = {
1108   { "if", parser_if },
1109   { "endif", parser_endif },
1110   { "else", parser_else },
1111   { "include", parser_include },
1112   { (char *)0x0, (_rl_parser_func_t *)0x0 }
1113 };
1114
1115 /* Handle a parser directive.  STATEMENT is the line of the directive
1116    without any leading `$'. */
1117 static int
1118 handle_parser_directive (statement)
1119      char *statement;
1120 {
1121   register int i;
1122   char *directive, *args;
1123
1124   /* Isolate the actual directive. */
1125
1126   /* Skip whitespace. */
1127   for (i = 0; whitespace (statement[i]); i++);
1128
1129   directive = &statement[i];
1130
1131   for (; statement[i] && !whitespace (statement[i]); i++);
1132
1133   if (statement[i])
1134     statement[i++] = '\0';
1135
1136   for (; statement[i] && whitespace (statement[i]); i++);
1137
1138   args = &statement[i];
1139
1140   /* Lookup the command, and act on it. */
1141   for (i = 0; parser_directives[i].name; i++)
1142     if (_rl_stricmp (directive, parser_directives[i].name) == 0)
1143       {
1144         (*parser_directives[i].function) (args);
1145         return (0);
1146       }
1147
1148   /* display an error message about the unknown parser directive */
1149   _rl_init_file_error ("unknown parser directive");
1150   return (1);
1151 }
1152
1153 /* Read the binding command from STRING and perform it.
1154    A key binding command looks like: Keyname: function-name\0,
1155    a variable binding command looks like: set variable value.
1156    A new-style keybinding looks like "\C-x\C-x": exchange-point-and-mark. */
1157 int
1158 rl_parse_and_bind (string)
1159      char *string;
1160 {
1161   char *funname, *kname;
1162   register int c, i;
1163   int key, equivalency;
1164
1165   while (string && whitespace (*string))
1166     string++;
1167
1168   if (!string || !*string || *string == '#')
1169     return 0;
1170
1171   /* If this is a parser directive, act on it. */
1172   if (*string == '$')
1173     {
1174       handle_parser_directive (&string[1]);
1175       return 0;
1176     }
1177
1178   /* If we aren't supposed to be parsing right now, then we're done. */
1179   if (_rl_parsing_conditionalized_out)
1180     return 0;
1181
1182   i = 0;
1183   /* If this keyname is a complex key expression surrounded by quotes,
1184      advance to after the matching close quote.  This code allows the
1185      backslash to quote characters in the key expression. */
1186   if (*string == '"')
1187     {
1188       int passc = 0;
1189
1190       for (i = 1; c = string[i]; i++)
1191         {
1192           if (passc)
1193             {
1194               passc = 0;
1195               continue;
1196             }
1197
1198           if (c == '\\')
1199             {
1200               passc++;
1201               continue;
1202             }
1203
1204           if (c == '"')
1205             break;
1206         }
1207       /* If we didn't find a closing quote, abort the line. */
1208       if (string[i] == '\0')
1209         {
1210           _rl_init_file_error ("no closing `\"' in key binding");
1211           return 1;
1212         }
1213     }
1214
1215   /* Advance to the colon (:) or whitespace which separates the two objects. */
1216   for (; (c = string[i]) && c != ':' && c != ' ' && c != '\t'; i++ );
1217
1218   equivalency = (c == ':' && string[i + 1] == '=');
1219
1220   /* Mark the end of the command (or keyname). */
1221   if (string[i])
1222     string[i++] = '\0';
1223
1224   /* If doing assignment, skip the '=' sign as well. */
1225   if (equivalency)
1226     string[i++] = '\0';
1227
1228   /* If this is a command to set a variable, then do that. */
1229   if (_rl_stricmp (string, "set") == 0)
1230     {
1231       char *var, *value, *e;
1232
1233       var = string + i;
1234       /* Make VAR point to start of variable name. */
1235       while (*var && whitespace (*var)) var++;
1236
1237       /* Make VALUE point to start of value string. */
1238       value = var;
1239       while (*value && !whitespace (*value)) value++;
1240       if (*value)
1241         *value++ = '\0';
1242       while (*value && whitespace (*value)) value++;
1243
1244       /* Strip trailing whitespace from values to boolean variables.  Temp
1245          fix until I get a real quoted-string parser here. */
1246       i = find_boolean_var (var);
1247       if (i >= 0)
1248         {
1249           /* remove trailing whitespace */
1250           e = value + strlen (value) - 1;
1251           while (e >= value && whitespace (*e))
1252             e--;
1253           e++;          /* skip back to whitespace or EOS */
1254           if (*e && e >= value)
1255             *e = '\0';
1256         }
1257
1258       rl_variable_bind (var, value);
1259       return 0;
1260     }
1261
1262   /* Skip any whitespace between keyname and funname. */
1263   for (; string[i] && whitespace (string[i]); i++);
1264   funname = &string[i];
1265
1266   /* Now isolate funname.
1267      For straight function names just look for whitespace, since
1268      that will signify the end of the string.  But this could be a
1269      macro definition.  In that case, the string is quoted, so skip
1270      to the matching delimiter.  We allow the backslash to quote the
1271      delimiter characters in the macro body. */
1272   /* This code exists to allow whitespace in macro expansions, which
1273      would otherwise be gobbled up by the next `for' loop.*/
1274   /* XXX - it may be desirable to allow backslash quoting only if " is
1275      the quoted string delimiter, like the shell. */
1276   if (*funname == '\'' || *funname == '"')
1277     {
1278       int delimiter, passc;
1279
1280       delimiter = string[i++];
1281       for (passc = 0; c = string[i]; i++)
1282         {
1283           if (passc)
1284             {
1285               passc = 0;
1286               continue;
1287             }
1288
1289           if (c == '\\')
1290             {
1291               passc = 1;
1292               continue;
1293             }
1294
1295           if (c == delimiter)
1296             break;
1297         }
1298       if (c)
1299         i++;
1300     }
1301
1302   /* Advance to the end of the string.  */
1303   for (; string[i] && !whitespace (string[i]); i++);
1304
1305   /* No extra whitespace at the end of the string. */
1306   string[i] = '\0';
1307
1308   /* Handle equivalency bindings here.  Make the left-hand side be exactly
1309      whatever the right-hand evaluates to, including keymaps. */
1310   if (equivalency)
1311     {
1312       return 0;
1313     }
1314
1315   /* If this is a new-style key-binding, then do the binding with
1316      rl_bind_keyseq ().  Otherwise, let the older code deal with it. */
1317   if (*string == '"')
1318     {
1319       char *seq;
1320       register int j, k, passc;
1321
1322       seq = (char *)xmalloc (1 + strlen (string));
1323       for (j = 1, k = passc = 0; string[j]; j++)
1324         {
1325           /* Allow backslash to quote characters, but leave them in place.
1326              This allows a string to end with a backslash quoting another
1327              backslash, or with a backslash quoting a double quote.  The
1328              backslashes are left in place for rl_translate_keyseq (). */
1329           if (passc || (string[j] == '\\'))
1330             {
1331               seq[k++] = string[j];
1332               passc = !passc;
1333               continue;
1334             }
1335
1336           if (string[j] == '"')
1337             break;
1338
1339           seq[k++] = string[j];
1340         }
1341       seq[k] = '\0';
1342
1343       /* Binding macro? */
1344       if (*funname == '\'' || *funname == '"')
1345         {
1346           j = strlen (funname);
1347
1348           /* Remove the delimiting quotes from each end of FUNNAME. */
1349           if (j && funname[j - 1] == *funname)
1350             funname[j - 1] = '\0';
1351
1352           rl_macro_bind (seq, &funname[1], _rl_keymap);
1353         }
1354       else
1355         rl_bind_keyseq (seq, rl_named_function (funname));
1356
1357       xfree (seq);
1358       return 0;
1359     }
1360
1361   /* Get the actual character we want to deal with. */
1362   kname = strrchr (string, '-');
1363   if (!kname)
1364     kname = string;
1365   else
1366     kname++;
1367
1368   key = glean_key_from_name (kname);
1369
1370   /* Add in control and meta bits. */
1371   if (substring_member_of_array (string, _rl_possible_control_prefixes))
1372     key = CTRL (_rl_to_upper (key));
1373
1374   if (substring_member_of_array (string, _rl_possible_meta_prefixes))
1375     key = META (key);
1376
1377   /* Temporary.  Handle old-style keyname with macro-binding. */
1378   if (*funname == '\'' || *funname == '"')
1379     {
1380       char useq[2];
1381       int fl = strlen (funname);
1382
1383       useq[0] = key; useq[1] = '\0';
1384       if (fl && funname[fl - 1] == *funname)
1385         funname[fl - 1] = '\0';
1386
1387       rl_macro_bind (useq, &funname[1], _rl_keymap);
1388     }
1389 #if defined (PREFIX_META_HACK)
1390   /* Ugly, but working hack to keep prefix-meta around. */
1391   else if (_rl_stricmp (funname, "prefix-meta") == 0)
1392     {
1393       char seq[2];
1394
1395       seq[0] = key;
1396       seq[1] = '\0';
1397       rl_generic_bind (ISKMAP, seq, (char *)emacs_meta_keymap, _rl_keymap);
1398     }
1399 #endif /* PREFIX_META_HACK */
1400   else
1401     rl_bind_key (key, rl_named_function (funname));
1402   return 0;
1403 }
1404
1405 /* Simple structure for boolean readline variables (i.e., those that can
1406    have one of two values; either "On" or 1 for truth, or "Off" or 0 for
1407    false. */
1408
1409 #define V_SPECIAL       0x1
1410
1411 static const struct {
1412   const char * const name;
1413   int *value;
1414   int flags;
1415 } boolean_varlist [] = {
1416   { "bind-tty-special-chars",   &_rl_bind_stty_chars,           0 },
1417   { "blink-matching-paren",     &rl_blink_matching_paren,       V_SPECIAL },
1418   { "byte-oriented",            &rl_byte_oriented,              0 },
1419   { "completion-ignore-case",   &_rl_completion_case_fold,      0 },
1420   { "convert-meta",             &_rl_convert_meta_chars_to_ascii, 0 },
1421   { "disable-completion",       &rl_inhibit_completion,         0 },
1422   { "enable-keypad",            &_rl_enable_keypad,             0 },
1423   { "expand-tilde",             &rl_complete_with_tilde_expansion, 0 },
1424   { "history-preserve-point",   &_rl_history_preserve_point,    0 },
1425   { "horizontal-scroll-mode",   &_rl_horizontal_scroll_mode,    0 },
1426   { "input-meta",               &_rl_meta_flag,                 0 },
1427   { "mark-directories",         &_rl_complete_mark_directories, 0 },
1428   { "mark-modified-lines",      &_rl_mark_modified_lines,       0 },
1429   { "mark-symlinked-directories", &_rl_complete_mark_symlink_dirs, 0 },
1430   { "match-hidden-files",       &_rl_match_hidden_files,        0 },
1431   { "meta-flag",                &_rl_meta_flag,                 0 },
1432   { "output-meta",              &_rl_output_meta_chars,         0 },
1433   { "page-completions",         &_rl_page_completions,          0 },
1434   { "prefer-visible-bell",      &_rl_prefer_visible_bell,       V_SPECIAL },
1435   { "print-completions-horizontally", &_rl_print_completions_horizontally, 0 },
1436   { "revert-all-at-newline",    &_rl_revert_all_at_newline,     0 },
1437   { "show-all-if-ambiguous",    &_rl_complete_show_all,         0 },
1438   { "show-all-if-unmodified",   &_rl_complete_show_unmodified,  0 },
1439 #if defined (VISIBLE_STATS)
1440   { "visible-stats",            &rl_visible_stats,              0 },
1441 #endif /* VISIBLE_STATS */
1442   { (char *)NULL, (int *)NULL }
1443 };
1444
1445 static int
1446 find_boolean_var (name)
1447      const char *name;
1448 {
1449   register int i;
1450
1451   for (i = 0; boolean_varlist[i].name; i++)
1452     if (_rl_stricmp (name, boolean_varlist[i].name) == 0)
1453       return i;
1454   return -1;
1455 }
1456
1457 /* Hooks for handling special boolean variables, where a
1458    function needs to be called or another variable needs
1459    to be changed when they're changed. */
1460 static void
1461 hack_special_boolean_var (i)
1462      int i;
1463 {
1464   const char *name;
1465
1466   name = boolean_varlist[i].name;
1467
1468   if (_rl_stricmp (name, "blink-matching-paren") == 0)
1469     _rl_enable_paren_matching (rl_blink_matching_paren);
1470   else if (_rl_stricmp (name, "prefer-visible-bell") == 0)
1471     {
1472       if (_rl_prefer_visible_bell)
1473         _rl_bell_preference = VISIBLE_BELL;
1474       else
1475         _rl_bell_preference = AUDIBLE_BELL;
1476     }
1477 }
1478
1479 typedef int _rl_sv_func_t PARAMS((const char *));
1480
1481 /* These *must* correspond to the array indices for the appropriate
1482    string variable.  (Though they're not used right now.) */
1483 #define V_BELLSTYLE     0
1484 #define V_COMBEGIN      1
1485 #define V_EDITMODE      2
1486 #define V_ISRCHTERM     3
1487 #define V_KEYMAP        4
1488
1489 #define V_STRING        1
1490 #define V_INT           2
1491
1492 /* Forward declarations */
1493 static int sv_bell_style PARAMS((const char *));
1494 static int sv_combegin PARAMS((const char *));
1495 static int sv_dispprefix PARAMS((const char *));
1496 static int sv_compquery PARAMS((const char *));
1497 static int sv_editmode PARAMS((const char *));
1498 static int sv_histsize PARAMS((const char *));
1499 static int sv_isrchterm PARAMS((const char *));
1500 static int sv_keymap PARAMS((const char *));
1501
1502 static const struct {
1503   const char * const name;
1504   int flags;
1505   _rl_sv_func_t *set_func;
1506 } string_varlist[] = {
1507   { "bell-style",       V_STRING,       sv_bell_style },
1508   { "comment-begin",    V_STRING,       sv_combegin },
1509   { "completion-prefix-display-length", V_INT,  sv_dispprefix },
1510   { "completion-query-items", V_INT,    sv_compquery },
1511   { "editing-mode",     V_STRING,       sv_editmode },
1512   { "history-size",     V_INT,          sv_histsize },
1513   { "isearch-terminators", V_STRING,    sv_isrchterm },
1514   { "keymap",           V_STRING,       sv_keymap },
1515   { (char *)NULL,       0 }
1516 };
1517
1518 static int
1519 find_string_var (name)
1520      const char *name;
1521 {
1522   register int i;
1523
1524   for (i = 0; string_varlist[i].name; i++)
1525     if (_rl_stricmp (name, string_varlist[i].name) == 0)
1526       return i;
1527   return -1;
1528 }
1529
1530 /* A boolean value that can appear in a `set variable' command is true if
1531    the value is null or empty, `on' (case-insenstive), or "1".  Any other
1532    values result in 0 (false). */
1533 static int
1534 bool_to_int (value)
1535      const char *value;
1536 {
1537   return (value == 0 || *value == '\0' ||
1538                 (_rl_stricmp (value, "on") == 0) ||
1539                 (value[0] == '1' && value[1] == '\0'));
1540 }
1541
1542 char *
1543 rl_variable_value (name)
1544      const char *name;
1545 {
1546   register int i;
1547
1548   /* Check for simple variables first. */
1549   i = find_boolean_var (name);
1550   if (i >= 0)
1551     return (*boolean_varlist[i].value ? "on" : "off");
1552
1553   i = find_string_var (name);
1554   if (i >= 0)
1555     return (_rl_get_string_variable_value (string_varlist[i].name));
1556
1557   /* Unknown variable names return NULL. */
1558   return 0;
1559 }
1560
1561 int
1562 rl_variable_bind (name, value)
1563      const char *name, *value;
1564 {
1565   register int i;
1566   int   v;
1567
1568   /* Check for simple variables first. */
1569   i = find_boolean_var (name);
1570   if (i >= 0)
1571     {
1572       *boolean_varlist[i].value = bool_to_int (value);
1573       if (boolean_varlist[i].flags & V_SPECIAL)
1574         hack_special_boolean_var (i);
1575       return 0;
1576     }
1577
1578   i = find_string_var (name);
1579
1580   /* For the time being, unknown variable names or string names without a
1581      handler function are simply ignored. */
1582   if (i < 0 || string_varlist[i].set_func == 0)
1583     return 0;
1584
1585   v = (*string_varlist[i].set_func) (value);
1586   return v;
1587 }
1588
1589 static int
1590 sv_editmode (value)
1591      const char *value;
1592 {
1593   if (_rl_strnicmp (value, "vi", 2) == 0)
1594     {
1595 #if defined (VI_MODE)
1596       _rl_keymap = vi_insertion_keymap;
1597       rl_editing_mode = vi_mode;
1598 #endif /* VI_MODE */
1599       return 0;
1600     }
1601   else if (_rl_strnicmp (value, "emacs", 5) == 0)
1602     {
1603       _rl_keymap = emacs_standard_keymap;
1604       rl_editing_mode = emacs_mode;
1605       return 0;
1606     }
1607   return 1;
1608 }
1609
1610 static int
1611 sv_combegin (value)
1612      const char *value;
1613 {
1614   if (value && *value)
1615     {
1616       FREE (_rl_comment_begin);
1617       _rl_comment_begin = savestring (value);
1618       return 0;
1619     }
1620   return 1;
1621 }
1622
1623 static int
1624 sv_dispprefix (value)
1625      const char *value;
1626 {
1627   int nval = 0;
1628
1629   if (value && *value)
1630     {
1631       nval = atoi (value);
1632       if (nval < 0)
1633         nval = 0;
1634     }
1635   _rl_completion_prefix_display_length = nval;
1636   return 0;
1637 }
1638
1639 static int
1640 sv_compquery (value)
1641      const char *value;
1642 {
1643   int nval = 100;
1644
1645   if (value && *value)
1646     {
1647       nval = atoi (value);
1648       if (nval < 0)
1649         nval = 0;
1650     }
1651   rl_completion_query_items = nval;
1652   return 0;
1653 }
1654
1655 static int
1656 sv_histsize (value)
1657      const char *value;
1658 {
1659   int nval = 500;
1660
1661   if (value && *value)
1662     {
1663       nval = atoi (value);
1664       if (nval < 0)
1665         return 1;
1666     }
1667   stifle_history (nval);
1668   return 0;
1669 }
1670
1671 static int
1672 sv_keymap (value)
1673      const char *value;
1674 {
1675   Keymap kmap;
1676
1677   kmap = rl_get_keymap_by_name (value);
1678   if (kmap)
1679     {
1680       rl_set_keymap (kmap);
1681       return 0;
1682     }
1683   return 1;
1684 }
1685
1686 static int
1687 sv_bell_style (value)
1688      const char *value;
1689 {
1690   if (value == 0 || *value == '\0')
1691     _rl_bell_preference = AUDIBLE_BELL;
1692   else if (_rl_stricmp (value, "none") == 0 || _rl_stricmp (value, "off") == 0)
1693     _rl_bell_preference = NO_BELL;
1694   else if (_rl_stricmp (value, "audible") == 0 || _rl_stricmp (value, "on") == 0)
1695     _rl_bell_preference = AUDIBLE_BELL;
1696   else if (_rl_stricmp (value, "visible") == 0)
1697     _rl_bell_preference = VISIBLE_BELL;
1698   else
1699     return 1;
1700   return 0;
1701 }
1702
1703 static int
1704 sv_isrchterm (value)
1705      const char *value;
1706 {
1707   int beg, end, delim;
1708   char *v;
1709
1710   if (value == 0)
1711     return 1;
1712
1713   /* Isolate the value and translate it into a character string. */
1714   v = savestring (value);
1715   FREE (_rl_isearch_terminators);
1716   if (v[0] == '"' || v[0] == '\'')
1717     {
1718       delim = v[0];
1719       for (beg = end = 1; v[end] && v[end] != delim; end++)
1720         ;
1721     }
1722   else
1723     {
1724       for (beg = end = 0; whitespace (v[end]) == 0; end++)
1725         ;
1726     }
1727
1728   v[end] = '\0';
1729
1730   /* The value starts at v + beg.  Translate it into a character string. */
1731   _rl_isearch_terminators = (char *)xmalloc (2 * strlen (v) + 1);
1732   rl_translate_keyseq (v + beg, _rl_isearch_terminators, &end);
1733   _rl_isearch_terminators[end] = '\0';
1734
1735   xfree (v);
1736   return 0;
1737 }
1738       
1739 /* Return the character which matches NAME.
1740    For example, `Space' returns ' '. */
1741
1742 typedef struct {
1743   const char * const name;
1744   int value;
1745 } assoc_list;
1746
1747 static const assoc_list name_key_alist[] = {
1748   { "DEL", 0x7f },
1749   { "ESC", '\033' },
1750   { "Escape", '\033' },
1751   { "LFD", '\n' },
1752   { "Newline", '\n' },
1753   { "RET", '\r' },
1754   { "Return", '\r' },
1755   { "Rubout", 0x7f },
1756   { "SPC", ' ' },
1757   { "Space", ' ' },
1758   { "Tab", 0x09 },
1759   { (char *)0x0, 0 }
1760 };
1761
1762 static int
1763 glean_key_from_name (name)
1764      char *name;
1765 {
1766   register int i;
1767
1768   for (i = 0; name_key_alist[i].name; i++)
1769     if (_rl_stricmp (name, name_key_alist[i].name) == 0)
1770       return (name_key_alist[i].value);
1771
1772   return (*(unsigned char *)name);      /* XXX was return (*name) */
1773 }
1774
1775 /* Auxiliary functions to manage keymaps. */
1776 static const struct {
1777   const char * const name;
1778   Keymap map;
1779 } keymap_names[] = {
1780   { "emacs", emacs_standard_keymap },
1781   { "emacs-standard", emacs_standard_keymap },
1782   { "emacs-meta", emacs_meta_keymap },
1783   { "emacs-ctlx", emacs_ctlx_keymap },
1784 #if defined (VI_MODE)
1785   { "vi", vi_movement_keymap },
1786   { "vi-move", vi_movement_keymap },
1787   { "vi-command", vi_movement_keymap },
1788   { "vi-insert", vi_insertion_keymap },
1789 #endif /* VI_MODE */
1790   { (char *)0x0, (Keymap)0x0 }
1791 };
1792
1793 Keymap
1794 rl_get_keymap_by_name (name)
1795      const char *name;
1796 {
1797   register int i;
1798
1799   for (i = 0; keymap_names[i].name; i++)
1800     if (_rl_stricmp (name, keymap_names[i].name) == 0)
1801       return (keymap_names[i].map);
1802   return ((Keymap) NULL);
1803 }
1804
1805 char *
1806 rl_get_keymap_name (map)
1807      Keymap map;
1808 {
1809   register int i;
1810   for (i = 0; keymap_names[i].name; i++)
1811     if (map == keymap_names[i].map)
1812       return ((char *)keymap_names[i].name);
1813   return ((char *)NULL);
1814 }
1815   
1816 void
1817 rl_set_keymap (map)
1818      Keymap map;
1819 {
1820   if (map)
1821     _rl_keymap = map;
1822 }
1823
1824 Keymap
1825 rl_get_keymap ()
1826 {
1827   return (_rl_keymap);
1828 }
1829
1830 void
1831 rl_set_keymap_from_edit_mode ()
1832 {
1833   if (rl_editing_mode == emacs_mode)
1834     _rl_keymap = emacs_standard_keymap;
1835 #if defined (VI_MODE)
1836   else if (rl_editing_mode == vi_mode)
1837     _rl_keymap = vi_insertion_keymap;
1838 #endif /* VI_MODE */
1839 }
1840
1841 char *
1842 rl_get_keymap_name_from_edit_mode ()
1843 {
1844   if (rl_editing_mode == emacs_mode)
1845     return "emacs";
1846 #if defined (VI_MODE)
1847   else if (rl_editing_mode == vi_mode)
1848     return "vi";
1849 #endif /* VI_MODE */
1850   else
1851     return "none";
1852 }
1853
1854 /* **************************************************************** */
1855 /*                                                                  */
1856 /*                Key Binding and Function Information              */
1857 /*                                                                  */
1858 /* **************************************************************** */
1859
1860 /* Each of the following functions produces information about the
1861    state of keybindings and functions known to Readline.  The info
1862    is always printed to rl_outstream, and in such a way that it can
1863    be read back in (i.e., passed to rl_parse_and_bind ()). */
1864
1865 /* Print the names of functions known to Readline. */
1866 void
1867 rl_list_funmap_names ()
1868 {
1869   register int i;
1870   const char **funmap_names;
1871
1872   funmap_names = rl_funmap_names ();
1873
1874   if (!funmap_names)
1875     return;
1876
1877   for (i = 0; funmap_names[i]; i++)
1878     fprintf (rl_outstream, "%s\n", funmap_names[i]);
1879
1880   xfree (funmap_names);
1881 }
1882
1883 static char *
1884 _rl_get_keyname (key)
1885      int key;
1886 {
1887   char *keyname;
1888   int i, c;
1889
1890   keyname = (char *)xmalloc (8);
1891
1892   c = key;
1893   /* Since this is going to be used to write out keysequence-function
1894      pairs for possible inclusion in an inputrc file, we don't want to
1895      do any special meta processing on KEY. */
1896
1897 #if 1
1898   /* XXX - Experimental */
1899   /* We might want to do this, but the old version of the code did not. */
1900
1901   /* If this is an escape character, we don't want to do any more processing.
1902      Just add the special ESC key sequence and return. */
1903   if (c == ESC)
1904     {
1905       keyname[0] = '\\';
1906       keyname[1] = 'e';
1907       keyname[2] = '\0';
1908       return keyname;
1909     }
1910 #endif
1911
1912   /* RUBOUT is translated directly into \C-? */
1913   if (key == RUBOUT)
1914     {
1915       keyname[0] = '\\';
1916       keyname[1] = 'C';
1917       keyname[2] = '-';
1918       keyname[3] = '?';
1919       keyname[4] = '\0';
1920       return keyname;
1921     }
1922
1923   i = 0;
1924   /* Now add special prefixes needed for control characters.  This can
1925      potentially change C. */
1926   if (CTRL_CHAR (c))
1927     {
1928       keyname[i++] = '\\';
1929       keyname[i++] = 'C';
1930       keyname[i++] = '-';
1931       c = _rl_to_lower (UNCTRL (c));
1932     }
1933
1934   /* XXX experimental code.  Turn the characters that are not ASCII or
1935      ISO Latin 1 (128 - 159) into octal escape sequences (\200 - \237).
1936      This changes C. */
1937   if (c >= 128 && c <= 159)
1938     {
1939       keyname[i++] = '\\';
1940       keyname[i++] = '2';
1941       c -= 128;
1942       keyname[i++] = (c / 8) + '0';
1943       c = (c % 8) + '0';
1944     }
1945
1946   /* Now, if the character needs to be quoted with a backslash, do that. */
1947   if (c == '\\' || c == '"')
1948     keyname[i++] = '\\';
1949
1950   /* Now add the key, terminate the string, and return it. */
1951   keyname[i++] = (char) c;
1952   keyname[i] = '\0';
1953
1954   return keyname;
1955 }
1956
1957 /* Return a NULL terminated array of strings which represent the key
1958    sequences that are used to invoke FUNCTION in MAP. */
1959 char **
1960 rl_invoking_keyseqs_in_map (function, map)
1961      rl_command_func_t *function;
1962      Keymap map;
1963 {
1964   register int key;
1965   char **result;
1966   int result_index, result_size;
1967
1968   result = (char **)NULL;
1969   result_index = result_size = 0;
1970
1971   for (key = 0; key < KEYMAP_SIZE; key++)
1972     {
1973       switch (map[key].type)
1974         {
1975         case ISMACR:
1976           /* Macros match, if, and only if, the pointers are identical.
1977              Thus, they are treated exactly like functions in here. */
1978         case ISFUNC:
1979           /* If the function in the keymap is the one we are looking for,
1980              then add the current KEY to the list of invoking keys. */
1981           if (map[key].function == function)
1982             {
1983               char *keyname;
1984
1985               keyname = _rl_get_keyname (key);
1986
1987               if (result_index + 2 > result_size)
1988                 {
1989                   result_size += 10;
1990                   result = (char **)xrealloc (result, result_size * sizeof (char *));
1991                 }
1992
1993               result[result_index++] = keyname;
1994               result[result_index] = (char *)NULL;
1995             }
1996           break;
1997
1998         case ISKMAP:
1999           {
2000             char **seqs;
2001             register int i;
2002
2003             /* Find the list of keyseqs in this map which have FUNCTION as
2004                their target.  Add the key sequences found to RESULT. */
2005             if (map[key].function)
2006               seqs =
2007                 rl_invoking_keyseqs_in_map (function, FUNCTION_TO_KEYMAP (map, key));
2008             else
2009               break;
2010
2011             if (seqs == 0)
2012               break;
2013
2014             for (i = 0; seqs[i]; i++)
2015               {
2016                 char *keyname = (char *)xmalloc (6 + strlen (seqs[i]));
2017
2018                 if (key == ESC)
2019                   {
2020                     /* If ESC is the meta prefix and we're converting chars
2021                        with the eighth bit set to ESC-prefixed sequences, then
2022                        we can use \M-.  Otherwise we need to use the sequence
2023                        for ESC. */
2024                     if (_rl_convert_meta_chars_to_ascii && map[ESC].type == ISKMAP)
2025                       sprintf (keyname, "\\M-");
2026                     else
2027                       sprintf (keyname, "\\e");
2028                   }
2029                 else if (CTRL_CHAR (key))
2030                   sprintf (keyname, "\\C-%c", _rl_to_lower (UNCTRL (key)));
2031                 else if (key == RUBOUT)
2032                   sprintf (keyname, "\\C-?");
2033                 else if (key == '\\' || key == '"')
2034                   {
2035                     keyname[0] = '\\';
2036                     keyname[1] = (char) key;
2037                     keyname[2] = '\0';
2038                   }
2039                 else
2040                   {
2041                     keyname[0] = (char) key;
2042                     keyname[1] = '\0';
2043                   }
2044                 
2045                 strcat (keyname, seqs[i]);
2046                 xfree (seqs[i]);
2047
2048                 if (result_index + 2 > result_size)
2049                   {
2050                     result_size += 10;
2051                     result = (char **)xrealloc (result, result_size * sizeof (char *));
2052                   }
2053
2054                 result[result_index++] = keyname;
2055                 result[result_index] = (char *)NULL;
2056               }
2057
2058             xfree (seqs);
2059           }
2060           break;
2061         }
2062     }
2063   return (result);
2064 }
2065
2066 /* Return a NULL terminated array of strings which represent the key
2067    sequences that can be used to invoke FUNCTION using the current keymap. */
2068 char **
2069 rl_invoking_keyseqs (function)
2070      rl_command_func_t *function;
2071 {
2072   return (rl_invoking_keyseqs_in_map (function, _rl_keymap));
2073 }
2074
2075 /* Print all of the functions and their bindings to rl_outstream.  If
2076    PRINT_READABLY is non-zero, then print the output in such a way
2077    that it can be read back in. */
2078 void
2079 rl_function_dumper (print_readably)
2080      int print_readably;
2081 {
2082   register int i;
2083   const char **names;
2084   const char *name;
2085
2086   names = rl_funmap_names ();
2087
2088   fprintf (rl_outstream, "\n");
2089
2090   for (i = 0; name = names[i]; i++)
2091     {
2092       rl_command_func_t *function;
2093       char **invokers;
2094
2095       function = rl_named_function (name);
2096       invokers = rl_invoking_keyseqs_in_map (function, _rl_keymap);
2097
2098       if (print_readably)
2099         {
2100           if (!invokers)
2101             fprintf (rl_outstream, "# %s (not bound)\n", name);
2102           else
2103             {
2104               register int j;
2105
2106               for (j = 0; invokers[j]; j++)
2107                 {
2108                   fprintf (rl_outstream, "\"%s\": %s\n",
2109                            invokers[j], name);
2110                   xfree (invokers[j]);
2111                 }
2112
2113               xfree (invokers);
2114             }
2115         }
2116       else
2117         {
2118           if (!invokers)
2119             fprintf (rl_outstream, "%s is not bound to any keys\n",
2120                      name);
2121           else
2122             {
2123               register int j;
2124
2125               fprintf (rl_outstream, "%s can be found on ", name);
2126
2127               for (j = 0; invokers[j] && j < 5; j++)
2128                 {
2129                   fprintf (rl_outstream, "\"%s\"%s", invokers[j],
2130                            invokers[j + 1] ? ", " : ".\n");
2131                 }
2132
2133               if (j == 5 && invokers[j])
2134                 fprintf (rl_outstream, "...\n");
2135
2136               for (j = 0; invokers[j]; j++)
2137                 xfree (invokers[j]);
2138
2139               xfree (invokers);
2140             }
2141         }
2142     }
2143 }
2144
2145 /* Print all of the current functions and their bindings to
2146    rl_outstream.  If an explicit argument is given, then print
2147    the output in such a way that it can be read back in. */
2148 int
2149 rl_dump_functions (count, key)
2150      int count, key;
2151 {
2152   if (rl_dispatching)
2153     fprintf (rl_outstream, "\r\n");
2154   rl_function_dumper (rl_explicit_arg);
2155   rl_on_new_line ();
2156   return (0);
2157 }
2158
2159 static void
2160 _rl_macro_dumper_internal (print_readably, map, prefix)
2161      int print_readably;
2162      Keymap map;
2163      char *prefix;
2164 {
2165   register int key;
2166   char *keyname, *out;
2167   int prefix_len;
2168
2169   for (key = 0; key < KEYMAP_SIZE; key++)
2170     {
2171       switch (map[key].type)
2172         {
2173         case ISMACR:
2174           keyname = _rl_get_keyname (key);
2175           out = _rl_untranslate_macro_value ((char *)map[key].function);
2176
2177           if (print_readably)
2178             fprintf (rl_outstream, "\"%s%s\": \"%s\"\n", prefix ? prefix : "",
2179                                                          keyname,
2180                                                          out ? out : "");
2181           else
2182             fprintf (rl_outstream, "%s%s outputs %s\n", prefix ? prefix : "",
2183                                                         keyname,
2184                                                         out ? out : "");
2185           xfree (keyname);
2186           xfree (out);
2187           break;
2188         case ISFUNC:
2189           break;
2190         case ISKMAP:
2191           prefix_len = prefix ? strlen (prefix) : 0;
2192           if (key == ESC)
2193             {
2194               keyname = (char *)xmalloc (3 + prefix_len);
2195               if (prefix)
2196                 strcpy (keyname, prefix);
2197               keyname[prefix_len] = '\\';
2198               keyname[prefix_len + 1] = 'e';
2199               keyname[prefix_len + 2] = '\0';
2200             }
2201           else
2202             {
2203               keyname = _rl_get_keyname (key);
2204               if (prefix)
2205                 {
2206                   out = (char *)xmalloc (strlen (keyname) + prefix_len + 1);
2207                   strcpy (out, prefix);
2208                   strcpy (out + prefix_len, keyname);
2209                   xfree (keyname);
2210                   keyname = out;
2211                 }
2212             }
2213
2214           _rl_macro_dumper_internal (print_readably, FUNCTION_TO_KEYMAP (map, key), keyname);
2215           xfree (keyname);
2216           break;
2217         }
2218     }
2219 }
2220
2221 void
2222 rl_macro_dumper (print_readably)
2223      int print_readably;
2224 {
2225   _rl_macro_dumper_internal (print_readably, _rl_keymap, (char *)NULL);
2226 }
2227
2228 int
2229 rl_dump_macros (count, key)
2230      int count, key;
2231 {
2232   if (rl_dispatching)
2233     fprintf (rl_outstream, "\r\n");
2234   rl_macro_dumper (rl_explicit_arg);
2235   rl_on_new_line ();
2236   return (0);
2237 }
2238
2239 static char *
2240 _rl_get_string_variable_value (name)
2241      const char *name;
2242 {
2243   static char numbuf[32];
2244   char *ret;
2245
2246   if (_rl_stricmp (name, "bell-style") == 0)
2247     {
2248       switch (_rl_bell_preference)
2249         {
2250           case NO_BELL:
2251             return "none";
2252           case VISIBLE_BELL:
2253             return "visible";
2254           case AUDIBLE_BELL:
2255           default:
2256             return "audible";
2257         }
2258     }
2259   else if (_rl_stricmp (name, "comment-begin") == 0)
2260     return (_rl_comment_begin ? _rl_comment_begin : RL_COMMENT_BEGIN_DEFAULT);
2261   else if (_rl_stricmp (name, "completion-prefix-display-length") == 0)
2262     {
2263       sprintf (numbuf, "%d", _rl_completion_prefix_display_length);
2264       return (numbuf);
2265     }
2266   else if (_rl_stricmp (name, "completion-query-items") == 0)
2267     {
2268       sprintf (numbuf, "%d", rl_completion_query_items);
2269       return (numbuf);
2270     }
2271   else if (_rl_stricmp (name, "editing-mode") == 0)
2272     return (rl_get_keymap_name_from_edit_mode ());
2273   else if (_rl_stricmp (name, "history-size") == 0)
2274     {
2275       sprintf (numbuf, "%d", history_is_stifled() ? history_max_entries : 0);
2276       return (numbuf);
2277     }
2278   else if (_rl_stricmp (name, "isearch-terminators") == 0)
2279     {
2280       if (_rl_isearch_terminators == 0)
2281         return 0;
2282       ret = _rl_untranslate_macro_value (_rl_isearch_terminators);
2283       if (ret)
2284         {
2285           strncpy (numbuf, ret, sizeof (numbuf) - 1);
2286           xfree (ret);
2287           numbuf[sizeof(numbuf) - 1] = '\0';
2288         }
2289       else
2290         numbuf[0] = '\0';
2291       return numbuf;
2292     }
2293   else if (_rl_stricmp (name, "keymap") == 0)
2294     {
2295       ret = rl_get_keymap_name (_rl_keymap);
2296       if (ret == 0)
2297         ret = rl_get_keymap_name_from_edit_mode ();
2298       return (ret ? ret : "none");
2299     }
2300   else
2301     return (0);
2302 }
2303
2304 void
2305 rl_variable_dumper (print_readably)
2306      int print_readably;
2307 {
2308   int i;
2309   char *v;
2310
2311   for (i = 0; boolean_varlist[i].name; i++)
2312     {
2313       if (print_readably)
2314         fprintf (rl_outstream, "set %s %s\n", boolean_varlist[i].name,
2315                                *boolean_varlist[i].value ? "on" : "off");
2316       else
2317         fprintf (rl_outstream, "%s is set to `%s'\n", boolean_varlist[i].name,
2318                                *boolean_varlist[i].value ? "on" : "off");
2319     }
2320
2321   for (i = 0; string_varlist[i].name; i++)
2322     {
2323       v = _rl_get_string_variable_value (string_varlist[i].name);
2324       if (v == 0)       /* _rl_isearch_terminators can be NULL */
2325         continue;
2326       if (print_readably)
2327         fprintf (rl_outstream, "set %s %s\n", string_varlist[i].name, v);
2328       else
2329         fprintf (rl_outstream, "%s is set to `%s'\n", string_varlist[i].name, v);
2330     }
2331 }
2332
2333 /* Print all of the current variables and their values to
2334    rl_outstream.  If an explicit argument is given, then print
2335    the output in such a way that it can be read back in. */
2336 int
2337 rl_dump_variables (count, key)
2338      int count, key;
2339 {
2340   if (rl_dispatching)
2341     fprintf (rl_outstream, "\r\n");
2342   rl_variable_dumper (rl_explicit_arg);
2343   rl_on_new_line ();
2344   return (0);
2345 }
2346
2347 /* Return non-zero if any members of ARRAY are a substring in STRING. */
2348 static int
2349 substring_member_of_array (string, array)
2350      const char *string;
2351      const char * const *array;
2352 {
2353   while (*array)
2354     {
2355       if (_rl_strindex (string, *array))
2356         return (1);
2357       array++;
2358     }
2359   return (0);
2360 }