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