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