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