funmap.c revision 21308
1/* funmap.c -- attach names to functions. */
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
28extern char *xmalloc (), *xrealloc ();
29
30#if !defined (BUFSIZ)
31#include <stdio.h>
32#endif /* BUFSIZ */
33
34#if defined (HAVE_STDLIB_H)
35#  include <stdlib.h>
36#else
37#  include "ansi_stdlib.h"
38#endif /* HAVE_STDLIB_H */
39
40#include "rlconf.h"
41#include "readline.h"
42
43extern int _rl_qsort_string_compare ();
44
45FUNMAP **funmap;
46static int funmap_size;
47static int funmap_entry;
48
49/* After initializing the function map, this is the index of the first
50   program specific function. */
51int funmap_program_specific_entry_start;
52
53static FUNMAP default_funmap[] = {
54  { "abort", rl_abort },
55  { "accept-line", rl_newline },
56  { "arrow-key-prefix", rl_arrow_keys },
57  { "backward-char", rl_backward },
58  { "backward-delete-char", rl_rubout },
59  { "backward-kill-line", rl_backward_kill_line },
60  { "backward-kill-word", rl_backward_kill_word },
61  { "backward-word", rl_backward_word },
62  { "beginning-of-history", rl_beginning_of_history },
63  { "beginning-of-line", rl_beg_of_line },
64  { "call-last-kbd-macro", rl_call_last_kbd_macro },
65  { "capitalize-word", rl_capitalize_word },
66  { "character-search", rl_char_search },
67  { "character-search-backward", rl_backward_char_search },
68  { "clear-screen", rl_clear_screen },
69  { "complete", rl_complete },
70  { "copy-backward-word", rl_copy_backward_word },
71  { "copy-forward-word", rl_copy_forward_word },
72  { "copy-region-as-kill", rl_copy_region_to_kill },
73  { "delete-char", rl_delete },
74  { "delete-horizontal-space", rl_delete_horizontal_space },
75  { "digit-argument", rl_digit_argument },
76  { "do-lowercase-version", rl_do_lowercase_version },
77  { "downcase-word", rl_downcase_word },
78  { "dump-functions", rl_dump_functions },
79  { "dump-variables", rl_dump_variables },
80  { "emacs-editing-mode", rl_emacs_editing_mode },
81  { "end-kbd-macro", rl_end_kbd_macro },
82  { "end-of-history", rl_end_of_history },
83  { "end-of-line", rl_end_of_line },
84  { "exchange-point-and-mark", rl_exchange_point_and_mark },
85  { "forward-char", rl_forward },
86  { "forward-search-history", rl_forward_search_history },
87  { "forward-word", rl_forward_word },
88  { "history-search-backward", rl_history_search_backward },
89  { "history-search-forward", rl_history_search_forward },
90  { "insert-comment", rl_insert_comment },
91  { "insert-completions", rl_insert_completions },
92  { "kill-whole-line", rl_kill_full_line },
93  { "kill-line", rl_kill_line },
94  { "kill-region", rl_kill_region },
95  { "kill-word", rl_kill_word },
96  { "next-history", rl_get_next_history },
97  { "non-incremental-forward-search-history", rl_noninc_forward_search },
98  { "non-incremental-reverse-search-history", rl_noninc_reverse_search },
99  { "non-incremental-forward-search-history-again", rl_noninc_forward_search_again },
100  { "non-incremental-reverse-search-history-again", rl_noninc_reverse_search_again },
101  { "possible-completions", rl_possible_completions },
102  { "previous-history", rl_get_previous_history },
103  { "quoted-insert", rl_quoted_insert },
104  { "re-read-init-file", rl_re_read_init_file },
105  { "redraw-current-line", rl_refresh_line},
106  { "reverse-search-history", rl_reverse_search_history },
107  { "revert-line", rl_revert_line },
108  { "self-insert", rl_insert },
109  { "set-mark", rl_set_mark },
110  { "start-kbd-macro", rl_start_kbd_macro },
111  { "tab-insert", rl_tab_insert },
112  { "tilde-expand", rl_tilde_expand },
113  { "transpose-chars", rl_transpose_chars },
114  { "transpose-words", rl_transpose_words },
115  { "tty-status", rl_tty_status },
116  { "undo", rl_undo_command },
117  { "universal-argument", rl_universal_argument },
118  { "unix-line-discard", rl_unix_line_discard },
119  { "unix-word-rubout", rl_unix_word_rubout },
120  { "upcase-word", rl_upcase_word },
121  { "yank", rl_yank },
122  { "yank-last-arg", rl_yank_last_arg },
123  { "yank-nth-arg", rl_yank_nth_arg },
124  { "yank-pop", rl_yank_pop },
125
126#if defined (VI_MODE)
127  { "vi-append-eol", rl_vi_append_eol },
128  { "vi-append-mode", rl_vi_append_mode },
129  { "vi-arg-digit", rl_vi_arg_digit },
130  { "vi-back-to-indent", rl_vi_back_to_indent },
131  { "vi-bWord", rl_vi_bWord },
132  { "vi-bracktype", rl_vi_bracktype },
133  { "vi-bword", rl_vi_bword },
134  { "vi-change-case", rl_vi_change_case },
135  { "vi-change-char", rl_vi_change_char },
136  { "vi-change-to", rl_vi_change_to },
137  { "vi-char-search", rl_vi_char_search },
138  { "vi-column", rl_vi_column },
139  { "vi-complete", rl_vi_complete },
140  { "vi-delete", rl_vi_delete },
141  { "vi-delete-to", rl_vi_delete_to },
142  { "vi-eWord", rl_vi_eWord },
143  { "vi-editing-mode", rl_vi_editing_mode },
144  { "vi-end-word", rl_vi_end_word },
145  { "vi-eof-maybe", rl_vi_eof_maybe },
146  { "vi-eword", rl_vi_eword },
147  { "vi-fWord", rl_vi_fWord },
148  { "vi-fetch-history", rl_vi_fetch_history },
149  { "vi-first-print", rl_vi_first_print },
150  { "vi-fword", rl_vi_fword },
151  { "vi-goto-mark", rl_vi_goto_mark },
152  { "vi-insert-beg", rl_vi_insert_beg },
153  { "vi-insertion-mode", rl_vi_insertion_mode },
154  { "vi-match", rl_vi_match },
155  { "vi-movement-mode", rl_vi_movement_mode },
156  { "vi-next-word", rl_vi_next_word },
157  { "vi-overstrike", rl_vi_overstrike },
158  { "vi-overstrike-delete", rl_vi_overstrike_delete },
159  { "vi-prev-word", rl_vi_prev_word },
160  { "vi-put", rl_vi_put },
161  { "vi-redo", rl_vi_redo },
162  { "vi-replace", rl_vi_replace },
163  { "vi-search", rl_vi_search },
164  { "vi-search-again", rl_vi_search_again },
165  { "vi-set-mark", rl_vi_set_mark },
166  { "vi-subst", rl_vi_subst },
167  { "vi-tilde-expand", rl_vi_tilde_expand },
168  { "vi-yank-arg", rl_vi_yank_arg },
169  { "vi-yank-to", rl_vi_yank_to },
170#endif /* VI_MODE */
171
172 {(char *)NULL, (Function *)NULL }
173};
174
175int
176rl_add_funmap_entry (name, function)
177     char *name;
178     Function *function;
179{
180  if (funmap_entry + 2 >= funmap_size)
181    {
182      funmap_size += 64;
183      funmap = (FUNMAP **)xrealloc (funmap, funmap_size * sizeof (FUNMAP *));
184    }
185
186  funmap[funmap_entry] = (FUNMAP *)xmalloc (sizeof (FUNMAP));
187  funmap[funmap_entry]->name = name;
188  funmap[funmap_entry]->function = function;
189
190  funmap[++funmap_entry] = (FUNMAP *)NULL;
191  return funmap_entry;
192}
193
194static int funmap_initialized;
195
196/* Make the funmap contain all of the default entries. */
197void
198rl_initialize_funmap ()
199{
200  register int i;
201
202  if (funmap_initialized)
203    return;
204
205  for (i = 0; default_funmap[i].name; i++)
206    rl_add_funmap_entry (default_funmap[i].name, default_funmap[i].function);
207
208  funmap_initialized = 1;
209  funmap_program_specific_entry_start = i;
210}
211
212/* Produce a NULL terminated array of known function names.  The array
213   is sorted.  The array itself is allocated, but not the strings inside.
214   You should free () the array when you done, but not the pointrs. */
215char **
216rl_funmap_names ()
217{
218  char **result;
219  int result_size, result_index;
220
221  /* Make sure that the function map has been initialized. */
222  rl_initialize_funmap ();
223
224  for (result_index = result_size = 0, result = (char **)NULL; funmap[result_index]; result_index++)
225    {
226      if (result_index + 2 > result_size)
227	{
228	  result_size += 20;
229	  result = (char **)xrealloc (result, result_size * sizeof (char *));
230	}
231
232      result[result_index] = funmap[result_index]->name;
233      result[result_index + 1] = (char *)NULL;
234    }
235
236  qsort (result, result_index, sizeof (char *), _rl_qsort_string_compare);
237  return (result);
238}
239
240/* Things that mean `Control'. */
241char *possible_control_prefixes[] = {
242  "Control-", "C-", "CTRL-", (char *)NULL
243};
244
245char *possible_meta_prefixes[] = {
246  "Meta", "M-", (char *)NULL
247};
248