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