OpenCoverage

bashline.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/bash/src/bashline.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* bashline.c -- Bash's interface to the readline library. */-
2-
3/* Copyright (C) 1987-2017 Free Software Foundation, Inc.-
4-
5 This file is part of GNU Bash, the Bourne Again SHell.-
6-
7 Bash is free software: you can redistribute it and/or modify-
8 it under the terms of the GNU General Public License as published by-
9 the Free Software Foundation, either version 3 of the License, or-
10 (at your option) any later version.-
11-
12 Bash is distributed in the hope that it will be useful,-
13 but WITHOUT ANY WARRANTY; without even the implied warranty of-
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the-
15 GNU General Public License for more details.-
16-
17 You should have received a copy of the GNU General Public License-
18 along with Bash. If not, see <http://www.gnu.org/licenses/>.-
19*/-
20-
21#include "config.h"-
22-
23#if defined (READLINE)-
24-
25#include "bashtypes.h"-
26#include "posixstat.h"-
27-
28#if defined (HAVE_UNISTD_H)-
29# include <unistd.h>-
30#endif-
31-
32#if defined (HAVE_GRP_H)-
33# include <grp.h>-
34#endif-
35-
36#if defined (HAVE_NETDB_H)-
37# include <netdb.h>-
38#endif-
39-
40#include <signal.h>-
41-
42#include <stdio.h>-
43#include "chartypes.h"-
44#include "bashansi.h"-
45#include "bashintl.h"-
46-
47#include "shell.h"-
48#include "input.h"-
49#include "parser.h"-
50#include "builtins.h"-
51#include "bashhist.h"-
52#include "bashline.h"-
53#include "execute_cmd.h"-
54#include "findcmd.h"-
55#include "pathexp.h"-
56#include "shmbutil.h"-
57#include "trap.h"-
58#include "flags.h"-
59-
60#if defined (HAVE_MBSTR_H) && defined (HAVE_MBSCHR)-
61# include <mbstr.h> /* mbschr */-
62#endif-
63-
64#include "builtins/common.h"-
65-
66#include <readline/rlconf.h>-
67#include <readline/readline.h>-
68#include <readline/history.h>-
69-
70#include <glob/glob.h>-
71-
72#if defined (ALIAS)-
73# include "alias.h"-
74#endif-
75-
76#if defined (PROGRAMMABLE_COMPLETION)-
77# include "pcomplete.h"-
78#endif-
79-
80/* These should agree with the defines for emacs_mode and vi_mode in-
81 rldefs.h, even though that's not a public readline header file. */-
82#ifndef EMACS_EDITING_MODE-
83# define NO_EDITING_MODE -1-
84# define EMACS_EDITING_MODE 1-
85# define VI_EDITING_MODE 0-
86#endif-
87-
88#define RL_BOOLEAN_VARIABLE_VALUE(s) ((s)[0] == 'o' && (s)[1] == 'n' && (s)[2] == '\0')-
89-
90#if defined (BRACE_COMPLETION)-
91extern int bash_brace_completion __P((int, int));-
92#endif /* BRACE_COMPLETION */-
93-
94/* To avoid including curses.h/term.h/termcap.h and that whole mess. */-
95#ifdef _MINIX-
96extern int tputs __P((const char *string, int nlines, void (*outx)(int)));-
97#else-
98extern int tputs __P((const char *string, int nlines, int (*outx)(int)));-
99#endif-
100-
101/* Forward declarations */-
102-
103/* Functions bound to keys in Readline for Bash users. */-
104static int shell_expand_line __P((int, int));-
105static int display_shell_version __P((int, int));-
106static int operate_and_get_next __P((int, int));-
107-
108static int bash_ignore_filenames __P((char **));-
109static int bash_ignore_everything __P((char **));-
110-
111#if defined (BANG_HISTORY)-
112static char *history_expand_line_internal __P((char *));-
113static int history_expand_line __P((int, int));-
114static int tcsh_magic_space __P((int, int));-
115#endif /* BANG_HISTORY */-
116#ifdef ALIAS-
117static int alias_expand_line __P((int, int));-
118#endif-
119#if defined (BANG_HISTORY) && defined (ALIAS)-
120static int history_and_alias_expand_line __P((int, int));-
121#endif-
122-
123static int bash_forward_shellword __P((int, int));-
124static int bash_backward_shellword __P((int, int));-
125static int bash_kill_shellword __P((int, int));-
126static int bash_backward_kill_shellword __P((int, int));-
127-
128/* Helper functions for Readline. */-
129static char *restore_tilde __P((char *, char *));-
130static char *maybe_restore_tilde __P((char *, char *));-
131-
132static char *bash_filename_rewrite_hook __P((char *, int));-
133-
134static void bash_directory_expansion __P((char **));-
135static int bash_filename_stat_hook __P((char **));-
136static int bash_command_name_stat_hook __P((char **));-
137static int bash_directory_completion_hook __P((char **));-
138static int filename_completion_ignore __P((char **));-
139static int bash_push_line __P((void));-
140-
141static int executable_completion __P((const char *, int));-
142-
143static rl_icppfunc_t *save_directory_hook __P((void));-
144static void restore_directory_hook __P((rl_icppfunc_t));-
145-
146static int directory_exists __P((const char *, int));-
147-
148static void cleanup_expansion_error __P((void));-
149static void maybe_make_readline_line __P((char *));-
150static void set_up_new_line __P((char *));-
151-
152static int check_redir __P((int));-
153static char **attempt_shell_completion __P((const char *, int, int));-
154static char *variable_completion_function __P((const char *, int));-
155static char *hostname_completion_function __P((const char *, int));-
156static char *command_subst_completion_function __P((const char *, int));-
157-
158static void build_history_completion_array __P((void));-
159static char *history_completion_generator __P((const char *, int));-
160static int dynamic_complete_history __P((int, int));-
161static int bash_dabbrev_expand __P((int, int));-
162-
163static void initialize_hostname_list __P((void));-
164static void add_host_name __P((char *));-
165static void snarf_hosts_from_file __P((char *));-
166static char **hostnames_matching __P((char *));-
167-
168static void _ignore_completion_names __P((char **, sh_ignore_func_t *));-
169static int name_is_acceptable __P((const char *));-
170static int test_for_directory __P((const char *));-
171static int return_zero __P((const char *));-
172-
173static char *bash_dequote_filename __P((char *, int));-
174static char *quote_word_break_chars __P((char *));-
175static void set_filename_bstab __P((const char *));-
176static char *bash_quote_filename __P((char *, int, char *));-
177-
178#ifdef _MINIX-
179static void putx __P((int));-
180#else-
181static int putx __P((int));-
182#endif-
183static int bash_execute_unix_command __P((int, int));-
184static void init_unix_command_map __P((void));-
185static int isolate_sequence __P((char *, int, int, int *));-
186-
187static int set_saved_history __P((void));-
188-
189#if defined (ALIAS)-
190static int posix_edit_macros __P((int, int));-
191#endif-
192-
193static int bash_event_hook __P((void));-
194-
195#if defined (PROGRAMMABLE_COMPLETION)-
196static int find_cmd_start __P((int));-
197static int find_cmd_end __P((int));-
198static char *find_cmd_name __P((int, int *, int *));-
199static char *prog_complete_return __P((const char *, int));-
200-
201static char **prog_complete_matches;-
202#endif-
203-
204extern int no_symbolic_links;-
205extern STRING_INT_ALIST word_token_alist[];-
206-
207/* SPECIFIC_COMPLETION_FUNCTIONS specifies that we have individual-
208 completion functions which indicate what type of completion should be-
209 done (at or before point) that can be bound to key sequences with-
210 the readline library. */-
211#define SPECIFIC_COMPLETION_FUNCTIONS-
212-
213#if defined (SPECIFIC_COMPLETION_FUNCTIONS)-
214static int bash_specific_completion __P((int, rl_compentry_func_t *));-
215-
216static int bash_complete_filename_internal __P((int));-
217static int bash_complete_username_internal __P((int));-
218static int bash_complete_hostname_internal __P((int));-
219static int bash_complete_variable_internal __P((int));-
220static int bash_complete_command_internal __P((int));-
221-
222static int bash_complete_filename __P((int, int));-
223static int bash_possible_filename_completions __P((int, int));-
224static int bash_complete_username __P((int, int));-
225static int bash_possible_username_completions __P((int, int));-
226static int bash_complete_hostname __P((int, int));-
227static int bash_possible_hostname_completions __P((int, int));-
228static int bash_complete_variable __P((int, int));-
229static int bash_possible_variable_completions __P((int, int));-
230static int bash_complete_command __P((int, int));-
231static int bash_possible_command_completions __P((int, int));-
232-
233static char *glob_complete_word __P((const char *, int));-
234static int bash_glob_completion_internal __P((int));-
235static int bash_glob_complete_word __P((int, int));-
236static int bash_glob_expand_word __P((int, int));-
237static int bash_glob_list_expansions __P((int, int));-
238-
239#endif /* SPECIFIC_COMPLETION_FUNCTIONS */-
240-
241static int edit_and_execute_command __P((int, int, int, char *));-
242#if defined (VI_MODE)-
243static int vi_edit_and_execute_command __P((int, int));-
244static int bash_vi_complete __P((int, int));-
245#endif-
246static int emacs_edit_and_execute_command __P((int, int));-
247-
248/* Non-zero once initalize_readline () has been called. */-
249int bash_readline_initialized = 0;-
250-
251/* If non-zero, we do hostname completion, breaking words at `@' and-
252 trying to complete the stuff after the `@' from our own internal-
253 host list. */-
254int perform_hostname_completion = 1;-
255-
256/* If non-zero, we don't do command completion on an empty line. */-
257int no_empty_command_completion;-
258-
259/* Set FORCE_FIGNORE if you want to honor FIGNORE even if it ignores the-
260 only possible matches. Set to 0 if you want to match filenames if they-
261 are the only possible matches, even if FIGNORE says to. */-
262int force_fignore = 1;-
263-
264/* Perform spelling correction on directory names during word completion */-
265int dircomplete_spelling = 0;-
266-
267/* Expand directory names during word/filename completion. */-
268#if DIRCOMPLETE_EXPAND_DEFAULT-
269int dircomplete_expand = 1;-
270int dircomplete_expand_relpath = 1;-
271#else-
272int dircomplete_expand = 0;-
273int dircomplete_expand_relpath = 0;-
274#endif-
275-
276/* When non-zero, perform `normal' shell quoting on completed filenames-
277 even when the completed name contains a directory name with a shell-
278 variable referene, so dollar signs in a filename get quoted appropriately.-
279 Set to zero to remove dollar sign (and braces or parens as needed) from-
280 the set of characters that will be quoted. */-
281int complete_fullquote = 1;-
282-
283static char *bash_completer_word_break_characters = " \t\n\"'@><=;|&(:";-
284static char *bash_nohostname_word_break_characters = " \t\n\"'><=;|&(:";-
285/* )) */-
286-
287static const char *default_filename_quote_characters = " \t\n\\\"'@<>=;|&()#$`?*[!:{~"; /*}*/-
288static char *custom_filename_quote_characters = 0;-
289static char filename_bstab[256];-
290-
291static rl_hook_func_t *old_rl_startup_hook = (rl_hook_func_t *)NULL;-
292-
293static int dot_in_path = 0;-
294-
295/* Set to non-zero when dabbrev-expand is running */-
296static int dabbrev_expand_active = 0;-
297-
298/* What kind of quoting is performed by bash_quote_filename:-
299 COMPLETE_DQUOTE = double-quoting the filename-
300 COMPLETE_SQUOTE = single_quoting the filename-
301 COMPLETE_BSQUOTE = backslash-quoting special chars in the filename-
302*/-
303#define COMPLETE_DQUOTE 1-
304#define COMPLETE_SQUOTE 2-
305#define COMPLETE_BSQUOTE 3-
306static int completion_quoting_style = COMPLETE_BSQUOTE;-
307-
308/* Flag values for the final argument to bash_default_completion */-
309#define DEFCOMP_CMDPOS 1-
310-
311/* Change the readline VI-mode keymaps into or out of Posix.2 compliance.-
312 Called when the shell is put into or out of `posix' mode. */-
313void-
314posix_readline_initialize (on_or_off)-
315 int on_or_off;-
316{-
317 if (on_or_off)
on_or_offDescription
TRUEnever evaluated
FALSEnever evaluated
0
318 rl_variable_bind ("comment-begin", "#");
never executed: rl_variable_bind ("comment-begin", "#");
0
319#if defined (VI_MODE)-
320 rl_bind_key_in_map (CTRL ('I'), on_or_off ? rl_insert : rl_complete, vi_insertion_keymap);-
321#endif-
322}
never executed: end of block
0
323-
324void-
325reset_completer_word_break_chars ()-
326{-
327 rl_completer_word_break_characters = perform_hostname_completion ? savestring (bash_completer_word_break_characters) : savestring (bash_nohostname_word_break_characters);
perform_hostname_completionDescription
TRUEevaluated 15 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-15
328}
executed 15 times by 1 test: end of block
Executed by:
  • Self test
15
329-
330/* When this function returns, rl_completer_word_break_characters points to-
331 dynamically allocated memory. */-
332int-
333enable_hostname_completion (on_or_off)-
334 int on_or_off;-
335{-
336 int old_value;-
337 char *at, *nv, *nval;-
338-
339 old_value = perform_hostname_completion;-
340-
341 if (on_or_off)
on_or_offDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
1-2
342 {-
343 perform_hostname_completion = 1;-
344 rl_special_prefixes = "$@";-
345 }
executed 1 time by 1 test: end of block
Executed by:
  • Self test
1
346 else-
347 {-
348 perform_hostname_completion = 0;-
349 rl_special_prefixes = "$";-
350 }
executed 2 times by 1 test: end of block
Executed by:
  • Self test
2
351-
352 /* Now we need to figure out how to appropriately modify and assign-
353 rl_completer_word_break_characters depending on whether we want-
354 hostname completion on or off. */-
355-
356 /* If this is the first time this has been called-
357 (bash_readline_initialized == 0), use the sames values as before, but-
358 allocate new memory for rl_completer_word_break_characters. */-
359-
360 if (bash_readline_initialized == 0 &&
bash_readline_initialized == 0Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-3
361 (rl_completer_word_break_characters == 0 ||
rl_completer_w...haracters == 0Description
TRUEevaluated 3 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-3
362 rl_completer_word_break_characters == rl_basic_word_break_characters))
rl_completer_w...eak_charactersDescription
TRUEnever evaluated
FALSEnever evaluated
0
363 {-
364 if (on_or_off)
on_or_offDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
1-2
365 rl_completer_word_break_characters = savestring (bash_completer_word_break_characters);
executed 1 time by 1 test: rl_completer_word_break_characters = (char *)strcpy (sh_xmalloc((1 + strlen (bash_completer_word_break_characters)), "bashline.c", 365), (bash_completer_word_break_characters));
Executed by:
  • Self test
1
366 else-
367 rl_completer_word_break_characters = savestring (bash_nohostname_word_break_characters);
executed 2 times by 1 test: rl_completer_word_break_characters = (char *)strcpy (sh_xmalloc((1 + strlen (bash_nohostname_word_break_characters)), "bashline.c", 367), (bash_nohostname_word_break_characters));
Executed by:
  • Self test
2
368 }-
369 else-
370 {-
371 /* See if we have anything to do. */-
372 at = strchr (rl_completer_word_break_characters, '@');
__builtin_constant_p ( '@' )Description
TRUEnever evaluated
FALSEnever evaluated
!__builtin_con...k_characters )Description
TRUEnever evaluated
FALSEnever evaluated
( '@' ) == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
373 if ((at == 0 && on_or_off == 0) || (at != 0 && on_or_off != 0))
at == 0Description
TRUEnever evaluated
FALSEnever evaluated
on_or_off == 0Description
TRUEnever evaluated
FALSEnever evaluated
at != 0Description
TRUEnever evaluated
FALSEnever evaluated
on_or_off != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
374 return old_value;
never executed: return old_value;
0
375-
376 /* We have something to do. Do it. */-
377 nval = (char *)xmalloc (strlen (rl_completer_word_break_characters) + 1 + on_or_off);-
378-
379 if (on_or_off == 0)
on_or_off == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
380 {-
381 /* Turn it off -- just remove `@' from word break chars. We want-
382 to remove all occurrences of `@' from the char list, so we loop-
383 rather than just copy the rest of the list over AT. */-
384 for (nv = nval, at = rl_completer_word_break_characters; *at; )
*atDescription
TRUEnever evaluated
FALSEnever evaluated
0
385 if (*at != '@')
*at != '@'Description
TRUEnever evaluated
FALSEnever evaluated
0
386 *nv++ = *at++;
never executed: *nv++ = *at++;
0
387 else-
388 at++;
never executed: at++;
0
389 *nv = '\0';-
390 }
never executed: end of block
0
391 else-
392 {-
393 nval[0] = '@';-
394 strcpy (nval + 1, rl_completer_word_break_characters);-
395 }
never executed: end of block
0
396-
397 free (rl_completer_word_break_characters);-
398 rl_completer_word_break_characters = nval;-
399 }
never executed: end of block
0
400-
401 return (old_value);
executed 3 times by 1 test: return (old_value);
Executed by:
  • Self test
3
402}-
403-
404/* Called once from parse.y if we are going to use readline. */-
405void-
406initialize_readline ()-
407{-
408 rl_command_func_t *func;-
409 char kseq[2];-
410-
411 if (bash_readline_initialized)
bash_readline_initializedDescription
TRUEnever evaluated
FALSEnever evaluated
0
412 return;
never executed: return;
0
413-
414 rl_terminal_name = get_string_value ("TERM");-
415 rl_instream = stdin;-
416 rl_outstream = stderr;-
417-
418 /* Allow conditional parsing of the ~/.inputrc file. */-
419 rl_readline_name = "Bash";-
420-
421 /* Add bindable names before calling rl_initialize so they may be-
422 referenced in the various inputrc files. */-
423 rl_add_defun ("shell-expand-line", shell_expand_line, -1);-
424#ifdef BANG_HISTORY-
425 rl_add_defun ("history-expand-line", history_expand_line, -1);-
426 rl_add_defun ("magic-space", tcsh_magic_space, -1);-
427#endif-
428-
429 rl_add_defun ("shell-forward-word", bash_forward_shellword, -1);-
430 rl_add_defun ("shell-backward-word", bash_backward_shellword, -1);-
431 rl_add_defun ("shell-kill-word", bash_kill_shellword, -1);-
432 rl_add_defun ("shell-backward-kill-word", bash_backward_kill_shellword, -1);-
433-
434#ifdef ALIAS-
435 rl_add_defun ("alias-expand-line", alias_expand_line, -1);-
436# ifdef BANG_HISTORY-
437 rl_add_defun ("history-and-alias-expand-line", history_and_alias_expand_line, -1);-
438# endif-
439#endif-
440-
441 /* Backwards compatibility. */-
442 rl_add_defun ("insert-last-argument", rl_yank_last_arg, -1);-
443-
444 rl_add_defun ("operate-and-get-next", operate_and_get_next, -1);-
445 rl_add_defun ("display-shell-version", display_shell_version, -1);-
446 rl_add_defun ("edit-and-execute-command", emacs_edit_and_execute_command, -1);-
447-
448#if defined (BRACE_COMPLETION)-
449 rl_add_defun ("complete-into-braces", bash_brace_completion, -1);-
450#endif-
451-
452#if defined (SPECIFIC_COMPLETION_FUNCTIONS)-
453 rl_add_defun ("complete-filename", bash_complete_filename, -1);-
454 rl_add_defun ("possible-filename-completions", bash_possible_filename_completions, -1);-
455 rl_add_defun ("complete-username", bash_complete_username, -1);-
456 rl_add_defun ("possible-username-completions", bash_possible_username_completions, -1);-
457 rl_add_defun ("complete-hostname", bash_complete_hostname, -1);-
458 rl_add_defun ("possible-hostname-completions", bash_possible_hostname_completions, -1);-
459 rl_add_defun ("complete-variable", bash_complete_variable, -1);-
460 rl_add_defun ("possible-variable-completions", bash_possible_variable_completions, -1);-
461 rl_add_defun ("complete-command", bash_complete_command, -1);-
462 rl_add_defun ("possible-command-completions", bash_possible_command_completions, -1);-
463 rl_add_defun ("glob-complete-word", bash_glob_complete_word, -1);-
464 rl_add_defun ("glob-expand-word", bash_glob_expand_word, -1);-
465 rl_add_defun ("glob-list-expansions", bash_glob_list_expansions, -1);-
466#endif-
467-
468 rl_add_defun ("dynamic-complete-history", dynamic_complete_history, -1);-
469 rl_add_defun ("dabbrev-expand", bash_dabbrev_expand, -1);-
470-
471 /* Bind defaults before binding our custom shell keybindings. */-
472 if (RL_ISSTATE(RL_STATE_INITIALIZED) == 0)
(rl_readline_s...0000002)) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
473 rl_initialize ();
never executed: rl_initialize ();
0
474-
475 /* Bind up our special shell functions. */-
476 rl_bind_key_if_unbound_in_map (CTRL('E'), shell_expand_line, emacs_meta_keymap);-
477-
478#ifdef BANG_HISTORY-
479 rl_bind_key_if_unbound_in_map ('^', history_expand_line, emacs_meta_keymap);-
480#endif-
481-
482 rl_bind_key_if_unbound_in_map (CTRL ('O'), operate_and_get_next, emacs_standard_keymap);-
483 rl_bind_key_if_unbound_in_map (CTRL ('V'), display_shell_version, emacs_ctlx_keymap);-
484-
485 /* In Bash, the user can switch editing modes with "set -o [vi emacs]",-
486 so it is not necessary to allow C-M-j for context switching. Turn-
487 off this occasionally confusing behaviour. */-
488 kseq[0] = CTRL('J');-
489 kseq[1] = '\0';-
490 func = rl_function_of_keyseq (kseq, emacs_meta_keymap, (int *)NULL);-
491 if (func == rl_vi_editing_mode)
func == rl_vi_editing_modeDescription
TRUEnever evaluated
FALSEnever evaluated
0
492 rl_unbind_key_in_map (CTRL('J'), emacs_meta_keymap);
never executed: rl_unbind_key_in_map ((('J') & 0x1f), emacs_meta_keymap);
0
493 kseq[0] = CTRL('M');-
494 func = rl_function_of_keyseq (kseq, emacs_meta_keymap, (int *)NULL);-
495 if (func == rl_vi_editing_mode)
func == rl_vi_editing_modeDescription
TRUEnever evaluated
FALSEnever evaluated
0
496 rl_unbind_key_in_map (CTRL('M'), emacs_meta_keymap);
never executed: rl_unbind_key_in_map ((('M') & 0x1f), emacs_meta_keymap);
0
497#if defined (VI_MODE)-
498 rl_unbind_key_in_map (CTRL('E'), vi_movement_keymap);-
499#endif-
500-
501#if defined (BRACE_COMPLETION)-
502 rl_bind_key_if_unbound_in_map ('{', bash_brace_completion, emacs_meta_keymap); /*}*/-
503#endif /* BRACE_COMPLETION */-
504-
505#if defined (SPECIFIC_COMPLETION_FUNCTIONS)-
506 rl_bind_key_if_unbound_in_map ('/', bash_complete_filename, emacs_meta_keymap);-
507 rl_bind_key_if_unbound_in_map ('/', bash_possible_filename_completions, emacs_ctlx_keymap);-
508-
509 /* Have to jump through hoops here because there is a default binding for-
510 M-~ (rl_tilde_expand) */-
511 kseq[0] = '~';-
512 kseq[1] = '\0';-
513 func = rl_function_of_keyseq (kseq, emacs_meta_keymap, (int *)NULL);-
514 if (func == 0 || func == rl_tilde_expand)
func == 0Description
TRUEnever evaluated
FALSEnever evaluated
func == rl_tilde_expandDescription
TRUEnever evaluated
FALSEnever evaluated
0
515 rl_bind_keyseq_in_map (kseq, bash_complete_username, emacs_meta_keymap);
never executed: rl_bind_keyseq_in_map (kseq, bash_complete_username, emacs_meta_keymap);
0
516-
517 rl_bind_key_if_unbound_in_map ('~', bash_possible_username_completions, emacs_ctlx_keymap);-
518-
519 rl_bind_key_if_unbound_in_map ('@', bash_complete_hostname, emacs_meta_keymap);-
520 rl_bind_key_if_unbound_in_map ('@', bash_possible_hostname_completions, emacs_ctlx_keymap);-
521-
522 rl_bind_key_if_unbound_in_map ('$', bash_complete_variable, emacs_meta_keymap);-
523 rl_bind_key_if_unbound_in_map ('$', bash_possible_variable_completions, emacs_ctlx_keymap);-
524-
525 rl_bind_key_if_unbound_in_map ('!', bash_complete_command, emacs_meta_keymap);-
526 rl_bind_key_if_unbound_in_map ('!', bash_possible_command_completions, emacs_ctlx_keymap);-
527-
528 rl_bind_key_if_unbound_in_map ('g', bash_glob_complete_word, emacs_meta_keymap);-
529 rl_bind_key_if_unbound_in_map ('*', bash_glob_expand_word, emacs_ctlx_keymap);-
530 rl_bind_key_if_unbound_in_map ('g', bash_glob_list_expansions, emacs_ctlx_keymap);-
531-
532#endif /* SPECIFIC_COMPLETION_FUNCTIONS */-
533-
534 kseq[0] = TAB;-
535 kseq[1] = '\0';-
536 func = rl_function_of_keyseq (kseq, emacs_meta_keymap, (int *)NULL);-
537 if (func == 0 || func == rl_tab_insert)
func == 0Description
TRUEnever evaluated
FALSEnever evaluated
func == rl_tab_insertDescription
TRUEnever evaluated
FALSEnever evaluated
0
538 rl_bind_key_in_map (TAB, dynamic_complete_history, emacs_meta_keymap);
never executed: rl_bind_key_in_map ('\t', dynamic_complete_history, emacs_meta_keymap);
0
539-
540 /* Tell the completer that we want a crack first. */-
541 rl_attempted_completion_function = attempt_shell_completion;-
542-
543 /* Tell the completer that we might want to follow symbolic links or-
544 do other expansion on directory names. */-
545 set_directory_hook ();-
546-
547 rl_filename_rewrite_hook = bash_filename_rewrite_hook;-
548-
549 rl_filename_stat_hook = bash_filename_stat_hook;-
550-
551 /* Tell the filename completer we want a chance to ignore some names. */-
552 rl_ignore_some_completions_function = filename_completion_ignore;-
553-
554 /* Bind C-xC-e to invoke emacs and run result as commands. */-
555 rl_bind_key_if_unbound_in_map (CTRL ('E'), emacs_edit_and_execute_command, emacs_ctlx_keymap);-
556#if defined (VI_MODE)-
557 rl_bind_key_if_unbound_in_map ('v', vi_edit_and_execute_command, vi_movement_keymap);-
558# if defined (ALIAS)-
559 rl_bind_key_if_unbound_in_map ('@', posix_edit_macros, vi_movement_keymap);-
560# endif-
561-
562 rl_bind_key_in_map ('\\', bash_vi_complete, vi_movement_keymap);-
563 rl_bind_key_in_map ('*', bash_vi_complete, vi_movement_keymap);-
564 rl_bind_key_in_map ('=', bash_vi_complete, vi_movement_keymap);-
565#endif-
566-
567 rl_completer_quote_characters = "'\"";-
568-
569 /* This sets rl_completer_word_break_characters and rl_special_prefixes-
570 to the appropriate values, depending on whether or not hostname-
571 completion is enabled. */-
572 enable_hostname_completion (perform_hostname_completion);-
573-
574 /* characters that need to be quoted when appearing in filenames. */-
575 rl_filename_quote_characters = default_filename_quote_characters;-
576 set_filename_bstab (rl_filename_quote_characters);-
577-
578 rl_filename_quoting_function = bash_quote_filename;-
579 rl_filename_dequoting_function = bash_dequote_filename;-
580 rl_char_is_quoted_p = char_is_quoted;-
581-
582#if 0-
583 /* This is superfluous and makes it impossible to use tab completion in-
584 vi mode even when explicitly binding it in ~/.inputrc. sv_strict_posix()-
585 should already have called posix_readline_initialize() when-
586 posixly_correct was set. */-
587 if (posixly_correct)-
588 posix_readline_initialize (1);-
589#endif-
590-
591 bash_readline_initialized = 1;-
592}
never executed: end of block
0
593-
594void-
595bashline_reinitialize ()-
596{-
597 bash_readline_initialized = 0;-
598}
executed 15 times by 1 test: end of block
Executed by:
  • Self test
