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