OpenCoverage

bind.def

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/bash/src/builtins/bind.def
Source codeSwitch to Preprocessed file
LineSourceCount
1This file is bind.def, from which is created bind.c.-
2It implements the builtin "bind" in Bash.-
3-
4Copyright (C) 1987-2015 Free Software Foundation, Inc.-
5-
6This file is part of GNU Bash, the Bourne Again SHell.-
7-
8Bash is free software: you can redistribute it and/or modify-
9it under the terms of the GNU General Public License as published by-
10the Free Software Foundation, either version 3 of the License, or-
11(at your option) any later version.-
12-
13Bash is distributed in the hope that it will be useful,-
14but WITHOUT ANY WARRANTY; without even the implied warranty of-
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the-
16GNU General Public License for more details.-
17-
18You should have received a copy of the GNU General Public License-
19along with Bash. If not, see <http://www.gnu.org/licenses/>.-
20-
21$PRODUCES bind.c-
22-
23#include <config.h>-
24-
25$BUILTIN bind-
26$DEPENDS_ON READLINE-
27$FUNCTION bind_builtin-
28$SHORT_DOC bind [-lpsvPSVX] [-m keymap] [-f filename] [-q name] [-u name] [-r keyseq] [-x keyseq:shell-command] [keyseq:readline-function or readline-command]-
29Set Readline key bindings and variables.-
30-
31Bind a key sequence to a Readline function or a macro, or set a-
32Readline variable. The non-option argument syntax is equivalent to-
33that found in ~/.inputrc, but must be passed as a single argument:-
34e.g., bind '"\C-x\C-r": re-read-init-file'.-
35-
36Options:-
37 -m keymap Use KEYMAP as the keymap for the duration of this-
38 command. Acceptable keymap names are emacs,-
39 emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move,-
40 vi-command, and vi-insert.-
41 -l List names of functions.-
42 -P List function names and bindings.-
43 -p List functions and bindings in a form that can be-
44 reused as input.-
45 -S List key sequences that invoke macros and their values-
46 -s List key sequences that invoke macros and their values-
47 in a form that can be reused as input.-
48 -V List variable names and values-
49 -v List variable names and values in a form that can-
50 be reused as input.-
51 -q function-name Query about which keys invoke the named function.-
52 -u function-name Unbind all keys which are bound to the named function.-
53 -r keyseq Remove the binding for KEYSEQ.-
54 -f filename Read key bindings from FILENAME.-
55 -x keyseq:shell-command Cause SHELL-COMMAND to be executed when-
56 KEYSEQ is entered.-
57 -X List key sequences bound with -x and associated commands-
58 in a form that can be reused as input.-
59-
60Exit Status:-
61bind returns 0 unless an unrecognized option is given or an error occurs.-
62$END-
63-
64#if defined (READLINE)-
65-
66#if defined (HAVE_UNISTD_H)-
67# ifdef _MINIX-
68# include <sys/types.h>-
69# endif-
70# include <unistd.h>-
71#endif-
72-
73#include <stdio.h>-
74#include <errno.h>-
75#if !defined (errno)-
76extern int errno;-
77#endif /* !errno */-
78-
79#include <readline/readline.h>-
80#include <readline/history.h>-
81-
82#include "../bashintl.h"-
83-
84#include "../shell.h"-
85#include "../bashline.h"-
86#include "bashgetopt.h"-
87#include "common.h"-
88-
89static int query_bindings __P((char *));-
90static int unbind_command __P((char *));-
91static int unbind_keyseq __P((char *));-
92-
93#define BIND_RETURN(x) do { return_code = x; goto bind_exit; } while (0)-
94-
95#define LFLAG 0x0001-
96#define PFLAG 0x0002-
97#define FFLAG 0x0004-
98#define VFLAG 0x0008-
99#define QFLAG 0x0010-
100#define MFLAG 0x0020-
101#define RFLAG 0x0040-
102#define PPFLAG 0x0080-
103#define VVFLAG 0x0100-
104#define SFLAG 0x0200-
105#define SSFLAG 0x0400-
106#define UFLAG 0x0800-
107#define XFLAG 0x1000-
108#define XXFLAG 0x2000-
109-
110int-
111bind_builtin (list)-
112 WORD_LIST *list;-
113{-
114 int return_code;-
115 Keymap kmap, saved_keymap;-
116 int flags, opt;-
117 char *initfile, *map_name, *fun_name, *unbind_name, *remove_seq, *cmd_seq, *t;-
118-
119 if (no_line_editing)
no_line_editingDescription
TRUEnever evaluated
FALSEnever evaluated
0
120 {-
121#if 0-
122 builtin_error (_("line editing not enabled"));-
123 return (EXECUTION_FAILURE);-
124#else-
125 builtin_warning (_("line editing not enabled"));-
126#endif-
127 }
never executed: end of block
0
128-
129 kmap = saved_keymap = (Keymap) NULL;-
130 flags = 0;-
131 initfile = map_name = fun_name = unbind_name = remove_seq = cmd_seq = (char *)NULL;-
132 return_code = EXECUTION_SUCCESS;-
133-
134 if (bash_readline_initialized == 0)
bash_readline_initialized == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
135 initialize_readline ();
never executed: initialize_readline ();
0
136-
137 begin_unwind_frame ("bind_builtin");-
138 unwind_protect_var (rl_outstream);-
139-
140 rl_outstream = stdout;-
141-
142 reset_internal_getopt (); -
143 while ((opt = internal_getopt (list, "lvpVPsSXf:q:u:m:r:x:")) != -1)
(opt = interna...:r:x:")) != -1Description
TRUEnever evaluated
FALSEnever evaluated
0
144 {-
145 switch (opt)-
146 {-
147 case 'l':
never executed: case 'l':
0
148 flags |= LFLAG;-
149 break;
never executed: break;
0
150 case 'v':
never executed: case 'v':
0
151 flags |= VFLAG;-
152 break;
never executed: break;
0
153 case 'p':
never executed: case 'p':
0
154 flags |= PFLAG;-
155 break;
never executed: break;
0
156 case 'f':
never executed: case 'f':
0
157 flags |= FFLAG;-
158 initfile = list_optarg;-
159 break;
never executed: break;
0
160 case 'm':
never executed: case 'm':
0
161 flags |= MFLAG;-
162 map_name = list_optarg;-
163 break;
never executed: break;
0
164 case 'q':
never executed: case 'q':
0
165 flags |= QFLAG;-
166 fun_name = list_optarg;-
167 break;
never executed: break;
0
168 case 'u':
never executed: case 'u':
0
169 flags |= UFLAG;-
170 unbind_name = list_optarg;-
171 break;
never executed: break;
0
172 case 'r':
never executed: case 'r':
0
173 flags |= RFLAG;-
174 remove_seq = list_optarg;-
175 break;
never executed: break;
0
176 case 'V':
never executed: case 'V':
0
177 flags |= VVFLAG;-
178 break;
never executed: break;
0
179 case 'P':
never executed: case 'P':
0
180 flags |= PPFLAG;-
181 break;
never executed: break;
0
182 case 's':
never executed: case 's':
0
183 flags |= SFLAG;-
184 break;
never executed: break;
0
185 case 'S':
never executed: case 'S':
0
186 flags |= SSFLAG;-
187 break;
never executed: break;
0
188 case 'x':
never executed: case 'x':
0
189 flags |= XFLAG;-
190 cmd_seq = list_optarg;-
191 break;
never executed: break;
0
192 case 'X':
never executed: case 'X':
0
193 flags |= XXFLAG;-
194 break;
never executed: break;
0
195 CASE_HELPOPT;
never executed: return (258);
never executed: case -99:
0
196 default:
never executed: default:
0
197 builtin_usage ();-
198 BIND_RETURN (EX_USAGE);
never executed: goto bind_exit;
0
199 }-
200 }-
201-
202 list = loptend;-
203-
204 /* First, see if we need to install a special keymap for this-
205 command. Then start on the arguments. */-
206-
207 if ((flags & MFLAG) && map_name)
(flags & 0x0020)Description
TRUEnever evaluated
FALSEnever evaluated
map_nameDescription
TRUEnever evaluated
FALSEnever evaluated
0
208 {-
209 kmap = rl_get_keymap_by_name (map_name);-
210 if (kmap == 0)
kmap == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
211 {-
212 builtin_error (_("`%s': invalid keymap name"), map_name);-
213 BIND_RETURN (EXECUTION_FAILURE);
never executed: goto bind_exit;
0
214 }-
215 }
never executed: end of block
0
216-
217 if (kmap)
kmapDescription
TRUEnever evaluated
FALSEnever evaluated
0
218 {-
219 saved_keymap = rl_get_keymap ();-
220 rl_set_keymap (kmap);-
221 }
never executed: end of block
0
222-
223 /* XXX - we need to add exclusive use tests here. It doesn't make sense-
224 to use some of these options together. */-
225 /* Now hack the option arguments */-
226 if (flags & LFLAG)
flags & 0x0001Description
TRUEnever evaluated
FALSEnever evaluated
0
227 rl_list_funmap_names ();
never executed: rl_list_funmap_names ();
0
228-
229 if (flags & PFLAG)
flags & 0x0002Description
TRUEnever evaluated
FALSEnever evaluated
0
230 rl_function_dumper (1);
never executed: rl_function_dumper (1);
0
231-
232 if (flags & PPFLAG)
flags & 0x0080Description
TRUEnever evaluated
FALSEnever evaluated
0
233 rl_function_dumper (0);
never executed: rl_function_dumper (0);
0
234-
235 if (flags & SFLAG)
flags & 0x0200Description
TRUEnever evaluated
FALSEnever evaluated
0
236 rl_macro_dumper (1);
never executed: rl_macro_dumper (1);
0
237-
238 if (flags & SSFLAG)
flags & 0x0400Description
TRUEnever evaluated
FALSEnever evaluated
0
239 rl_macro_dumper (0);
never executed: rl_macro_dumper (0);
0
240-
241 if (flags & VFLAG)
flags & 0x0008Description
TRUEnever evaluated
FALSEnever evaluated
0
242 rl_variable_dumper (1);
never executed: rl_variable_dumper (1);
0
243-
244 if (flags & VVFLAG)
flags & 0x0100Description
TRUEnever evaluated
FALSEnever evaluated
0
245 rl_variable_dumper (0);
never executed: rl_variable_dumper (0);
0
246-
247 if ((flags & FFLAG) && initfile)
(flags & 0x0004)Description
TRUEnever evaluated
FALSEnever evaluated
initfileDescription
TRUEnever evaluated
FALSEnever evaluated
0
248 {-
249 if (rl_read_init_file (initfile) != 0)
rl_read_init_f...initfile) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
250 {-
251 t = printable_filename (initfile, 0);-
252 builtin_error (_("%s: cannot read: %s"), t, strerror (errno));-
253 if (t != initfile)
t != initfileDescription
TRUEnever evaluated
FALSEnever evaluated
0
254 free (t);
never executed: sh_xfree((t), "./bind.def", 254);
0
255 BIND_RETURN (EXECUTION_FAILURE);
never executed: goto bind_exit;
0
256 }-
257 }
never executed: end of block
0
258-
259 if ((flags & QFLAG) && fun_name)
(flags & 0x0010)Description
TRUEnever evaluated
FALSEnever evaluated
fun_nameDescription
TRUEnever evaluated
FALSEnever evaluated
0
260 return_code = query_bindings (fun_name);
never executed: return_code = query_bindings (fun_name);
0
261-
262 if ((flags & UFLAG) && unbind_name)
(flags & 0x0800)Description
TRUEnever evaluated
FALSEnever evaluated
unbind_nameDescription
TRUEnever evaluated
FALSEnever evaluated
0
263 return_code = unbind_command (unbind_name);
never executed: return_code = unbind_command (unbind_name);
0
264-
265 if ((flags & RFLAG) && remove_seq)
(flags & 0x0040)Description
TRUEnever evaluated
FALSEnever evaluated
remove_seqDescription
TRUEnever evaluated
FALSEnever evaluated
0
266 {-
267 opt = unbind_keyseq (remove_seq);-
268 BIND_RETURN (opt);
never executed: goto bind_exit;
0
269 }-
270-
271 if (flags & XFLAG)
flags & 0x1000Description
TRUEnever evaluated
FALSEnever evaluated
0
272 return_code = bind_keyseq_to_unix_command (cmd_seq);
never executed: return_code = bind_keyseq_to_unix_command (cmd_seq);
0
273-
274 if (flags & XXFLAG)
flags & 0x2000Description
TRUEnever evaluated
FALSEnever evaluated
0
275 return_code = print_unix_command_map ();
never executed: return_code = print_unix_command_map ();
0
276-
277 /* Process the rest of the arguments as binding specifications. */-
278 while (list)
listDescription
TRUEnever evaluated
FALSEnever evaluated
0
279 {-
280 rl_parse_and_bind (list->word->word);-
281 list = list->next;-
282 }
never executed: end of block
0
283-
284 bind_exit:
code before this statement never executed: bind_exit:
0
285 if (saved_keymap)
saved_keymapDescription
TRUEnever evaluated
FALSEnever evaluated
0
286 rl_set_keymap (saved_keymap);
never executed: rl_set_keymap (saved_keymap);
0
287-
288 run_unwind_frame ("bind_builtin");-
289-
290 return (sh_chkwrite (return_code));
never executed: return (sh_chkwrite (return_code));
0
291}-
292-
293static int-
294query_bindings (name)-
295 char *name;-
296{-
297 rl_command_func_t *function;-
298 char **keyseqs;-
299 int j;-
300-
301 function = rl_named_function (name);-
302 if (function == 0)
function == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
303 {-
304 builtin_error (_("`%s': unknown function name"), name);-
305 return EXECUTION_FAILURE;
never executed: return 1;
0
306 }-
307-
308 keyseqs = rl_invoking_keyseqs (function);-
309-
310 if (!keyseqs)
!keyseqsDescription
TRUEnever evaluated
FALSEnever evaluated
0
311 {-
312 printf (_("%s is not bound to any keys.\n"), name);-
313 return EXECUTION_FAILURE;
never executed: return 1;
0
314 }-
315-
316 printf (_("%s can be invoked via "), name);-
317 for (j = 0; j < 5 && keyseqs[j]; j++)
j < 5Description
TRUEnever evaluated
FALSEnever evaluated
keyseqs[j]Description
TRUEnever evaluated
FALSEnever evaluated
0
318 printf ("\"%s\"%s", keyseqs[j], keyseqs[j + 1] ? ", " : ".\n");
never executed: printf ("\"%s\"%s", keyseqs[j], keyseqs[j + 1] ? ", " : ".\n");
0
319 if (keyseqs[j])
keyseqs[j]Description
TRUEnever evaluated
FALSEnever evaluated
0
320 printf ("...\n");
never executed: printf ("...\n");
0
321 strvec_dispose (keyseqs);-
322 return EXECUTION_SUCCESS;
never executed: return 0;
0
323}-
324-
325static int-
326unbind_command (name)-
327 char *name;-
328{-
329 rl_command_func_t *function;-
330-
331 function = rl_named_function (name);-
332 if (function == 0)
function == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
333 {-
334 builtin_error (_("`%s': unknown function name"), name);-
335 return EXECUTION_FAILURE;
never executed: return 1;
0
336 }-
337-
338 rl_unbind_function_in_map (function, rl_get_keymap ());-
339 return EXECUTION_SUCCESS;
never executed: return 0;
0
340}-
341-
342static int-
343unbind_keyseq (seq)-
344 char *seq;-
345{-
346 char *kseq;-
347 int kslen;-
348-
349 kseq = (char *)xmalloc ((2 * strlen (seq)) + 1);-
350 if (rl_translate_keyseq (seq, kseq, &kslen))
rl_translate_k... kseq, &kslen)Description
TRUEnever evaluated
FALSEnever evaluated
0
351 {-
352 free (kseq);-
353 builtin_error (_("`%s': cannot unbind"), seq);-
354 return EXECUTION_FAILURE;
never executed: return 1;
0
355 }-
356 if (rl_function_of_keyseq (kseq, (Keymap)0, (int *)0) == 0)
rl_function_of...(int *)0) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
357 {-
358 free (kseq);-
359 return (EXECUTION_SUCCESS);
never executed: return (0);
0
360 }-
361-
362 /* I wish this didn't have to translate the key sequence again, but readline-
363 doesn't have a binding function that takes a translated key sequence as-
364 an argument. */-
365 if (rl_bind_keyseq (seq, (rl_command_func_t *)NULL) != 0)
rl_bind_keyseq...id *)0) ) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
366 {-
367 free (kseq);-
368 builtin_error (_("`%s': cannot unbind"), seq);-
369 return (EXECUTION_FAILURE);
never executed: return (1);
0
370 }-
371-
372 free (kseq);-
373 return (EXECUTION_SUCCESS);
never executed: return (0);
0
374}-
375#endif /* READLINE */-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2