15
599-
600void-
601bashline_set_event_hook ()-
602{-
603 rl_signal_event_hook = bash_event_hook;-
604}
never executed: end of block
0
605-
606void-
607bashline_reset_event_hook ()-
608{-
609 rl_signal_event_hook = 0;-
610}
never executed: end of block
0
611-
612/* On Sun systems at least, rl_attempted_completion_function can end up-
613 getting set to NULL, and rl_completion_entry_function set to do command-
614 word completion if Bash is interrupted while trying to complete a command-
615 word. This just resets all the completion functions to the right thing.-
616 It's called from throw_to_top_level(). */-
617void-
618bashline_reset ()-
619{-
620 tilde_initialize ();-
621 rl_attempted_completion_function = attempt_shell_completion;-
622 rl_completion_entry_function = NULL;-
623 rl_ignore_some_completions_function = filename_completion_ignore;-
624 rl_filename_quote_characters = default_filename_quote_characters;-
625 set_filename_bstab (rl_filename_quote_characters);-
626-
627 set_directory_hook ();-
628 rl_filename_stat_hook = bash_filename_stat_hook;-
629-
630 bashline_reset_event_hook ();-
631-
632 rl_sort_completion_matches = 1;-
633}
never executed: end of block
0
634-
635/* Contains the line to push into readline. */-
636static char *push_to_readline = (char *)NULL;-
637-
638/* Push the contents of push_to_readline into the-
639 readline buffer. */-
640static int-
641bash_push_line ()-
642{-
643 if (push_to_readline)
push_to_readlineDescription
TRUEnever evaluated
FALSEnever evaluated
0
644 {-
645 rl_insert_text (push_to_readline);-
646 free (push_to_readline);-
647 push_to_readline = (char *)NULL;-
648 rl_startup_hook = old_rl_startup_hook;-
649 }
never executed: end of block
0
650 return 0;
never executed: return 0;
0
651}-
652-
653/* Call this to set the initial text for the next line to read-
654 from readline. */-
655int-
656bash_re_edit (line)-
657 char *line;-
658{-
659 FREE (push_to_readline);
never executed: sh_xfree((push_to_readline), "bashline.c", 659);
push_to_readlineDescription
TRUEnever evaluated
FALSEnever evaluated
0
660-
661 push_to_readline = savestring (line);-
662 old_rl_startup_hook = rl_startup_hook;-
663 rl_startup_hook = bash_push_line;-
664-
665 return (0);
never executed: return (0);
0
666}-
667-
668static int-
669display_shell_version (count, c)-
670 int count, c;-
671{-
672 rl_crlf ();-
673 show_shell_version (0);-
674 putc ('\r', rl_outstream);-
675 fflush (rl_outstream);-
676 rl_on_new_line ();-
677 rl_redisplay ();-
678 return 0;
never executed: return 0;
0
679}-
680-
681/* **************************************************************** */-
682/* */-
683/* Readline Stuff */-
684/* */-
685/* **************************************************************** */-
686-
687/* If the user requests hostname completion, then simply build a list-
688 of hosts, and complete from that forever more, or at least until-
689 HOSTFILE is unset. */-
690-
691/* THIS SHOULD BE A STRINGLIST. */-
692/* The kept list of hostnames. */-
693static char **hostname_list = (char **)NULL;-
694-
695/* The physical size of the above list. */-
696static int hostname_list_size;-
697-
698/* The number of hostnames in the above list. */-
699static int hostname_list_length;-
700-
701/* Whether or not HOSTNAME_LIST has been initialized. */-
702int hostname_list_initialized = 0;-
703-
704/* Initialize the hostname completion table. */-
705static void-
706initialize_hostname_list ()-
707{-
708 char *temp;-
709-
710 temp = get_string_value ("HOSTFILE");-
711 if (temp == 0)
temp == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
712 temp = get_string_value ("hostname_completion_file");
never executed: temp = get_string_value ("hostname_completion_file");
0
713 if (temp == 0)
temp == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
714 temp = DEFAULT_HOSTS_FILE;
never executed: temp = "/etc/hosts";
0
715-
716 snarf_hosts_from_file (temp);-
717-
718 if (hostname_list)
hostname_listDescription
TRUEnever evaluated
FALSEnever evaluated
0
719 hostname_list_initialized++;
never executed: hostname_list_initialized++;
0
720}
never executed: end of block
0
721-
722/* Add NAME to the list of hosts. */-
723static void-
724add_host_name (name)-
725 char *name;-
726{-
727 if (hostname_list_length + 2 > hostname_list_size)
hostname_list_...name_list_sizeDescription
TRUEnever evaluated
FALSEnever evaluated
0
728 {-
729 hostname_list_size = (hostname_list_size + 32) - (hostname_list_size % 32);-
730 hostname_list = strvec_resize (hostname_list, hostname_list_size);-
731 }
never executed: end of block
0
732-
733 hostname_list[hostname_list_length++] = savestring (name);-
734 hostname_list[hostname_list_length] = (char *)NULL;-
735}
never executed: end of block
0
736-
737#define cr_whitespace(c) ((c) == '\r' || (c) == '\n' || whitespace(c))-
738-
739static void-
740snarf_hosts_from_file (filename)-
741 char *filename;-
742{-
743 FILE *file;-
744 char *temp, buffer[256], name[256];-
745 register int i, start;-
746-
747 file = fopen (filename, "r");-
748 if (file == 0)
file == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
749 return;
never executed: return;
0
750-
751 while (temp = fgets (buffer, 255, file))
temp = fgets (...er, 255, file)Description
TRUEnever evaluated
FALSEnever evaluated
0
752 {-
753 /* Skip to first character. */-
754 for (i = 0; buffer[i] && cr_whitespace (buffer[i]); i++)
buffer[i]Description
TRUEnever evaluated
FALSEnever evaluated
(buffer[i]) == '\r'Description
TRUEnever evaluated
FALSEnever evaluated
(buffer[i]) == '\n'Description
TRUEnever evaluated
FALSEnever evaluated
((buffer[i]) == ' ')Description
TRUEnever evaluated
FALSEnever evaluated
((buffer[i]) == '\t')Description
TRUEnever evaluated
FALSEnever evaluated
0
755 ;
never executed: ;
0
756-
757 /* If comment or blank line, ignore. */-
758 if (buffer[i] == '\0' || buffer[i] == '#')
buffer[i] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
buffer[i] == '#'Description
TRUEnever evaluated
FALSEnever evaluated
0
759 continue;
never executed: continue;
0
760-
761 /* If `preprocessor' directive, do the include. */-
762 if (strncmp (buffer + i, "$include ", 9) == 0)
never executed: __result = (((const unsigned char *) (const char *) ( buffer + i ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "$include " ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(__extension__..." , 9 ))) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( 9 )Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...( buffer + i )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( buffe...size_t) ( 9 ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons... "$include " )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( "$inc...size_t) ( 9 ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
763 {-
764 char *incfile, *t;-
765-
766 /* Find start of filename. */-
767 for (incfile = buffer + i + 9; *incfile && whitespace (*incfile); incfile++)
*incfileDescription
TRUEnever evaluated
FALSEnever evaluated
((*incfile) == ' ')Description
TRUEnever evaluated
FALSEnever evaluated
((*incfile) == '\t')Description
TRUEnever evaluated
FALSEnever evaluated
0
768 ;
never executed: ;
0
769-
770 /* Find end of filename. */-
771 for (t = incfile; *t && cr_whitespace (*t) == 0; t++)
*tDescription
TRUEnever evaluated
FALSEnever evaluated
((*t) == '\r' ...= '\t'))) == 0Description
TRUEnever evaluated
FALSEnever evaluated
(*t) == '\r'Description
TRUEnever evaluated
FALSEnever evaluated
(*t) == '\n'Description
TRUEnever evaluated
FALSEnever evaluated
((*t) == ' ')Description
TRUEnever evaluated
FALSEnever evaluated
((*t) == '\t')Description
TRUEnever evaluated
FALSEnever evaluated
0
772 ;
never executed: ;
0
773-
774 *t = '\0';-
775-
776 snarf_hosts_from_file (incfile);-
777 continue;
never executed: continue;
0
778 }-
779-
780 /* Skip internet address if present. */-
781 if (DIGIT (buffer[i]))
(buffer[i]) >= '0'Description
TRUEnever evaluated
FALSEnever evaluated
(buffer[i]) <= '9'Description
TRUEnever evaluated
FALSEnever evaluated
0
782 for (; buffer[i] && cr_whitespace (buffer[i]) == 0; i++);
never executed: ;
buffer[i]Description
TRUEnever evaluated
FALSEnever evaluated
((buffer[i]) =...= '\t'))) == 0Description
TRUEnever evaluated
FALSEnever evaluated
(buffer[i]) == '\r'Description
TRUEnever evaluated
FALSEnever evaluated
(buffer[i]) == '\n'Description
TRUEnever evaluated
FALSEnever evaluated
((buffer[i]) == ' ')Description
TRUEnever evaluated
FALSEnever evaluated
((buffer[i]) == '\t')Description
TRUEnever evaluated
FALSEnever evaluated
0
783-
784 /* Gobble up names. Each name is separated with whitespace. */-
785 while (buffer[i])
buffer[i]Description
TRUEnever evaluated
FALSEnever evaluated
0
786 {-
787 for (; cr_whitespace (buffer[i]); i++)
(buffer[i]) == '\r'Description
TRUEnever evaluated
FALSEnever evaluated
(buffer[i]) == '\n'Description
TRUEnever evaluated
FALSEnever evaluated
((buffer[i]) == ' ')Description
TRUEnever evaluated
FALSEnever evaluated
((buffer[i]) == '\t')Description
TRUEnever evaluated
FALSEnever evaluated
0
788 ;
never executed: ;
0
789 if (buffer[i] == '\0' || buffer[i] == '#')
buffer[i] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
buffer[i] == '#'Description
TRUEnever evaluated
FALSEnever evaluated
0
790 break;
never executed: break;
0
791-
792 /* Isolate the current word. */-
793 for (start = i; buffer[i] && cr_whitespace (buffer[i]) == 0; i++)
buffer[i]Description
TRUEnever evaluated
FALSEnever evaluated
((buffer[i]) =...= '\t'))) == 0Description
TRUEnever evaluated
FALSEnever evaluated
(buffer[i]) == '\r'Description
TRUEnever evaluated
FALSEnever evaluated
(buffer[i]) == '\n'Description
TRUEnever evaluated
FALSEnever evaluated
((buffer[i]) == ' ')Description
TRUEnever evaluated
FALSEnever evaluated
((buffer[i]) == '\t')Description
TRUEnever evaluated
FALSEnever evaluated
0
794 ;
never executed: ;
0
795 if (i == start)
i == startDescription
TRUEnever evaluated
FALSEnever evaluated
0
796 continue;
never executed: continue;
0
797 strncpy (name, buffer + start, i - start);-
798 name[i - start] = '\0';-
799 add_host_name (name);-
800 }
never executed: end of block
0
801 }
never executed: end of block
0
802 fclose (file);-
803}
never executed: end of block
0
804-
805/* Return the hostname list. */-
806char **-
807get_hostname_list ()-
808{-
809 if (hostname_list_initialized == 0)
hostname_list_initialized == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
810 initialize_hostname_list ();
never executed: initialize_hostname_list ();
0
811 return (hostname_list);
never executed: return (hostname_list);
0
812}-
813-
814void-
815clear_hostname_list ()-
816{-
817 register int i;-
818-
819 if (hostname_list_initialized == 0)
hostname_list_initialized == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
820 return;
never executed: return;
0
821 for (i = 0; i < hostname_list_length; i++)
i < hostname_list_lengthDescription
TRUEnever evaluated
FALSEnever evaluated
0
822 free (hostname_list[i]);
never executed: sh_xfree((hostname_list[i]), "bashline.c", 822);
0
823 hostname_list_length = hostname_list_initialized = 0;-
824}
never executed: end of block
0
825-
826/* Return a NULL terminated list of hostnames which begin with TEXT.-
827 Initialize the hostname list the first time if necessary.-
828 The array is malloc ()'ed, but not the individual strings. */-
829static char **-
830hostnames_matching (text)-
831 char *text;-
832{-
833 register int i, len, nmatch, rsize;-
834 char **result;-
835-
836 if (hostname_list_initialized == 0)
hostname_list_initialized == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
837 initialize_hostname_list ();
never executed: initialize_hostname_list ();
0
838-
839 if (hostname_list_initialized == 0)
hostname_list_initialized == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
840 return ((char **)NULL);
never executed: return ((char **) ((void *)0) );
0
841-
842 /* Special case. If TEXT consists of nothing, then the whole list is-
843 what is desired. */-
844 if (*text == '\0')
*text == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
845 {-
846 result = strvec_create (1 + hostname_list_length);-
847 for (i = 0; i < hostname_list_length; i++)
i < hostname_list_lengthDescription
TRUEnever evaluated
FALSEnever evaluated
0
848 result[i] = hostname_list[i];
never executed: result[i] = hostname_list[i];
0
849 result[i] = (char *)NULL;-
850 return (result);
never executed: return (result);
0
851 }-
852-
853 /* Scan until found, or failure. */-
854 len = strlen (text);-
855 result = (char **)NULL;-
856 for (i = nmatch = rsize = 0; i < hostname_list_length; i++)
i < hostname_list_lengthDescription
TRUEnever evaluated
FALSEnever evaluated
0
857 {-
858 if (STREQN (text, hostname_list[i], len) == 0)
never executed: __result = (((const unsigned char *) (const char *) ( text ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( hostname_list[i] ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
((len == 0) ? ...)) == 0)) == 0Description
TRUEnever evaluated
FALSEnever evaluated
(len == 0)Description
TRUEnever evaluated
FALSEnever evaluated
(text)[0] == (...me_list[i])[0]Description
TRUEnever evaluated
FALSEnever evaluated
(__extension__..., len ))) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( len )Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( text )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( text ...ze_t) ( len ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...name_list[i] )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( hostn...ze_t) ( len ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
859 continue;
never executed: continue;
0
860-
861 /* OK, it matches. Add it to the list. */-
862 if (nmatch >= (rsize - 1))
nmatch >= (rsize - 1)Description
TRUEnever evaluated
FALSEnever evaluated
0
863 {-
864 rsize = (rsize + 16) - (rsize % 16);-
865 result = strvec_resize (result, rsize);-
866 }
never executed: end of block
0
867-
868 result[nmatch++] = hostname_list[i];-
869 }
never executed: end of block
0
870 if (nmatch)
nmatchDescription
TRUEnever evaluated
FALSEnever evaluated
0
871 result[nmatch] = (char *)NULL;
never executed: result[nmatch] = (char *) ((void *)0) ;
0
872 return (result);
never executed: return (result);
0
873}-
874-
875/* The equivalent of the Korn shell C-o operate-and-get-next-history-line-
876 editing command. */-
877static int saved_history_line_to_use = -1;-
878static int last_saved_history_line = -1;-
879-
880#define HISTORY_FULL() (history_is_stifled () && history_length >= history_max_entries)-
881-
882static int-
883set_saved_history ()-
884{-
885 /* XXX - compensate for assumption that history was `shuffled' if it was-
886 actually not. */-
887 if (HISTORY_FULL () &&
history_is_stifled ()Description
TRUEnever evaluated
FALSEnever evaluated
history_length...ry_max_entriesDescription
TRUEnever evaluated
FALSEnever evaluated
0
888 hist_last_line_added == 0 &&
hist_last_line_added == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
889 saved_history_line_to_use < history_length - 1)
saved_history_...ory_length - 1Description
TRUEnever evaluated
FALSEnever evaluated
0
890 saved_history_line_to_use++;
never executed: saved_history_line_to_use++;
0
891-
892 if (saved_history_line_to_use >= 0)
saved_history_line_to_use >= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
893 {-
894 rl_get_previous_history (history_length - saved_history_line_to_use, 0);-
895 last_saved_history_line = saved_history_line_to_use;-
896 }
never executed: end of block
0
897 saved_history_line_to_use = -1;-
898 rl_startup_hook = old_rl_startup_hook;-
899 return (0);
never executed: return (0);
0
900}-
901-
902static int-
903operate_and_get_next (count, c)-
904 int count, c;-
905{-
906 int where;-
907-
908 /* Accept the current line. */-
909 rl_newline (1, c);-
910-
911 /* Find the current line, and find the next line to use. */-
912 where = rl_explicit_arg ? count : where_history ();
rl_explicit_argDescription
TRUEnever evaluated
FALSEnever evaluated
0
913-
914 if (HISTORY_FULL () || (where >= history_length - 1) || rl_explicit_arg)
history_is_stifled ()Description
TRUEnever evaluated
FALSEnever evaluated
history_length...ry_max_entriesDescription
TRUEnever evaluated
FALSEnever evaluated
(where >= history_length - 1)Description
TRUEnever evaluated
FALSEnever evaluated
rl_explicit_argDescription
TRUEnever evaluated
FALSEnever evaluated
0
915 saved_history_line_to_use = where;
never executed: saved_history_line_to_use = where;
0
916 else-
917 saved_history_line_to_use = where + 1;
never executed: saved_history_line_to_use = where + 1;
0
918-
919 old_rl_startup_hook = rl_startup_hook;-
920 rl_startup_hook = set_saved_history;-
921-
922 return 0;
never executed: return 0;
0
923}-
924-
925/* This vi mode command causes VI_EDIT_COMMAND to be run on the current-
926 command being entered (if no explicit argument is given), otherwise on-
927 a command from the history file. */-
928-
929#define VI_EDIT_COMMAND "fc -e \"${VISUAL:-${EDITOR:-vi}}\""-
930#define EMACS_EDIT_COMMAND "fc -e \"${VISUAL:-${EDITOR:-emacs}}\""-
931#define POSIX_VI_EDIT_COMMAND "fc -e vi"-
932-
933static int-
934edit_and_execute_command (count, c, editing_mode, edit_command)-
935 int count, c, editing_mode;-
936 char *edit_command;-
937{-
938 char *command, *metaval;-
939 int r, rrs, metaflag;-
940 sh_parser_state_t ps;-
941-
942 rrs = rl_readline_state;-
943 saved_command_line_count = current_command_line_count;-
944-
945 /* Accept the current line. */-
946 rl_newline (1, c);-
947-
948 if (rl_explicit_arg)
rl_explicit_argDescription
TRUEnever evaluated
FALSEnever evaluated
0
949 {-
950 command = (char *)xmalloc (strlen (edit_command) + 8);-
951 sprintf (command, "%s %d", edit_command, count);-
952 }
never executed: end of block
0
953 else-
954 {-
955 /* Take the command we were just editing, add it to the history file,-
956 then call fc to operate on it. We have to add a dummy command to-
957 the end of the history because fc ignores the last command (assumes-
958 it's supposed to deal with the command before the `fc'). */-
959 /* This breaks down when using command-oriented history and are not-
960 finished with the command, so we should not ignore the last command */-
961 using_history ();-
962 if (rl_line_buffer[0])
rl_line_buffer[0]Description
TRUEnever evaluated
FALSEnever evaluated
0
963 {-
964 current_command_line_count++; /* for rl_newline above */-
965 bash_add_history (rl_line_buffer);-
966 }
never executed: end of block
0
967 current_command_line_count = 0; /* for dummy history entry */-
968 bash_add_history ("");-
969 history_lines_this_session++;-
970 using_history ();-
971 command = savestring (edit_command);-
972 }
never executed: end of block
0
973-
974 metaval = rl_variable_value ("input-meta");-
975 metaflag = RL_BOOLEAN_VARIABLE_VALUE (metaval);
(metaval)[0] == 'o'Description
TRUEnever evaluated
FALSEnever evaluated
(metaval)[1] == 'n'Description
TRUEnever evaluated
FALSEnever evaluated
(metaval)[2] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
976 -
977 if (rl_deprep_term_function)
rl_deprep_term_functionDescription
TRUEnever evaluated
FALSEnever evaluated
0
978 (*rl_deprep_term_function) ();
never executed: (*rl_deprep_term_function) ();
0
979 save_parser_state (&ps);-
980 r = parse_and_execute (command, (editing_mode == VI_EDITING_MODE) ? "v" : "C-xC-e", SEVAL_NOHIST);-
981 restore_parser_state (&ps);-
982 if (rl_prep_term_function)
rl_prep_term_functionDescription
TRUEnever evaluated
FALSEnever evaluated
0
983 (*rl_prep_term_function) (metaflag);
never executed: (*rl_prep_term_function) (metaflag);
0
984-
985 current_command_line_count = saved_command_line_count;-
986-
987 /* Now erase the contents of the current line and undo the effects of the-
988 rl_accept_line() above. We don't even want to make the text we just-
989 executed available for undoing. */-
990 rl_line_buffer[0] = '\0'; /* XXX */-
991 rl_point = rl_end = 0;-
992 rl_done = 0;-
993 rl_readline_state = rrs;-
994-
995#if defined (VI_MODE)-
996 if (editing_mode == VI_EDITING_MODE)
editing_mode == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
997 rl_vi_insertion_mode (1, c);
never executed: rl_vi_insertion_mode (1, c);
0
998#endif-
999-
1000 rl_forced_update_display ();-
1001-
1002 return r;
never executed: return r;
0
1003}-
1004-
1005#if defined (VI_MODE)-
1006static int-
1007vi_edit_and_execute_command (count, c)-
1008 int count, c;-
1009{-
1010 if (posixly_correct)
posixly_correctDescription
TRUEnever evaluated
FALSEnever evaluated
0
1011 return (edit_and_execute_command (count, c, VI_EDITING_MODE, POSIX_VI_EDIT_COMMAND));
never executed: return (edit_and_execute_command (count, c, 0, "fc -e vi"));
0
1012 else-
1013 return (edit_and_execute_command (count, c, VI_EDITING_MODE, VI_EDIT_COMMAND));
never executed: return (edit_and_execute_command (count, c, 0, "fc -e \"${VISUAL:-${EDITOR:-vi}}\""));
0
1014}-
1015#endif /* VI_MODE */-
1016-
1017static int-
1018emacs_edit_and_execute_command (count, c)-
1019 int count, c;-
1020{-
1021 return (edit_and_execute_command (count, c, EMACS_EDITING_MODE, EMACS_EDIT_COMMAND));
never executed: return (edit_and_execute_command (count, c, 1, "fc -e \"${VISUAL:-${EDITOR:-emacs}}\""));
0
1022}-
1023-
1024#if defined (ALIAS)-
1025static int-
1026posix_edit_macros (count, key)-
1027 int count, key;-
1028{-
1029 int c;-
1030 char alias_name[3], *alias_value, *macro;-
1031-
1032 c = rl_read_key ();-
1033 alias_name[0] = '_';-
1034 alias_name[1] = c;-
1035 alias_name[2] = '\0';-
1036-
1037 alias_value = get_alias_value (alias_name);-
1038 if (alias_value && *alias_value)
alias_valueDescription
TRUEnever evaluated
FALSEnever evaluated
*alias_valueDescription
TRUEnever evaluated
FALSEnever evaluated
0
1039 {-
1040 macro = savestring (alias_value);-
1041 rl_push_macro_input (macro);-
1042 }
never executed: end of block
0
1043 return 0;
never executed: return 0;
0
1044}-
1045#endif-
1046-
1047/* Bindable commands that move `shell-words': that is, sequences of-
1048 non-unquoted-metacharacters. */-
1049-
1050#define WORDDELIM(c) (shellmeta(c) || shellblank(c))-
1051-
1052static int-
1053bash_forward_shellword (count, key)-
1054 int count, key;-
1055{-
1056 size_t slen;-
1057 int c, p;-
1058 DECLARE_MBSTATE;-
1059-
1060 if (count < 0)
count < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1061 return (bash_backward_shellword (-count, key));
never executed: return (bash_backward_shellword (-count, key));
0
1062-
1063 /* The tricky part of this is deciding whether or not the first character-
1064 we're on is an unquoted metacharacter. Not completely handled yet. */-
1065 /* XXX - need to test this stuff with backslash-escaped shell-
1066 metacharacters and unclosed single- and double-quoted strings. */-
1067-
1068 p = rl_point;-
1069 slen = rl_end;-
1070-
1071 while (count)
countDescription
TRUEnever evaluated
FALSEnever evaluated
0
1072 {-
1073 if (p == rl_end)
p == rl_endDescription
TRUEnever evaluated
FALSEnever evaluated
0
1074 {-
1075 rl_point = rl_end;-
1076 return 0;
never executed: return 0;
0
1077 }-
1078-
1079 /* Are we in a quoted string? If we are, move to the end of the quoted-
1080 string and continue the outer loop. We only want quoted strings, not-
1081 backslash-escaped characters, but char_is_quoted doesn't-
1082 differentiate. */-
1083 if (char_is_quoted (rl_line_buffer, p) && p > 0 && rl_line_buffer[p-1] != '\\')
char_is_quoted...ine_buffer, p)Description
TRUEnever evaluated
FALSEnever evaluated
p > 0Description
TRUEnever evaluated
FALSEnever evaluated
rl_line_buffer[p-1] != '\\'Description
TRUEnever evaluated
FALSEnever evaluated
0
1084 {-
1085 do-
1086 ADVANCE_CHAR (rl_line_buffer, slen, p);
never executed: mblength = 1;
never executed: mblength = 1;
never executed: end of block
never executed: end of block
never executed: (p)++;
never executed: (p) += mblength;
never executed: (p)++;
never executed: end of block
locale_mb_cur_max > 1Description
TRUEnever evaluated
FALSEnever evaluated
_fDescription
TRUEnever evaluated
FALSEnever evaluated
mblength == 0Description
TRUEnever evaluated
FALSEnever evaluated
locale_utf8localeDescription
TRUEnever evaluated
FALSEnever evaluated
(((rl_line_buf... & 0x80) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
mblength == (size_t)-2Description
TRUEnever evaluated
FALSEnever evaluated
mblength == (size_t)-1Description
TRUEnever evaluated
FALSEnever evaluated
0
1087 while (p < rl_end && char_is_quoted (rl_line_buffer, p));
p < rl_endDescription
TRUEnever evaluated
FALSEnever evaluated
char_is_quoted...ine_buffer, p)Description
TRUEnever evaluated
FALSEnever evaluated
0
1088 count--;-
1089 continue;
never executed: continue;
0
1090 }-
1091-
1092 /* Rest of code assumes we are not in a quoted string. */-
1093 /* Move forward until we hit a non-metacharacter. */-
1094 while (p < rl_end && (c = rl_line_buffer[p]) && WORDDELIM (c))
p < rl_endDescription
TRUEnever evaluated
FALSEnever evaluated
(c = rl_line_buffer[p])Description
TRUEnever evaluated
FALSEnever evaluated
(sh_syntaxtab[...(c)] & 0x0001)Description
TRUEnever evaluated
FALSEnever evaluated
(sh_syntaxtab[...(c)] & 0x2000)Description
TRUEnever evaluated
FALSEnever evaluated
0
1095 {-
1096 switch (c)-
1097 {-
1098 default:
never executed: default:
0
1099 ADVANCE_CHAR (rl_line_buffer, slen, p);
never executed: mblength = 1;
never executed: mblength = 1;
never executed: end of block
never executed: end of block
never executed: (p)++;
never executed: (p) += mblength;
never executed: (p)++;
locale_mb_cur_max > 1Description
TRUEnever evaluated
FALSEnever evaluated
_fDescription
TRUEnever evaluated
FALSEnever evaluated
mblength == 0Description
TRUEnever evaluated
FALSEnever evaluated
locale_utf8localeDescription
TRUEnever evaluated
FALSEnever evaluated
(((rl_line_buf... & 0x80) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
mblength == (size_t)-2Description
TRUEnever evaluated
FALSEnever evaluated
mblength == (size_t)-1Description
TRUEnever evaluated
FALSEnever evaluated
0
1100 continue; /* straight back to loop, don't increment p */
never executed: continue;
0
1101 case '\\':
never executed: case '\\':
0
1102 if (p < rl_end && rl_line_buffer[p])
p < rl_endDescription
TRUEnever evaluated
FALSEnever evaluated
rl_line_buffer[p]Description
TRUEnever evaluated
FALSEnever evaluated
0
1103 ADVANCE_CHAR (rl_line_buffer, slen, p);
never executed: mblength = 1;
never executed: mblength = 1;
never executed: end of block
never executed: end of block
never executed: (p)++;
never executed: (p) += mblength;
never executed: (p)++;
never executed: end of block
locale_mb_cur_max > 1Description
TRUEnever evaluated
FALSEnever evaluated
_fDescription
TRUEnever evaluated
FALSEnever evaluated
mblength == 0Description
TRUEnever evaluated
FALSEnever evaluated
locale_utf8localeDescription
TRUEnever evaluated
FALSEnever evaluated
(((rl_line_buf... & 0x80) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
mblength == (size_t)-2Description
TRUEnever evaluated
FALSEnever evaluated
mblength == (size_t)-1Description
TRUEnever evaluated
FALSEnever evaluated
0
1104 break;
never executed: break;
0
1105 case '\'':
never executed: case '\'':
0
1106 p = skip_to_delim (rl_line_buffer, ++p, "'", SD_NOJMP);-
1107 break;
never executed: break;
0
1108 case '"':
never executed: case '"':
0
1109 p = skip_to_delim (rl_line_buffer, ++p, "\"", SD_NOJMP);-
1110 break;
never executed: break;
0
1111 }-
1112-
1113 if (p < rl_end)
p < rl_endDescription
TRUEnever evaluated
FALSEnever evaluated
0
1114 p++;
never executed: p++;
0
1115 }
never executed: end of block
0
1116-
1117 if (rl_line_buffer[p] == 0 || p == rl_end)
rl_line_buffer[p] == 0Description
TRUEnever evaluated
FALSEnever evaluated
p == rl_endDescription
TRUEnever evaluated
FALSEnever evaluated
0
1118 {-
1119 rl_point = rl_end;-
1120 rl_ding ();-
1121 return 0;
never executed: return 0;
0
1122 }-
1123 -
1124 /* Now move forward until we hit a non-quoted metacharacter or EOL */-
1125 while (p < rl_end && (c = rl_line_buffer[p]) && WORDDELIM (c) == 0)
p < rl_endDescription
TRUEnever evaluated
FALSEnever evaluated
(c = rl_line_buffer[p])Description
TRUEnever evaluated
FALSEnever evaluated
((sh_syntaxtab... 0x2000)) == 0Description
TRUEnever evaluated
FALSEnever evaluated
(sh_syntaxtab[...(c)] & 0x0001)Description
TRUEnever evaluated
FALSEnever evaluated
(sh_syntaxtab[...(c)] & 0x2000)Description
TRUEnever evaluated
FALSEnever evaluated
0
1126 {-
1127 switch (c)-
1128 {-
1129 default:
never executed: default:
0
1130 ADVANCE_CHAR (rl_line_buffer, slen, p);
never executed: mblength = 1;
never executed: mblength = 1;
never executed: end of block
never executed: end of block
never executed: (p)++;
never executed: (p) += mblength;
never executed: (p)++;
locale_mb_cur_max > 1Description
TRUEnever evaluated
FALSEnever evaluated
_fDescription
TRUEnever evaluated
FALSEnever evaluated
mblength == 0Description
TRUEnever evaluated
FALSEnever evaluated
locale_utf8localeDescription
TRUEnever evaluated
FALSEnever evaluated
(((rl_line_buf... & 0x80) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
mblength == (size_t)-2Description
TRUEnever evaluated
FALSEnever evaluated
mblength == (size_t)-1Description
TRUEnever evaluated
FALSEnever evaluated
0
1131 continue; /* straight back to loop, don't increment p */
never executed: continue;
0
1132 case '\\':
never executed: case '\\':
0
1133 if (p < rl_end && rl_line_buffer[p])
p < rl_endDescription
TRUEnever evaluated
FALSEnever evaluated
rl_line_buffer[p]Description
TRUEnever evaluated
FALSEnever evaluated
0
1134 ADVANCE_CHAR (rl_line_buffer, slen, p);
never executed: mblength = 1;
never executed: mblength = 1;
never executed: end of block
never executed: end of block
never executed: (p)++;
never executed: (p) += mblength;
never executed: (p)++;
never executed: end of block
locale_mb_cur_max > 1Description
TRUEnever evaluated
FALSEnever evaluated
_fDescription
TRUEnever evaluated
FALSEnever evaluated
mblength == 0Description
TRUEnever evaluated
FALSEnever evaluated
locale_utf8localeDescription
TRUEnever evaluated
FALSEnever evaluated
(((rl_line_buf... & 0x80) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
mblength == (size_t)-2Description
TRUEnever evaluated
FALSEnever evaluated
mblength == (size_t)-1Description
TRUEnever evaluated
FALSEnever evaluated
0
1135 break;
never executed: break;
0
1136 case '\'':
never executed: case '\'':
0
1137 p = skip_to_delim (rl_line_buffer, ++p, "'", SD_NOJMP);-
1138 break;
never executed: break;
0
1139 case '"':
never executed: case '"':
0
1140 p = skip_to_delim (rl_line_buffer, ++p, "\"", SD_NOJMP);-
1141 break;
never executed: break;
0
1142 }-
1143-
1144 if (p < rl_end)
p < rl_endDescription
TRUEnever evaluated
FALSEnever evaluated
0
1145 p++;
never executed: p++;
0
1146 }
never executed: end of block
0
1147-
1148 if (p == rl_end || rl_line_buffer[p] == 0)
p == rl_endDescription
TRUEnever evaluated
FALSEnever evaluated
rl_line_buffer[p] == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1149 {-
1150 rl_point = rl_end;-
1151 return (0);
never executed: return (0);
0
1152 }-
1153-
1154 count--; -
1155 }
never executed: end of block
0
1156-
1157 rl_point = p;-
1158 return (0);
never executed: return (0);
0
1159}-
1160-
1161static int-
1162bash_backward_shellword (count, key)-
1163 int count, key;-
1164{-
1165 size_t slen;-
1166 int c, p;-
1167 DECLARE_MBSTATE;-
1168-
1169 if (count < 0)
count < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1170 return (bash_forward_shellword (-count, key));
never executed: return (bash_forward_shellword (-count, key));
0
1171-
1172 p = rl_point;-
1173 slen = rl_end;-
1174-
1175 if (p == rl_end && p > 0)
p == rl_endDescription
TRUEnever evaluated
FALSEnever evaluated
p > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1176 p--;
never executed: p--;
0
1177-
1178 while (count)
countDescription
TRUEnever evaluated
FALSEnever evaluated
0
1179 {-
1180 if (p == 0)
p == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1181 {-
1182 rl_point = 0;-
1183 return 0;
never executed: return 0;
0
1184 }-
1185-
1186 /* Move backward until we hit a non-metacharacter. */-
1187 while (p > 0)
p > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1188 {-
1189 c = rl_line_buffer[p];-
1190 if (WORDDELIM (c) == 0 || char_is_quoted (rl_line_buffer, p))
((sh_syntaxtab... 0x2000)) == 0Description
TRUEnever evaluated
FALSEnever evaluated
(sh_syntaxtab[...(c)] & 0x0001)Description
TRUEnever evaluated
FALSEnever evaluated
(sh_syntaxtab[...(c)] & 0x2000)Description
TRUEnever evaluated
FALSEnever evaluated
char_is_quoted...ine_buffer, p)Description
TRUEnever evaluated
FALSEnever evaluated
0
1191 break;
never executed: break;
0
1192 BACKUP_CHAR (rl_line_buffer, slen, p);
never executed: end of block
never executed: _x++;
never executed: end of block
never executed: end of block
never executed: (p)--;
locale_mb_cur_max > 1Description
TRUEnever evaluated
FALSEnever evaluated
mblength == 0Description
TRUEnever evaluated
FALSEnever evaluated
_x < (p)Description
TRUEnever evaluated
FALSEnever evaluated
mblength == (size_t)-2Description
TRUEnever evaluated
FALSEnever evaluated
mblength == (size_t)-1Description
TRUEnever evaluated
FALSEnever evaluated
0
1193 }
never executed: end of block
0
1194-
1195 if (p == 0)
p == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1196 {-
1197 rl_point = 0;-
1198 return 0;
never executed: return 0;
0
1199 }-
1200-
1201 /* Now move backward until we hit a metacharacter or BOL. */-
1202 while (p > 0)
p > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1203 {-
1204 c = rl_line_buffer[p];-
1205 if (WORDDELIM (c) && char_is_quoted (rl_line_buffer, p) == 0)
(sh_syntaxtab[...(c)] & 0x0001)Description
TRUEnever evaluated
FALSEnever evaluated
(sh_syntaxtab[...(c)] & 0x2000)Description
TRUEnever evaluated
FALSEnever evaluated
char_is_quoted...uffer, p) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1206 break;
never executed: break;
0
1207 BACKUP_CHAR (rl_line_buffer, slen, p);
never executed: end of block
never executed: _x++;
never executed: end of block
never executed: end of block
never executed: (p)--;
locale_mb_cur_max > 1Description
TRUEnever evaluated
FALSEnever evaluated
mblength == 0Description
TRUEnever evaluated
FALSEnever evaluated
_x < (p)Description
TRUEnever evaluated
FALSEnever evaluated
mblength == (size_t)-2Description
TRUEnever evaluated
FALSEnever evaluated
mblength == (size_t)-1Description
TRUEnever evaluated
FALSEnever evaluated
0
1208 }
never executed: end of block
0
1209-
1210 count--;-
1211 }
never executed: end of block
0
1212-
1213 rl_point = p;-
1214 return 0;
never executed: return 0;
0
1215}-
1216-
1217static int-
1218bash_kill_shellword (count, key)-
1219 int count, key;-
1220{-
1221 int p;-
1222-
1223 if (count < 0)
count < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1224 return (bash_backward_kill_shellword (-count, key));
never executed: return (bash_backward_kill_shellword (-count, key));
0
1225-
1226 p = rl_point;-
1227 bash_forward_shellword (count, key);-
1228-
1229 if (rl_point != p)
rl_point != pDescription
TRUEnever evaluated
FALSEnever evaluated
0
1230 rl_kill_text (p, rl_point);
never executed: rl_kill_text (p, rl_point);
0
1231-
1232 rl_point = p;-
1233 if (rl_editing_mode == 1) /* 1 == emacs_mode */
rl_editing_mode == 1Description
TRUEnever evaluated
FALSEnever evaluated
0
1234 rl_mark = rl_point;
never executed: rl_mark = rl_point;
0
1235-
1236 return 0;
never executed: return 0;
0
1237}-
1238-
1239static int-
1240bash_backward_kill_shellword (count, key)-
1241 int count, key;-
1242{-
1243 int p;-
1244-
1245 if (count < 0)
count < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1246 return (bash_kill_shellword (-count, key));
never executed: return (bash_kill_shellword (-count, key));
0
1247-
1248 p = rl_point;-
1249 bash_backward_shellword (count, key);-
1250-
1251 if (rl_point != p)
rl_point != pDescription
TRUEnever evaluated
FALSEnever evaluated
0
1252 rl_kill_text (p, rl_point);
never executed: rl_kill_text (p, rl_point);
0
1253-
1254 if (rl_editing_mode == 1) /* 1 == emacs_mode */
rl_editing_mode == 1Description
TRUEnever evaluated
FALSEnever evaluated
0
1255 rl_mark = rl_point;
never executed: rl_mark = rl_point;
0
1256-
1257 return 0;
never executed: return 0;
0
1258}-
1259-
1260-
1261/* **************************************************************** */-
1262/* */-
1263/* How To Do Shell Completion */-
1264/* */-
1265/* **************************************************************** */-
1266-
1267#define COMMAND_SEPARATORS ";|&{(`"-
1268/* )} */ -
1269#define COMMAND_SEPARATORS_PLUS_WS ";|&{(` \t"-
1270/* )} */ -
1271-
1272/* check for redirections and other character combinations that are not-
1273 command separators */-
1274static int-
1275check_redir (ti)-
1276 int ti;-
1277{-
1278 register int this_char, prev_char;-
1279-
1280 /* Handle the two character tokens `>&', `<&', and `>|'.-
1281 We are not in a command position after one of these. */-
1282 this_char = rl_line_buffer[ti];-
1283 prev_char = (ti > 0) ? rl_line_buffer[ti - 1] : 0;
(ti > 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1284-
1285 if ((this_char == '&' && (prev_char == '<' || prev_char == '>')) ||
this_char == '&'Description
TRUEnever evaluated
FALSEnever evaluated
prev_char == '<'Description
TRUEnever evaluated
FALSEnever evaluated
prev_char == '>'Description
TRUEnever evaluated
FALSEnever evaluated
0
1286 (this_char == '|' && prev_char == '>'))
this_char == '|'Description
TRUEnever evaluated
FALSEnever evaluated
prev_char == '>'Description
TRUEnever evaluated
FALSEnever evaluated
0
1287 return (1);
never executed: return (1);
0
1288 else if (this_char == '{' && prev_char == '$') /*}*/
this_char == '{'Description
TRUEnever evaluated
FALSEnever evaluated
prev_char == '$'Description
TRUEnever evaluated
FALSEnever evaluated
0
1289 return (1);
never executed: return (1);
0
1290#if 0 /* Not yet */-
1291 else if (this_char == '(' && prev_char == '$') /*)*/-
1292 return (1);-
1293 else if (this_char == '(' && prev_char == '<') /*)*/-
1294 return (1);-
1295#if defined (EXTENDED_GLOB)-
1296 else if (extended_glob && this_char == '(' && prev_char == '!') /*)*/-
1297 return (1);-
1298#endif-
1299#endif-
1300 else if (char_is_quoted (rl_line_buffer, ti))
char_is_quoted...ne_buffer, ti)Description
TRUEnever evaluated
FALSEnever evaluated
0
1301 return (1);
never executed: return (1);
0
1302 return (0);
never executed: return (0);
0
1303}-
1304-
1305#if defined (PROGRAMMABLE_COMPLETION)-
1306/*-
1307 * XXX - because of the <= start test, and setting os = s+1, this can-
1308 * potentially return os > start. This is probably not what we want to-
1309 * happen, but fix later after 2.05a-release.-
1310 */-
1311static int-
1312find_cmd_start (start)-
1313 int start;-
1314{-
1315 register int s, os, ns;-
1316-
1317 os = 0;-
1318 /* Flags == SD_NOJMP only because we want to skip over command substitutions-
1319 in assignment statements. Have to test whether this affects `standalone'-
1320 command substitutions as individual words. */-
1321 while (((s = skip_to_delim (rl_line_buffer, os, COMMAND_SEPARATORS, SD_NOJMP|SD_COMPLETE/*|SD_NOSKIPCMD*/)) <= start) &&
((s = skip_to_...0 )) <= start)Description
TRUEnever evaluated
FALSEnever evaluated
0
1322 rl_line_buffer[s])
rl_line_buffer[s]Description
TRUEnever evaluated
FALSEnever evaluated
0
1323 {-
1324 /* Handle >| token crudely; treat as > not | */-
1325 if (rl_line_buffer[s] == '|' && rl_line_buffer[s-1] == '>')
rl_line_buffer[s] == '|'Description
TRUEnever evaluated
FALSEnever evaluated
rl_line_buffer[s-1] == '>'Description
TRUEnever evaluated
FALSEnever evaluated
0
1326 {-
1327 ns = skip_to_delim (rl_line_buffer, s+1, COMMAND_SEPARATORS, SD_NOJMP|SD_COMPLETE/*|SD_NOSKIPCMD*/);-
1328 if (ns > start || rl_line_buffer[ns] == 0)
ns > startDescription
TRUEnever evaluated
FALSEnever evaluated
rl_line_buffer[ns] == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1329 return os;
never executed: return os;
0
1330 os = ns+1;-
1331 continue;
never executed: continue;
0
1332 }-
1333 os = s+1;-
1334 }
never executed: end of block
0
1335 return os;
never executed: return os;
0
1336}-
1337-
1338static int-
1339find_cmd_end (end)-
1340 int end;-
1341{-
1342 register int e;-
1343-
1344 e = skip_to_delim (rl_line_buffer, end, COMMAND_SEPARATORS, SD_NOJMP|SD_COMPLETE);-
1345 return e;
never executed: return e;
0
1346}-
1347-
1348static char *-
1349find_cmd_name (start, sp, ep)-
1350 int start;-
1351 int *sp, *ep;-
1352{-
1353 char *name;-
1354 register int s, e;-
1355-
1356 for (s = start; whitespace (rl_line_buffer[s]); s++)
((rl_line_buffer[s]) == ' ')Description
TRUEnever evaluated
FALSEnever evaluated
((rl_line_buffer[s]) == '\t')Description
TRUEnever evaluated
FALSEnever evaluated
0
1357 ;
never executed: ;
0
1358-
1359 /* skip until a shell break character */-
1360 e = skip_to_delim (rl_line_buffer, s, "()<>;&| \t\n", SD_NOJMP|SD_COMPLETE);-
1361-
1362 name = substring (rl_line_buffer, s, e);-
1363-
1364 if (sp)
spDescription
TRUEnever evaluated
FALSEnever evaluated
0
1365 *sp = s;
never executed: *sp = s;
0
1366 if (ep)
epDescription
TRUEnever evaluated
FALSEnever evaluated
0
1367 *ep = e;
never executed: *ep = e;
0
1368-
1369 return (name);
never executed: return (name);
0
1370}-
1371-
1372static char *-
1373prog_complete_return (text, matchnum)-
1374 const char *text;-
1375 int matchnum;-
1376{-
1377 static int ind;-
1378-
1379 if (matchnum == 0)
matchnum == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1380 ind = 0;
never executed: ind = 0;
0
1381-
1382 if (prog_complete_matches == 0 || prog_complete_matches[ind] == 0)
prog_complete_matches == 0Description
TRUEnever evaluated
FALSEnever evaluated
prog_complete_...ches[ind] == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1383 return (char *)NULL;
never executed: return (char *) ((void *)0) ;
0
1384 return (prog_complete_matches[ind++]);
never executed: return (prog_complete_matches[ind++]);
0
1385}-
1386-
1387#endif /* PROGRAMMABLE_COMPLETION */-
1388-
1389/* Try and catch completion attempts that are syntax errors or otherwise-
1390 invalid. */-
1391static int-
1392invalid_completion (text, ind)-
1393 const char *text;-
1394 int ind;-
1395{-
1396 int pind;-
1397-
1398 /* If we don't catch these here, the next clause will */-
1399 if (ind > 0 && rl_line_buffer[ind] == '(' && /*)*/
ind > 0Description
TRUEnever evaluated
FALSEnever evaluated
rl_line_buffer[ind] == '('Description
TRUEnever evaluated
FALSEnever evaluated
0
1400 member (rl_line_buffer[ind-1], "$<>"))
(rl_line_buffer[ind-1])Description
TRUEnever evaluated
FALSEnever evaluated
((rl_line_buff...id *)0) ) : 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1401 return 0;
never executed: return 0;
0
1402-
1403 pind = ind - 1;-
1404 while (pind > 0 && whitespace (rl_line_buffer[pind]))
pind > 0Description
TRUEnever evaluated
FALSEnever evaluated
((rl_line_buff...pind]) == ' ')Description
TRUEnever evaluated
FALSEnever evaluated
((rl_line_buff...ind]) == '\t')Description
TRUEnever evaluated
FALSEnever evaluated
0
1405 pind--;
never executed: pind--;
0
1406 /* If we have only whitespace preceding a paren, it's valid */-
1407 if (ind >= 0 && pind <= 0 && rl_line_buffer[ind] == '(') /*)*/
ind >= 0Description
TRUEnever evaluated
FALSEnever evaluated
pind <= 0Description
TRUEnever evaluated
FALSEnever evaluated
rl_line_buffer[ind] == '('Description
TRUEnever evaluated
FALSEnever evaluated
0
1408 return 0;
never executed: return 0;
0
1409 /* Flag the invalid completions, which are mostly syntax errors */-
1410 if (ind > 0 && rl_line_buffer[ind] == '(' && /*)*/
ind > 0Description
TRUEnever evaluated
FALSEnever evaluated
rl_line_buffer[ind] == '('Description
TRUEnever evaluated
FALSEnever evaluated
0
1411 member (rl_line_buffer[pind], COMMAND_SEPARATORS) == 0)
(rl_line_buffer[pind])Description
TRUEnever evaluated
FALSEnever evaluated
((rl_line_buff...0) ) : 0) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1412 return 1;
never executed: return 1;
0
1413-
1414 return 0;
never executed: return 0;
0
1415}-
1416-
1417/* Do some completion on TEXT. The indices of TEXT in RL_LINE_BUFFER are-
1418 at START and END. Return an array of matches, or NULL if none. */-
1419static char **-
1420attempt_shell_completion (text, start, end)-
1421 const char *text;-
1422 int start, end;-
1423{-
1424 int in_command_position, ti, qc, dflags;-
1425 char **matches, *command_separator_chars;-
1426#if defined (PROGRAMMABLE_COMPLETION)-
1427 int have_progcomps, was_assignment;-
1428#endif-
1429-
1430 command_separator_chars = COMMAND_SEPARATORS;-
1431 matches = (char **)NULL;-
1432 rl_ignore_some_completions_function = filename_completion_ignore;-
1433-
1434 rl_filename_quote_characters = default_filename_quote_characters;-
1435 set_filename_bstab (rl_filename_quote_characters);-
1436 set_directory_hook ();-
1437 rl_filename_stat_hook = bash_filename_stat_hook;-
1438-
1439 rl_sort_completion_matches = 1; /* sort by default */-
1440-
1441 /* Determine if this could be a command word. It is if it appears at-
1442 the start of the line (ignoring preceding whitespace), or if it-
1443 appears after a character that separates commands. It cannot be a-
1444 command word if we aren't at the top-level prompt. */-
1445 ti = start - 1;-
1446 qc = -1;-
1447-
1448 while ((ti > -1) && (whitespace (rl_line_buffer[ti])))
(ti > -1)Description
TRUEnever evaluated
FALSEnever evaluated
((rl_line_buffer[ti]) == ' ')Description
TRUEnever evaluated
FALSEnever evaluated
((rl_line_buffer[ti]) == '\t')Description
TRUEnever evaluated
FALSEnever evaluated
0
1449 ti--;
never executed: ti--;
0
1450-
1451#if 1-
1452 /* If this is an open quote, maybe we're trying to complete a quoted-
1453 command name. */-
1454 if (ti >= 0 && (rl_line_buffer[ti] == '"' || rl_line_buffer[ti] == '\''))
ti >= 0Description
TRUEnever evaluated
FALSEnever evaluated
rl_line_buffer[ti] == '"'Description
TRUEnever evaluated
FALSEnever evaluated
rl_line_buffer[ti] == '\''Description
TRUEnever evaluated
FALSEnever evaluated
0
1455 {-
1456 qc = rl_line_buffer[ti];-
1457 ti--;-
1458 while (ti > -1 && (whitespace (rl_line_buffer[ti])))
ti > -1Description
TRUEnever evaluated
FALSEnever evaluated
((rl_line_buffer[ti]) == ' ')Description
TRUEnever evaluated
FALSEnever evaluated
((rl_line_buffer[ti]) == '\t')Description
TRUEnever evaluated
FALSEnever evaluated
0
1459 ti--;
never executed: ti--;
0
1460 }
never executed: end of block
0
1461#endif-
1462 -
1463 in_command_position = 0;-
1464 if (ti < 0)
ti < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1465 {-
1466 /* Only do command completion at the start of a line when we-
1467 are prompting at the top level. */-
1468 if (current_prompt_string == ps1_prompt)
current_prompt... == ps1_promptDescription
TRUEnever evaluated
FALSEnever evaluated
0
1469 in_command_position++;
never executed: in_command_position++;
0
1470 else if (parser_in_command_position ())
parser_in_command_position ()Description
TRUEnever evaluated
FALSEnever evaluated
0
1471 in_command_position++;
never executed: in_command_position++;
0
1472 }
never executed: end of block
0
1473 else if (member (rl_line_buffer[ti], command_separator_chars))
((rl_line_buff...id *)0) ) : 0)Description
TRUEnever evaluated
FALSEnever evaluated
(rl_line_buffer[ti])Description
TRUEnever evaluated
FALSEnever evaluated
0
1474 {-
1475 in_command_position++;-
1476-
1477 if (check_redir (ti) == 1)
check_redir (ti) == 1Description
TRUEnever evaluated
FALSEnever evaluated
0
1478 in_command_position = 0;
never executed: in_command_position = 0;
0
1479 }
never executed: end of block
0
1480 else-
1481 {-
1482 /* This still could be in command position. It is possible-
1483 that all of the previous words on the line are variable-
1484 assignments. */-
1485 }
never executed: end of block
0
1486-
1487 if (in_command_position && invalid_completion (text, ti))
in_command_positionDescription
TRUEnever evaluated
FALSEnever evaluated
invalid_completion (text, ti)Description
TRUEnever evaluated
FALSEnever evaluated
0
1488 {-
1489 rl_attempted_completion_over = 1;-
1490 return ((char **)NULL);
never executed: return ((char **) ((void *)0) );
0
1491 }-
1492-
1493 /* Check that we haven't incorrectly flagged a closed command substitution-
1494 as indicating we're in a command position. */-
1495 if (in_command_position && ti >= 0 && rl_line_buffer[ti] == '`' &&
in_command_positionDescription
TRUEnever evaluated
FALSEnever evaluated
ti >= 0Description
TRUEnever evaluated
FALSEnever evaluated
rl_line_buffer[ti] == '`'Description
TRUEnever evaluated
FALSEnever evaluated
0
1496 *text != '`' && unclosed_pair (rl_line_buffer, end, "`") == 0)
*text != '`'Description
TRUEnever evaluated
FALSEnever evaluated
unclosed_pair ...end, "`") == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1497 in_command_position = 0;
never executed: in_command_position = 0;
0
1498-
1499 /* Special handling for command substitution. If *TEXT is a backquote,-
1500 it can be the start or end of an old-style command substitution, or-
1501 unmatched. If it's unmatched, both calls to unclosed_pair will-
1502 succeed. Don't bother if readline found a single quote and we are-
1503 completing on the substring. */-
1504 if (*text == '`' && rl_completion_quote_character != '\'' &&
*text == '`'Description
TRUEnever evaluated
FALSEnever evaluated
rl_completion_...racter != '\''Description
TRUEnever evaluated
FALSEnever evaluated
0
1505 (in_command_position || (unclosed_pair (rl_line_buffer, start, "`") &&
in_command_positionDescription
TRUEnever evaluated
FALSEnever evaluated
unclosed_pair ...r, start, "`")Description
TRUEnever evaluated
FALSEnever evaluated
0
1506 unclosed_pair (rl_line_buffer, end, "`"))))
unclosed_pair ...fer, end, "`")Description
TRUEnever evaluated
FALSEnever evaluated
0
1507 matches = rl_completion_matches (text, command_subst_completion_function);
never executed: matches = rl_completion_matches (text, command_subst_completion_function);
0
1508-
1509#if defined (PROGRAMMABLE_COMPLETION)-
1510 /* Attempt programmable completion. */-
1511 have_progcomps = prog_completion_enabled && (progcomp_size () > 0);
prog_completion_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
(progcomp_size () > 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1512 if (matches == 0 && (in_command_position == 0 || text[0] == '\0') &&
matches == 0Description
TRUEnever evaluated
FALSEnever evaluated
in_command_position == 0Description
TRUEnever evaluated
FALSEnever evaluated
text[0] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
1513 current_prompt_string == ps1_prompt)
current_prompt... == ps1_promptDescription
TRUEnever evaluated
FALSEnever evaluated
0
1514 {-
1515 int s, e, s1, e1, os, foundcs;-
1516 char *n;-
1517-
1518 /* XXX - don't free the members */-
1519 if (prog_complete_matches)
prog_complete_matchesDescription
TRUEnever evaluated
FALSEnever evaluated
0
1520 free (prog_complete_matches);
never executed: sh_xfree((prog_complete_matches), "bashline.c", 1520);
0
1521 prog_complete_matches = (char **)NULL;-
1522-
1523 os = start;-
1524 n = 0;-
1525 was_assignment = 0;-
1526 s = find_cmd_start (os);-
1527 e = find_cmd_end (end);-
1528 do-
1529 {-
1530 /* Don't read past the end of rl_line_buffer */-
1531 if (s > rl_end)
s > rl_endDescription
TRUEnever evaluated
FALSEnever evaluated
0
1532 {-
1533 s1 = s = e1;-
1534 break;
never executed: break;
0
1535 }-
1536 /* Or past point if point is within an assignment statement */-
1537 else if (was_assignment && s > rl_point)
was_assignmentDescription
TRUEnever evaluated
FALSEnever evaluated
s > rl_pointDescription
TRUEnever evaluated
FALSEnever evaluated
0
1538 {-
1539 s1 = s = e1;-
1540 break;
never executed: break;
0
1541 }-
1542 /* Skip over assignment statements preceding a command name. If we-
1543 don't find a command name at all, we can perform command name-
1544 completion. If we find a partial command name, we should perform-
1545 command name completion on it. */-
1546 FREE (n);
never executed: sh_xfree((n), "bashline.c", 1546);
nDescription
TRUEnever evaluated
FALSEnever evaluated
0
1547 n = find_cmd_name (s, &s1, &e1);-
1548 s = e1 + 1;-
1549 }
never executed: end of block
0
1550 while (was_assignment = assignment (n, 0));
was_assignment...ignment (n, 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1551 s = s1; /* reset to index where name begins */-
1552-
1553 /* s == index of where command name begins (reset above)-
1554 e == end of current command, may be end of line-
1555 s1 = index of where command name begins-
1556 e1 == index of where command name ends-
1557 start == index of where word to be completed begins-
1558 end == index of where word to be completed ends-
1559 if (s == start) we are doing command word completion for sure-
1560 if (e1 == end) we are at the end of the command name and completing it */-
1561 if (start == 0 && end == 0 && e != 0 && text[0] == '\0') /* beginning of non-empty line */
start == 0Description
TRUEnever evaluated
FALSEnever evaluated
end == 0Description
TRUEnever evaluated
FALSEnever evaluated
e != 0Description
TRUEnever evaluated
FALSEnever evaluated
text[0] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
1562 foundcs = 0;
never executed: foundcs = 0;
0
1563 else if (start == end && start == s1 && e != 0 && e1 > end) /* beginning of command name, leading whitespace */
start == endDescription
TRUEnever evaluated
FALSEnever evaluated
start == s1Description
TRUEnever evaluated
FALSEnever evaluated
e != 0Description
TRUEnever evaluated
FALSEnever evaluated
e1 > endDescription
TRUEnever evaluated
FALSEnever evaluated
0
1564 foundcs = 0;
never executed: foundcs = 0;
0
1565 else if (e == 0 && e == s && text[0] == '\0' && have_progcomps) /* beginning of empty line */
e == 0Description
TRUEnever evaluated
FALSEnever evaluated
e == sDescription
TRUEnever evaluated
FALSEnever evaluated
text[0] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
have_progcompsDescription
TRUEnever evaluated
FALSEnever evaluated
0
1566 prog_complete_matches = programmable_completions ("_EmptycmD_", text, s, e, &foundcs);
never executed: prog_complete_matches = programmable_completions ("_EmptycmD_", text, s, e, &foundcs);
0
1567 else if (start == end && text[0] == '\0' && s1 > start && whitespace (rl_line_buffer[start]))
start == endDescription
TRUEnever evaluated
FALSEnever evaluated
text[0] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
s1 > startDescription
TRUEnever evaluated
FALSEnever evaluated
((rl_line_buff...tart]) == ' ')Description
TRUEnever evaluated
FALSEnever evaluated
((rl_line_buff...art]) == '\t')Description
TRUEnever evaluated
FALSEnever evaluated
0
1568 foundcs = 0; /* whitespace before command name */
never executed: foundcs = 0;
0
1569 else if (e > s && was_assignment == 0 && e1 == end && rl_line_buffer[e] == 0 && whitespace (rl_line_buffer[e-1]) == 0)
e > sDescription
TRUEnever evaluated
FALSEnever evaluated
was_assignment == 0Description
TRUEnever evaluated
FALSEnever evaluated
e1 == endDescription
TRUEnever evaluated
FALSEnever evaluated
rl_line_buffer[e] == 0Description
TRUEnever evaluated
FALSEnever evaluated
(((rl_line_buf...== '\t')) == 0Description
TRUEnever evaluated
FALSEnever evaluated
((rl_line_buffer[e-1]) == ' ')Description
TRUEnever evaluated
FALSEnever evaluated
((rl_line_buff...e-1]) == '\t')Description
TRUEnever evaluated
FALSEnever evaluated
0
1570 {-
1571 /* not assignment statement, but still want to perform command-
1572 completion if we are composing command word. */-
1573 foundcs = 0;-
1574 in_command_position = s == start && STREQ (n, text); /* XXX */
never executed: __result = (((const unsigned char *) (const char *) ( n ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( text ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
s == startDescription
TRUEnever evaluated
FALSEnever evaluated
(n)[0] == (text)[0]Description
TRUEnever evaluated
FALSEnever evaluated
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1575 }
never executed: end of block
0
1576 else if (e > s && was_assignment == 0 && have_progcomps)
e > sDescription
TRUEnever evaluated
FALSEnever evaluated
was_assignment == 0Description
TRUEnever evaluated
FALSEnever evaluated
have_progcompsDescription
TRUEnever evaluated
FALSEnever evaluated
0
1577 {-
1578 prog_complete_matches = programmable_completions (n, text, s, e, &foundcs);-
1579 /* command completion if programmable completion fails */-
1580 in_command_position = s == start && STREQ (n, text); /* XXX */
never executed: __result = (((const unsigned char *) (const char *) ( n ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( text ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
s == startDescription
TRUEnever evaluated
FALSEnever evaluated
(n)[0] == (text)[0]Description
TRUEnever evaluated
FALSEnever evaluated
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1581 }
never executed: end of block
0
1582 /* empty command name following command separator */-
1583 else if (s >= e && n[0] == '\0' && text[0] == '\0' && start > 0 &&
s >= eDescription
TRUEnever evaluated
FALSEnever evaluated
n[0] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
text[0] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
start > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1584 was_assignment == 0 && member (rl_line_buffer[start-1], COMMAND_SEPARATORS))
(rl_line_buffer[start-1])Description
TRUEnever evaluated
FALSEnever evaluated
was_assignment == 0Description
TRUEnever evaluated
FALSEnever evaluated
((rl_line_buff...id *)0) ) : 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1585 {-
1586 foundcs = 0;-
1587 in_command_position = 1;-
1588 }
never executed: end of block
0
1589 else if (s >= e && n[0] == '\0' && text[0] == '\0' && start > 0)
s >= eDescription
TRUEnever evaluated
FALSEnever evaluated
n[0] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
text[0] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
start > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1590 {-
1591 foundcs = 0; /* empty command name following assignments */-
1592 in_command_position = was_assignment;-
1593 }
never executed: end of block
0
1594 else if (s == start && e == end && STREQ (n, text) && start > 0)
never executed: __result = (((const unsigned char *) (const char *) ( n ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( text ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
s == startDescription
TRUEnever evaluated
FALSEnever evaluated
e == endDescription
TRUEnever evaluated
FALSEnever evaluated
(n)[0] == (text)[0]Description
TRUEnever evaluated
FALSEnever evaluated
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
start > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1595 {-
1596 foundcs = 0; /* partial command name following assignments */-
1597 in_command_position = 1;-
1598 }
never executed: end of block
0
1599 else-
1600 foundcs = 0;
never executed: foundcs = 0;
0
1601 FREE (n);
never executed: sh_xfree((n), "bashline.c", 1601);
nDescription
TRUEnever evaluated
FALSEnever evaluated
0
1602 /* XXX - if we found a COMPSPEC for the command, just return whatever-
1603 the programmable completion code returns, and disable the default-
1604 filename completion that readline will do unless the COPT_DEFAULT-
1605 option has been set with the `-o default' option to complete or-
1606 compopt. */-
1607 if (foundcs)
foundcsDescription
TRUEnever evaluated
FALSEnever evaluated
0
1608 {-
1609 pcomp_set_readline_variables (foundcs, 1);-
1610 /* Turn what the programmable completion code returns into what-
1611 readline wants. I should have made compute_lcd_of_matches-
1612 external... */-
1613 matches = rl_completion_matches (text, prog_complete_return);-
1614 if ((foundcs & COPT_DEFAULT) == 0)
(foundcs & (1<<1)) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1615 rl_attempted_completion_over = 1; /* no default */
never executed: rl_attempted_completion_over = 1;
0
1616 if (matches || ((foundcs & COPT_BASHDEFAULT) == 0))
matchesDescription
TRUEnever evaluated
FALSEnever evaluated
((foundcs & (1<<6)) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1617 return (matches);
never executed: return (matches);
0
1618 }
never executed: end of block
0
1619 }
never executed: end of block
0
1620#endif-
1621-
1622 if (matches == 0)
matches == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1623 {-
1624 dflags = 0;-
1625 if (in_command_position)
in_command_positionDescription
TRUEnever evaluated
FALSEnever evaluated
0
1626 dflags |= DEFCOMP_CMDPOS;
never executed: dflags |= 1;
0
1627 matches = bash_default_completion (text, start, end, qc, dflags);-
1628 }
never executed: end of block
0
1629-
1630 return matches;
never executed: return matches;
0
1631}-
1632-
1633char **-
1634bash_default_completion (text, start, end, qc, compflags)-
1635 const char *text;-
1636 int start, end, qc, compflags;-
1637{-
1638 char **matches, *t;-
1639-
1640 matches = (char **)NULL;-
1641-
1642 /* New posix-style command substitution or variable name? */-
1643 if (*text == '$')
*text == '$'Description
TRUEnever evaluated
FALSEnever evaluated
0
1644 {-
1645 if (qc != '\'' && text[1] == '(') /* ) */
qc != '\''Description
TRUEnever evaluated
FALSEnever evaluated
text[1] == '('Description
TRUEnever evaluated
FALSEnever evaluated
0
1646 matches = rl_completion_matches (text, command_subst_completion_function);
never executed: matches = rl_completion_matches (text, command_subst_completion_function);
0
1647 else-
1648 {-
1649 matches = rl_completion_matches (text, variable_completion_function);-
1650 /* If a single match, see if it expands to a directory name and append-
1651 a slash if it does. This requires us to expand the variable name,-
1652 so we don't want to display errors if the variable is unset. This-
1653 can happen with dynamic variables whose value has never been-
1654 requested. */-
1655 if (matches && matches[0] && matches[1] == 0)
matchesDescription
TRUEnever evaluated
FALSEnever evaluated
matches[0]Description
TRUEnever evaluated
FALSEnever evaluated
matches[1] == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1656 {-
1657 t = savestring (matches[0]);-
1658 bash_filename_stat_hook (&t);-
1659 /* doesn't use test_for_directory because that performs tilde-
1660 expansion */-
1661 if (file_isdir (t))
file_isdir (t)Description
TRUEnever evaluated
FALSEnever evaluated
0
1662 rl_completion_append_character = '/';
never executed: rl_completion_append_character = '/';
0
1663 free (t);-
1664 }
never executed: end of block
0
1665 }
never executed: end of block
0
1666 }-
1667-
1668 /* If the word starts in `~', and there is no slash in the word, then-
1669 try completing this word as a username. */-
1670 if (matches == 0 && *text == '~' && mbschr (text, '/') == 0)
matches == 0Description
TRUEnever evaluated
FALSEnever evaluated
*text == '~'Description
TRUEnever evaluated
FALSEnever evaluated
mbschr (text, '/') == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1671 matches = rl_completion_matches (text, rl_username_completion_function);
never executed: matches = rl_completion_matches (text, rl_username_completion_function);
0
1672-
1673 /* Another one. Why not? If the word starts in '@', then look through-
1674 the world of known hostnames for completion first. */-
1675 if (matches == 0 && perform_hostname_completion && *text == '@')
matches == 0Description
TRUEnever evaluated
FALSEnever evaluated
perform_hostname_completionDescription
TRUEnever evaluated
FALSEnever evaluated
*text == '@'Description
TRUEnever evaluated
FALSEnever evaluated
0
1676 matches = rl_completion_matches (text, hostname_completion_function);
never executed: matches = rl_completion_matches (text, hostname_completion_function);
0
1677-
1678 /* And last, (but not least) if this word is in a command position, then-
1679 complete over possible command names, including aliases, functions,-
1680 and command names. */-
1681 if (matches == 0 && (compflags & DEFCOMP_CMDPOS))
matches == 0Description
TRUEnever evaluated
FALSEnever evaluated
(compflags & 1)Description
TRUEnever evaluated
FALSEnever evaluated
0
1682 {-
1683 /* If END == START and text[0] == 0, we are trying to complete an empty-
1684 command word. */-
1685 if (no_empty_command_completion && end == start && text[0] == '\0')
no_empty_command_completionDescription
TRUEnever evaluated
FALSEnever evaluated
end == startDescription
TRUEnever evaluated
FALSEnever evaluated
text[0] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
1686 {-
1687 matches = (char **)NULL;-
1688 rl_ignore_some_completions_function = bash_ignore_everything;-
1689 }
never executed: end of block
0
1690 else-
1691 {-
1692#define CMD_IS_DIR(x) (absolute_pathname(x) == 0 && absolute_program(x) == 0 && *(x) != '~' && test_for_directory (x))-
1693-
1694 dot_in_path = 0;-
1695 matches = rl_completion_matches (text, command_word_completion_function);-
1696-
1697 /* If we are attempting command completion and nothing matches, we-
1698 do not want readline to perform filename completion for us. We-
1699 still want to be able to complete partial pathnames, so set the-
1700 completion ignore function to something which will remove-
1701 filenames and leave directories in the match list. */-
1702 if (matches == (char **)NULL)
matches == (ch...*) ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
1703 rl_ignore_some_completions_function = bash_ignore_filenames;
never executed: rl_ignore_some_completions_function = bash_ignore_filenames;
0
1704 else if (matches[1] == 0 && CMD_IS_DIR(matches[0]) && dot_in_path == 0)
matches[1] == 0Description
TRUEnever evaluated
FALSEnever evaluated
absolute_pathn...tches[0]) == 0Description
TRUEnever evaluated
FALSEnever evaluated
absolute_progr...tches[0]) == 0Description
TRUEnever evaluated
FALSEnever evaluated
*(matches[0]) != '~'Description
TRUEnever evaluated
FALSEnever evaluated
test_for_direc...y (matches[0])Description
TRUEnever evaluated
FALSEnever evaluated
dot_in_path == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1705 /* If we found a single match, without looking in the current-
1706 directory (because it's not in $PATH), but the found name is-
1707 also a command in the current directory, suppress appending any-
1708 terminating character, since it's ambiguous. */-
1709 {-
1710 rl_completion_suppress_append = 1;-
1711 rl_filename_completion_desired = 0;-
1712 }
never executed: end of block
0
1713 else if (matches[0] && matches[1] && STREQ (matches[0], matches[1]) && CMD_IS_DIR (matches[0]))
never executed: __result = (((const unsigned char *) (const char *) ( matches[0] ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( matches[1] ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
matches[0]Description
TRUEnever evaluated
FALSEnever evaluated
matches[1]Description
TRUEnever evaluated
FALSEnever evaluated
(matches[0])[0...matches[1])[0]Description
TRUEnever evaluated
FALSEnever evaluated
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
absolute_pathn...tches[0]) == 0Description
TRUEnever evaluated
FALSEnever evaluated
absolute_progr...tches[0]) == 0Description
TRUEnever evaluated
FALSEnever evaluated
*(matches[0]) != '~'Description
TRUEnever evaluated
FALSEnever evaluated
test_for_direc...y (matches[0])Description
TRUEnever evaluated
FALSEnever evaluated
0
1714 /* There are multiple instances of the same match (duplicate-
1715 completions haven't yet been removed). In this case, all of-
1716 the matches will be the same, and the duplicate removal code-
1717 will distill them all down to one. We turn on-
1718 rl_completion_suppress_append for the same reason as above.-
1719 Remember: we only care if there's eventually a single unique-
1720 completion. If there are multiple completions this won't-
1721 make a difference and the problem won't occur. */-
1722 {-
1723 rl_completion_suppress_append = 1;-
1724 rl_filename_completion_desired = 0;-
1725 }
never executed: end of block
0
1726 }
never executed: end of block
0
1727 }-
1728-
1729 /* This could be a globbing pattern, so try to expand it using pathname-
1730 expansion. */-
1731 if (!matches && glob_pattern_p (text))
!matchesDescription
TRUEnever evaluated
FALSEnever evaluated
glob_pattern_p (text)Description
TRUEnever evaluated
FALSEnever evaluated
0
1732 {-
1733 matches = rl_completion_matches (text, glob_complete_word);-
1734 /* A glob expression that matches more than one filename is problematic.-
1735 If we match more than one filename, punt. */-
1736 if (matches && matches[1] && rl_completion_type == TAB)
matchesDescription
TRUEnever evaluated
FALSEnever evaluated
matches[1]Description
TRUEnever evaluated
FALSEnever evaluated
rl_completion_type == '\t'Description
TRUEnever evaluated
FALSEnever evaluated
0
1737 {-
1738 strvec_dispose (matches);-
1739 matches = (char **)0;-
1740 }
never executed: end of block
0
1741 else if (matches && matches[1] && rl_completion_type == '!')
matchesDescription
TRUEnever evaluated
FALSEnever evaluated
matches[1]Description
TRUEnever evaluated
FALSEnever evaluated
rl_completion_type == '!'Description
TRUEnever evaluated
FALSEnever evaluated
0
1742 {-
1743 rl_completion_suppress_append = 1;-
1744 rl_filename_completion_desired = 0;-
1745 }
never executed: end of block
0
1746 }
never executed: end of block
0
1747-
1748 return (matches);
never executed: return (matches);
0
1749}-
1750-
1751static int-
1752bash_command_name_stat_hook (name)-
1753 char **name;-
1754{-
1755 char *cname, *result;-
1756-
1757 /* If it's not something we're going to look up in $PATH, just call the-
1758 normal filename stat hook. */-
1759 if (absolute_program (*name))
absolute_program (*name)Description
TRUEnever evaluated
FALSEnever evaluated
0
1760 return (bash_filename_stat_hook (name));
never executed: return (bash_filename_stat_hook (name));
0
1761-
1762 cname = *name;-
1763 /* XXX - we could do something here with converting aliases, builtins,-
1764 and functions into something that came out as executable, but we don't. */-
1765 result = search_for_command (cname, 0);-
1766 if (result)
resultDescription
TRUEnever evaluated
FALSEnever evaluated
0
1767 {-
1768 *name = result;-
1769 return 1;
never executed: return 1;
0
1770 }-
1771 return 0;
never executed: return 0;
0
1772}-
1773-
1774static int-
1775executable_completion (filename, searching_path)-
1776 const char *filename;-
1777 int searching_path;-
1778{-
1779 char *f;-
1780 int r;-
1781-
1782 f = savestring (filename);-
1783 bash_directory_completion_hook (&f);-
1784 -
1785 r = searching_path ? executable_file (f) : executable_or_directory (f);
searching_pathDescription
TRUEnever evaluated
FALSEnever evaluated
0
1786 free (f);-
1787 return r;
never executed: return r;
0
1788}-
1789-
1790/* This is the function to call when the word to complete is in a position-
1791 where a command word can be found. It grovels $PATH, looking for commands-
1792 that match. It also scans aliases, function names, and the shell_builtin-
1793 table. */-
1794char *-
1795command_word_completion_function (hint_text, state)-
1796 const char *hint_text;-
1797 int state;-
1798{-
1799 static char *hint = (char *)NULL;-
1800 static char *path = (char *)NULL;-
1801 static char *val = (char *)NULL;-
1802 static char *filename_hint = (char *)NULL;-
1803 static char *fnhint = (char *)NULL;-
1804 static char *dequoted_hint = (char *)NULL;-
1805 static char *directory_part = (char *)NULL;-
1806 static char **glob_matches = (char **)NULL;-
1807 static int path_index, hint_len, istate, igncase;-
1808 static int mapping_over, local_index, searching_path, hint_is_dir;-
1809 static int old_glob_ignore_case, globpat;-
1810 static SHELL_VAR **varlist = (SHELL_VAR **)NULL;-
1811#if defined (ALIAS)-
1812 static alias_t **alias_list = (alias_t **)NULL;-
1813#endif /* ALIAS */-
1814 char *temp, *cval;-
1815-
1816 /* We have to map over the possibilities for command words. If we have-
1817 no state, then make one just for that purpose. */-
1818 if (state == 0)
state == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1819 {-
1820 rl_filename_stat_hook = bash_command_name_stat_hook;-
1821-
1822 if (dequoted_hint && dequoted_hint != hint)
dequoted_hintDescription
TRUEnever evaluated
FALSEnever evaluated
dequoted_hint != hintDescription
TRUEnever evaluated
FALSEnever evaluated
0
1823 free (dequoted_hint);
never executed: sh_xfree((dequoted_hint), "bashline.c", 1823);
0
1824 if (hint)
hintDescription
TRUEnever evaluated
FALSEnever evaluated
0
1825 free (hint);
never executed: sh_xfree((hint), "bashline.c", 1825);
0
1826-
1827 mapping_over = searching_path = 0;-
1828 hint_is_dir = CMD_IS_DIR (hint_text);
absolute_pathn...int_text) == 0Description
TRUEnever evaluated
FALSEnever evaluated
absolute_progr...int_text) == 0Description
TRUEnever evaluated
FALSEnever evaluated
*(hint_text) != '~'Description
TRUEnever evaluated
FALSEnever evaluated
test_for_directory (hint_text)Description
TRUEnever evaluated
FALSEnever evaluated
0
1829 val = (char *)NULL;-
1830-
1831 temp = rl_variable_value ("completion-ignore-case");-
1832 igncase = RL_BOOLEAN_VARIABLE_VALUE (temp);
(temp)[0] == 'o'Description
TRUEnever evaluated
FALSEnever evaluated
(temp)[1] == 'n'Description
TRUEnever evaluated
FALSEnever evaluated
(temp)[2] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
1833-
1834 if (glob_matches)
glob_matchesDescription
TRUEnever evaluated
FALSEnever evaluated
0
1835 {-
1836 free (glob_matches);-
1837 glob_matches = (char **)NULL;-
1838 }
never executed: end of block
0
1839-
1840 globpat = glob_pattern_p (hint_text);-
1841-
1842 /* If this is an absolute program name, do not check it against-
1843 aliases, reserved words, functions or builtins. We must check-
1844 whether or not it is unique, and, if so, whether that filename-
1845 is executable. */-
1846 if (globpat || absolute_program (hint_text))
globpatDescription
TRUEnever evaluated
FALSEnever evaluated
absolute_program (hint_text)Description
TRUEnever evaluated
FALSEnever evaluated
0
1847 {-
1848 /* Perform tilde expansion on what's passed, so we don't end up-
1849 passing filenames with tildes directly to stat(). The rest of-
1850 the shell doesn't do variable expansion on the word following-
1851 the tilde, so we don't do it here even if direxpand is set. */-
1852 if (*hint_text == '~')
*hint_text == '~'Description
TRUEnever evaluated
FALSEnever evaluated
0
1853 {-
1854 hint = bash_tilde_expand (hint_text, 0);-
1855 directory_part = savestring (hint_text);-
1856 temp = strchr (directory_part, '/');
__builtin_constant_p ( '/' )Description
TRUEnever evaluated
FALSEnever evaluated
!__builtin_con...rectory_part )Description
TRUEnever evaluated
FALSEnever evaluated
( '/' ) == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
1857 if (temp)
tempDescription
TRUEnever evaluated
FALSEnever evaluated
0
1858 *temp = 0;
never executed: *temp = 0;
0
1859 else-
1860 {-
1861 free (directory_part);-
1862 directory_part = (char *)NULL;-
1863 }
never executed: end of block
0
1864 }-
1865 else if (dircomplete_expand)
dircomplete_expandDescription
TRUEnever evaluated
FALSEnever evaluated
0
1866 {-
1867 hint = savestring (hint_text);-
1868 bash_directory_completion_hook (&hint);-
1869 }
never executed: end of block
0
1870 else-
1871 hint = savestring (hint_text);
never executed: hint = (char *)strcpy (sh_xmalloc((1 + strlen (hint_text)), "bashline.c", 1871), (hint_text));
0
1872-
1873 dequoted_hint = hint;-
1874 /* If readline's completer found a quote character somewhere, but-
1875 didn't set the quote character, there must have been a quote-
1876 character embedded in the filename. It can't be at the start of-
1877 the filename, so we need to dequote the filename before we look-
1878 in the file system for it. */-
1879 if (rl_completion_found_quote && rl_completion_quote_character == 0)
rl_completion_found_quoteDescription
TRUEnever evaluated
FALSEnever evaluated
rl_completion_...character == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1880 {-
1881 dequoted_hint = bash_dequote_filename (hint, 0);-
1882 free (hint);-
1883 hint = dequoted_hint;-
1884 }
never executed: end of block
0
1885 hint_len = strlen (hint);-
1886-
1887 if (filename_hint)
filename_hintDescription
TRUEnever evaluated
FALSEnever evaluated
0
1888 free (filename_hint);
never executed: sh_xfree((filename_hint), "bashline.c", 1888);
0
1889-
1890 fnhint = filename_hint = savestring (hint);-
1891-
1892 istate = 0;-
1893-
1894 if (globpat)
globpatDescription
TRUEnever evaluated
FALSEnever evaluated
0
1895 {-
1896 mapping_over = 5;-
1897 goto globword;
never executed: goto globword;
0
1898 }-
1899 else-
1900 {-
1901 if (dircomplete_expand && path_dot_or_dotdot (filename_hint))
dircomplete_expandDescription
TRUEnever evaluated
FALSEnever evaluated
path_dot_or_do...filename_hint)Description
TRUEnever evaluated
FALSEnever evaluated
0
1902 {-
1903 dircomplete_expand = 0;-
1904 set_directory_hook ();-
1905 dircomplete_expand = 1;-
1906 }
never executed: end of block
0
1907 mapping_over = 4;-
1908 goto inner;
never executed: goto inner;
0
1909 }-
1910 }-
1911-
1912 dequoted_hint = hint = savestring (hint_text);-
1913 hint_len = strlen (hint);-
1914-
1915 if (rl_completion_found_quote && rl_completion_quote_character == 0)
rl_completion_found_quoteDescription
TRUEnever evaluated
FALSEnever evaluated
rl_completion_...character == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1916 dequoted_hint = bash_dequote_filename (hint, 0);
never executed: dequoted_hint = bash_dequote_filename (hint, 0);
0
1917 -
1918 path = get_string_value ("PATH");-
1919 path_index = dot_in_path = 0;-
1920-
1921 /* Initialize the variables for each type of command word. */-
1922 local_index = 0;-
1923-
1924 if (varlist)
varlistDescription
TRUEnever evaluated
FALSEnever evaluated
0
1925 free (varlist);
never executed: sh_xfree((varlist), "bashline.c", 1925);
0
1926-
1927 varlist = all_visible_functions ();-
1928-
1929#if defined (ALIAS)-
1930 if (alias_list)
alias_listDescription
TRUEnever evaluated
FALSEnever evaluated
0
1931 free (alias_list);
never executed: sh_xfree((alias_list), "bashline.c", 1931);
0
1932-
1933 alias_list = all_aliases ();-
1934#endif /* ALIAS */-
1935 }
never executed: end of block
0
1936-
1937 /* mapping_over says what we are currently hacking. Note that every case-
1938 in this list must fall through when there are no more possibilities. */-
1939-
1940 switch (mapping_over)-
1941 {-
1942 case 0: /* Aliases come first. */
never executed: case 0:
0
1943#if defined (ALIAS)-
1944 while (alias_list && alias_list[local_index])
alias_listDescription
TRUEnever evaluated
FALSEnever evaluated
alias_list[local_index]Description
TRUEnever evaluated
FALSEnever evaluated
0
1945 {-
1946 register char *alias;-
1947-
1948 alias = alias_list[local_index++]->name;-
1949-
1950 if (igncase == 0 && (STREQN (alias, hint, hint_len)))
never executed: __result = (((const unsigned char *) (const char *) ( alias ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( hint ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(hint_len == 0)Description
TRUEnever evaluated
FALSEnever evaluated
igncase == 0Description
TRUEnever evaluated
FALSEnever evaluated
(((hint_len ==...en ))) == 0)))Description
TRUEnever evaluated
FALSEnever evaluated
(alias)[0] == (hint)[0]Description
TRUEnever evaluated
FALSEnever evaluated
(__extension__...t_len ))) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...p ( hint_len )Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( alias )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( alias... ( hint_len ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( hint )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( hint ... ( hint_len ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1951 return (savestring (alias));
never executed: return ((char *)strcpy (sh_xmalloc((1 + strlen (alias)), "bashline.c", 1951), (alias)));
0
1952 else if (igncase && strncasecmp (alias, hint, hint_len) == 0)
igncaseDescription
TRUEnever evaluated
FALSEnever evaluated
strncasecmp (a...hint_len) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1953 return (savestring (alias));
never executed: return ((char *)strcpy (sh_xmalloc((1 + strlen (alias)), "bashline.c", 1953), (alias)));
0
1954 }
never executed: end of block
0
1955#endif /* ALIAS */-
1956 local_index = 0;-
1957 mapping_over++;-
1958-
1959 case 1: /* Then shell reserved words. */
code before this statement never executed: case 1:
never executed: case 1:
0
1960 {-
1961 while (word_token_alist[local_index].word)
word_token_ali...al_index].wordDescription
TRUEnever evaluated
FALSEnever evaluated
0
1962 {-
1963 register char *reserved_word;-
1964-
1965 reserved_word = word_token_alist[local_index++].word;-
1966-
1967 if (STREQN (reserved_word, hint, hint_len))
never executed: __result = (((const unsigned char *) (const char *) ( reserved_word ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( hint ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
((hint_len == ...len ))) == 0))Description
TRUEnever evaluated
FALSEnever evaluated
(hint_len == 0)Description
TRUEnever evaluated
FALSEnever evaluated
(reserved_word...] == (hint)[0]Description
TRUEnever evaluated
FALSEnever evaluated
(__extension__...t_len ))) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...p ( hint_len )Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...eserved_word )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( reser... ( hint_len ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( hint )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( hint ... ( hint_len ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1968 return (savestring (reserved_word));
never executed: return ((char *)strcpy (sh_xmalloc((1 + strlen (reserved_word)), "bashline.c", 1968), (reserved_word)));
0
1969 }
never executed: end of block
0
1970 local_index = 0;-
1971 mapping_over++;-
1972 }-
1973-
1974 case 2: /* Then function names. */
code before this statement never executed: case 2:
never executed: case 2:
0
1975 while (varlist && varlist[local_index])
varlistDescription
TRUEnever evaluated
FALSEnever evaluated
varlist[local_index]Description
TRUEnever evaluated
FALSEnever evaluated
0
1976 {-
1977 register char *varname;-
1978-
1979 varname = varlist[local_index++]->name;-
1980-
1981 /* Honor completion-ignore-case for shell function names. */-
1982 if (igncase == 0 && (STREQN (varname, hint, hint_len)))
never executed: __result = (((const unsigned char *) (const char *) ( varname ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( hint ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(hint_len == 0)Description
TRUEnever evaluated
FALSEnever evaluated
igncase == 0Description
TRUEnever evaluated
FALSEnever evaluated
(((hint_len ==...en ))) == 0)))Description
TRUEnever evaluated
FALSEnever evaluated
(varname)[0] == (hint)[0]Description
TRUEnever evaluated
FALSEnever evaluated
(__extension__...t_len ))) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...p ( hint_len )Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons..._p ( varname )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( varna... ( hint_len ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( hint )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( hint ... ( hint_len ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1983 return (savestring (varname));
never executed: return ((char *)strcpy (sh_xmalloc((1 + strlen (varname)), "bashline.c", 1983), (varname)));
0
1984 else if (igncase && strncasecmp (varname, hint, hint_len) == 0)
igncaseDescription
TRUEnever evaluated
FALSEnever evaluated
strncasecmp (v...hint_len) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1985 return (savestring (varname));
never executed: return ((char *)strcpy (sh_xmalloc((1 + strlen (varname)), "bashline.c", 1985), (varname)));
0
1986 }
never executed: end of block
0
1987 local_index = 0;-
1988 mapping_over++;-
1989-
1990 case 3: /* Then shell builtins. */
code before this statement never executed: case 3:
never executed: case 3:
0
1991 for (; local_index < num_shell_builtins; local_index++)
local_index < ...shell_builtinsDescription
TRUEnever evaluated
FALSEnever evaluated
0
1992 {-
1993 /* Ignore it if it doesn't have a function pointer or if it-
1994 is not currently enabled. */-
1995 if (!shell_builtins[local_index].function ||
!shell_builtin...ndex].functionDescription
TRUEnever evaluated
FALSEnever evaluated
0
1996 (shell_builtins[local_index].flags & BUILTIN_ENABLED) == 0)
(shell_builtin...s & 0x01) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1997 continue;
never executed: continue;
0
1998-
1999 if (STREQN (shell_builtins[local_index].name, hint, hint_len))
never executed: __result = (((const unsigned char *) (const char *) ( shell_builtins[local_index].name ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( hint ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
((hint_len == ...len ))) == 0))Description
TRUEnever evaluated
FALSEnever evaluated
(hint_len == 0)Description
TRUEnever evaluated
FALSEnever evaluated
(shell_builtin...] == (hint)[0]Description
TRUEnever evaluated
FALSEnever evaluated
(__extension__...t_len ))) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...p ( hint_len )Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons..._index].name )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( shell... ( hint_len ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( hint )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( hint ... ( hint_len ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2000 {-
2001 int i = local_index++;-
2002-
2003 return (savestring (shell_builtins[i].name));
never executed: return ((char *)strcpy (sh_xmalloc((1 + strlen (shell_builtins[i].name)), "bashline.c", 2003), (shell_builtins[i].name)));
0
2004 }-
2005 }
never executed: end of block
0
2006 local_index = 0;-
2007 mapping_over++;-
2008 }
never executed: end of block
0
2009-
2010globword:
code before this statement never executed: globword:
0
2011 /* Limited support for completing command words with globbing chars. Only-
2012 a single match (multiple matches that end up reducing the number of-
2013 characters in the common prefix are bad) will ever be returned on-
2014 regular completion. */-
2015 if (globpat)
globpatDescription
TRUEnever evaluated
FALSEnever evaluated
0
2016 {-
2017 if (state == 0)
state == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2018 {-
2019 glob_ignore_case = igncase;-
2020 glob_matches = shell_glob_filename (hint);-
2021 glob_ignore_case = old_glob_ignore_case;-
2022-
2023 if (GLOB_FAILED (glob_matches) || glob_matches == 0)
(glob_matches)...b_error_returnDescription
TRUEnever evaluated
FALSEnever evaluated
glob_matches == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2024 {-
2025 glob_matches = (char **)NULL;-
2026 return ((char *)NULL);
never executed: return ((char *) ((void *)0) );
0
2027 }-
2028-
2029 local_index = 0;-
2030 -
2031 if (glob_matches[1] && rl_completion_type == TAB) /* multiple matches are bad */
glob_matches[1]Description
TRUEnever evaluated
FALSEnever evaluated
rl_completion_type == '\t'Description
TRUEnever evaluated
FALSEnever evaluated
0
2032 return ((char *)NULL);
never executed: return ((char *) ((void *)0) );
0
2033 }
never executed: end of block
0
2034-
2035 while (val = glob_matches[local_index++])
val = glob_mat...local_index++]Description
TRUEnever evaluated
FALSEnever evaluated
0
2036 {-
2037 if (executable_or_directory (val))
executable_or_directory (val)Description
TRUEnever evaluated
FALSEnever evaluated
0
2038 {-
2039 if (*hint_text == '~' && directory_part)
*hint_text == '~'Description
TRUEnever evaluated
FALSEnever evaluated
directory_partDescription
TRUEnever evaluated
FALSEnever evaluated
0
2040 {-
2041 temp = maybe_restore_tilde (val, directory_part);-
2042 free (val);-
2043 val = temp;-
2044 }
never executed: end of block
0
2045 return (val);
never executed: return (val);
0
2046 }-
2047 free (val);-
2048 }
never executed: end of block
0
2049-
2050 glob_ignore_case = old_glob_ignore_case;-
2051 return ((char *)NULL);
never executed: return ((char *) ((void *)0) );
0
2052 }-
2053-
2054 /* If the text passed is a directory in the current directory, return it-
2055 as a possible match. Executables in directories in the current-
2056 directory can be specified using relative pathnames and successfully-
2057 executed even when `.' is not in $PATH. */-
2058 if (hint_is_dir)
hint_is_dirDescription
TRUEnever evaluated
FALSEnever evaluated
0
2059 {-
2060 hint_is_dir = 0; /* only return the hint text once */-
2061 return (savestring (hint_text));
never executed: return ((char *)strcpy (sh_xmalloc((1 + strlen (hint_text)), "bashline.c", 2061), (hint_text)));
0
2062 }-
2063 -
2064 /* Repeatedly call filename_completion_function while we have-
2065 members of PATH left. Question: should we stat each file?-
2066 Answer: we call executable_file () on each file. */-
2067 outer:
code before this statement never executed: outer:
0
2068-
2069 istate = (val != (char *)NULL);-
2070-
2071 if (istate == 0)
istate == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2072 {-
2073 char *current_path;-
2074-
2075 /* Get the next directory from the path. If there is none, then we-
2076 are all done. */-
2077 if (path == 0 || path[path_index] == 0 ||
path == 0Description
TRUEnever evaluated
FALSEnever evaluated
path[path_index] == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2078 (current_path = extract_colon_unit (path, &path_index)) == 0)
(current_path ...h_index)) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2079 return ((char *)NULL);
never executed: return ((char *) ((void *)0) );
0
2080-
2081 searching_path = 1;-
2082 if (*current_path == 0)
*current_path == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2083 {-
2084 free (current_path);-
2085 current_path = savestring (".");-
2086 }
never executed: end of block
0
2087-
2088 if (*current_path == '~')
*current_path == '~'Description
TRUEnever evaluated
FALSEnever evaluated
0
2089 {-
2090 char *t;-
2091-
2092 t = bash_tilde_expand (current_path, 0);-
2093 free (current_path);-
2094 current_path = t;-
2095 }
never executed: end of block
0
2096-
2097 if (current_path[0] == '.' && current_path[1] == '\0')
current_path[0] == '.'Description
TRUEnever evaluated
FALSEnever evaluated
current_path[1] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
2098 dot_in_path = 1;
never executed: dot_in_path = 1;
0
2099-
2100 if (fnhint && fnhint != filename_hint)
fnhintDescription
TRUEnever evaluated
FALSEnever evaluated
fnhint != filename_hintDescription
TRUEnever evaluated
FALSEnever evaluated
0
2101 free (fnhint);
never executed: sh_xfree((fnhint), "bashline.c", 2101);
0
2102 if (filename_hint)
filename_hintDescription
TRUEnever evaluated
FALSEnever evaluated
0
2103 free (filename_hint);
never executed: sh_xfree((filename_hint), "bashline.c", 2103);
0
2104-
2105 filename_hint = sh_makepath (current_path, hint, 0);-
2106 /* Need a quoted version (though it doesn't matter much in most-
2107 cases) because rl_filename_completion_function dequotes the-
2108 filename it gets, assuming that it's been quoted as part of-
2109 the input line buffer. */-
2110 if (strpbrk (filename_hint, "\"'\\"))
__builtin_strp...nt , "\"'\\" )Description
TRUEnever evaluated
FALSEnever evaluated
0
2111 fnhint = sh_backslash_quote (filename_hint, filename_bstab, 0);
never executed: fnhint = sh_backslash_quote (filename_hint, filename_bstab, 0);
0
2112 else-
2113 fnhint = filename_hint;
never executed: fnhint = filename_hint;
0
2114 free (current_path); /* XXX */-
2115 }
never executed: end of block
0
2116-
2117 inner:
code before this statement never executed: inner:
0
2118 val = rl_filename_completion_function (fnhint, istate);-
2119 if (mapping_over == 4 && dircomplete_expand)
mapping_over == 4Description
TRUEnever evaluated
FALSEnever evaluated
dircomplete_expandDescription
TRUEnever evaluated
FALSEnever evaluated
0
2120 set_directory_hook ();
never executed: set_directory_hook ();
0
2121-
2122 istate = 1;-
2123-
2124 if (val == 0)
val == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2125 {-
2126 /* If the hint text is an absolute program, then don't bother-
2127 searching through PATH. */-
2128 if (absolute_program (hint))
absolute_program (hint)Description
TRUEnever evaluated
FALSEnever evaluated
0
2129 return ((char *)NULL);
never executed: return ((char *) ((void *)0) );
0
2130-
2131 goto outer;
never executed: goto outer;
0
2132 }-
2133 else-
2134 {-
2135 int match, freetemp;-
2136-
2137 if (absolute_program (hint))
absolute_program (hint)Description
TRUEnever evaluated
FALSEnever evaluated
0
2138 {-
2139 if (igncase == 0)
igncase == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2140 match = strncmp (val, hint, hint_len) == 0;
never executed: match = (__extension__ (__builtin_constant_p ( hint_len ) && ((__builtin_constant_p ( val ) && strlen ( val ) < ((size_t) ( hint_len ))) || (__builtin_constant_p ( hint ) && strlen ( hint ) < ((size_t) ( hint_len )))) ? __extension__ ({ size_t __s1_len, _...(const char *) ( hint ))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ( hint ))[3] - __s2[3]); } } __result; }))) : __builtin_strcmp ( val , hint )))); }) : strncmp ( val , hint , hint_len ))) == 0;
never executed: __result = (((const unsigned char *) (const char *) ( val ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( hint ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
__builtin_cons...p ( hint_len )Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( val )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( val )... ( hint_len ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( hint )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( hint ... ( hint_len ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2141 else-
2142 match = strncasecmp (val, hint, hint_len) == 0;
never executed: match = strncasecmp (val, hint, hint_len) == 0;
0
2143-
2144 /* If we performed tilde expansion, restore the original-
2145 filename. */-
2146 if (*hint_text == '~')
*hint_text == '~'Description
TRUEnever evaluated
FALSEnever evaluated
0
2147 temp = maybe_restore_tilde (val, directory_part);
never executed: temp = maybe_restore_tilde (val, directory_part);
0
2148 else-
2149 temp = savestring (val);
never executed: temp = (char *)strcpy (sh_xmalloc((1 + strlen (val)), "bashline.c", 2149), (val));
0
2150 freetemp = 1;-
2151 }
never executed: end of block
0
2152 else-
2153 {-
2154 temp = strrchr (val, '/');-
2155-
2156 if (temp)
tempDescription
TRUEnever evaluated
FALSEnever evaluated
0
2157 {-
2158 temp++;-
2159 if (igncase == 0)
igncase == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2160 freetemp = match = strncmp (temp, hint, hint_len) == 0;
never executed: freetemp = match = (__extension__ (__builtin_constant_p ( hint_len ) && ((__builtin_constant_p ( temp ) && strlen ( temp ) < ((size_t) ( hint_len ))) || (__builtin_constant_p ( hint ) && strlen ( hint ) < ((size_t) ( hint_len )))) ? __extension__ ({ size_...onst char *) ( hint ))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ( hint ))[3] - __s2[3]); } } __result; }))) : __builtin_strcmp ( temp , hint )))); }) : strncmp ( temp , hint , hint_len ))) == 0;
never executed: __result = (((const unsigned char *) (const char *) ( temp ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( hint ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
__builtin_cons...p ( hint_len )Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( temp )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( temp ... ( hint_len ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( hint )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( hint ... ( hint_len ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2161 else-
2162 freetemp = match = strncasecmp (temp, hint, hint_len) == 0;
never executed: freetemp = match = strncasecmp (temp, hint, hint_len) == 0;
0
2163 if (match)
matchDescription
TRUEnever evaluated
FALSEnever evaluated
0
2164 temp = savestring (temp);
never executed: temp = (char *)strcpy (sh_xmalloc((1 + strlen (temp)), "bashline.c", 2164), (temp));
0
2165 }
never executed: end of block
0
2166 else-
2167 freetemp = match = 0;
never executed: freetemp = match = 0;
0
2168 }-
2169-
2170 /* If we have found a match, and it is an executable file, return it.-
2171 We don't return directory names when searching $PATH, since the-
2172 bash execution code won't find executables in directories which-
2173 appear in directories in $PATH when they're specified using-
2174 relative pathnames. */-
2175#if 0-
2176 /* If we're not searching $PATH and we have a relative pathname, we-
2177 need to re-canonicalize it before testing whether or not it's an-
2178 executable or a directory so the shell treats .. relative to $PWD-
2179 according to the physical/logical option. The shell already-
2180 canonicalizes the directory name in order to tell readline where-
2181 to look, so not doing it here will be inconsistent. */-
2182 /* XXX -- currently not used -- will introduce more inconsistency,-
2183 since shell does not canonicalize ../foo before passing it to-
2184 shell_execve(). */-
2185 if (match && searching_path == 0 && *val == '.')-
2186 {-
2187 char *t, *t1;-
2188-
2189 t = get_working_directory ("command-word-completion");-
2190 t1 = make_absolute (val, t);-
2191 free (t);-
2192 cval = sh_canonpath (t1, PATH_CHECKDOTDOT|PATH_CHECKEXISTS);-
2193 }-
2194 else-
2195#endif-
2196 cval = val;-
2197-
2198 if (match && executable_completion ((searching_path ? val : cval), searching_path))
matchDescription
TRUEnever evaluated
FALSEnever evaluated
executable_com...earching_path)Description
TRUEnever evaluated
FALSEnever evaluated
0
2199 {-
2200 if (cval != val)
cval != valDescription
TRUEnever evaluated
FALSEnever evaluated
0
2201 free (cval);
never executed: sh_xfree((cval), "bashline.c", 2201);
0
2202 free (val);-
2203 val = ""; /* So it won't be NULL. */-
2204 return (temp);
never executed: return (temp);
0
2205 }-
2206 else-
2207 {-
2208 if (freetemp)
freetempDescription
TRUEnever evaluated
FALSEnever evaluated
0
2209 free (temp);
never executed: sh_xfree((temp), "bashline.c", 2209);
0
2210 if (cval != val)
cval != valDescription
TRUEnever evaluated
FALSEnever evaluated
0
2211 free (cval);
never executed: sh_xfree((cval), "bashline.c", 2211);
0
2212 free (val);-
2213 goto inner;
never executed: goto inner;
0
2214 }-
2215 }-
2216}-
2217-
2218/* Completion inside an unterminated command substitution. */-
2219static char *-
2220command_subst_completion_function (text, state)-
2221 const char *text;-
2222 int state;-
2223{-
2224 static char **matches = (char **)NULL;-
2225 static const char *orig_start;-
2226 static char *filename_text = (char *)NULL;-
2227 static int cmd_index, start_len;-
2228 char *value;-
2229-
2230 if (state == 0)
state == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2231 {-
2232 if (filename_text)
filename_textDescription
TRUEnever evaluated
FALSEnever evaluated
0
2233 free (filename_text);
never executed: sh_xfree((filename_text), "bashline.c", 2233);
0
2234 orig_start = text;-
2235 if (*text == '`')
*text == '`'Description
TRUEnever evaluated
FALSEnever evaluated
0
2236 text++;
never executed: text++;
0
2237 else if (*text == '$' && text[1] == '(') /* ) */
*text == '$'Description
TRUEnever evaluated
FALSEnever evaluated
text[1] == '('Description
TRUEnever evaluated
FALSEnever evaluated
0
2238 text += 2;
never executed: text += 2;
0
2239 /* If the text was quoted, suppress any quote character that the-
2240 readline completion code would insert. */-
2241 rl_completion_suppress_quote = 1;-
2242 start_len = text - orig_start;-
2243 filename_text = savestring (text);-
2244 if (matches)
matchesDescription
TRUEnever evaluated
FALSEnever evaluated
0
2245 free (matches);
never executed: sh_xfree((matches), "bashline.c", 2245);
0
2246-
2247 /*-
2248 * At this point we can entertain the idea of re-parsing-
2249 * `filename_text' into a (possibly incomplete) command name and-
2250 * arguments, and doing completion based on that. This is-
2251 * currently very rudimentary, but it is a small improvement.-
2252 */-
2253 for (value = filename_text + strlen (filename_text) - 1; value > filename_text; value--)
value > filename_textDescription
TRUEnever evaluated
FALSEnever evaluated
0
2254 if (whitespace (*value) || member (*value, COMMAND_SEPARATORS))
(*value)Description
TRUEnever evaluated
FALSEnever evaluated
((*value) == ' ')Description
TRUEnever evaluated
FALSEnever evaluated
((*value) == '\t')Description
TRUEnever evaluated
FALSEnever evaluated
((*value) ? ((...id *)0) ) : 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
2255 break;
never executed: break;
0
2256 if (value <= filename_text)
value <= filename_textDescription
TRUEnever evaluated
FALSEnever evaluated
0
2257 matches = rl_completion_matches (filename_text, command_word_completion_function);
never executed: matches = rl_completion_matches (filename_text, command_word_completion_function);
0
2258 else-
2259 {-
2260 value++;-
2261 start_len += value - filename_text;-
2262 if (whitespace (value[-1]))
((value[-1]) == ' ')Description
TRUEnever evaluated
FALSEnever evaluated
((value[-1]) == '\t')Description
TRUEnever evaluated
FALSEnever evaluated
0
2263 matches = rl_completion_matches (value, rl_filename_completion_function);
never executed: matches = rl_completion_matches (value, rl_filename_completion_function);
0
2264 else-
2265 matches = rl_completion_matches (value, command_word_completion_function);
never executed: matches = rl_completion_matches (value, command_word_completion_function);
0
2266 }-
2267-
2268 /* If there is more than one match, rl_completion_matches has already-
2269 put the lcd in matches[0]. Skip over it. */-
2270 cmd_index = matches && matches[0] && matches[1];
matchesDescription
TRUEnever evaluated
FALSEnever evaluated
matches[0]Description
TRUEnever evaluated
FALSEnever evaluated
matches[1]Description
TRUEnever evaluated
FALSEnever evaluated
0
2271-
2272 /* If there's a single match and it's a directory, set the append char-
2273 to the expected `/'. Otherwise, don't append anything. */-
2274 if (matches && matches[0] && matches[1] == 0 && test_for_directory (matches[0]))
matchesDescription
TRUEnever evaluated
FALSEnever evaluated
matches[0]Description
TRUEnever evaluated
FALSEnever evaluated
matches[1] == 0Description
TRUEnever evaluated
FALSEnever evaluated
test_for_direc...y (matches[0])Description
TRUEnever evaluated
FALSEnever evaluated
0
2275 rl_completion_append_character = '/';
never executed: rl_completion_append_character = '/';
0
2276 else-
2277 rl_completion_suppress_append = 1;
never executed: rl_completion_suppress_append = 1;
0
2278 }-
2279-
2280 if (matches == 0 || matches[cmd_index] == 0)
matches == 0Description
TRUEnever evaluated
FALSEnever evaluated
matches[cmd_index] == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2281 {-
2282 rl_filename_quoting_desired = 0; /* disable quoting */-
2283 return ((char *)NULL);
never executed: return ((char *) ((void *)0) );
0
2284 }-
2285 else-
2286 {-
2287 value = (char *)xmalloc (1 + start_len + strlen (matches[cmd_index]));-
2288-
2289 if (start_len == 1)
start_len == 1Description
TRUEnever evaluated
FALSEnever evaluated
0
2290 value[0] = *orig_start;
never executed: value[0] = *orig_start;
0
2291 else-
2292 strncpy (value, orig_start, start_len);
never executed: __builtin_strncpy ( value , orig_start , start_len ) ;
0
2293-
2294 strcpy (value + start_len, matches[cmd_index]);-
2295-
2296 cmd_index++;-
2297 return (value);
never executed: return (value);
0
2298 }-
2299}-
2300-
2301/* Okay, now we write the entry_function for variable completion. */-
2302static char *-
2303variable_completion_function (text, state)-
2304 const char *text;-
2305 int state;-
2306{-
2307 static char **varlist = (char **)NULL;-
2308 static int varlist_index;-
2309 static char *varname = (char *)NULL;-
2310 static int first_char, first_char_loc;-
2311-
2312 if (!state)
!stateDescription
TRUEnever evaluated
FALSEnever evaluated
0
2313 {-
2314 if (varname)
varnameDescription
TRUEnever evaluated
FALSEnever evaluated
0
2315 free (varname);
never executed: sh_xfree((varname), "bashline.c", 2315);
0
2316-
2317 first_char_loc = 0;-
2318 first_char = text[0];-
2319-
2320 if (first_char == '$')
first_char == '$'Description
TRUEnever evaluated
FALSEnever evaluated
0
2321 first_char_loc++;
never executed: first_char_loc++;
0
2322-
2323 if (text[first_char_loc] == '{')
text[first_char_loc] == '{'Description
TRUEnever evaluated
FALSEnever evaluated
0
2324 first_char_loc++;
never executed: first_char_loc++;
0
2325-
2326 varname = savestring (text + first_char_loc);-
2327-
2328 if (varlist)
varlistDescription
TRUEnever evaluated
FALSEnever evaluated
0
2329 strvec_dispose (varlist);
never executed: strvec_dispose (varlist);
0
2330-
2331 varlist = all_variables_matching_prefix (varname);-
2332 varlist_index = 0;-
2333 }
never executed: end of block
0
2334-
2335 if (!varlist || !varlist[varlist_index])
!varlistDescription
TRUEnever evaluated
FALSEnever evaluated
!varlist[varlist_index]Description
TRUEnever evaluated
FALSEnever evaluated
0
2336 {-
2337 return ((char *)NULL);
never executed: return ((char *) ((void *)0) );
0
2338 }-
2339 else-
2340 {-
2341 char *value;-
2342-
2343 value = (char *)xmalloc (4 + strlen (varlist[varlist_index]));-
2344-
2345 if (first_char_loc)
first_char_locDescription
TRUEnever evaluated
FALSEnever evaluated
0
2346 {-
2347 value[0] = first_char;-
2348 if (first_char_loc == 2)
first_char_loc == 2Description
TRUEnever evaluated
FALSEnever evaluated
0
2349 value[1] = '{';
never executed: value[1] = '{';
0
2350 }
never executed: end of block
0
2351-
2352 strcpy (value + first_char_loc, varlist[varlist_index]);-
2353 if (first_char_loc == 2)
first_char_loc == 2Description
TRUEnever evaluated
FALSEnever evaluated
0
2354 strcat (value, "}");
never executed: strcat (value, "}");
0
2355-
2356 varlist_index++;-
2357 return (value);
never executed: return (value);
0
2358 }-
2359}-
2360-
2361/* How about a completion function for hostnames? */-
2362static char *-
2363hostname_completion_function (text, state)-
2364 const char *text;-
2365 int state;-
2366{-
2367 static char **list = (char **)NULL;-
2368 static int list_index = 0;-
2369 static int first_char, first_char_loc;-
2370-
2371 /* If we don't have any state, make some. */-
2372 if (state == 0)
state == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2373 {-
2374 FREE (list);
never executed: sh_xfree((list), "bashline.c", 2374);
listDescription
TRUEnever evaluated
FALSEnever evaluated
0
2375-
2376 list = (char **)NULL;-
2377-
2378 first_char_loc = 0;-
2379 first_char = *text;-
2380-
2381 if (first_char == '@')
first_char == '@'Description
TRUEnever evaluated
FALSEnever evaluated
0
2382 first_char_loc++;
never executed: first_char_loc++;
0
2383-
2384 list = hostnames_matching ((char *)text+first_char_loc);-
2385 list_index = 0;-
2386 }
never executed: end of block
0
2387-
2388 if (list && list[list_index])
listDescription
TRUEnever evaluated
FALSEnever evaluated
list[list_index]Description
TRUEnever evaluated
FALSEnever evaluated
0
2389 {-
2390 char *t;-
2391-
2392 t = (char *)xmalloc (2 + strlen (list[list_index]));-
2393 *t = first_char;-
2394 strcpy (t + first_char_loc, list[list_index]);-
2395 list_index++;-
2396 return (t);
never executed: return (t);
0
2397 }-
2398-
2399 return ((char *)NULL);
never executed: return ((char *) ((void *)0) );
0
2400}-
2401-
2402/*-
2403 * A completion function for service names from /etc/services (or wherever).-
2404 */-
2405char *-
2406bash_servicename_completion_function (text, state)-
2407 const char *text;-
2408 int state;-
2409{-
2410#if defined (__WIN32__) || defined (__OPENNT) || !defined (HAVE_GETSERVENT)-
2411 return ((char *)NULL);-
2412#else-
2413 static char *sname = (char *)NULL;-
2414 static struct servent *srvent;-
2415 static int snamelen;-
2416 char *value;-
2417 char **alist, *aentry;-
2418 int afound;-
2419-
2420 if (state == 0)
state == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2421 {-
2422 FREE (sname);
never executed: sh_xfree((sname), "bashline.c", 2422);
snameDescription
TRUEnever evaluated
FALSEnever evaluated
0
2423-
2424 sname = savestring (text);-
2425 snamelen = strlen (sname);-
2426 setservent (0);-
2427 }
never executed: end of block
0
2428-
2429 while (srvent = getservent ())
srvent = getservent ()Description
TRUEnever evaluated
FALSEnever evaluated
0
2430 {-
2431 afound = 0;-
2432 if (snamelen == 0 || (STREQN (sname, srvent->s_name, snamelen)))
never executed: __result = (((const unsigned char *) (const char *) ( sname ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( srvent->s_name ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(snamelen == 0)Description
TRUEnever evaluated
FALSEnever evaluated
snamelen == 0Description
TRUEnever evaluated
FALSEnever evaluated
(((snamelen ==...en ))) == 0)))Description
TRUEnever evaluated
FALSEnever evaluated
(sname)[0] == ...nt->s_name)[0]Description
TRUEnever evaluated
FALSEnever evaluated
(__extension__...melen ))) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...p ( snamelen )Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( sname )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( sname... ( snamelen ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...vent->s_name )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( srven... ( snamelen ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2433 break;
never executed: break;
0
2434 /* Not primary, check aliases */-
2435 for (alist = srvent->s_aliases; *alist; alist++)
*alistDescription
TRUEnever evaluated
FALSEnever evaluated
0
2436 {-
2437 aentry = *alist;-
2438 if (STREQN (sname, aentry, snamelen))
never executed: __result = (((const unsigned char *) (const char *) ( sname ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( aentry ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
((snamelen == ...len ))) == 0))Description
TRUEnever evaluated
FALSEnever evaluated
(snamelen == 0)Description
TRUEnever evaluated
FALSEnever evaluated
(sname)[0] == (aentry)[0]Description
TRUEnever evaluated
FALSEnever evaluated
(__extension__...melen ))) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...p ( snamelen )Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( sname )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( sname... ( snamelen ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...t_p ( aentry )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( aentr... ( snamelen ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2439 {-
2440 afound = 1;-
2441 break;
never executed: break;
0
2442 }-
2443 }
never executed: end of block
0
2444-
2445 if (afound)
afoundDescription
TRUEnever evaluated
FALSEnever evaluated
0
2446 break;
never executed: break;
0
2447 }
never executed: end of block
0
2448-
2449 if (srvent == 0)
srvent == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2450 {-
2451 endservent ();-
2452 return ((char *)NULL);
never executed: return ((char *) ((void *)0) );
0
2453 }-
2454-
2455 value = afound ? savestring (aentry) : savestring (srvent->s_name);
afoundDescription
TRUEnever evaluated
FALSEnever evaluated
0
2456 return value;
never executed: return value;
0
2457#endif-
2458}-
2459-
2460/*-
2461 * A completion function for group names from /etc/group (or wherever).-
2462 */-
2463char *-
2464bash_groupname_completion_function (text, state)-
2465 const char *text;-
2466 int state;-
2467{-
2468#if defined (__WIN32__) || defined (__OPENNT) || !defined (HAVE_GRP_H)-
2469 return ((char *)NULL);-
2470#else-
2471 static char *gname = (char *)NULL;-
2472 static struct group *grent;-
2473 static int gnamelen;-
2474 char *value;-
2475-
2476 if (state == 0)
state == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2477 {-
2478 FREE (gname);
never executed: sh_xfree((gname), "bashline.c", 2478);
gnameDescription
TRUEnever evaluated
FALSEnever evaluated
0
2479 gname = savestring (text);-
2480 gnamelen = strlen (gname);-
2481-
2482 setgrent ();-
2483 }
never executed: end of block
0
2484-
2485 while (grent = getgrent ())
grent = getgrent ()Description
TRUEnever evaluated
FALSEnever evaluated
0
2486 {-
2487 if (gnamelen == 0 || (STREQN (gname, grent->gr_name, gnamelen)))
never executed: __result = (((const unsigned char *) (const char *) ( gname ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( grent->gr_name ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(gnamelen == 0)Description
TRUEnever evaluated
FALSEnever evaluated
gnamelen == 0Description
TRUEnever evaluated
FALSEnever evaluated
(((gnamelen ==...en ))) == 0)))Description
TRUEnever evaluated
FALSEnever evaluated
(gname)[0] == ...t->gr_name)[0]Description
TRUEnever evaluated
FALSEnever evaluated
(__extension__...melen ))) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...p ( gnamelen )Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( gname )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( gname... ( gnamelen ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...ent->gr_name )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( grent... ( gnamelen ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2488 break;
never executed: break;
0
2489 }
never executed: end of block
0
2490-
2491 if (grent == 0)
grent == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2492 {-
2493 endgrent ();-
2494 return ((char *)NULL);
never executed: return ((char *) ((void *)0) );
0
2495 }-
2496-
2497 value = savestring (grent->gr_name);-
2498 return (value);
never executed: return (value);
0
2499#endif-
2500}-
2501-
2502/* Functions to perform history and alias expansions on the current line. */-
2503-
2504#if defined (BANG_HISTORY)-
2505/* Perform history expansion on the current line. If no history expansion-
2506 is done, pre_process_line() returns what it was passed, so we need to-
2507 allocate a new line here. */-
2508static char *-
2509history_expand_line_internal (line)-
2510 char *line;-
2511{-
2512 char *new_line;-
2513 int old_verify;-
2514-
2515 old_verify = hist_verify;-
2516 hist_verify = 0;-
2517 new_line = pre_process_line (line, 0, 0);-
2518 hist_verify = old_verify;-
2519-
2520 return (new_line == line) ? savestring (line) : new_line;
never executed: return (new_line == line) ? (char *)strcpy (sh_xmalloc((1 + strlen (line)), "bashline.c", 2520), (line)) : new_line;
0
2521}-
2522#endif-
2523-
2524/* There was an error in expansion. Let the preprocessor print-
2525 the error here. */-
2526static void-
2527cleanup_expansion_error ()-
2528{-
2529 char *to_free;-
2530#if defined (BANG_HISTORY)-
2531 int old_verify;-
2532-
2533 old_verify = hist_verify;-
2534 hist_verify = 0;-
2535#endif-
2536-
2537 fprintf (rl_outstream, "\r\n");-
2538 to_free = pre_process_line (rl_line_buffer, 1, 0);-
2539#if defined (BANG_HISTORY)-
2540 hist_verify = old_verify;-
2541#endif-
2542 if (to_free != rl_line_buffer)
to_free != rl_line_bufferDescription
TRUEnever evaluated
FALSEnever evaluated
0
2543 FREE (to_free);
never executed: sh_xfree((to_free), "bashline.c", 2543);
never executed: end of block
to_freeDescription
TRUEnever evaluated
FALSEnever evaluated
0
2544 putc ('\r', rl_outstream);-
2545 rl_forced_update_display ();-
2546}
never executed: end of block
0
2547-
2548/* If NEW_LINE differs from what is in the readline line buffer, add an-
2549 undo record to get from the readline line buffer contents to the new-
2550 line and make NEW_LINE the current readline line. */-
2551static void-
2552maybe_make_readline_line (new_line)-
2553 char *new_line;-
2554{-
2555 if (new_line && strcmp (new_line, rl_line_buffer) != 0)
never executed: __result = (((const unsigned char *) (const char *) ( new_line ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( rl_line_buffer ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
new_lineDescription
TRUEnever evaluated
FALSEnever evaluated
__extension__ ... )))); }) != 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2556 {-
2557 rl_point = rl_end;-
2558-
2559 rl_add_undo (UNDO_BEGIN, 0, 0, 0);-
2560 rl_delete_text (0, rl_point);-
2561 rl_point = rl_end = rl_mark = 0;-
2562 rl_insert_text (new_line);-
2563 rl_add_undo (UNDO_END, 0, 0, 0);-
2564 }
never executed: end of block
0
2565}
never executed: end of block
0
2566-
2567/* Make NEW_LINE be the current readline line. This frees NEW_LINE. */-
2568static void-
2569set_up_new_line (new_line)-
2570 char *new_line;-
2571{-
2572 int old_point, at_end;-
2573-
2574 old_point = rl_point;-
2575 at_end = rl_point == rl_end;-
2576-
2577 /* If the line was history and alias expanded, then make that-
2578 be one thing to undo. */-
2579 maybe_make_readline_line (new_line);-
2580 free (new_line);-
2581-
2582 /* Place rl_point where we think it should go. */-
2583 if (at_end)
at_endDescription
TRUEnever evaluated
FALSEnever evaluated
0
2584 rl_point = rl_end;
never executed: rl_point = rl_end;
0
2585 else if (old_point < rl_end)
old_point < rl_endDescription
TRUEnever evaluated
FALSEnever evaluated
0
2586 {-
2587 rl_point = old_point;-
2588 if (!whitespace (rl_line_buffer[rl_point]))
((rl_line_buff...oint]) == ' ')Description
TRUEnever evaluated
FALSEnever evaluated
((rl_line_buff...int]) == '\t')Description
TRUEnever evaluated
FALSEnever evaluated
0
2589 rl_forward_word (1, 0);
never executed: rl_forward_word (1, 0);
0
2590 }
never executed: end of block
0
2591}
never executed: end of block
0
2592-
2593#if defined (ALIAS)-
2594/* Expand aliases in the current readline line. */-
2595static int-
2596alias_expand_line (count, ignore)-
2597 int count, ignore;-
2598{-
2599 char *new_line;-
2600-
2601 new_line = alias_expand (rl_line_buffer);-
2602-
2603 if (new_line)
new_lineDescription
TRUEnever evaluated
FALSEnever evaluated
0
2604 {-
2605 set_up_new_line (new_line);-
2606 return (0);
never executed: return (0);
0
2607 }-
2608 else-
2609 {-
2610 cleanup_expansion_error ();-
2611 return (1);
never executed: return (1);
0
2612 }-
2613}-
2614#endif-
2615-
2616#if defined (BANG_HISTORY)-
2617/* History expand the line. */-
2618static int-
2619history_expand_line (count, ignore)-
2620 int count, ignore;-
2621{-
2622 char *new_line;-
2623-
2624 new_line = history_expand_line_internal (rl_line_buffer);-
2625-
2626 if (new_line)
new_lineDescription
TRUEnever evaluated
FALSEnever evaluated
0
2627 {-
2628 set_up_new_line (new_line);-
2629 return (0);
never executed: return (0);
0
2630 }-
2631 else-
2632 {-
2633 cleanup_expansion_error ();-
2634 return (1);
never executed: return (1);
0
2635 }-
2636}-
2637-
2638/* Expand history substitutions in the current line and then insert a-
2639 space (hopefully close to where we were before). */-
2640static int-
2641tcsh_magic_space (count, ignore)-
2642 int count, ignore;-
2643{-
2644 int dist_from_end, old_point;-
2645-
2646 old_point = rl_point;-
2647 dist_from_end = rl_end - rl_point;-
2648 if (history_expand_line (count, ignore) == 0)
history_expand..., ignore) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2649 {-
2650 /* Try a simple heuristic from Stephen Gildea <gildea@intouchsys.com>.-
2651 This works if all expansions were before rl_point or if no expansions-
2652 were performed. */-
2653 rl_point = (old_point == 0) ? old_point : rl_end - dist_from_end;
(old_point == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
2654 rl_insert (1, ' ');-
2655 return (0);
never executed: return (0);
0
2656 }-
2657 else-
2658 return (1);
never executed: return (1);
0
2659}-
2660#endif /* BANG_HISTORY */-
2661-
2662/* History and alias expand the line. */-
2663static int-
2664history_and_alias_expand_line (count, ignore)-
2665 int count, ignore;-
2666{-
2667 char *new_line;-
2668-
2669 new_line = 0;-
2670#if defined (BANG_HISTORY)-
2671 new_line = history_expand_line_internal (rl_line_buffer);-
2672#endif-
2673-
2674#if defined (ALIAS)-
2675 if (new_line)
new_lineDescription
TRUEnever evaluated
FALSEnever evaluated
0
2676 {-
2677 char *alias_line;-
2678-
2679 alias_line = alias_expand (new_line);-
2680 free (new_line);-
2681 new_line = alias_line;-
2682 }
never executed: end of block
0
2683#endif /* ALIAS */-
2684-
2685 if (new_line)
new_lineDescription
TRUEnever evaluated
FALSEnever evaluated
0
2686 {-
2687 set_up_new_line (new_line);-
2688 return (0);
never executed: return (0);
0
2689 }-
2690 else-
2691 {-
2692 cleanup_expansion_error ();-
2693 return (1);
never executed: return (1);
0
2694 }-
2695}-
2696-
2697/* History and alias expand the line, then perform the shell word-
2698 expansions by calling expand_string. This can't use set_up_new_line()-
2699 because we want the variable expansions as a separate undo'able-
2700 set of operations. */-
2701static int-
2702shell_expand_line (count, ignore)-
2703 int count, ignore;-
2704{-
2705 char *new_line;-
2706 WORD_LIST *expanded_string;-
2707 WORD_DESC *w;-
2708-
2709 new_line = 0;-
2710#if defined (BANG_HISTORY)-
2711 new_line = history_expand_line_internal (rl_line_buffer);-
2712#endif-
2713-
2714#if defined (ALIAS)-
2715 if (new_line)
new_lineDescription
TRUEnever evaluated
FALSEnever evaluated
0
2716 {-
2717 char *alias_line;-
2718-
2719 alias_line = alias_expand (new_line);-
2720 free (new_line);-
2721 new_line = alias_line;-
2722 }
never executed: end of block
0
2723#endif /* ALIAS */-
2724-
2725 if (new_line)
new_lineDescription
TRUEnever evaluated
FALSEnever evaluated
0
2726 {-
2727 int old_point = rl_point;-
2728 int at_end = rl_point == rl_end;-
2729-
2730 /* If the line was history and alias expanded, then make that-
2731 be one thing to undo. */-
2732 maybe_make_readline_line (new_line);-
2733 free (new_line);-
2734-
2735 /* If there is variable expansion to perform, do that as a separate-
2736 operation to be undone. */-
2737-
2738#if 1-
2739 w = alloc_word_desc ();-
2740 w->word = savestring (rl_line_buffer);-
2741 w->flags = rl_explicit_arg ? (W_NOPROCSUB|W_NOCOMSUB) : 0;
rl_explicit_argDescription
TRUEnever evaluated
FALSEnever evaluated
0
2742 expanded_string = expand_word (w, rl_explicit_arg ? Q_HERE_DOCUMENT : 0);-
2743 dispose_word (w);-
2744#else-
2745 new_line = savestring (rl_line_buffer);-
2746 expanded_string = expand_string (new_line, 0);-
2747 FREE (new_line);-
2748#endif-
2749-
2750 if (expanded_string == 0)
expanded_string == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2751 {-
2752 new_line = (char *)xmalloc (1);-
2753 new_line[0] = '\0';-
2754 }
never executed: end of block
0
2755 else-
2756 {-
2757 new_line = string_list (expanded_string);-
2758 dispose_words (expanded_string);-
2759 }
never executed: end of block
0
2760-
2761 maybe_make_readline_line (new_line);-
2762 free (new_line);-
2763-
2764 /* Place rl_point where we think it should go. */-
2765 if (at_end)
at_endDescription
TRUEnever evaluated
FALSEnever evaluated
0
2766 rl_point = rl_end;
never executed: rl_point = rl_end;
0
2767 else if (old_point < rl_end)
old_point < rl_endDescription
TRUEnever evaluated
FALSEnever evaluated
0
2768 {-
2769 rl_point = old_point;-
2770 if (!whitespace (rl_line_buffer[rl_point]))
((rl_line_buff...oint]) == ' ')Description
TRUEnever evaluated
FALSEnever evaluated
((rl_line_buff...int]) == '\t')Description
TRUEnever evaluated
FALSEnever evaluated
0
2771 rl_forward_word (1, 0);
never executed: rl_forward_word (1, 0);
0
2772 }
never executed: end of block
0
2773 return 0;
never executed: return 0;
0
2774 }-
2775 else-
2776 {-
2777 cleanup_expansion_error ();-
2778 return 1;
never executed: return 1;
0
2779 }-
2780}-
2781-
2782/* If FIGNORE is set, then don't match files with the given suffixes when-
2783 completing filenames. If only one of the possibilities has an acceptable-
2784 suffix, delete the others, else just return and let the completer-
2785 signal an error. It is called by the completer when real-
2786 completions are done on filenames by the completer's internal-
2787 function, not for completion lists (M-?) and not on "other"-
2788 completion types, such as hostnames or commands. */-
2789-
2790static struct ignorevar fignore =-
2791{-
2792 "FIGNORE",-
2793 (struct ign *)0,-
2794 0,-
2795 (char *)0,-
2796 (sh_iv_item_func_t *) 0,-
2797};-
2798-
2799static void-
2800_ignore_completion_names (names, name_func)-
2801 char **names;-
2802 sh_ignore_func_t *name_func;-
2803{-
2804 char **newnames;-
2805 int idx, nidx;-
2806 char **oldnames;-
2807 int oidx;-
2808-
2809 /* If there is only one completion, see if it is acceptable. If it is-
2810 not, free it up. In any case, short-circuit and return. This is a-
2811 special case because names[0] is not the prefix of the list of names-
2812 if there is only one completion; it is the completion itself. */-
2813 if (names[1] == (char *)0)
names[1] == (char *)0Description
TRUEnever evaluated
FALSEnever evaluated
0
2814 {-
2815 if (force_fignore)
force_fignoreDescription
TRUEnever evaluated
FALSEnever evaluated
0
2816 if ((*name_func) (names[0]) == 0)
(*name_func) (names[0]) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2817 {-
2818 free (names[0]);-
2819 names[0] = (char *)NULL;-
2820 }
never executed: end of block
0
2821-
2822 return;
never executed: return;
0
2823 }-
2824-
2825 /* Allocate space for array to hold list of pointers to matching-
2826 filenames. The pointers are copied back to NAMES when done. */-
2827 for (nidx = 1; names[nidx]; nidx++)
names[nidx]Description
TRUEnever evaluated
FALSEnever evaluated
0
2828 ;
never executed: ;
0
2829 newnames = strvec_create (nidx + 1);-
2830-
2831 if (force_fignore == 0)
force_fignore == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2832 {-
2833 oldnames = strvec_create (nidx - 1);-
2834 oidx = 0;-
2835 }
never executed: end of block
0
2836-
2837 newnames[0] = names[0];-
2838 for (idx = nidx = 1; names[idx]; idx++)
names[idx]Description
TRUEnever evaluated
FALSEnever evaluated
0
2839 {-
2840 if ((*name_func) (names[idx]))
(*name_func) (names[idx])Description
TRUEnever evaluated
FALSEnever evaluated
0
2841 newnames[nidx++] = names[idx];
never executed: newnames[nidx++] = names[idx];
0
2842 else if (force_fignore == 0)
force_fignore == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2843 oldnames[oidx++] = names[idx];
never executed: oldnames[oidx++] = names[idx];
0
2844 else-
2845 free (names[idx]);
never executed: sh_xfree((names[idx]), "bashline.c", 2845);
0
2846 }-
2847-
2848 newnames[nidx] = (char *)NULL;-
2849-
2850 /* If none are acceptable then let the completer handle it. */-
2851 if (nidx == 1)
nidx == 1Description
TRUEnever evaluated
FALSEnever evaluated
0
2852 {-
2853 if (force_fignore)
force_fignoreDescription
TRUEnever evaluated
FALSEnever evaluated
0
2854 {-
2855 free (names[0]);-
2856 names[0] = (char *)NULL;-
2857 }
never executed: end of block
0
2858 else-
2859 free (oldnames);
never executed: sh_xfree((oldnames), "bashline.c", 2859);
0
2860-
2861 free (newnames);-
2862 return;
never executed: return;
0
2863 }-
2864-
2865 if (force_fignore == 0)
force_fignore == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2866 {-
2867 while (oidx)
oidxDescription
TRUEnever evaluated
FALSEnever evaluated
0
2868 free (oldnames[--oidx]);
never executed: sh_xfree((oldnames[--oidx]), "bashline.c", 2868);
0
2869 free (oldnames);-
2870 }
never executed: end of block
0
2871-
2872 /* If only one is acceptable, copy it to names[0] and return. */-
2873 if (nidx == 2)
nidx == 2Description
TRUEnever evaluated
FALSEnever evaluated
0
2874 {-
2875 free (names[0]);-
2876 names[0] = newnames[1];-
2877 names[1] = (char *)NULL;-
2878 free (newnames);-
2879 return;
never executed: return;
0
2880 }-
2881-
2882 /* Copy the acceptable names back to NAMES, set the new array end,-
2883 and return. */-
2884 for (nidx = 1; newnames[nidx]; nidx++)
newnames[nidx]Description
TRUEnever evaluated
FALSEnever evaluated
0
2885 names[nidx] = newnames[nidx];
never executed: names[nidx] = newnames[nidx];
0
2886 names[nidx] = (char *)NULL;-
2887 free (newnames);-
2888}
never executed: end of block
0
2889-
2890static int-
2891name_is_acceptable (name)-
2892 const char *name;-
2893{-
2894 struct ign *p;-
2895 int nlen;-
2896-
2897 for (nlen = strlen (name), p = fignore.ignores; p->val; p++)
p->valDescription
TRUEnever evaluated
FALSEnever evaluated
0
2898 {-
2899 if (nlen > p->len && p->len > 0 && STREQ (p->val, &name[nlen - p->len]))
never executed: __result = (((const unsigned char *) (const char *) ( p->val ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( &name[nlen - p->len] ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
nlen > p->lenDescription
TRUEnever evaluated
FALSEnever evaluated
p->len > 0Description
TRUEnever evaluated
FALSEnever evaluated
(p->val)[0] ==... - p->len])[0]Description
TRUEnever evaluated
FALSEnever evaluated
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2900 return (0);
never executed: return (0);
0
2901 }
never executed: end of block
0
2902-
2903 return (1);
never executed: return (1);
0
2904}-
2905-
2906#if 0-
2907static int-
2908ignore_dot_names (name)-
2909 char *name;-
2910{-
2911 return (name[0] != '.');-
2912}-
2913#endif-
2914-
2915static int-
2916filename_completion_ignore (names)-
2917 char **names;-
2918{-
2919#if 0-
2920 if (glob_dot_filenames == 0)-
2921 _ignore_completion_names (names, ignore_dot_names);-
2922#endif-
2923-
2924 setup_ignore_patterns (&fignore);-
2925-
2926 if (fignore.num_ignores == 0)
fignore.num_ignores == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
2927 return 0;
never executed: return 0;
0
2928-
2929 _ignore_completion_names (names, name_is_acceptable);-
2930-
2931 return 0;
never executed: return 0;
0
2932}-
2933-
2934/* Return 1 if NAME is a directory. NAME undergoes tilde expansion. */-
2935static int-
2936test_for_directory (name)-
2937 const char *name;-
2938{-
2939 char *fn;-
2940 int r;-
2941-
2942 fn = bash_tilde_expand (name, 0);-
2943 r = file_isdir (fn);-
2944 free (fn);-
2945-
2946 return (r);
never executed: return (r);
0
2947}-
2948-
2949/* Remove files from NAMES, leaving directories. */-
2950static int-
2951bash_ignore_filenames (names)-
2952 char **names;-
2953{-
2954 _ignore_completion_names (names, test_for_directory);-
2955 return 0;
never executed: return 0;
0
2956}-
2957-
2958static int-
2959return_zero (name)-
2960 const char *name;-
2961{-
2962 return 0;
never executed: return 0;
0
2963}-
2964-
2965static int-
2966bash_ignore_everything (names)-
2967 char **names;-
2968{-
2969 _ignore_completion_names (names, return_zero);-
2970 return 0;
never executed: return 0;
0
2971}-
2972-
2973/* Replace a tilde-prefix in VAL with a `~', assuming the user typed it. VAL-
2974 is an expanded filename. DIRECTORY_PART is the tilde-prefix portion-
2975 of the un-tilde-expanded version of VAL (what the user typed). */-
2976static char *-
2977restore_tilde (val, directory_part)-
2978 char *val, *directory_part;-
2979{-
2980 int l, vl, dl2, xl;-
2981 char *dh2, *expdir, *ret;-
2982-
2983 vl = strlen (val);-
2984-
2985 /* We need to duplicate the expansions readline performs on the directory-
2986 portion before passing it to our completion function. */-
2987 dh2 = directory_part ? bash_dequote_filename (directory_part, 0) : 0;
directory_partDescription
TRUEnever evaluated
FALSEnever evaluated
0
2988 bash_directory_expansion (&dh2);-
2989 dl2 = strlen (dh2);-
2990-
2991 expdir = bash_tilde_expand (directory_part, 0);-
2992 xl = strlen (expdir);-
2993 free (expdir);-
2994-
2995 /*-
2996 dh2 = unexpanded but dequoted tilde-prefix-
2997 dl2 = length of tilde-prefix-
2998 expdir = tilde-expanded tilde-prefix-
2999 xl = length of expanded tilde-prefix-
3000 l = length of remainder after tilde-prefix-
3001 */-
3002 l = (vl - xl) + 1;-
3003-
3004 ret = (char *)xmalloc (dl2 + 2 + l);-
3005 strcpy (ret, dh2);-
3006 strcpy (ret + dl2, val + xl);-
3007-
3008 free (dh2);-
3009 return (ret);
never executed: return (ret);
0
3010}-
3011-
3012static char *-
3013maybe_restore_tilde (val, directory_part)-
3014 char *val, *directory_part;-
3015{-
3016 rl_icppfunc_t *save;-
3017 char *ret;-
3018-
3019 save = (dircomplete_expand == 0) ? save_directory_hook () : (rl_icppfunc_t *)0;
(dircomplete_expand == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
3020 ret = restore_tilde (val, directory_part);-
3021 if (save)
saveDescription
TRUEnever evaluated
FALSEnever evaluated
0
3022 restore_directory_hook (save);
never executed: restore_directory_hook (save);
0
3023 return ret;
never executed: return ret;
0
3024}-
3025-
3026/* Simulate the expansions that will be performed by-
3027 rl_filename_completion_function. This must be called with the address of-
3028 a pointer to malloc'd memory. */-
3029static void-
3030bash_directory_expansion (dirname)-
3031 char **dirname;-
3032{-
3033 char *d, *nd;-
3034-
3035 d = savestring (*dirname);-
3036-
3037 if ((rl_directory_rewrite_hook) && (*rl_directory_rewrite_hook) (&d))
(rl_directory_rewrite_hook)Description
TRUEnever evaluated
FALSEnever evaluated
(*rl_directory...ite_hook) (&d)Description
TRUEnever evaluated
FALSEnever evaluated
0
3038 {-
3039 free (*dirname);-
3040 *dirname = d;-
3041 }
never executed: end of block
0
3042 else if (rl_directory_completion_hook && (*rl_directory_completion_hook) (&d))
rl_directory_completion_hookDescription
TRUEnever evaluated
FALSEnever evaluated
(*rl_directory...ion_hook) (&d)Description
TRUEnever evaluated
FALSEnever evaluated
0
3043 {-
3044 free (*dirname);-
3045 *dirname = d;-
3046 }
never executed: end of block
0
3047 else if (rl_completion_found_quote)
rl_completion_found_quoteDescription
TRUEnever evaluated
FALSEnever evaluated
0
3048 {-
3049 nd = bash_dequote_filename (d, rl_completion_quote_character);-
3050 free (*dirname);-
3051 free (d);-
3052 *dirname = nd;-
3053 }
never executed: end of block
0
3054}
never executed: end of block
0
3055-
3056/* If necessary, rewrite directory entry */-
3057static char *-
3058bash_filename_rewrite_hook (fname, fnlen)-
3059 char *fname;-
3060 int fnlen;-
3061{-
3062 char *conv;-
3063-
3064 conv = fnx_fromfs (fname, fnlen);-
3065 if (conv != fname)
conv != fnameDescription
TRUEnever evaluated
FALSEnever evaluated
0
3066 conv = savestring (conv);
never executed: conv = (char *)strcpy (sh_xmalloc((1 + strlen (conv)), "bashline.c", 3066), (conv));
0
3067 return conv;
never executed: return conv;
0
3068}-
3069-
3070/* Functions to save and restore the appropriate directory hook */-
3071/* This is not static so the shopt code can call it */-
3072void-
3073set_directory_hook ()-
3074{-
3075 if (dircomplete_expand)
dircomplete_expandDescription
TRUEnever evaluated
FALSEnever evaluated
0
3076 {-
3077 rl_directory_completion_hook = bash_directory_completion_hook;-
3078 rl_directory_rewrite_hook = (rl_icppfunc_t *)0;-
3079 }
never executed: end of block
0
3080 else-
3081 {-
3082 rl_directory_rewrite_hook = bash_directory_completion_hook;-
3083 rl_directory_completion_hook = (rl_icppfunc_t *)0;-
3084 }
never executed: end of block
0
3085}-
3086-
3087static rl_icppfunc_t *-
3088save_directory_hook ()-
3089{-
3090 rl_icppfunc_t *ret;-
3091-
3092 if (dircomplete_expand)
dircomplete_expandDescription
TRUEnever evaluated
FALSEnever evaluated
0
3093 {-
3094 ret = rl_directory_completion_hook;-
3095 rl_directory_completion_hook = (rl_icppfunc_t *)NULL;-
3096 }
never executed: end of block
0
3097 else-
3098 {-
3099 ret = rl_directory_rewrite_hook;-
3100 rl_directory_rewrite_hook = (rl_icppfunc_t *)NULL;-
3101 }
never executed: end of block
0
3102-
3103 return ret;
never executed: return ret;
0
3104}-
3105-
3106static void-
3107restore_directory_hook (hookf)-
3108 rl_icppfunc_t *hookf;-
3109{-
3110 if (dircomplete_expand)
dircomplete_expandDescription
TRUEnever evaluated
FALSEnever evaluated
0
3111 rl_directory_completion_hook = hookf;
never executed: rl_directory_completion_hook = hookf;
0
3112 else-
3113 rl_directory_rewrite_hook = hookf;
never executed: rl_directory_rewrite_hook = hookf;
0
3114}-
3115-
3116/* Check whether not DIRNAME, with any trailing slash removed, exists. If-
3117 SHOULD_DEQUOTE is non-zero, we dequote the directory name first. */-
3118static int-
3119directory_exists (dirname, should_dequote)-
3120 const char *dirname;-
3121 int should_dequote;-
3122{-
3123 char *new_dirname;-
3124 int dirlen, r;-
3125 struct stat sb;-
3126-
3127 /* We save the string and chop the trailing slash because stat/lstat behave-
3128 inconsistently if one is present. */-
3129 new_dirname = should_dequote ? bash_dequote_filename ((char *)dirname, rl_completion_quote_character) : savestring (dirname);
should_dequoteDescription
TRUEnever evaluated
FALSEnever evaluated
0
3130 dirlen = STRLEN (new_dirname);
(new_dirname)[1]Description
TRUEnever evaluated
FALSEnever evaluated
(new_dirname)[2]Description
TRUEnever evaluated
FALSEnever evaluated
(new_dirname)Description
TRUEnever evaluated
FALSEnever evaluated
(new_dirname)[0]Description
TRUEnever evaluated
FALSEnever evaluated
0
3131 if (new_dirname[dirlen - 1] == '/')
new_dirname[dirlen - 1] == '/'Description
TRUEnever evaluated
FALSEnever evaluated
0
3132 new_dirname[dirlen - 1] = '\0';
never executed: new_dirname[dirlen - 1] = '\0';
0
3133#if defined (HAVE_LSTAT)-
3134 r = lstat (new_dirname, &sb) == 0;-
3135#else-
3136 r = stat (new_dirname, &sb) == 0;-
3137#endif-
3138 free (new_dirname);-
3139 return (r);
never executed: return (r);
0
3140}-
3141 -
3142/* Expand a filename before the readline completion code passes it to stat(2).-
3143 The filename will already have had tilde expansion performed. */-
3144static int-
3145bash_filename_stat_hook (dirname)-
3146 char **dirname;-
3147{-
3148 char *local_dirname, *new_dirname, *t;-
3149 int should_expand_dirname, return_value;-
3150 int global_nounset;-
3151 WORD_LIST *wl;-
3152-
3153 local_dirname = *dirname;-
3154 should_expand_dirname = return_value = 0;-
3155 if (t = mbschr (local_dirname, '$'))
t = mbschr (lo..._dirname, '$')Description
TRUEnever evaluated
FALSEnever evaluated
0
3156 should_expand_dirname = '$';
never executed: should_expand_dirname = '$';
0
3157 else if (t = mbschr (local_dirname, '`')) /* XXX */
t = mbschr (lo..._dirname, '`')Description
TRUEnever evaluated
FALSEnever evaluated
0
3158 should_expand_dirname = '`';
never executed: should_expand_dirname = '`';
0
3159-
3160 if (should_expand_dirname && directory_exists (local_dirname, 0))
should_expand_dirnameDescription
TRUEnever evaluated
FALSEnever evaluated
directory_exis...al_dirname, 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
3161 should_expand_dirname = 0;
never executed: should_expand_dirname = 0;
0
3162 -
3163 if (should_expand_dirname)
should_expand_dirnameDescription
TRUEnever evaluated
FALSEnever evaluated
0
3164 {-
3165 new_dirname = savestring (local_dirname);-
3166 /* no error messages, and expand_prompt_string doesn't longjmp so we don't-
3167 have to worry about restoring this setting. */-
3168 global_nounset = unbound_vars_is_error;-
3169 unbound_vars_is_error = 0;-
3170 wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB|W_NOPROCSUB|W_COMPLETE); /* does the right thing */-
3171 unbound_vars_is_error = global_nounset;-
3172 if (wl)
wlDescription
TRUEnever evaluated
FALSEnever evaluated
0
3173 {-
3174 free (new_dirname);-
3175 new_dirname = string_list (wl);-
3176 /* Tell the completer we actually expanded something and change-
3177 *dirname only if we expanded to something non-null -- stat-
3178 behaves unpredictably when passed null or empty strings */-
3179 if (new_dirname && *new_dirname)
new_dirnameDescription
TRUEnever evaluated
FALSEnever evaluated
*new_dirnameDescription
TRUEnever evaluated
FALSEnever evaluated
0
3180 {-
3181 free (local_dirname); /* XXX */-
3182 local_dirname = *dirname = new_dirname;-
3183 return_value = STREQ (local_dirname, *dirname) == 0;
never executed: __result = (((const unsigned char *) (const char *) ( local_dirname ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( *dirname ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(local_dirname... (*dirname)[0]Description
TRUEnever evaluated
FALSEnever evaluated
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
3184 }
never executed: end of block
0
3185 else-
3186 free (new_dirname);
never executed: sh_xfree((new_dirname), "bashline.c", 3186);
0
3187 dispose_words (wl);-
3188 }
never executed: end of block
0
3189 else-
3190 free (new_dirname);
never executed: sh_xfree((new_dirname), "bashline.c", 3190);
0
3191 } -
3192-
3193 /* This is very similar to the code in bash_directory_completion_hook below,-
3194 but without spelling correction and not worrying about whether or not-
3195 we change relative pathnames. */-
3196 if (no_symbolic_links == 0 && (local_dirname[0] != '.' || local_dirname[1]))
no_symbolic_links == 0Description
TRUEnever evaluated
FALSEnever evaluated
local_dirname[0] != '.'Description
TRUEnever evaluated
FALSEnever evaluated
local_dirname[1]Description
TRUEnever evaluated
FALSEnever evaluated
0
3197 {-
3198 char *temp1, *temp2;-
3199-
3200 t = get_working_directory ("symlink-hook");-
3201 temp1 = make_absolute (local_dirname, t);-
3202 free (t);-
3203 temp2 = sh_canonpath (temp1, PATH_CHECKDOTDOT|PATH_CHECKEXISTS);-
3204-
3205 /* If we can't canonicalize, bail. */-
3206 if (temp2 == 0)
temp2 == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
3207 {-
3208 free (temp1);-
3209 return return_value;
never executed: return return_value;
0
3210 }-
3211-
3212 free (local_dirname);-
3213 *dirname = temp2;-
3214 free (temp1);-
3215 }
never executed: end of block
0
3216-
3217 return (return_value);
never executed: return (return_value);
0
3218}-
3219-
3220/* Handle symbolic link references and other directory name-
3221 expansions while hacking completion. This should return 1 if it modifies-
3222 the DIRNAME argument, 0 otherwise. It should make sure not to modify-
3223 DIRNAME if it returns 0. */-
3224static int-
3225bash_directory_completion_hook (dirname)-
3226 char **dirname;-
3227{-
3228 char *local_dirname, *new_dirname, *t;-
3229 int return_value, should_expand_dirname, nextch, closer;-
3230 WORD_LIST *wl;-
3231-
3232 return_value = should_expand_dirname = nextch = closer = 0;-
3233 local_dirname = *dirname;-
3234-
3235 if (t = mbschr (local_dirname, '$'))
t = mbschr (lo..._dirname, '$')Description
TRUEnever evaluated
FALSEnever evaluated
0
3236 {-
3237 should_expand_dirname = '$';-
3238 nextch = t[1];-
3239 /* Deliberately does not handle the deprecated $[...] arithmetic-
3240 expansion syntax */-
3241 if (nextch == '(')
nextch == '('Description
TRUEnever evaluated
FALSEnever evaluated
0
3242 closer = ')';
never executed: closer = ')';
0
3243 else if (nextch == '{')
nextch == '{'Description
TRUEnever evaluated
FALSEnever evaluated
0
3244 closer = '}';
never executed: closer = '}';
0
3245 else-
3246 nextch = 0;
never executed: nextch = 0;
0
3247-
3248 if (closer)
closerDescription
TRUEnever evaluated
FALSEnever evaluated
0
3249 {-
3250 int p;-
3251 char delims[2];-
3252-
3253 delims[0] = closer; delims[1] = 0;-
3254 p = skip_to_delim (t, 1, delims, SD_NOJMP|SD_COMPLETE);-
3255 if (t[p] != closer)
t[p] != closerDescription
TRUEnever evaluated
FALSEnever evaluated
0
3256 should_expand_dirname = 0;
never executed: should_expand_dirname = 0;
0
3257 }
never executed: end of block
0
3258 }
never executed: end of block
0
3259 else if (local_dirname[0] == '~')
local_dirname[0] == '~'Description
TRUEnever evaluated
FALSEnever evaluated
0
3260 should_expand_dirname = '~';
never executed: should_expand_dirname = '~';
0
3261 else-
3262 {-
3263 t = mbschr (local_dirname, '`');-
3264 if (t && unclosed_pair (local_dirname, strlen (local_dirname), "`") == 0)
tDescription
TRUEnever evaluated
FALSEnever evaluated
unclosed_pair ...me), "`") == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
3265 should_expand_dirname = '`';
never executed: should_expand_dirname = '`';
0
3266 }
never executed: end of block
0
3267-
3268 if (should_expand_dirname && directory_exists (local_dirname, 1))
should_expand_dirnameDescription
TRUEnever evaluated
FALSEnever evaluated
directory_exis...al_dirname, 1)Description
TRUEnever evaluated
FALSEnever evaluated
0
3269 should_expand_dirname = 0;
never executed: should_expand_dirname = 0;
0
3270-
3271 if (should_expand_dirname)
should_expand_dirnameDescription
TRUEnever evaluated
FALSEnever evaluated
0
3272 {-
3273 new_dirname = savestring (local_dirname);-
3274 wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB|W_NOPROCSUB|W_COMPLETE); /* does the right thing */-
3275 if (wl)
wlDescription
TRUEnever evaluated
FALSEnever evaluated
0
3276 {-
3277 *dirname = string_list (wl);-
3278 /* Tell the completer to replace the directory name only if we-
3279 actually expanded something. */-
3280 return_value = STREQ (local_dirname, *dirname) == 0;
never executed: __result = (((const unsigned char *) (const char *) ( local_dirname ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( *dirname ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(local_dirname... (*dirname)[0]Description
TRUEnever evaluated
FALSEnever evaluated
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
3281 free (local_dirname);-
3282 free (new_dirname);-
3283 dispose_words (wl);-
3284 local_dirname = *dirname;-
3285 /* XXX - change rl_filename_quote_characters here based on-
3286 should_expand_dirname/nextch/closer. This is the only place-
3287 custom_filename_quote_characters is modified. */-
3288 if (rl_filename_quote_characters && *rl_filename_quote_characters)
rl_filename_quote_charactersDescription
TRUEnever evaluated
FALSEnever evaluated
*rl_filename_quote_charactersDescription
TRUEnever evaluated
FALSEnever evaluated
0
3289 {-
3290 int i, j, c;-
3291 i = strlen (default_filename_quote_characters);-
3292 custom_filename_quote_characters = xrealloc (custom_filename_quote_characters, i+1);-
3293 for (i = j = 0; c = default_filename_quote_characters[i]; i++)
c = default_fi..._characters[i]Description
TRUEnever evaluated
FALSEnever evaluated
0
3294 {-
3295 if (c == should_expand_dirname || c == nextch || c == closer)
c == should_expand_dirnameDescription
TRUEnever evaluated
FALSEnever evaluated
c == nextchDescription
TRUEnever evaluated
FALSEnever evaluated
c == closerDescription
TRUEnever evaluated
FALSEnever evaluated
0
3296 continue;
never executed: continue;
0
3297 custom_filename_quote_characters[j++] = c;-
3298 }
never executed: end of block
0
3299 custom_filename_quote_characters[j] = '\0';-
3300 rl_filename_quote_characters = custom_filename_quote_characters;-
3301 set_filename_bstab (rl_filename_quote_characters);-
3302 }
never executed: end of block
0
3303 }
never executed: end of block
0
3304 else-
3305 {-
3306 free (new_dirname);-
3307 free (local_dirname);-
3308 *dirname = (char *)xmalloc (1);-
3309 **dirname = '\0';-
3310 return 1;
never executed: return 1;
0
3311 }-
3312 }-
3313 else -
3314 {-
3315 /* Dequote the filename even if we don't expand it. */-
3316 new_dirname = bash_dequote_filename (local_dirname, rl_completion_quote_character);-
3317 return_value = STREQ (local_dirname, new_dirname) == 0;
never executed: __result = (((const unsigned char *) (const char *) ( local_dirname ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( new_dirname ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(local_dirname...ew_dirname)[0]Description
TRUEnever evaluated
FALSEnever evaluated
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
3318 free (local_dirname);-
3319 local_dirname = *dirname = new_dirname;-
3320 }
never executed: end of block
0
3321-
3322 /* no_symbolic_links == 0 -> use (default) logical view of the file system.-
3323 local_dirname[0] == '.' && local_dirname[1] == '/' means files in the-
3324 current directory (./).-
3325 local_dirname[0] == '.' && local_dirname[1] == 0 means relative pathnames-
3326 in the current directory (e.g., lib/sh).-
3327 XXX - should we do spelling correction on these? */-
3328-
3329 /* This is test as it was in bash-4.2: skip relative pathnames in current-
3330 directory. Change test to-
3331 (local_dirname[0] != '.' || (local_dirname[1] && local_dirname[1] != '/'))-
3332 if we want to skip paths beginning with ./ also. */-
3333 if (no_symbolic_links == 0 && (local_dirname[0] != '.' || local_dirname[1]))
no_symbolic_links == 0Description
TRUEnever evaluated
FALSEnever evaluated
local_dirname[0] != '.'Description
TRUEnever evaluated
FALSEnever evaluated
local_dirname[1]Description
TRUEnever evaluated
FALSEnever evaluated
0
3334 {-
3335 char *temp1, *temp2;-
3336 int len1, len2;-
3337-
3338 /* If we have a relative path-
3339 (local_dirname[0] != '/' && local_dirname[0] != '.')-
3340 that is canonical after appending it to the current directory, then-
3341 temp1 = temp2+'/'-
3342 That is,-
3343 strcmp (temp1, temp2) == 0-
3344 after adding a slash to temp2 below. It should be safe to not-
3345 change those.-
3346 */-
3347 t = get_working_directory ("symlink-hook");-
3348 temp1 = make_absolute (local_dirname, t);-
3349 free (t);-
3350 temp2 = sh_canonpath (temp1, PATH_CHECKDOTDOT|PATH_CHECKEXISTS);-
3351-
3352 /* Try spelling correction if initial canonicalization fails. Make-
3353 sure we are set to replace the directory name with the results so-
3354 subsequent directory checks don't fail. */-
3355 if (temp2 == 0 && dircomplete_spelling && dircomplete_expand)
temp2 == 0Description
TRUEnever evaluated
FALSEnever evaluated
dircomplete_spellingDescription
TRUEnever evaluated
FALSEnever evaluated
dircomplete_expandDescription
TRUEnever evaluated
FALSEnever evaluated
0
3356 {-
3357 temp2 = dirspell (temp1);-
3358 if (temp2)
temp2Description
TRUEnever evaluated
FALSEnever evaluated
0
3359 {-
3360 free (temp1);-
3361 temp1 = temp2;-
3362 temp2 = sh_canonpath (temp1, PATH_CHECKDOTDOT|PATH_CHECKEXISTS);-
3363 return_value |= temp2 != 0;-
3364 }
never executed: end of block
0
3365 }
never executed: end of block
0
3366 /* If we can't canonicalize, bail. */-
3367 if (temp2 == 0)
temp2 == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
3368 {-
3369 free (temp1);-
3370 return return_value;
never executed: return return_value;
0
3371 }-
3372 len1 = strlen (temp1);-
3373 if (temp1[len1 - 1] == '/')
temp1[len1 - 1] == '/'Description
TRUEnever evaluated
FALSEnever evaluated
0
3374 {-
3375 len2 = strlen (temp2);-
3376 if (len2 > 2) /* don't append `/' to `/' or `//' */
len2 > 2Description
TRUEnever evaluated
FALSEnever evaluated
0
3377 {-
3378 temp2 = (char *)xrealloc (temp2, len2 + 2);-
3379 temp2[len2] = '/';-
3380 temp2[len2 + 1] = '\0';-
3381 }
never executed: end of block
0
3382 }
never executed: end of block
0
3383-
3384 /* dircomplete_expand_relpath == 0 means we want to leave relative-
3385 pathnames that are unchanged by canonicalization alone.-
3386 *local_dirname != '/' && *local_dirname != '.' == relative pathname-
3387 (consistent with general.c:absolute_pathname())-
3388 temp1 == temp2 (after appending a slash to temp2) means the pathname-
3389 is not changed by canonicalization as described above. */-
3390 if (dircomplete_expand_relpath || ((local_dirname[0] != '/' && local_dirname[0] != '.') && STREQ (temp1, temp2) == 0))
never executed: __result = (((const unsigned char *) (const char *) ( temp1 ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( temp2 ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
dircomplete_expand_relpathDescription
TRUEnever evaluated
FALSEnever evaluated
local_dirname[0] != '/'Description
TRUEnever evaluated
FALSEnever evaluated
local_dirname[0] != '.'Description
TRUEnever evaluated
FALSEnever evaluated
((temp1)[0] ==... }) == 0) == 0Description
TRUEnever evaluated
FALSEnever evaluated
(temp1)[0] == (temp2)[0]Description
TRUEnever evaluated
FALSEnever evaluated
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
3391 return_value |= STREQ (local_dirname, temp2) == 0;
never executed: return_value |= ((local_dirname)[0] == (temp2)[0] && __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p ( local_dirname ) && __builtin_constant_p ( temp2 ) && (__s1_len = __builtin_strlen ( local_dirname ), __s2_len = __builtin_strlen ( tem...t unsigned char *) (const char *) ( temp2 ))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ( temp2 ))[3] - __s2[3]); } } __result; }))) : __builtin_strcmp ( local_dirname , temp2 )))); }) == 0) == 0;
never executed: __result = (((const unsigned char *) (const char *) ( local_dirname ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( temp2 ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(local_dirname... == (temp2)[0]Description
TRUEnever evaluated
FALSEnever evaluated
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
3392 free (local_dirname);-
3393 *dirname = temp2;-
3394 free (temp1);-
3395 }
never executed: end of block
0
3396-
3397 return (return_value);
never executed: return (return_value);
0
3398}-
3399-
3400static char **history_completion_array = (char **)NULL;-
3401static int harry_size;-
3402static int harry_len;-
3403-
3404static void-
3405build_history_completion_array ()-
3406{-
3407 register int i, j;-
3408 HIST_ENTRY **hlist;-
3409 char **tokens;-
3410-
3411 /* First, clear out the current dynamic history completion list. */-
3412 if (harry_size)
harry_sizeDescription
TRUEnever evaluated
FALSEnever evaluated
0
3413 {-
3414 strvec_dispose (history_completion_array);-
3415 history_completion_array = (char **)NULL;-
3416 harry_size = 0;-
3417 harry_len = 0;-
3418 }
never executed: end of block
0
3419-
3420 /* Next, grovel each line of history, making each shell-sized token-
3421 a separate entry in the history_completion_array. */-
3422 hlist = history_list ();-
3423-
3424 if (hlist)
hlistDescription
TRUEnever evaluated
FALSEnever evaluated
0
3425 {-
3426 for (i = 0; hlist[i]; i++)
hlist[i]Description
TRUEnever evaluated
FALSEnever evaluated
0
3427 ;
never executed: ;
0
3428 for ( --i; i >= 0; i--)
i >= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
3429 {-
3430 /* Separate each token, and place into an array. */-
3431 tokens = history_tokenize (hlist[i]->line);-
3432-
3433 for (j = 0; tokens && tokens[j]; j++)
tokensDescription
TRUEnever evaluated
FALSEnever evaluated
tokens[j]Description
TRUEnever evaluated
FALSEnever evaluated
0
3434 {-
3435 if (harry_len + 2 > harry_size)
harry_len + 2 > harry_sizeDescription
TRUEnever evaluated
FALSEnever evaluated
0
3436 history_completion_array = strvec_resize (history_completion_array, harry_size += 10);
never executed: history_completion_array = strvec_resize (history_completion_array, harry_size += 10);
0
3437-
3438 history_completion_array[harry_len++] = tokens[j];-
3439 history_completion_array[harry_len] = (char *)NULL;-
3440 }
never executed: end of block
0
3441 free (tokens);-
3442 }
never executed: end of block
0
3443-
3444 /* Sort the complete list of tokens. */-
3445 if (dabbrev_expand_active == 0)
dabbrev_expand_active == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
3446 qsort (history_completion_array, harry_len, sizeof (char *), (QSFUNC *)strvec_strcmp);
never executed: qsort (history_completion_array, harry_len, sizeof (char *), (QSFUNC *)strvec_strcmp);
0
3447 }
never executed: end of block
0
3448}
never executed: end of block
0
3449-
3450static char *-
3451history_completion_generator (hint_text, state)-
3452 const char *hint_text;-
3453 int state;-
3454{-
3455 static int local_index, len;-
3456 static const char *text;-
3457-
3458 /* If this is the first call to the generator, then initialize the-
3459 list of strings to complete over. */-
3460 if (state == 0)
state == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
3461 {-
3462 if (dabbrev_expand_active) /* This is kind of messy */
dabbrev_expand_activeDescription
TRUEnever evaluated
FALSEnever evaluated
0
3463 rl_completion_suppress_append = 1;
never executed: rl_completion_suppress_append = 1;
0
3464 local_index = 0;-
3465 build_history_completion_array ();-
3466 text = hint_text;-
3467 len = strlen (text);-
3468 }
never executed: end of block
0
3469-
3470 while (history_completion_array && history_completion_array[local_index])
history_completion_arrayDescription
TRUEnever evaluated
FALSEnever evaluated
history_comple...y[local_index]Description
TRUEnever evaluated
FALSEnever evaluated
0
3471 {-
3472 /* XXX - should this use completion-ignore-case? */-
3473 if (strncmp (text, history_completion_array[local_index++], len) == 0)
never executed: __result = (((const unsigned char *) (const char *) ( text ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( history_completion_array[local_index++] ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(__extension__..., len ))) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( len )Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( text )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( text ...ze_t) ( len ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...cal_index++] )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( histo...ze_t) ( len ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
3474 return (savestring (history_completion_array[local_index - 1]));
never executed: return ((char *)strcpy (sh_xmalloc((1 + strlen (history_completion_array[local_index - 1])), "bashline.c", 3474), (history_completion_array[local_index - 1])));
0
3475 }
never executed: end of block
0
3476 return ((char *)NULL);
never executed: return ((char *) ((void *)0) );
0
3477}-
3478-
3479static int-
3480dynamic_complete_history (count, key)-
3481 int count, key;-
3482{-
3483 int r;-
3484 rl_compentry_func_t *orig_func;-
3485 rl_completion_func_t *orig_attempt_func;-
3486 rl_compignore_func_t *orig_ignore_func;-
3487-
3488 orig_func = rl_completion_entry_function;-
3489 orig_attempt_func = rl_attempted_completion_function;-
3490 orig_ignore_func = rl_ignore_some_completions_function;-
3491-
3492 rl_completion_entry_function = history_completion_generator;-
3493 rl_attempted_completion_function = (rl_completion_func_t *)NULL;-
3494 rl_ignore_some_completions_function = filename_completion_ignore;-
3495-
3496 /* XXX - use rl_completion_mode here? */-
3497 if (rl_last_func == dynamic_complete_history)
rl_last_func =...mplete_historyDescription
TRUEnever evaluated
FALSEnever evaluated
0
3498 r = rl_complete_internal ('?');
never executed: r = rl_complete_internal ('?');
0
3499 else-
3500 r = rl_complete_internal (TAB);
never executed: r = rl_complete_internal ('\t');
0
3501-
3502 rl_completion_entry_function = orig_func;-
3503 rl_attempted_completion_function = orig_attempt_func;-
3504 rl_ignore_some_completions_function = orig_ignore_func;-
3505-
3506 return r;
never executed: return r;
0
3507}-
3508-
3509static int-
3510bash_dabbrev_expand (count, key)-
3511 int count, key;-
3512{-
3513 int r, orig_suppress, orig_sort;-
3514 rl_compentry_func_t *orig_func;-
3515 rl_completion_func_t *orig_attempt_func;-
3516 rl_compignore_func_t *orig_ignore_func;-
3517-
3518 orig_func = rl_menu_completion_entry_function;-
3519 orig_attempt_func = rl_attempted_completion_function;-
3520 orig_ignore_func = rl_ignore_some_completions_function;-
3521 orig_suppress = rl_completion_suppress_append;-
3522 orig_sort = rl_sort_completion_matches;-
3523-
3524 rl_menu_completion_entry_function = history_completion_generator;-
3525 rl_attempted_completion_function = (rl_completion_func_t *)NULL;-
3526 rl_ignore_some_completions_function = filename_completion_ignore;-
3527 rl_filename_completion_desired = 0;-
3528 rl_completion_suppress_append = 1;-
3529 rl_sort_completion_matches = 0;-
3530-
3531 /* XXX - use rl_completion_mode here? */-
3532 dabbrev_expand_active = 1;-
3533 if (rl_last_func == bash_dabbrev_expand)
rl_last_func =...dabbrev_expandDescription
TRUEnever evaluated
FALSEnever evaluated
0
3534 rl_last_func = rl_menu_complete;
never executed: rl_last_func = rl_menu_complete;
0
3535 r = rl_menu_complete (count, key);-
3536 dabbrev_expand_active = 0;-
3537-
3538 rl_last_func = bash_dabbrev_expand;-
3539 rl_menu_completion_entry_function = orig_func;-
3540 rl_attempted_completion_function = orig_attempt_func;-
3541 rl_ignore_some_completions_function = orig_ignore_func;-
3542 rl_completion_suppress_append = orig_suppress;-
3543 rl_sort_completion_matches = orig_sort;-
3544-
3545 return r;
never executed: return r;
0
3546}-
3547-
3548#if defined (SPECIFIC_COMPLETION_FUNCTIONS)-
3549static int-
3550bash_complete_username (ignore, ignore2)-
3551 int ignore, ignore2;-
3552{-
3553 return bash_complete_username_internal (rl_completion_mode (bash_complete_username));
never executed: return bash_complete_username_internal (rl_completion_mode (bash_complete_username));
0
3554}-
3555-
3556static int-
3557bash_possible_username_completions (ignore, ignore2)-
3558 int ignore, ignore2;-
3559{-
3560 return bash_complete_username_internal ('?');
never executed: return bash_complete_username_internal ('?');
0
3561}-
3562-
3563static int-
3564bash_complete_username_internal (what_to_do)-
3565 int what_to_do;-
3566{-
3567 return bash_specific_completion (what_to_do, rl_username_completion_function);
never executed: return bash_specific_completion (what_to_do, rl_username_completion_function);
0
3568}-
3569-
3570static int-
3571bash_complete_filename (ignore, ignore2)-
3572 int ignore, ignore2;-
3573{-
3574 return bash_complete_filename_internal (rl_completion_mode (bash_complete_filename));
never executed: return bash_complete_filename_internal (rl_completion_mode (bash_complete_filename));
0
3575}-
3576-
3577static int-
3578bash_possible_filename_completions (ignore, ignore2)-
3579 int ignore, ignore2;-
3580{-
3581 return bash_complete_filename_internal ('?');
never executed: return bash_complete_filename_internal ('?');
0
3582}-
3583-
3584static int-
3585bash_complete_filename_internal (what_to_do)-
3586 int what_to_do;-
3587{-
3588 rl_compentry_func_t *orig_func;-
3589 rl_completion_func_t *orig_attempt_func;-
3590 rl_icppfunc_t *orig_dir_func;-
3591 rl_compignore_func_t *orig_ignore_func;-
3592 /*const*/ char *orig_rl_completer_word_break_characters;-
3593 int r;-
3594-
3595 orig_func = rl_completion_entry_function;-
3596 orig_attempt_func = rl_attempted_completion_function;-
3597 orig_ignore_func = rl_ignore_some_completions_function;-
3598 orig_rl_completer_word_break_characters = rl_completer_word_break_characters;-
3599-
3600 orig_dir_func = save_directory_hook ();-
3601-
3602 rl_completion_entry_function = rl_filename_completion_function;-
3603 rl_attempted_completion_function = (rl_completion_func_t *)NULL;-
3604 rl_ignore_some_completions_function = filename_completion_ignore;-
3605 rl_completer_word_break_characters = " \t\n\"\'";-
3606-
3607 r = rl_complete_internal (what_to_do);-
3608-
3609 rl_completion_entry_function = orig_func;-
3610 rl_attempted_completion_function = orig_attempt_func;-
3611 rl_ignore_some_completions_function = orig_ignore_func;-
3612 rl_completer_word_break_characters = orig_rl_completer_word_break_characters;-
3613-
3614 restore_directory_hook (orig_dir_func);-
3615-
3616 return r;
never executed: return r;
0
3617}-
3618-
3619static int-
3620bash_complete_hostname (ignore, ignore2)-
3621 int ignore, ignore2;-
3622{-
3623 return bash_complete_hostname_internal (rl_completion_mode (bash_complete_hostname));
never executed: return bash_complete_hostname_internal (rl_completion_mode (bash_complete_hostname));
0
3624}-
3625-
3626static int-
3627bash_possible_hostname_completions (ignore, ignore2)-
3628 int ignore, ignore2;-
3629{-
3630 return bash_complete_hostname_internal ('?');
never executed: return bash_complete_hostname_internal ('?');
0
3631}-
3632-
3633static int-
3634bash_complete_variable (ignore, ignore2)-
3635 int ignore, ignore2;-
3636{-
3637 return bash_complete_variable_internal (rl_completion_mode (bash_complete_variable));
never executed: return bash_complete_variable_internal (rl_completion_mode (bash_complete_variable));
0
3638}-
3639-
3640static int-
3641bash_possible_variable_completions (ignore, ignore2)-
3642 int ignore, ignore2;-
3643{-
3644 return bash_complete_variable_internal ('?');
never executed: return bash_complete_variable_internal ('?');
0
3645}-
3646-
3647static int-
3648bash_complete_command (ignore, ignore2)-
3649 int ignore, ignore2;-
3650{-
3651 return bash_complete_command_internal (rl_completion_mode (bash_complete_command));
never executed: return bash_complete_command_internal (rl_completion_mode (bash_complete_command));
0
3652}-
3653-
3654static int-
3655bash_possible_command_completions (ignore, ignore2)-
3656 int ignore, ignore2;-
3657{-
3658 return bash_complete_command_internal ('?');
never executed: return bash_complete_command_internal ('?');
0
3659}-
3660-
3661static int-
3662bash_complete_hostname_internal (what_to_do)-
3663 int what_to_do;-
3664{-
3665 return bash_specific_completion (what_to_do, hostname_completion_function);
never executed: return bash_specific_completion (what_to_do, hostname_completion_function);
0
3666}-
3667-
3668static int-
3669bash_complete_variable_internal (what_to_do)-
3670 int what_to_do;-
3671{-
3672 return bash_specific_completion (what_to_do, variable_completion_function);
never executed: return bash_specific_completion (what_to_do, variable_completion_function);
0
3673}-
3674-
3675static int-
3676bash_complete_command_internal (what_to_do)-
3677 int what_to_do;-
3678{-
3679 return bash_specific_completion (what_to_do, command_word_completion_function);
never executed: return bash_specific_completion (what_to_do, command_word_completion_function);
0
3680}-
3681-
3682static char *globtext;-
3683static char *globorig;-
3684-
3685static char *-
3686glob_complete_word (text, state)-
3687 const char *text;-
3688 int state;-
3689{-
3690 static char **matches = (char **)NULL;-
3691 static int ind;-
3692 int glen;-
3693 char *ret, *ttext;-
3694-
3695 if (state == 0)
state == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
3696 {-
3697 rl_filename_completion_desired = 1;-
3698 FREE (matches);
never executed: sh_xfree((matches), "bashline.c", 3698);
matchesDescription
TRUEnever evaluated
FALSEnever evaluated
0
3699 if (globorig != globtext)
globorig != globtextDescription
TRUEnever evaluated
FALSEnever evaluated
0
3700 FREE (globorig);
never executed: sh_xfree((globorig), "bashline.c", 3700);
never executed: end of block
globorigDescription
TRUEnever evaluated
FALSEnever evaluated
0
3701 FREE (globtext);
never executed: sh_xfree((globtext), "bashline.c", 3701);
globtextDescription
TRUEnever evaluated
FALSEnever evaluated
0
3702-
3703 ttext = bash_tilde_expand (text, 0);-
3704-
3705 if (rl_explicit_arg)
rl_explicit_argDescription
TRUEnever evaluated
FALSEnever evaluated
0
3706 {-
3707 globorig = savestring (ttext);-
3708 glen = strlen (ttext);-
3709 globtext = (char *)xmalloc (glen + 2);-
3710 strcpy (globtext, ttext);-
3711 globtext[glen] = '*';-
3712 globtext[glen+1] = '\0';-
3713 }
never executed: end of block
0
3714 else-
3715 globtext = globorig = savestring (ttext);
never executed: globtext = globorig = (char *)strcpy (sh_xmalloc((1 + strlen (ttext)), "bashline.c", 3715), (ttext));
0
3716-
3717 if (ttext != text)
ttext != textDescription
TRUEnever evaluated
FALSEnever evaluated
0
3718 free (ttext);
never executed: sh_xfree((ttext), "bashline.c", 3718);
0
3719-
3720 matches = shell_glob_filename (globtext);-
3721 if (GLOB_FAILED (matches))
(matches) == (...b_error_returnDescription
TRUEnever evaluated
FALSEnever evaluated
0
3722 matches = (char **)NULL;
never executed: matches = (char **) ((void *)0) ;
0
3723 ind = 0;-
3724 }
never executed: end of block
0
3725-
3726 ret = matches ? matches[ind] : (char *)NULL;
matchesDescription
TRUEnever evaluated
FALSEnever evaluated
0
3727 ind++;-
3728 return ret;
never executed: return ret;
0
3729}-
3730-
3731static int-
3732bash_glob_completion_internal (what_to_do)-
3733 int what_to_do;-
3734{-
3735 return bash_specific_completion (what_to_do, glob_complete_word);
never executed: return bash_specific_completion (what_to_do, glob_complete_word);
0
3736}-
3737-
3738/* A special quoting function so we don't end up quoting globbing characters-
3739 in the word if there are no matches or multiple matches. */-
3740static char *-
3741bash_glob_quote_filename (s, rtype, qcp)-
3742 char *s;-
3743 int rtype;-
3744 char *qcp;-
3745{-
3746 if (globorig && qcp && *qcp == '\0' && STREQ (s, globorig))
never executed: __result = (((const unsigned char *) (const char *) ( s ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( globorig ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
globorigDescription
TRUEnever evaluated
FALSEnever evaluated
qcpDescription
TRUEnever evaluated
FALSEnever evaluated
*qcp == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
(s)[0] == (globorig)[0]Description
TRUEnever evaluated
FALSEnever evaluated
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
3747 return (savestring (s));
never executed: return ((char *)strcpy (sh_xmalloc((1 + strlen (s)), "bashline.c", 3747), (s)));
0
3748 else-
3749 return (bash_quote_filename (s, rtype, qcp));
never executed: return (bash_quote_filename (s, rtype, qcp));
0
3750}-
3751-
3752static int-
3753bash_glob_complete_word (count, key)-
3754 int count, key;-
3755{-
3756 int r;-
3757 rl_quote_func_t *orig_quoting_function;-
3758-
3759 if (rl_editing_mode == EMACS_EDITING_MODE)
rl_editing_mode == 1Description
TRUEnever evaluated
FALSEnever evaluated
0
3760 rl_explicit_arg = 1; /* force `*' append */
never executed: rl_explicit_arg = 1;
0
3761 orig_quoting_function = rl_filename_quoting_function;-
3762 rl_filename_quoting_function = bash_glob_quote_filename;-
3763 -
3764 r = bash_glob_completion_internal (rl_completion_mode (bash_glob_complete_word));-
3765-
3766 rl_filename_quoting_function = orig_quoting_function;-
3767 return r;
never executed: return r;
0
3768}-
3769-
3770static int-
3771bash_glob_expand_word (count, key)-
3772 int count, key;-
3773{-
3774 return bash_glob_completion_internal ('*');
never executed: return bash_glob_completion_internal ('*');
0
3775}-
3776-
3777static int-
3778bash_glob_list_expansions (count, key)-
3779 int count, key;-
3780{-
3781 return bash_glob_completion_internal ('?');
never executed: return bash_glob_completion_internal ('?');
0
3782}-
3783-
3784static int-
3785bash_specific_completion (what_to_do, generator)-
3786 int what_to_do;-
3787 rl_compentry_func_t *generator;-
3788{-
3789 rl_compentry_func_t *orig_func;-
3790 rl_completion_func_t *orig_attempt_func;-
3791 rl_compignore_func_t *orig_ignore_func;-
3792 int r;-
3793-
3794 orig_func = rl_completion_entry_function;-
3795 orig_attempt_func = rl_attempted_completion_function;-
3796 orig_ignore_func = rl_ignore_some_completions_function;-
3797 rl_completion_entry_function = generator;-
3798 rl_attempted_completion_function = NULL;-
3799 rl_ignore_some_completions_function = orig_ignore_func;-
3800-
3801 r = rl_complete_internal (what_to_do);-
3802-
3803 rl_completion_entry_function = orig_func;-
3804 rl_attempted_completion_function = orig_attempt_func;-
3805 rl_ignore_some_completions_function = orig_ignore_func;-
3806-
3807 return r;
never executed: return r;
0
3808}-
3809-
3810#endif /* SPECIFIC_COMPLETION_FUNCTIONS */-
3811-
3812#if defined (VI_MODE)-
3813/* Completion, from vi mode's point of view. This is a modified version of-
3814 rl_vi_complete which uses the bash globbing code to implement what POSIX-
3815 specifies, which is to append a `*' and attempt filename generation (which-
3816 has the side effect of expanding any globbing characters in the word). */-
3817static int-
3818bash_vi_complete (count, key)-
3819 int count, key;-
3820{-
3821#if defined (SPECIFIC_COMPLETION_FUNCTIONS)-
3822 int p, r;-
3823 char *t;-
3824-
3825 if ((rl_point < rl_end) && (!whitespace (rl_line_buffer[rl_point])))
(rl_point < rl_end)Description
TRUEnever evaluated
FALSEnever evaluated
((rl_line_buff...oint]) == ' ')Description
TRUEnever evaluated
FALSEnever evaluated
((rl_line_buff...int]) == '\t')Description
TRUEnever evaluated
FALSEnever evaluated
0
3826 {-
3827 if (!whitespace (rl_line_buffer[rl_point + 1]))
((rl_line_buff... + 1]) == ' ')Description
TRUEnever evaluated
FALSEnever evaluated
((rl_line_buff...+ 1]) == '\t')Description
TRUEnever evaluated
FALSEnever evaluated
0
3828 rl_vi_end_word (1, 'E');
never executed: rl_vi_end_word (1, 'E');
0
3829 rl_point++;-
3830 }
never executed: end of block
0
3831-
3832 /* Find boundaries of current word, according to vi definition of a-
3833 `bigword'. */-
3834 t = 0;-
3835 if (rl_point > 0)
rl_point > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
3836 {-
3837 p = rl_point;-
3838 rl_vi_bWord (1, 'B');-
3839 r = rl_point;-
3840 rl_point = p;-
3841 p = r;-
3842-
3843 t = substring (rl_line_buffer, p, rl_point);-
3844 }
never executed: end of block
0
3845-
3846 if (t && glob_pattern_p (t) == 0)
tDescription
TRUEnever evaluated
FALSEnever evaluated
glob_pattern_p (t) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
3847 rl_explicit_arg = 1; /* XXX - force glob_complete_word to append `*' */
never executed: rl_explicit_arg = 1;
0
3848 FREE (t);
never executed: sh_xfree((t), "bashline.c", 3848);
tDescription
TRUEnever evaluated
FALSEnever evaluated
0
3849-
3850 if (key == '*') /* Expansion and replacement. */
key == '*'Description
TRUEnever evaluated
FALSEnever evaluated
0
3851 r = bash_glob_expand_word (count, key);
never executed: r = bash_glob_expand_word (count, key);
0
3852 else if (key == '=') /* List possible completions. */
key == '='Description
TRUEnever evaluated
FALSEnever evaluated
0
3853 r = bash_glob_list_expansions (count, key);
never executed: r = bash_glob_list_expansions (count, key);
0
3854 else if (key == '\\') /* Standard completion */
key == '\\'Description
TRUEnever evaluated
FALSEnever evaluated
0
3855 r = bash_glob_complete_word (count, key);
never executed: r = bash_glob_complete_word (count, key);
0
3856 else-
3857 r = rl_complete (0, key);
never executed: r = rl_complete (0, key);
0
3858-
3859 if (key == '*' || key == '\\')
key == '*'Description
TRUEnever evaluated
FALSEnever evaluated
key == '\\'Description
TRUEnever evaluated
FALSEnever evaluated
0
3860 rl_vi_start_inserting (key, 1, 1);
never executed: rl_vi_start_inserting (key, 1, 1);
0
3861-
3862 return (r);
never executed: return (r);
0
3863#else-
3864 return rl_vi_complete (count, key);-
3865#endif /* !SPECIFIC_COMPLETION_FUNCTIONS */-
3866}-
3867#endif /* VI_MODE */-
3868-
3869/* Filename quoting for completion. */-
3870/* A function to strip unquoted quote characters (single quotes, double-
3871 quotes, and backslashes). It allows single quotes to appear-
3872 within double quotes, and vice versa. It should be smarter. */-
3873static char *-
3874bash_dequote_filename (text, quote_char)-
3875 char *text;-
3876 int quote_char;-
3877{-
3878 char *ret, *p, *r;-
3879 int l, quoted;-
3880-
3881 l = strlen (text);-
3882 ret = (char *)xmalloc (l + 1);-
3883 for (quoted = quote_char, p = text, r = ret; p && *p; p++)
pDescription
TRUEnever evaluated
FALSEnever evaluated
*pDescription
TRUEnever evaluated
FALSEnever evaluated
0
3884 {-
3885 /* Allow backslash-escaped characters to pass through unscathed. */-
3886 if (*p == '\\')
*p == '\\'Description
TRUEnever evaluated
FALSEnever evaluated
0
3887 {-
3888 /* Backslashes are preserved within single quotes. */-
3889 if (quoted == '\'')
quoted == '\''Description
TRUEnever evaluated
FALSEnever evaluated
0
3890 *r++ = *p;
never executed: *r++ = *p;
0
3891 /* Backslashes are preserved within double quotes unless the-
3892 character is one that is defined to be escaped */-
3893 else if (quoted == '"' && ((sh_syntaxtab[(unsigned char)p[1]] & CBSDQUOTE) == 0))
quoted == '"'Description
TRUEnever evaluated
FALSEnever evaluated
((sh_syntaxtab... 0x0040) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
3894 *r++ = *p;
never executed: *r++ = *p;
0
3895-
3896 *r++ = *++p;-
3897 if (*p == '\0')
*p == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
3898 return ret; /* XXX - was break; */
never executed: return ret;
0
3899 continue;
never executed: continue;
0
3900 }-
3901 /* Close quote. */-
3902 if (quoted && *p == quoted)
quotedDescription
TRUEnever evaluated
FALSEnever evaluated
*p == quotedDescription
TRUEnever evaluated
FALSEnever evaluated
0
3903 {-
3904 quoted = 0;-
3905 continue;
never executed: continue;
0
3906 }-
3907 /* Open quote. */-
3908 if (quoted == 0 && (*p == '\'' || *p == '"'))
quoted == 0Description
TRUEnever evaluated
FALSEnever evaluated
*p == '\''Description
TRUEnever evaluated
FALSEnever evaluated
*p == '"'Description
TRUEnever evaluated
FALSEnever evaluated
0
3909 {-
3910 quoted = *p;-
3911 continue;
never executed: continue;
0
3912 }-
3913 *r++ = *p;-
3914 }
never executed: end of block
0
3915 *r = '\0';-
3916 return ret;
never executed: return ret;
0
3917}-
3918-
3919/* Quote characters that the readline completion code would treat as-
3920 word break characters with backslashes. Pass backslash-quoted-
3921 characters through without examination. */-
3922static char *-
3923quote_word_break_chars (text)-
3924 char *text;-
3925{-
3926 char *ret, *r, *s;-
3927 int l;-
3928-
3929 l = strlen (text);-
3930 ret = (char *)xmalloc ((2 * l) + 1);-
3931 for (s = text, r = ret; *s; s++)
*sDescription
TRUEnever evaluated
FALSEnever evaluated
0
3932 {-
3933 /* Pass backslash-quoted characters through, including the backslash. */-
3934 if (*s == '\\')
*s == '\\'Description
TRUEnever evaluated
FALSEnever evaluated
0
3935 {-
3936 *r++ = '\\';-
3937 *r++ = *++s;-
3938 if (*s == '\0')
*s == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
3939 break;
never executed: break;
0
3940 continue;
never executed: continue;
0
3941 }-
3942 /* OK, we have an unquoted character. Check its presence in-
3943 rl_completer_word_break_characters. */-
3944 if (mbschr (rl_completer_word_break_characters, *s))
mbschr (rl_com...haracters, *s)Description
TRUEnever evaluated
FALSEnever evaluated
0
3945 *r++ = '\\';
never executed: *r++ = '\\';
0
3946 /* XXX -- check for standalone tildes here and backslash-quote them */-
3947 if (s == text && *s == '~' && file_exists (text))
s == textDescription
TRUEnever evaluated
FALSEnever evaluated
*s == '~'Description
TRUEnever evaluated
FALSEnever evaluated
file_exists (text)Description
TRUEnever evaluated
FALSEnever evaluated
0
3948 *r++ = '\\';
never executed: *r++ = '\\';
0
3949 *r++ = *s;-
3950 }
never executed: end of block
0
3951 *r = '\0';-
3952 return ret;
never executed: return ret;
0
3953}-
3954-
3955/* Use characters in STRING to populate the table of characters that should-
3956 be backslash-quoted. The table will be used for sh_backslash_quote from-
3957 this file. */-
3958static void-
3959set_filename_bstab (string)-
3960 const char *string;-
3961{-
3962 const char *s;-
3963-
3964 memset (filename_bstab, 0, sizeof (filename_bstab));-
3965 for (s = string; s && *s; s++)
sDescription
TRUEnever evaluated
FALSEnever evaluated
*sDescription
TRUEnever evaluated
FALSEnever evaluated
0
3966 filename_bstab[*s] = 1;
never executed: filename_bstab[*s] = 1;
0
3967}
never executed: end of block
0
3968-
3969/* Quote a filename using double quotes, single quotes, or backslashes-
3970 depending on the value of completion_quoting_style. If we're-
3971 completing using backslashes, we need to quote some additional-
3972 characters (those that readline treats as word breaks), so we call-
3973 quote_word_break_chars on the result. This returns newly-allocated-
3974 memory. */-
3975static char *-
3976bash_quote_filename (s, rtype, qcp)-
3977 char *s;-
3978 int rtype;-
3979 char *qcp;-
3980{-
3981 char *rtext, *mtext, *ret;-
3982 int rlen, cs;-
3983-
3984 rtext = (char *)NULL;-
3985-
3986 /* If RTYPE == MULT_MATCH, it means that there is-
3987 more than one match. In this case, we do not add-
3988 the closing quote or attempt to perform tilde-
3989 expansion. If RTYPE == SINGLE_MATCH, we try-
3990 to perform tilde expansion, because single and double-
3991 quotes inhibit tilde expansion by the shell. */-
3992-
3993 cs = completion_quoting_style;-
3994 /* Might need to modify the default completion style based on *qcp,-
3995 since it's set to any user-provided opening quote. We also change-
3996 to single-quoting if there is no user-provided opening quote and-
3997 the word being completed contains newlines, since those are not-
3998 quoted correctly using backslashes (a backslash-newline pair is-
3999 special to the shell parser). */-
4000 if (*qcp == '\0' && cs == COMPLETE_BSQUOTE && mbschr (s, '\n'))
*qcp == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
cs == 3Description
TRUEnever evaluated
FALSEnever evaluated
mbschr (s, '\n')Description
TRUEnever evaluated
FALSEnever evaluated
0
4001 cs = COMPLETE_SQUOTE;
never executed: cs = 2;
0
4002 else if (*qcp == '"')
*qcp == '"'Description
TRUEnever evaluated
FALSEnever evaluated
0
4003 cs = COMPLETE_DQUOTE;
never executed: cs = 1;
0
4004 else if (*qcp == '\'')
*qcp == '\''Description
TRUEnever evaluated
FALSEnever evaluated
0
4005 cs = COMPLETE_SQUOTE;
never executed: cs = 2;
0
4006#if defined (BANG_HISTORY)-
4007 else if (*qcp == '\0' && history_expansion && cs == COMPLETE_DQUOTE &&
*qcp == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
history_expansionDescription
TRUEnever evaluated
FALSEnever evaluated
cs == 1Description
TRUEnever evaluated
FALSEnever evaluated
0
4008 history_expansion_inhibited == 0 && mbschr (s, '!'))
history_expans...inhibited == 0Description
TRUEnever evaluated
FALSEnever evaluated
mbschr (s, '!')Description
TRUEnever evaluated
FALSEnever evaluated
0
4009 cs = COMPLETE_BSQUOTE;
never executed: cs = 3;
0
4010-
4011 if (*qcp == '"' && history_expansion && cs == COMPLETE_DQUOTE &&
*qcp == '"'Description
TRUEnever evaluated
FALSEnever evaluated
history_expansionDescription
TRUEnever evaluated
FALSEnever evaluated
cs == 1Description
TRUEnever evaluated
FALSEnever evaluated
0
4012 history_expansion_inhibited == 0 && mbschr (s, '!'))
history_expans...inhibited == 0Description
TRUEnever evaluated
FALSEnever evaluated
mbschr (s, '!')Description
TRUEnever evaluated
FALSEnever evaluated
0
4013 {-
4014 cs = COMPLETE_BSQUOTE;-
4015 *qcp = '\0';-
4016 }
never executed: end of block
0
4017#endif-
4018-
4019 /* Don't tilde-expand backslash-quoted filenames, since only single and-
4020 double quotes inhibit tilde expansion. */-
4021 mtext = s;-
4022 if (mtext[0] == '~' && rtype == SINGLE_MATCH && cs != COMPLETE_BSQUOTE)
mtext[0] == '~'Description
TRUEnever evaluated
FALSEnever evaluated
rtype == 1Description
TRUEnever evaluated
FALSEnever evaluated
cs != 3Description
TRUEnever evaluated
FALSEnever evaluated
0
4023 mtext = bash_tilde_expand (s, 0);
never executed: mtext = bash_tilde_expand (s, 0);
0
4024-
4025 switch (cs)-
4026 {-
4027 case COMPLETE_DQUOTE:
never executed: case 1:
0
4028 rtext = sh_double_quote (mtext);-
4029 break;
never executed: break;
0
4030 case COMPLETE_SQUOTE:
never executed: case 2:
0
4031 rtext = sh_single_quote (mtext);-
4032 break;
never executed: break;
0
4033 case COMPLETE_BSQUOTE:
never executed: case 3:
0
4034 rtext = sh_backslash_quote (mtext, complete_fullquote ? 0 : filename_bstab, 0);-
4035 break;
never executed: break;
0
4036 }-
4037-
4038 if (mtext != s)
mtext != sDescription
TRUEnever evaluated
FALSEnever evaluated
0
4039 free (mtext);
never executed: sh_xfree((mtext), "bashline.c", 4039);
0
4040-
4041 /* We may need to quote additional characters: those that readline treats-
4042 as word breaks that are not quoted by backslash_quote. */-
4043 if (rtext && cs == COMPLETE_BSQUOTE)
rtextDescription
TRUEnever evaluated
FALSEnever evaluated
cs == 3Description
TRUEnever evaluated
FALSEnever evaluated
0
4044 {-
4045 mtext = quote_word_break_chars (rtext);-
4046 free (rtext);-
4047 rtext = mtext;-
4048 }
never executed: end of block
0
4049-
4050 /* Leave the opening quote intact. The readline completion code takes-
4051 care of avoiding doubled opening quotes. */-
4052 if (rtext)
rtextDescription
TRUEnever evaluated
FALSEnever evaluated
0
4053 {-
4054 rlen = strlen (rtext);-
4055 ret = (char *)xmalloc (rlen + 1);-
4056 strcpy (ret, rtext);-
4057 }
never executed: end of block
0
4058 else-
4059 {-
4060 ret = (char *)xmalloc (rlen = 1);-
4061 ret[0] = '\0';-
4062 }
never executed: end of block
0
4063-
4064 /* If there are multiple matches, cut off the closing quote. */-
4065 if (rtype == MULT_MATCH && cs != COMPLETE_BSQUOTE)
rtype == 2Description
TRUEnever evaluated
FALSEnever evaluated
cs != 3Description
TRUEnever evaluated
FALSEnever evaluated
0
4066 ret[rlen - 1] = '\0';
never executed: ret[rlen - 1] = '\0';
0
4067 free (rtext);-
4068 return ret;
never executed: return ret;
0
4069}-
4070-
4071/* Support for binding readline key sequences to Unix commands. */-
4072static Keymap cmd_xmap;-
4073-
4074#ifdef _MINIX-
4075static void-
4076#else-
4077static int-
4078#endif-
4079putx(c)-
4080 int c;-
4081{-
4082 int x;-
4083 x = putc (c, rl_outstream);-
4084#ifndef _MINIX-
4085 return x;
never executed: return x;
0
4086#endif-
4087}-
4088 -
4089static int-
4090bash_execute_unix_command (count, key)-
4091 int count; /* ignored */-
4092 int key;-
4093{-
4094 int type;-
4095 register int i, r;-
4096 intmax_t mi;-
4097 sh_parser_state_t ps;-
4098 char *cmd, *value, *ce;-
4099 SHELL_VAR *v;-
4100 char ibuf[INT_STRLEN_BOUND(int) + 1];-
4101-
4102 /* First, we need to find the right command to execute. This is tricky,-
4103 because we might have already indirected into another keymap, so we-
4104 have to walk cmd_xmap using the entire key sequence. */-
4105 cmd = (char *)rl_function_of_keyseq_len (rl_executing_keyseq, rl_key_sequence_length, cmd_xmap, &type);-
4106 -
4107 if (cmd == 0 || type != ISMACR)
cmd == 0Description
TRUEnever evaluated
FALSEnever evaluated
type != 2Description
TRUEnever evaluated
FALSEnever evaluated
0
4108 {-
4109 rl_crlf ();-
4110 internal_error (_("bash_execute_unix_command: cannot find keymap for command"));-
4111 rl_forced_update_display ();-
4112 return 1;
never executed: return 1;
0
4113 }-
4114-
4115 ce = rl_get_termcap ("ce");-
4116 if (ce) /* clear current line */
ceDescription
TRUEnever evaluated
FALSEnever evaluated
0
4117 {-
4118#if 0-
4119 fprintf (rl_outstream, "\r");-
4120 tputs (ce, 1, putx);-
4121#else-
4122 rl_clear_visible_line ();-
4123#endif-
4124 fflush (rl_outstream);-
4125 }
never executed: end of block
0
4126 else-
4127 rl_crlf (); /* move to a new line */
never executed: rl_crlf ();
0
4128-
4129 v = bind_variable ("READLINE_LINE", rl_line_buffer, 0);-
4130 if (v)
vDescription
TRUEnever evaluated
FALSEnever evaluated
0
4131 VSETATTR (v, att_exported);
never executed: ((v)->attributes |= (0x0000001));
0
4132 value = inttostr (rl_point, ibuf, sizeof (ibuf));-
4133 v = bind_int_variable ("READLINE_POINT", value, 0);-
4134 if (v)
vDescription
TRUEnever evaluated
FALSEnever evaluated
0
4135 VSETATTR (v, att_exported);
never executed: ((v)->attributes |= (0x0000001));
0
4136 array_needs_making = 1;-
4137-
4138 save_parser_state (&ps);-
4139 r = parse_and_execute (cmd, "bash_execute_unix_command", SEVAL_NOHIST|SEVAL_NOFREE);-
4140 restore_parser_state (&ps);-
4141-
4142 v = find_variable ("READLINE_LINE");-
4143 maybe_make_readline_line (v ? value_cell (v) : 0);-
4144-
4145 v = find_variable ("READLINE_POINT");-
4146 if (v && legal_number (value_cell (v), &mi))
vDescription
TRUEnever evaluated
FALSEnever evaluated
legal_number (...->value), &mi)Description
TRUEnever evaluated
FALSEnever evaluated
0
4147 {-
4148 i = mi;-
4149 if (i != rl_point)
i != rl_pointDescription
TRUEnever evaluated
FALSEnever evaluated
0
4150 {-
4151 rl_point = i;-
4152 if (rl_point > rl_end)
rl_point > rl_endDescription
TRUEnever evaluated
FALSEnever evaluated
0
4153 rl_point = rl_end;
never executed: rl_point = rl_end;
0
4154 else if (rl_point < 0)
rl_point < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
4155 rl_point = 0;
never executed: rl_point = 0;
0
4156 }
never executed: end of block
0
4157 }
never executed: end of block
0
4158-
4159 check_unbind_variable ("READLINE_LINE");-
4160 check_unbind_variable ("READLINE_POINT");-
4161 array_needs_making = 1;-
4162-
4163 /* and restore the readline buffer and display after command execution. */-
4164 /* If we clear the last line of the prompt above, redraw only that last-
4165 line. If the command returns 124, we redraw unconditionally as in-
4166 previous versions. */-
4167 if (ce && r != 124)
ceDescription
TRUEnever evaluated
FALSEnever evaluated
r != 124Description
TRUEnever evaluated
FALSEnever evaluated
0
4168 rl_redraw_prompt_last_line ();
never executed: rl_redraw_prompt_last_line ();
0
4169 else-
4170 rl_forced_update_display ();
never executed: rl_forced_update_display ();
0
4171-
4172 return 0;
never executed: return 0;
0
4173}-
4174-
4175int-
4176print_unix_command_map ()-
4177{-
4178 Keymap save;-
4179-
4180 save = rl_get_keymap ();-
4181 rl_set_keymap (cmd_xmap);-
4182 rl_macro_dumper (1);-
4183 rl_set_keymap (save);-
4184 return 0;
never executed: return 0;
0
4185}-
4186-
4187static void-
4188init_unix_command_map ()-
4189{-
4190 cmd_xmap = rl_make_bare_keymap ();-
4191}
never executed: end of block
0
4192-
4193static int-
4194isolate_sequence (string, ind, need_dquote, startp)-
4195 char *string;-
4196 int ind, need_dquote, *startp;-
4197{-
4198 register int i;-
4199 int c, passc, delim;-
4200-
4201 for (i = ind; string[i] && whitespace (string[i]); i++)
string[i]Description
TRUEnever evaluated
FALSEnever evaluated
((string[i]) == ' ')Description
TRUEnever evaluated
FALSEnever evaluated
((string[i]) == '\t')Description
TRUEnever evaluated
FALSEnever evaluated
0
4202 ;
never executed: ;
0
4203 /* NEED_DQUOTE means that the first non-white character *must* be `"'. */-
4204 if (need_dquote && string[i] != '"')
need_dquoteDescription
TRUEnever evaluated
FALSEnever evaluated
string[i] != '"'Description
TRUEnever evaluated
FALSEnever evaluated
0
4205 {-
4206 builtin_error (_("%s: first non-whitespace character is not `\"'"), string);-
4207 return -1;
never executed: return -1;
0
4208 }-
4209-
4210 /* We can have delimited strings even if NEED_DQUOTE == 0, like the command-
4211 string to bind the key sequence to. */-
4212 delim = (string[i] == '"' || string[i] == '\'') ? string[i] : 0;
string[i] == '"'Description
TRUEnever evaluated
FALSEnever evaluated
string[i] == '\''Description
TRUEnever evaluated
FALSEnever evaluated
0
4213 -
4214 if (startp)
startpDescription
TRUEnever evaluated
FALSEnever evaluated
0
4215 *startp = delim ? ++i : i;
never executed: *startp = delim ? ++i : i;
delimDescription
TRUEnever evaluated
FALSEnever evaluated
0
4216-
4217 for (passc = 0; c = string[i]; i++)
c = string[i]Description
TRUEnever evaluated
FALSEnever evaluated
0
4218 {-
4219 if (passc)
passcDescription
TRUEnever evaluated
FALSEnever evaluated
0
4220 {-
4221 passc = 0;-
4222 continue;
never executed: continue;
0
4223 }-
4224 if (c == '\\')
c == '\\'Description
TRUEnever evaluated
FALSEnever evaluated
0
4225 {-
4226 passc++;-
4227 continue;
never executed: continue;
0
4228 }-
4229 if (c == delim)
c == delimDescription
TRUEnever evaluated
FALSEnever evaluated
0
4230 break;
never executed: break;
0
4231 }
never executed: end of block
0
4232-
4233 if (delim && string[i] != delim)
delimDescription
TRUEnever evaluated
FALSEnever evaluated
string[i] != delimDescription
TRUEnever evaluated
FALSEnever evaluated
0
4234 {-
4235 builtin_error (_("no closing `%c' in %s"), delim, string);-
4236 return -1;
never executed: return -1;
0
4237 }-
4238-
4239 return i;
never executed: return i;
0
4240}-
4241-
4242int-
4243bind_keyseq_to_unix_command (line)-
4244 char *line;-
4245{-
4246 Keymap kmap;-
4247 char *kseq, *value;-
4248 int i, kstart;-
4249-
4250 if (cmd_xmap == 0)
cmd_xmap == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
4251 init_unix_command_map ();
never executed: init_unix_command_map ();
0
4252-
4253 kmap = rl_get_keymap ();-
4254-
4255 /* We duplicate some of the work done by rl_parse_and_bind here, but-
4256 this code only has to handle `"keyseq": ["]command["]' and can-
4257 generate an error for anything else. */-
4258 i = isolate_sequence (line, 0, 1, &kstart);-
4259 if (i < 0)
i < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
4260 return -1;
never executed: return -1;
0
4261-
4262 /* Create the key sequence string to pass to rl_generic_bind */-
4263 kseq = substring (line, kstart, i);-
4264-
4265 for ( ; line[i] && line[i] != ':'; i++)
line[i]Description
TRUEnever evaluated
FALSEnever evaluated
line[i] != ':'Description
TRUEnever evaluated
FALSEnever evaluated
0
4266 ;
never executed: ;
0
4267 if (line[i] != ':')
line[i] != ':'Description
TRUEnever evaluated
FALSEnever evaluated
0
4268 {-
4269 builtin_error (_("%s: missing colon separator"), line);-
4270 FREE (kseq);
never executed: sh_xfree((kseq), "bashline.c", 4270);
kseqDescription
TRUEnever evaluated
FALSEnever evaluated
0
4271 return -1;
never executed: return -1;
0
4272 }-
4273-
4274 i = isolate_sequence (line, i + 1, 0, &kstart);-
4275 if (i < 0)
i < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
4276 {-
4277 FREE (kseq);
never executed: sh_xfree((kseq), "bashline.c", 4277);
kseqDescription
TRUEnever evaluated
FALSEnever evaluated
0
4278 return -1;
never executed: return -1;
0
4279 }-
4280-
4281 /* Create the value string containing the command to execute. */-
4282 value = substring (line, kstart, i);-
4283-
4284 /* Save the command to execute and the key sequence in the CMD_XMAP */-
4285 rl_generic_bind (ISMACR, kseq, value, cmd_xmap);-
4286-
4287 /* and bind the key sequence in the current keymap to a function that-
4288 understands how to execute from CMD_XMAP */-
4289 rl_bind_keyseq_in_map (kseq, bash_execute_unix_command, kmap);-
4290-
4291 free (kseq); -
4292 return 0;
never executed: return 0;
0
4293}-
4294-
4295/* Used by the programmable completion code. Complete TEXT as a filename,-
4296 but return only directories as matches. Dequotes the filename before-
4297 attempting to find matches. */-
4298char **-
4299bash_directory_completion_matches (text)-
4300 const char *text;-
4301{-
4302 char **m1;-
4303 char *dfn;-
4304 int qc;-
4305-
4306 qc = rl_dispatching ? rl_completion_quote_character : 0;
rl_dispatchingDescription
TRUEnever evaluated
FALSEnever evaluated
0
4307 /* If rl_completion_found_quote != 0, rl_completion_matches will call the-
4308 filename dequoting function, causing the directory name to be dequoted-
4309 twice. */-
4310 if (rl_dispatching && rl_completion_found_quote == 0)
rl_dispatchingDescription
TRUEnever evaluated
FALSEnever evaluated
rl_completion_found_quote == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
4311 dfn = bash_dequote_filename ((char *)text, qc);
never executed: dfn = bash_dequote_filename ((char *)text, qc);
0
4312 else-
4313 dfn = (char *)text;
never executed: dfn = (char *)text;
0
4314 m1 = rl_completion_matches (dfn, rl_filename_completion_function);-
4315 if (dfn != text)
dfn != textDescription
TRUEnever evaluated
FALSEnever evaluated
0
4316 free (dfn);
never executed: sh_xfree((dfn), "bashline.c", 4316);
0
4317-
4318 if (m1 == 0 || m1[0] == 0)
m1 == 0Description
TRUEnever evaluated
FALSEnever evaluated
m1[0] == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
4319 return m1;
never executed: return m1;
0
4320 /* We don't bother recomputing the lcd of the matches, because it will just-
4321 get thrown away by the programmable completion code and recomputed-
4322 later. */-
4323 (void)bash_ignore_filenames (m1);-
4324 return m1;
never executed: return m1;
0
4325}-
4326-
4327char *-
4328bash_dequote_text (text)-
4329 const char *text;-
4330{-
4331 char *dtxt;-
4332 int qc;-
4333-
4334 qc = (text[0] == '"' || text[0] == '\'') ? text[0] : 0;
text[0] == '"'Description
TRUEnever evaluated
FALSEnever evaluated
text[0] == '\''Description
TRUEnever evaluated
FALSEnever evaluated
0
4335 dtxt = bash_dequote_filename ((char *)text, qc);-
4336 return (dtxt);
never executed: return (dtxt);
0
4337}-
4338-
4339/* This event hook is designed to be called after readline receives a signal-
4340 that interrupts read(2). It gives reasonable responsiveness to interrupts-
4341 and fatal signals without executing too much code in a signal handler-
4342 context. */-
4343static int-
4344bash_event_hook ()-
4345{-
4346 /* If we're going to longjmp to top_level, make sure we clean up readline.-
4347 check_signals will call QUIT, which will eventually longjmp to top_level,-
4348 calling run_interrupt_trap along the way. The check for sigalrm_seen is-
4349 to clean up the read builtin's state. */-
4350 if (terminating_signal || interrupt_state || sigalrm_seen)
terminating_signalDescription
TRUEnever evaluated
FALSEnever evaluated
interrupt_stateDescription
TRUEnever evaluated
FALSEnever evaluated
sigalrm_seenDescription
TRUEnever evaluated
FALSEnever evaluated
0
4351 rl_cleanup_after_signal ();
never executed: rl_cleanup_after_signal ();
0
4352 bashline_reset_event_hook ();-
4353 check_signals_and_traps (); /* XXX */-
4354 return 0;
never executed: return 0;
0
4355}-
4356-
4357#endif /* READLINE */-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2