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