]> git.ipfire.org Git - thirdparty/bash.git/blame - lib/readline/funmap.c
commit bash-20111202 snapshot
[thirdparty/bash.git] / lib / readline / funmap.c
CommitLineData
726f6388
JA
1/* funmap.c -- attach names to functions. */
2
6faad625 3/* Copyright (C) 1987-2010 Free Software Foundation, Inc.
726f6388 4
2e4498b3
CR
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.
726f6388 7
2e4498b3
CR
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
726f6388
JA
11 (at your option) any later version.
12
2e4498b3
CR
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
726f6388
JA
16 GNU General Public License for more details.
17
2e4498b3
CR
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
726f6388
JA
22#define READLINE_LIBRARY
23
ccc6cda3
JA
24#if defined (HAVE_CONFIG_H)
25# include <config.h>
26#endif
27
726f6388
JA
28#if !defined (BUFSIZ)
29#include <stdio.h>
30#endif /* BUFSIZ */
31
32#if defined (HAVE_STDLIB_H)
33# include <stdlib.h>
34#else
35# include "ansi_stdlib.h"
36#endif /* HAVE_STDLIB_H */
37
38#include "rlconf.h"
39#include "readline.h"
40
bb70624e
JA
41#include "xmalloc.h"
42
43#ifdef __STDC__
44typedef int QSFUNC (const void *, const void *);
45#else
46typedef int QSFUNC ();
47#endif
48
f73dda09 49extern int _rl_qsort_string_compare PARAMS((char **, char **));
726f6388 50
ccc6cda3
JA
51FUNMAP **funmap;
52static int funmap_size;
53static int funmap_entry;
726f6388
JA
54
55/* After initializing the function map, this is the index of the first
56 program specific function. */
57int funmap_program_specific_entry_start;
58
d3ad40de 59static const FUNMAP default_funmap[] = {
726f6388
JA
60 { "abort", rl_abort },
61 { "accept-line", rl_newline },
62 { "arrow-key-prefix", rl_arrow_keys },
7117c2d2
JA
63 { "backward-byte", rl_backward_byte },
64 { "backward-char", rl_backward_char },
726f6388
JA
65 { "backward-delete-char", rl_rubout },
66 { "backward-kill-line", rl_backward_kill_line },
67 { "backward-kill-word", rl_backward_kill_word },
68 { "backward-word", rl_backward_word },
69 { "beginning-of-history", rl_beginning_of_history },
70 { "beginning-of-line", rl_beg_of_line },
71 { "call-last-kbd-macro", rl_call_last_kbd_macro },
72 { "capitalize-word", rl_capitalize_word },
ccc6cda3
JA
73 { "character-search", rl_char_search },
74 { "character-search-backward", rl_backward_char_search },
726f6388
JA
75 { "clear-screen", rl_clear_screen },
76 { "complete", rl_complete },
ccc6cda3
JA
77 { "copy-backward-word", rl_copy_backward_word },
78 { "copy-forward-word", rl_copy_forward_word },
79 { "copy-region-as-kill", rl_copy_region_to_kill },
726f6388 80 { "delete-char", rl_delete },
b72432fd 81 { "delete-char-or-list", rl_delete_or_show_completions },
726f6388
JA
82 { "delete-horizontal-space", rl_delete_horizontal_space },
83 { "digit-argument", rl_digit_argument },
84 { "do-lowercase-version", rl_do_lowercase_version },
85 { "downcase-word", rl_downcase_word },
86 { "dump-functions", rl_dump_functions },
d166f048 87 { "dump-macros", rl_dump_macros },
ccc6cda3 88 { "dump-variables", rl_dump_variables },
726f6388
JA
89 { "emacs-editing-mode", rl_emacs_editing_mode },
90 { "end-kbd-macro", rl_end_kbd_macro },
91 { "end-of-history", rl_end_of_history },
92 { "end-of-line", rl_end_of_line },
ccc6cda3 93 { "exchange-point-and-mark", rl_exchange_point_and_mark },
b72432fd 94 { "forward-backward-delete-char", rl_rubout_or_delete },
7117c2d2
JA
95 { "forward-byte", rl_forward_byte },
96 { "forward-char", rl_forward_char },
726f6388
JA
97 { "forward-search-history", rl_forward_search_history },
98 { "forward-word", rl_forward_word },
99 { "history-search-backward", rl_history_search_backward },
100 { "history-search-forward", rl_history_search_forward },
276cb932
CR
101 { "history-substring-search-backward", rl_history_substr_search_backward },
102 { "history-substring-search-forward", rl_history_substr_search_forward },
ccc6cda3 103 { "insert-comment", rl_insert_comment },
726f6388
JA
104 { "insert-completions", rl_insert_completions },
105 { "kill-whole-line", rl_kill_full_line },
106 { "kill-line", rl_kill_line },
ccc6cda3 107 { "kill-region", rl_kill_region },
726f6388 108 { "kill-word", rl_kill_word },
cce855bc 109 { "menu-complete", rl_menu_complete },
9dd88db7 110 { "menu-complete-backward", rl_backward_menu_complete },
726f6388
JA
111 { "next-history", rl_get_next_history },
112 { "non-incremental-forward-search-history", rl_noninc_forward_search },
113 { "non-incremental-reverse-search-history", rl_noninc_reverse_search },
114 { "non-incremental-forward-search-history-again", rl_noninc_forward_search_again },
115 { "non-incremental-reverse-search-history-again", rl_noninc_reverse_search_again },
af98a2a6 116 { "old-menu-complete", rl_old_menu_complete },
7117c2d2 117 { "overwrite-mode", rl_overwrite_mode },
28ef6c31 118#ifdef __CYGWIN__
cce855bc
JA
119 { "paste-from-clipboard", rl_paste_from_clipboard },
120#endif
726f6388
JA
121 { "possible-completions", rl_possible_completions },
122 { "previous-history", rl_get_previous_history },
123 { "quoted-insert", rl_quoted_insert },
124 { "re-read-init-file", rl_re_read_init_file },
125 { "redraw-current-line", rl_refresh_line},
126 { "reverse-search-history", rl_reverse_search_history },
127 { "revert-line", rl_revert_line },
128 { "self-insert", rl_insert },
ccc6cda3 129 { "set-mark", rl_set_mark },
691aebcb 130 { "skip-csi-sequence", rl_skip_csi_sequence },
726f6388
JA
131 { "start-kbd-macro", rl_start_kbd_macro },
132 { "tab-insert", rl_tab_insert },
133 { "tilde-expand", rl_tilde_expand },
134 { "transpose-chars", rl_transpose_chars },
135 { "transpose-words", rl_transpose_words },
136 { "tty-status", rl_tty_status },
137 { "undo", rl_undo_command },
138 { "universal-argument", rl_universal_argument },
113d85a4 139 { "unix-filename-rubout", rl_unix_filename_rubout },
726f6388
JA
140 { "unix-line-discard", rl_unix_line_discard },
141 { "unix-word-rubout", rl_unix_word_rubout },
142 { "upcase-word", rl_upcase_word },
143 { "yank", rl_yank },
144 { "yank-last-arg", rl_yank_last_arg },
145 { "yank-nth-arg", rl_yank_nth_arg },
146 { "yank-pop", rl_yank_pop },
147
148#if defined (VI_MODE)
149 { "vi-append-eol", rl_vi_append_eol },
150 { "vi-append-mode", rl_vi_append_mode },
151 { "vi-arg-digit", rl_vi_arg_digit },
ccc6cda3 152 { "vi-back-to-indent", rl_vi_back_to_indent },
6faad625
CR
153 { "vi-backward-bigword", rl_vi_bWord },
154 { "vi-backward-word", rl_vi_bword },
726f6388 155 { "vi-bWord", rl_vi_bWord },
726f6388
JA
156 { "vi-bword", rl_vi_bword },
157 { "vi-change-case", rl_vi_change_case },
158 { "vi-change-char", rl_vi_change_char },
159 { "vi-change-to", rl_vi_change_to },
160 { "vi-char-search", rl_vi_char_search },
161 { "vi-column", rl_vi_column },
726f6388
JA
162 { "vi-complete", rl_vi_complete },
163 { "vi-delete", rl_vi_delete },
164 { "vi-delete-to", rl_vi_delete_to },
165 { "vi-eWord", rl_vi_eWord },
166 { "vi-editing-mode", rl_vi_editing_mode },
6faad625 167 { "vi-end-bigword", rl_vi_eWord },
726f6388
JA
168 { "vi-end-word", rl_vi_end_word },
169 { "vi-eof-maybe", rl_vi_eof_maybe },
170 { "vi-eword", rl_vi_eword },
171 { "vi-fWord", rl_vi_fWord },
ccc6cda3 172 { "vi-fetch-history", rl_vi_fetch_history },
726f6388 173 { "vi-first-print", rl_vi_first_print },
6faad625
CR
174 { "vi-forward-bigword", rl_vi_fWord },
175 { "vi-forward-word", rl_vi_fword },
726f6388 176 { "vi-fword", rl_vi_fword },
ccc6cda3 177 { "vi-goto-mark", rl_vi_goto_mark },
726f6388
JA
178 { "vi-insert-beg", rl_vi_insert_beg },
179 { "vi-insertion-mode", rl_vi_insertion_mode },
180 { "vi-match", rl_vi_match },
181 { "vi-movement-mode", rl_vi_movement_mode },
182 { "vi-next-word", rl_vi_next_word },
183 { "vi-overstrike", rl_vi_overstrike },
184 { "vi-overstrike-delete", rl_vi_overstrike_delete },
185 { "vi-prev-word", rl_vi_prev_word },
186 { "vi-put", rl_vi_put },
187 { "vi-redo", rl_vi_redo },
188 { "vi-replace", rl_vi_replace },
a82a04b3 189 { "vi-rubout", rl_vi_rubout },
726f6388
JA
190 { "vi-search", rl_vi_search },
191 { "vi-search-again", rl_vi_search_again },
ccc6cda3 192 { "vi-set-mark", rl_vi_set_mark },
726f6388
JA
193 { "vi-subst", rl_vi_subst },
194 { "vi-tilde-expand", rl_vi_tilde_expand },
195 { "vi-yank-arg", rl_vi_yank_arg },
196 { "vi-yank-to", rl_vi_yank_to },
197#endif /* VI_MODE */
198
28ef6c31 199 {(char *)NULL, (rl_command_func_t *)NULL }
726f6388
JA
200};
201
ccc6cda3 202int
726f6388 203rl_add_funmap_entry (name, function)
28ef6c31
JA
204 const char *name;
205 rl_command_func_t *function;
726f6388
JA
206{
207 if (funmap_entry + 2 >= funmap_size)
ccc6cda3
JA
208 {
209 funmap_size += 64;
210 funmap = (FUNMAP **)xrealloc (funmap, funmap_size * sizeof (FUNMAP *));
211 }
726f6388
JA
212
213 funmap[funmap_entry] = (FUNMAP *)xmalloc (sizeof (FUNMAP));
214 funmap[funmap_entry]->name = name;
215 funmap[funmap_entry]->function = function;
216
217 funmap[++funmap_entry] = (FUNMAP *)NULL;
218 return funmap_entry;
219}
220
ccc6cda3 221static int funmap_initialized;
726f6388
JA
222
223/* Make the funmap contain all of the default entries. */
224void
225rl_initialize_funmap ()
226{
227 register int i;
228
229 if (funmap_initialized)
230 return;
231
232 for (i = 0; default_funmap[i].name; i++)
233 rl_add_funmap_entry (default_funmap[i].name, default_funmap[i].function);
234
235 funmap_initialized = 1;
236 funmap_program_specific_entry_start = i;
237}
238
239/* Produce a NULL terminated array of known function names. The array
240 is sorted. The array itself is allocated, but not the strings inside.
241 You should free () the array when you done, but not the pointrs. */
28ef6c31 242const char **
726f6388
JA
243rl_funmap_names ()
244{
28ef6c31 245 const char **result;
726f6388
JA
246 int result_size, result_index;
247
726f6388
JA
248 /* Make sure that the function map has been initialized. */
249 rl_initialize_funmap ();
250
28ef6c31 251 for (result_index = result_size = 0, result = (const char **)NULL; funmap[result_index]; result_index++)
726f6388
JA
252 {
253 if (result_index + 2 > result_size)
254 {
ccc6cda3 255 result_size += 20;
28ef6c31 256 result = (const char **)xrealloc (result, result_size * sizeof (char *));
726f6388
JA
257 }
258
259 result[result_index] = funmap[result_index]->name;
260 result[result_index + 1] = (char *)NULL;
261 }
262
bb70624e 263 qsort (result, result_index, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare);
726f6388
JA
264 return (result);
265}