]> git.ipfire.org Git - thirdparty/bash.git/blame - bashline.c
Imported from ../bash-3.2.tar.gz.
[thirdparty/bash.git] / bashline.c
CommitLineData
726f6388
JA
1/* bashline.c -- Bash's interface to the readline library. */
2
0628567a 3/* Copyright (C) 1987-2006 Free Software Foundation, Inc.
726f6388
JA
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 it
8 under the terms of the GNU General Public License as published by
bb70624e 9 the Free Software Foundation; either version 2, or (at your option)
726f6388
JA
10 any later version.
11
12 Bash is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with Bash; see the file COPYING. If not, write to the Free
bb70624e 19 Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
726f6388 20
ccc6cda3
JA
21#include "config.h"
22
23#if defined (READLINE)
24
726f6388
JA
25#include "bashtypes.h"
26#include "posixstat.h"
27
ccc6cda3
JA
28#if defined (HAVE_UNISTD_H)
29# include <unistd.h>
30#endif
31
f73dda09
JA
32#if defined (HAVE_GRP_H)
33# include <grp.h>
34#endif
35
7117c2d2
JA
36#if defined (HAVE_NETDB_H)
37# include <netdb.h>
38#endif
39
726f6388 40#include <stdio.h>
f73dda09 41#include "chartypes.h"
726f6388 42#include "bashansi.h"
b80f6443
JA
43#include "bashintl.h"
44
726f6388 45#include "shell.h"
7117c2d2 46#include "input.h"
726f6388 47#include "builtins.h"
726f6388 48#include "bashhist.h"
ccc6cda3 49#include "bashline.h"
726f6388 50#include "execute_cmd.h"
cce855bc 51#include "findcmd.h"
ccc6cda3
JA
52#include "pathexp.h"
53#include "builtins/common.h"
54#include <readline/rlconf.h>
55#include <readline/readline.h>
56#include <readline/history.h>
57
58#include <glob/glob.h>
726f6388
JA
59
60#if defined (ALIAS)
61# include "alias.h"
62#endif
63
bb70624e
JA
64#if defined (PROGRAMMABLE_COMPLETION)
65# include "pcomplete.h"
66#endif
67
7117c2d2
JA
68/* These should agree with the defines for emacs_mode and vi_mode in
69 rldefs.h, even though that's not a public readline header file. */
70#ifndef EMACS_EDITING_MODE
71# define NO_EDITING_MODE -1
72# define EMACS_EDITING_MODE 1
73# define VI_EDITING_MODE 0
74#endif
75
726f6388 76#if defined (BRACE_COMPLETION)
28ef6c31 77extern int bash_brace_completion __P((int, int));
726f6388
JA
78#endif /* BRACE_COMPLETION */
79
28ef6c31
JA
80/* Forward declarations */
81
726f6388 82/* Functions bound to keys in Readline for Bash users. */
28ef6c31
JA
83static int shell_expand_line __P((int, int));
84static int display_shell_version __P((int, int));
85static int operate_and_get_next __P((int, int));
86
87static int bash_ignore_filenames __P((char **));
88static int bash_ignore_everything __P((char **));
89
cce855bc 90#if defined (BANG_HISTORY)
f73dda09 91static char *history_expand_line_internal __P((char *));
28ef6c31
JA
92static int history_expand_line __P((int, int));
93static int tcsh_magic_space __P((int, int));
cce855bc 94#endif /* BANG_HISTORY */
d166f048 95#ifdef ALIAS
28ef6c31 96static int alias_expand_line __P((int, int));
cce855bc
JA
97#endif
98#if defined (BANG_HISTORY) && defined (ALIAS)
28ef6c31 99static int history_and_alias_expand_line __P((int, int));
d166f048 100#endif
726f6388
JA
101
102/* Helper functions for Readline. */
95732b49 103static void bash_directory_expansion __P((char **));
f73dda09
JA
104static int bash_directory_completion_hook __P((char **));
105static int filename_completion_ignore __P((char **));
28ef6c31 106static int bash_push_line __P((void));
726f6388 107
f73dda09
JA
108static void cleanup_expansion_error __P((void));
109static void maybe_make_readline_line __P((char *));
110static void set_up_new_line __P((char *));
111
112static int check_redir __P((int));
28ef6c31
JA
113static char **attempt_shell_completion __P((const char *, int, int));
114static char *variable_completion_function __P((const char *, int));
115static char *hostname_completion_function __P((const char *, int));
116static char *command_subst_completion_function __P((const char *, int));
ccc6cda3 117
f73dda09
JA
118static void build_history_completion_array __P((void));
119static char *history_completion_generator __P((const char *, int));
28ef6c31 120static int dynamic_complete_history __P((int, int));
726f6388 121
f73dda09 122static void initialize_hostname_list __P((void));
28ef6c31 123static void add_host_name __P((char *));
f73dda09
JA
124static void snarf_hosts_from_file __P((char *));
125static char **hostnames_matching __P((char *));
126
127static void _ignore_completion_names __P((char **, sh_ignore_func_t *));
128static int name_is_acceptable __P((const char *));
129static int test_for_directory __P((const char *));
130static int return_zero __P((const char *));
28ef6c31
JA
131
132static char *bash_dequote_filename __P((char *, int));
f73dda09 133static char *quote_word_break_chars __P((char *));
28ef6c31 134static char *bash_quote_filename __P((char *, int, char *));
ccc6cda3 135
f73dda09
JA
136static int bash_execute_unix_command __P((int, int));
137static void init_unix_command_map __P((void));
138static int isolate_sequence __P((char *, int, int, int *));
139
140static int set_saved_history __P((void));
141
ccc6cda3 142#if defined (ALIAS)
28ef6c31 143static int posix_edit_macros __P((int, int));
ccc6cda3 144#endif
726f6388 145
bb70624e 146#if defined (PROGRAMMABLE_COMPLETION)
f73dda09
JA
147static int find_cmd_start __P((int));
148static int find_cmd_end __P((int));
149static char *find_cmd_name __P((int));
150static char *prog_complete_return __P((const char *, int));
151
bb70624e 152static char **prog_complete_matches;
bb70624e
JA
153#endif
154
726f6388 155/* Variables used here but defined in other files. */
b80f6443
JA
156#if defined (BANG_HISTORY)
157extern int hist_verify;
158#endif
159
160extern int current_command_line_count, last_command_exit_value;
726f6388 161extern int posixly_correct, no_symbolic_links;
726f6388
JA
162extern char *current_prompt_string, *ps1_prompt;
163extern STRING_INT_ALIST word_token_alist[];
b80f6443 164extern sh_builtin_func_t *last_shell_builtin, *this_shell_builtin;
726f6388
JA
165
166/* SPECIFIC_COMPLETION_FUNCTIONS specifies that we have individual
167 completion functions which indicate what type of completion should be
168 done (at or before point) that can be bound to key sequences with
169 the readline library. */
170#define SPECIFIC_COMPLETION_FUNCTIONS
171
172#if defined (SPECIFIC_COMPLETION_FUNCTIONS)
28ef6c31
JA
173static int bash_specific_completion __P((int, rl_compentry_func_t *));
174
175static int bash_complete_filename_internal __P((int));
176static int bash_complete_username_internal __P((int));
177static int bash_complete_hostname_internal __P((int));
178static int bash_complete_variable_internal __P((int));
179static int bash_complete_command_internal __P((int));
180
181static int bash_complete_filename __P((int, int));
182static int bash_possible_filename_completions __P((int, int));
183static int bash_complete_username __P((int, int));
184static int bash_possible_username_completions __P((int, int));
185static int bash_complete_hostname __P((int, int));
186static int bash_possible_hostname_completions __P((int, int));
187static int bash_complete_variable __P((int, int));
188static int bash_possible_variable_completions __P((int, int));
189static int bash_complete_command __P((int, int));
190static int bash_possible_command_completions __P((int, int));
f73dda09
JA
191
192static char *glob_complete_word __P((const char *, int));
193static int bash_glob_completion_internal __P((int));
7117c2d2 194static int bash_glob_complete_word __P((int, int));
f73dda09
JA
195static int bash_glob_expand_word __P((int, int));
196static int bash_glob_list_expansions __P((int, int));
b80f6443 197
726f6388
JA
198#endif /* SPECIFIC_COMPLETION_FUNCTIONS */
199
7117c2d2 200static int edit_and_execute_command __P((int, int, int, char *));
726f6388 201#if defined (VI_MODE)
28ef6c31 202static int vi_edit_and_execute_command __P((int, int));
b80f6443 203static int bash_vi_complete __P((int, int));
726f6388 204#endif
7117c2d2 205static int emacs_edit_and_execute_command __P((int, int));
726f6388 206
ccc6cda3
JA
207/* Non-zero once initalize_readline () has been called. */
208int bash_readline_initialized = 0;
209
210/* If non-zero, we do hostname completion, breaking words at `@' and
211 trying to complete the stuff after the `@' from our own internal
212 host list. */
213int perform_hostname_completion = 1;
214
bb70624e
JA
215/* If non-zero, we don't do command completion on an empty line. */
216int no_empty_command_completion;
217
b80f6443
JA
218/* Set FORCE_FIGNORE if you want to honor FIGNORE even if it ignores the
219 only possible matches. Set to 0 if you want to match filenames if they
220 are the only possible matches, even if FIGNORE says to. */
221int force_fignore = 1;
222
ccc6cda3
JA
223static char *bash_completer_word_break_characters = " \t\n\"'@><=;|&(:";
224static char *bash_nohostname_word_break_characters = " \t\n\"'><=;|&(:";
b80f6443 225/* )) */
ccc6cda3 226
28ef6c31 227static rl_hook_func_t *old_rl_startup_hook = (rl_hook_func_t *)NULL;
726f6388 228
95732b49
JA
229static int dot_in_path = 0;
230
ccc6cda3
JA
231/* What kind of quoting is performed by bash_quote_filename:
232 COMPLETE_DQUOTE = double-quoting the filename
233 COMPLETE_SQUOTE = single_quoting the filename
234 COMPLETE_BSQUOTE = backslash-quoting special chars in the filename
235*/
236#define COMPLETE_DQUOTE 1
237#define COMPLETE_SQUOTE 2
238#define COMPLETE_BSQUOTE 3
239static int completion_quoting_style = COMPLETE_BSQUOTE;
240
0628567a
JA
241/* Flag values for the final argument to bash_default_completion */
242#define DEFCOMP_CMDPOS 1
243
726f6388
JA
244/* Change the readline VI-mode keymaps into or out of Posix.2 compliance.
245 Called when the shell is put into or out of `posix' mode. */
246void
247posix_readline_initialize (on_or_off)
248 int on_or_off;
249{
ccc6cda3
JA
250 if (on_or_off)
251 rl_variable_bind ("comment-begin", "#");
726f6388 252#if defined (VI_MODE)
7117c2d2 253 rl_bind_key_in_map (CTRL ('I'), on_or_off ? rl_insert : rl_complete, vi_insertion_keymap);
ccc6cda3
JA
254#endif
255}
256
b80f6443
JA
257/* When this function returns, rl_completer_word_break_characters points to
258 dynamically allocated memory. */
f73dda09 259int
ccc6cda3
JA
260enable_hostname_completion (on_or_off)
261 int on_or_off;
262{
f73dda09 263 int old_value;
b80f6443 264 char *at, *nv, *nval;
f73dda09
JA
265
266 old_value = perform_hostname_completion;
267
726f6388
JA
268 if (on_or_off)
269 {
ccc6cda3
JA
270 perform_hostname_completion = 1;
271 rl_special_prefixes = "$@";
726f6388
JA
272 }
273 else
ccc6cda3
JA
274 {
275 perform_hostname_completion = 0;
276 rl_special_prefixes = "$";
b80f6443
JA
277 }
278
279 /* Now we need to figure out how to appropriately modify and assign
280 rl_completer_word_break_characters depending on whether we want
281 hostname completion on or off. */
282
283 /* If this is the first time this has been called
284 (bash_readline_initialized == 0), use the sames values as before, but
285 allocate new memory for rl_completer_word_break_characters. */
286
287 if (bash_readline_initialized == 0 &&
288 (rl_completer_word_break_characters == 0 ||
289 rl_completer_word_break_characters == rl_basic_word_break_characters))
290 {
291 if (on_or_off)
292 rl_completer_word_break_characters = savestring (bash_completer_word_break_characters);
293 else
294 rl_completer_word_break_characters = savestring (bash_nohostname_word_break_characters);
295 }
296 else
297 {
298 /* See if we have anything to do. */
299 at = strchr (rl_completer_word_break_characters, '@');
300 if ((at == 0 && on_or_off == 0) || (at != 0 && on_or_off != 0))
eb873671 301 return old_value;
b80f6443
JA
302
303 /* We have something to do. Do it. */
304 nval = (char *)xmalloc (strlen (rl_completer_word_break_characters) + 1 + on_or_off);
305
306 if (on_or_off == 0)
307 {
308 /* Turn it off -- just remove `@' from word break chars. We want
309 to remove all occurrences of `@' from the char list, so we loop
310 rather than just copy the rest of the list over AT. */
311 for (nv = nval, at = rl_completer_word_break_characters; *at; )
312 if (*at != '@')
313 *nv++ = *at++;
314 else
315 at++;
316 *nv = '\0';
317 }
318 else
319 {
320 nval[0] = '@';
321 strcpy (nval + 1, rl_completer_word_break_characters);
322 }
323
324 free (rl_completer_word_break_characters);
325 rl_completer_word_break_characters = nval;
ccc6cda3 326 }
f73dda09
JA
327
328 return (old_value);
ccc6cda3 329}
726f6388
JA
330
331/* Called once from parse.y if we are going to use readline. */
332void
333initialize_readline ()
334{
b80f6443
JA
335 rl_command_func_t *func;
336 char kseq[2];
337
726f6388
JA
338 if (bash_readline_initialized)
339 return;
340
341 rl_terminal_name = get_string_value ("TERM");
342 rl_instream = stdin;
343 rl_outstream = stderr;
726f6388
JA
344
345 /* Allow conditional parsing of the ~/.inputrc file. */
346 rl_readline_name = "Bash";
347
28ef6c31
JA
348 /* Add bindable names before calling rl_initialize so they may be
349 referenced in the various inputrc files. */
350 rl_add_defun ("shell-expand-line", shell_expand_line, -1);
cce855bc 351#ifdef BANG_HISTORY
28ef6c31
JA
352 rl_add_defun ("history-expand-line", history_expand_line, -1);
353 rl_add_defun ("magic-space", tcsh_magic_space, -1);
cce855bc
JA
354#endif
355
d166f048 356#ifdef ALIAS
28ef6c31 357 rl_add_defun ("alias-expand-line", alias_expand_line, -1);
bc4cd23c 358# ifdef BANG_HISTORY
28ef6c31 359 rl_add_defun ("history-and-alias-expand-line", history_and_alias_expand_line, -1);
bc4cd23c 360# endif
d166f048
JA
361#endif
362
726f6388
JA
363 /* Backwards compatibility. */
364 rl_add_defun ("insert-last-argument", rl_yank_last_arg, -1);
365
28ef6c31
JA
366 rl_add_defun ("operate-and-get-next", operate_and_get_next, -1);
367 rl_add_defun ("display-shell-version", display_shell_version, -1);
7117c2d2 368 rl_add_defun ("edit-and-execute-command", emacs_edit_and_execute_command, -1);
28ef6c31
JA
369
370#if defined (BRACE_COMPLETION)
371 rl_add_defun ("complete-into-braces", bash_brace_completion, -1);
372#endif
373
374#if defined (SPECIFIC_COMPLETION_FUNCTIONS)
375 rl_add_defun ("complete-filename", bash_complete_filename, -1);
376 rl_add_defun ("possible-filename-completions", bash_possible_filename_completions, -1);
377 rl_add_defun ("complete-username", bash_complete_username, -1);
378 rl_add_defun ("possible-username-completions", bash_possible_username_completions, -1);
379 rl_add_defun ("complete-hostname", bash_complete_hostname, -1);
380 rl_add_defun ("possible-hostname-completions", bash_possible_hostname_completions, -1);
381 rl_add_defun ("complete-variable", bash_complete_variable, -1);
382 rl_add_defun ("possible-variable-completions", bash_possible_variable_completions, -1);
383 rl_add_defun ("complete-command", bash_complete_command, -1);
384 rl_add_defun ("possible-command-completions", bash_possible_command_completions, -1);
7117c2d2 385 rl_add_defun ("glob-complete-word", bash_glob_complete_word, -1);
28ef6c31
JA
386 rl_add_defun ("glob-expand-word", bash_glob_expand_word, -1);
387 rl_add_defun ("glob-list-expansions", bash_glob_list_expansions, -1);
388#endif
389
390 rl_add_defun ("dynamic-complete-history", dynamic_complete_history, -1);
726f6388 391
28ef6c31
JA
392 /* Bind defaults before binding our custom shell keybindings. */
393 if (RL_ISSTATE(RL_STATE_INITIALIZED) == 0)
394 rl_initialize ();
395
396 /* Bind up our special shell functions. */
b80f6443 397 rl_bind_key_if_unbound_in_map (CTRL('E'), shell_expand_line, emacs_meta_keymap);
28ef6c31 398
28ef6c31 399#ifdef BANG_HISTORY
b80f6443 400 rl_bind_key_if_unbound_in_map ('^', history_expand_line, emacs_meta_keymap);
28ef6c31
JA
401#endif
402
b80f6443
JA
403 rl_bind_key_if_unbound_in_map (CTRL ('O'), operate_and_get_next, emacs_standard_keymap);
404 rl_bind_key_if_unbound_in_map (CTRL ('V'), display_shell_version, emacs_ctlx_keymap);
726f6388
JA
405
406 /* In Bash, the user can switch editing modes with "set -o [vi emacs]",
407 so it is not necessary to allow C-M-j for context switching. Turn
408 off this occasionally confusing behaviour. */
b80f6443
JA
409 kseq[0] = CTRL('J');
410 kseq[1] = '\0';
411 func = rl_function_of_keyseq (kseq, emacs_meta_keymap, (int *)NULL);
412 if (func == rl_vi_editing_mode)
413 rl_unbind_key_in_map (CTRL('J'), emacs_meta_keymap);
414 kseq[0] = CTRL('M');
415 func = rl_function_of_keyseq (kseq, emacs_meta_keymap, (int *)NULL);
416 if (func == rl_vi_editing_mode)
417 rl_unbind_key_in_map (CTRL('M'), emacs_meta_keymap);
726f6388
JA
418#if defined (VI_MODE)
419 rl_unbind_key_in_map (CTRL('E'), vi_movement_keymap);
420#endif
ccc6cda3 421
726f6388 422#if defined (BRACE_COMPLETION)
b80f6443 423 rl_bind_key_if_unbound_in_map ('{', bash_brace_completion, emacs_meta_keymap); /*}*/
726f6388
JA
424#endif /* BRACE_COMPLETION */
425
426#if defined (SPECIFIC_COMPLETION_FUNCTIONS)
b80f6443
JA
427 rl_bind_key_if_unbound_in_map ('/', bash_complete_filename, emacs_meta_keymap);
428 rl_bind_key_if_unbound_in_map ('/', bash_possible_filename_completions, emacs_ctlx_keymap);
28ef6c31 429
b80f6443
JA
430 /* Have to jump through hoops here because there is a default binding for
431 M-~ (rl_tilde_expand) */
432 kseq[0] = '~';
433 kseq[1] = '\0';
434 func = rl_function_of_keyseq (kseq, emacs_meta_keymap, (int *)NULL);
435 if (func == 0 || func == rl_tilde_expand)
436 rl_bind_keyseq_in_map (kseq, bash_complete_username, emacs_meta_keymap);
28ef6c31 437
b80f6443 438 rl_bind_key_if_unbound_in_map ('~', bash_possible_username_completions, emacs_ctlx_keymap);
28ef6c31 439
b80f6443
JA
440 rl_bind_key_if_unbound_in_map ('@', bash_complete_hostname, emacs_meta_keymap);
441 rl_bind_key_if_unbound_in_map ('@', bash_possible_hostname_completions, emacs_ctlx_keymap);
28ef6c31 442
b80f6443
JA
443 rl_bind_key_if_unbound_in_map ('$', bash_complete_variable, emacs_meta_keymap);
444 rl_bind_key_if_unbound_in_map ('$', bash_possible_variable_completions, emacs_ctlx_keymap);
28ef6c31 445
b80f6443
JA
446 rl_bind_key_if_unbound_in_map ('!', bash_complete_command, emacs_meta_keymap);
447 rl_bind_key_if_unbound_in_map ('!', bash_possible_command_completions, emacs_ctlx_keymap);
448
449 rl_bind_key_if_unbound_in_map ('g', bash_glob_complete_word, emacs_meta_keymap);
450 rl_bind_key_if_unbound_in_map ('*', bash_glob_expand_word, emacs_ctlx_keymap);
451 rl_bind_key_if_unbound_in_map ('g', bash_glob_list_expansions, emacs_ctlx_keymap);
726f6388
JA
452
453#endif /* SPECIFIC_COMPLETION_FUNCTIONS */
454
95732b49
JA
455 kseq[0] = TAB;
456 kseq[1] = '\0';
457 func = rl_function_of_keyseq (kseq, emacs_meta_keymap, (int *)NULL);
458 if (func == 0 || func == rl_tab_insert)
459 rl_bind_key_in_map (TAB, dynamic_complete_history, emacs_meta_keymap);
726f6388
JA
460
461 /* Tell the completer that we want a crack first. */
28ef6c31 462 rl_attempted_completion_function = attempt_shell_completion;
726f6388
JA
463
464 /* Tell the completer that we might want to follow symbolic links or
465 do other expansion on directory names. */
466 rl_directory_completion_hook = bash_directory_completion_hook;
467
468 /* Tell the filename completer we want a chance to ignore some names. */
28ef6c31 469 rl_ignore_some_completions_function = filename_completion_ignore;
726f6388 470
7117c2d2 471 /* Bind C-xC-e to invoke emacs and run result as commands. */
b80f6443 472 rl_bind_key_if_unbound_in_map (CTRL ('E'), emacs_edit_and_execute_command, emacs_ctlx_keymap);
726f6388 473#if defined (VI_MODE)
b80f6443 474 rl_bind_key_if_unbound_in_map ('v', vi_edit_and_execute_command, vi_movement_keymap);
ccc6cda3 475# if defined (ALIAS)
b80f6443 476 rl_bind_key_if_unbound_in_map ('@', posix_edit_macros, vi_movement_keymap);
ccc6cda3 477# endif
b80f6443
JA
478
479 rl_bind_key_in_map ('\\', bash_vi_complete, vi_movement_keymap);
480 rl_bind_key_in_map ('*', bash_vi_complete, vi_movement_keymap);
481 rl_bind_key_in_map ('=', bash_vi_complete, vi_movement_keymap);
726f6388
JA
482#endif
483
484 rl_completer_quote_characters = "'\"";
ccc6cda3
JA
485
486 /* This sets rl_completer_word_break_characters and rl_special_prefixes
487 to the appropriate values, depending on whether or not hostname
488 completion is enabled. */
489 enable_hostname_completion (perform_hostname_completion);
490
491 /* characters that need to be quoted when appearing in filenames. */
28ef6c31 492 rl_filename_quote_characters = " \t\n\\\"'@<>=;|&()#$`?*[!:{"; /*}*/
ccc6cda3
JA
493 rl_filename_quoting_function = bash_quote_filename;
494 rl_filename_dequoting_function = bash_dequote_filename;
495 rl_char_is_quoted_p = char_is_quoted;
726f6388 496
7117c2d2
JA
497#if 0
498 /* This is superfluous and makes it impossible to use tab completion in
499 vi mode even when explicitly binding it in ~/.inputrc. sv_strict_posix()
500 should already have called posix_readline_initialize() when
501 posixly_correct was set. */
726f6388
JA
502 if (posixly_correct)
503 posix_readline_initialize (1);
7117c2d2 504#endif
726f6388
JA
505
506 bash_readline_initialized = 1;
507}
508
509/* On Sun systems at least, rl_attempted_completion_function can end up
510 getting set to NULL, and rl_completion_entry_function set to do command
511 word completion if Bash is interrupted while trying to complete a command
512 word. This just resets all the completion functions to the right thing.
513 It's called from throw_to_top_level(). */
514void
515bashline_reinitialize ()
516{
517 tilde_initialize ();
518 rl_attempted_completion_function = attempt_shell_completion;
28ef6c31 519 rl_completion_entry_function = NULL;
726f6388 520 rl_directory_completion_hook = bash_directory_completion_hook;
28ef6c31 521 rl_ignore_some_completions_function = filename_completion_ignore;
726f6388
JA
522}
523
524/* Contains the line to push into readline. */
525static char *push_to_readline = (char *)NULL;
526
527/* Push the contents of push_to_readline into the
528 readline buffer. */
28ef6c31 529static int
726f6388
JA
530bash_push_line ()
531{
532 if (push_to_readline)
533 {
534 rl_insert_text (push_to_readline);
535 free (push_to_readline);
536 push_to_readline = (char *)NULL;
537 rl_startup_hook = old_rl_startup_hook;
538 }
28ef6c31 539 return 0;
726f6388
JA
540}
541
542/* Call this to set the initial text for the next line to read
543 from readline. */
544int
545bash_re_edit (line)
546 char *line;
547{
ccc6cda3 548 FREE (push_to_readline);
726f6388
JA
549
550 push_to_readline = savestring (line);
551 old_rl_startup_hook = rl_startup_hook;
28ef6c31 552 rl_startup_hook = bash_push_line;
726f6388
JA
553
554 return (0);
555}
556
28ef6c31 557static int
726f6388
JA
558display_shell_version (count, c)
559 int count, c;
560{
28ef6c31 561 rl_crlf ();
ccc6cda3 562 show_shell_version (0);
726f6388
JA
563 putc ('\r', rl_outstream);
564 fflush (rl_outstream);
565 rl_on_new_line ();
566 rl_redisplay ();
28ef6c31 567 return 0;
726f6388
JA
568}
569
570/* **************************************************************** */
571/* */
572/* Readline Stuff */
573/* */
574/* **************************************************************** */
575
576/* If the user requests hostname completion, then simply build a list
bb70624e
JA
577 of hosts, and complete from that forever more, or at least until
578 HOSTFILE is unset. */
726f6388 579
bb70624e 580/* THIS SHOULD BE A STRINGLIST. */
726f6388
JA
581/* The kept list of hostnames. */
582static char **hostname_list = (char **)NULL;
583
584/* The physical size of the above list. */
ccc6cda3 585static int hostname_list_size;
726f6388 586
ccc6cda3
JA
587/* The number of hostnames in the above list. */
588static int hostname_list_length;
726f6388
JA
589
590/* Whether or not HOSTNAME_LIST has been initialized. */
591int hostname_list_initialized = 0;
592
726f6388
JA
593/* Initialize the hostname completion table. */
594static void
595initialize_hostname_list ()
596{
597 char *temp;
598
599 temp = get_string_value ("HOSTFILE");
ccc6cda3 600 if (temp == 0)
726f6388 601 temp = get_string_value ("hostname_completion_file");
ccc6cda3
JA
602 if (temp == 0)
603 temp = DEFAULT_HOSTS_FILE;
726f6388
JA
604
605 snarf_hosts_from_file (temp);
726f6388
JA
606
607 if (hostname_list)
608 hostname_list_initialized++;
609}
610
611/* Add NAME to the list of hosts. */
612static void
613add_host_name (name)
614 char *name;
615{
616 if (hostname_list_length + 2 > hostname_list_size)
617 {
ccc6cda3 618 hostname_list_size = (hostname_list_size + 32) - (hostname_list_size % 32);
7117c2d2 619 hostname_list = strvec_resize (hostname_list, hostname_list_size);
726f6388
JA
620 }
621
ccc6cda3
JA
622 hostname_list[hostname_list_length++] = savestring (name);
623 hostname_list[hostname_list_length] = (char *)NULL;
726f6388
JA
624}
625
626#define cr_whitespace(c) ((c) == '\r' || (c) == '\n' || whitespace(c))
627
628static void
629snarf_hosts_from_file (filename)
630 char *filename;
631{
ccc6cda3 632 FILE *file;
726f6388
JA
633 char *temp, buffer[256], name[256];
634 register int i, start;
635
ccc6cda3
JA
636 file = fopen (filename, "r");
637 if (file == 0)
726f6388
JA
638 return;
639
640 while (temp = fgets (buffer, 255, file))
641 {
642 /* Skip to first character. */
ccc6cda3
JA
643 for (i = 0; buffer[i] && cr_whitespace (buffer[i]); i++)
644 ;
726f6388 645
ccc6cda3
JA
646 /* If comment or blank line, ignore. */
647 if (buffer[i] == '\0' || buffer[i] == '#')
726f6388
JA
648 continue;
649
650 /* If `preprocessor' directive, do the include. */
ccc6cda3 651 if (strncmp (buffer + i, "$include ", 9) == 0)
726f6388 652 {
ccc6cda3 653 char *incfile, *t;
726f6388
JA
654
655 /* Find start of filename. */
ccc6cda3
JA
656 for (incfile = buffer + i + 9; *incfile && whitespace (*incfile); incfile++)
657 ;
726f6388
JA
658
659 /* Find end of filename. */
ccc6cda3
JA
660 for (t = incfile; *t && cr_whitespace (*t) == 0; t++)
661 ;
726f6388
JA
662
663 *t = '\0';
664
ccc6cda3 665 snarf_hosts_from_file (incfile);
726f6388
JA
666 continue;
667 }
668
ccc6cda3 669 /* Skip internet address if present. */
f73dda09 670 if (DIGIT (buffer[i]))
ccc6cda3 671 for (; buffer[i] && cr_whitespace (buffer[i]) == 0; i++);
726f6388
JA
672
673 /* Gobble up names. Each name is separated with whitespace. */
ccc6cda3 674 while (buffer[i])
726f6388 675 {
ccc6cda3
JA
676 for (; cr_whitespace (buffer[i]); i++)
677 ;
678 if (buffer[i] == '\0' || buffer[i] == '#')
679 break;
680
681 /* Isolate the current word. */
682 for (start = i; buffer[i] && cr_whitespace (buffer[i]) == 0; i++)
683 ;
684 if (i == start)
726f6388
JA
685 continue;
686 strncpy (name, buffer + start, i - start);
687 name[i - start] = '\0';
688 add_host_name (name);
689 }
690 }
691 fclose (file);
692}
693
bb70624e
JA
694/* Return the hostname list. */
695char **
696get_hostname_list ()
697{
698 if (hostname_list_initialized == 0)
699 initialize_hostname_list ();
700 return (hostname_list);
701}
702
703void
704clear_hostname_list ()
705{
706 register int i;
707
708 if (hostname_list_initialized == 0)
709 return;
710 for (i = 0; i < hostname_list_length; i++)
711 free (hostname_list[i]);
712 hostname_list_length = 0;
713}
714
726f6388
JA
715/* Return a NULL terminated list of hostnames which begin with TEXT.
716 Initialize the hostname list the first time if neccessary.
717 The array is malloc ()'ed, but not the individual strings. */
718static char **
719hostnames_matching (text)
720 char *text;
721{
ccc6cda3
JA
722 register int i, len, nmatch, rsize;
723 char **result;
726f6388 724
ccc6cda3
JA
725 if (hostname_list_initialized == 0)
726 initialize_hostname_list ();
726f6388 727
ccc6cda3
JA
728 if (hostname_list_initialized == 0)
729 return ((char **)NULL);
726f6388
JA
730
731 /* Special case. If TEXT consists of nothing, then the whole list is
732 what is desired. */
ccc6cda3 733 if (*text == '\0')
726f6388 734 {
7117c2d2 735 result = strvec_create (1 + hostname_list_length);
726f6388
JA
736 for (i = 0; i < hostname_list_length; i++)
737 result[i] = hostname_list[i];
738 result[i] = (char *)NULL;
739 return (result);
740 }
741
742 /* Scan until found, or failure. */
ccc6cda3
JA
743 len = strlen (text);
744 result = (char **)NULL;
745 for (i = nmatch = rsize = 0; i < hostname_list_length; i++)
726f6388 746 {
ccc6cda3 747 if (STREQN (text, hostname_list[i], len) == 0)
28ef6c31 748 continue;
726f6388 749
ccc6cda3 750 /* OK, it matches. Add it to the list. */
bc4cd23c 751 if (nmatch >= (rsize - 1))
726f6388 752 {
ccc6cda3 753 rsize = (rsize + 16) - (rsize % 16);
7117c2d2 754 result = strvec_resize (result, rsize);
726f6388
JA
755 }
756
ccc6cda3 757 result[nmatch++] = hostname_list[i];
726f6388 758 }
ccc6cda3
JA
759 if (nmatch)
760 result[nmatch] = (char *)NULL;
761 return (result);
726f6388
JA
762}
763
ccc6cda3 764/* The equivalent of the Korn shell C-o operate-and-get-next-history-line
726f6388 765 editing command. */
ccc6cda3 766static int saved_history_line_to_use = -1;
726f6388 767
28ef6c31 768static int
726f6388
JA
769set_saved_history ()
770{
ccc6cda3 771 if (saved_history_line_to_use >= 0)
b72432fd 772 rl_get_previous_history (history_length - saved_history_line_to_use, 0);
ccc6cda3 773 saved_history_line_to_use = -1;
726f6388 774 rl_startup_hook = old_rl_startup_hook;
f73dda09 775 return (0);
ccc6cda3 776}
726f6388 777
28ef6c31 778static int
726f6388
JA
779operate_and_get_next (count, c)
780 int count, c;
781{
782 int where;
783
784 /* Accept the current line. */
b72432fd 785 rl_newline (1, c);
726f6388
JA
786
787 /* Find the current line, and find the next line to use. */
788 where = where_history ();
789
28ef6c31 790 if ((history_is_stifled () && (history_length >= history_max_entries)) ||
726f6388
JA
791 (where >= history_length - 1))
792 saved_history_line_to_use = where;
793 else
794 saved_history_line_to_use = where + 1;
795
796 old_rl_startup_hook = rl_startup_hook;
28ef6c31
JA
797 rl_startup_hook = set_saved_history;
798
799 return 0;
726f6388
JA
800}
801
726f6388
JA
802/* This vi mode command causes VI_EDIT_COMMAND to be run on the current
803 command being entered (if no explicit argument is given), otherwise on
804 a command from the history file. */
805
b80f6443
JA
806#define VI_EDIT_COMMAND "fc -e \"${VISUAL:-${EDITOR:-vi}}\""
807#define EMACS_EDIT_COMMAND "fc -e \"${VISUAL:-${EDITOR:-emacs}}\""
95732b49 808#define POSIX_VI_EDIT_COMMAND "fc -e vi"
726f6388 809
28ef6c31 810static int
7117c2d2
JA
811edit_and_execute_command (count, c, editing_mode, edit_command)
812 int count, c, editing_mode;
813 char *edit_command;
726f6388
JA
814{
815 char *command;
f73dda09
JA
816 int r, cclc, rrs;
817
818 rrs = rl_readline_state;
819 cclc = current_command_line_count;
726f6388
JA
820
821 /* Accept the current line. */
b72432fd 822 rl_newline (1, c);
726f6388
JA
823
824 if (rl_explicit_arg)
825 {
7117c2d2
JA
826 command = (char *)xmalloc (strlen (edit_command) + 8);
827 sprintf (command, "%s %d", edit_command, count);
726f6388
JA
828 }
829 else
830 {
831 /* Take the command we were just editing, add it to the history file,
832 then call fc to operate on it. We have to add a dummy command to
833 the end of the history because fc ignores the last command (assumes
834 it's supposed to deal with the command before the `fc'). */
835 using_history ();
d166f048
JA
836 bash_add_history (rl_line_buffer);
837 bash_add_history ("");
726f6388
JA
838 history_lines_this_session++;
839 using_history ();
7117c2d2 840 command = savestring (edit_command);
726f6388 841 }
7117c2d2
JA
842
843 /* Now, POSIX.1-2001 and SUSv3 say that the commands executed from the
844 temporary file should be placed into the history. We don't do that
845 yet. */
846 r = parse_and_execute (command, (editing_mode == VI_EDITING_MODE) ? "v" : "C-xC-e", SEVAL_NOHIST);
f73dda09
JA
847
848 current_command_line_count = cclc;
849
850 /* Now erase the contents of the current line and undo the effects of the
851 rl_accept_line() above. We don't even want to make the text we just
852 executed available for undoing. */
ccc6cda3 853 rl_line_buffer[0] = '\0'; /* XXX */
f73dda09
JA
854 rl_point = rl_end = 0;
855 rl_done = 0;
856 rl_readline_state = rrs;
857
858 rl_forced_update_display ();
28ef6c31
JA
859
860 return r;
726f6388 861}
7117c2d2
JA
862
863#if defined (VI_MODE)
864static int
865vi_edit_and_execute_command (count, c)
866 int count, c;
867{
95732b49
JA
868 if (posixly_correct)
869 return (edit_and_execute_command (count, c, VI_EDITING_MODE, POSIX_VI_EDIT_COMMAND));
870 else
871 return (edit_and_execute_command (count, c, VI_EDITING_MODE, VI_EDIT_COMMAND));
7117c2d2 872}
726f6388
JA
873#endif /* VI_MODE */
874
7117c2d2
JA
875static int
876emacs_edit_and_execute_command (count, c)
877 int count, c;
878{
879 return (edit_and_execute_command (count, c, EMACS_EDITING_MODE, EMACS_EDIT_COMMAND));
880}
881
ccc6cda3
JA
882#if defined (ALIAS)
883static int
884posix_edit_macros (count, key)
885 int count, key;
886{
887 int c;
888 char alias_name[3], *alias_value, *macro;
889
890 c = rl_read_key ();
891 alias_name[0] = '_';
892 alias_name[1] = c;
893 alias_name[2] = '\0';
894
895 alias_value = get_alias_value (alias_name);
896 if (alias_value && *alias_value)
897 {
898 macro = savestring (alias_value);
899 rl_push_macro_input (macro);
900 }
901 return 0;
902}
903#endif
904
726f6388
JA
905/* **************************************************************** */
906/* */
907/* How To Do Shell Completion */
908/* */
909/* **************************************************************** */
910
bb70624e 911#define COMMAND_SEPARATORS ";|&{(`"
b80f6443 912/* )} */
bb70624e
JA
913
914static int
915check_redir (ti)
916 int ti;
917{
918 register int this_char, prev_char;
919
920 /* Handle the two character tokens `>&', `<&', and `>|'.
921 We are not in a command position after one of these. */
922 this_char = rl_line_buffer[ti];
923 prev_char = rl_line_buffer[ti - 1];
924
925 if ((this_char == '&' && (prev_char == '<' || prev_char == '>')) ||
926 (this_char == '|' && prev_char == '>'))
927 return (1);
928 else if ((this_char == '{' && prev_char == '$') || /* } */
929 (char_is_quoted (rl_line_buffer, ti)))
930 return (1);
931 return (0);
932}
933
934#if defined (PROGRAMMABLE_COMPLETION)
f73dda09
JA
935/*
936 * XXX - because of the <= start test, and setting os = s+1, this can
937 * potentially return os > start. This is probably not what we want to
938 * happen, but fix later after 2.05a-release.
939 */
bb70624e
JA
940static int
941find_cmd_start (start)
942 int start;
943{
944 register int s, os;
945
946 os = 0;
947 while (((s = skip_to_delim (rl_line_buffer, os, COMMAND_SEPARATORS)) <= start) &&
948 rl_line_buffer[s])
949 os = s+1;
950 return os;
951}
952
953static int
954find_cmd_end (end)
955 int end;
956{
957 register int e;
958
959 e = skip_to_delim (rl_line_buffer, end, COMMAND_SEPARATORS);
960 return e;
961}
962
963static char *
964find_cmd_name (start)
965 int start;
966{
967 char *name;
968 register int s, e;
969
970 for (s = start; whitespace (rl_line_buffer[s]); s++)
971 ;
972
973 /* skip until a shell break character */
974 e = skip_to_delim (rl_line_buffer, s, "()<>;&| \t\n");
975
976 name = substring (rl_line_buffer, s, e);
977
978 return (name);
979}
980
981static char *
982prog_complete_return (text, matchnum)
f73dda09 983 const char *text;
bb70624e
JA
984 int matchnum;
985{
986 static int ind;
987
988 if (matchnum == 0)
989 ind = 0;
990
991 if (prog_complete_matches == 0 || prog_complete_matches[ind] == 0)
992 return (char *)NULL;
993 return (prog_complete_matches[ind++]);
994}
995
996#endif /* PROGRAMMABLE_COMPLETION */
997
726f6388
JA
998/* Do some completion on TEXT. The indices of TEXT in RL_LINE_BUFFER are
999 at START and END. Return an array of matches, or NULL if none. */
1000static char **
1001attempt_shell_completion (text, start, end)
28ef6c31 1002 const char *text;
726f6388
JA
1003 int start, end;
1004{
0628567a 1005 int in_command_position, ti, saveti, qc, dflags;
ccc6cda3 1006 char **matches, *command_separator_chars;
726f6388 1007
bb70624e 1008 command_separator_chars = COMMAND_SEPARATORS;
ccc6cda3 1009 matches = (char **)NULL;
28ef6c31 1010 rl_ignore_some_completions_function = filename_completion_ignore;
726f6388
JA
1011
1012 /* Determine if this could be a command word. It is if it appears at
1013 the start of the line (ignoring preceding whitespace), or if it
1014 appears after a character that separates commands. It cannot be a
1015 command word if we aren't at the top-level prompt. */
1016 ti = start - 1;
bb70624e 1017 saveti = qc = -1;
726f6388
JA
1018
1019 while ((ti > -1) && (whitespace (rl_line_buffer[ti])))
1020 ti--;
1021
bb70624e
JA
1022#if 1
1023 /* If this is an open quote, maybe we're trying to complete a quoted
1024 command name. */
b80f6443 1025 if (ti >= 0 && (rl_line_buffer[ti] == '"' || rl_line_buffer[ti] == '\''))
bb70624e
JA
1026 {
1027 qc = rl_line_buffer[ti];
1028 saveti = ti--;
1029 while (ti > -1 && (whitespace (rl_line_buffer[ti])))
28ef6c31 1030 ti--;
bb70624e
JA
1031 }
1032#endif
1033
726f6388
JA
1034 in_command_position = 0;
1035 if (ti < 0)
1036 {
1037 /* Only do command completion at the start of a line when we
28ef6c31 1038 are prompting at the top level. */
726f6388
JA
1039 if (current_prompt_string == ps1_prompt)
1040 in_command_position++;
1041 }
1042 else if (member (rl_line_buffer[ti], command_separator_chars))
1043 {
726f6388
JA
1044 in_command_position++;
1045
bb70624e 1046 if (check_redir (ti) == 1)
28ef6c31 1047 in_command_position = 0;
726f6388
JA
1048 }
1049 else
1050 {
1051 /* This still could be in command position. It is possible
1052 that all of the previous words on the line are variable
1053 assignments. */
1054 }
1055
d166f048
JA
1056 /* Check that we haven't incorrectly flagged a closed command substitution
1057 as indicating we're in a command position. */
e8ce775d 1058 if (in_command_position && ti >= 0 && rl_line_buffer[ti] == '`' &&
bb70624e 1059 *text != '`' && unclosed_pair (rl_line_buffer, end, "`") == 0)
d166f048
JA
1060 in_command_position = 0;
1061
1062 /* Special handling for command substitution. If *TEXT is a backquote,
1063 it can be the start or end of an old-style command substitution, or
1064 unmatched. If it's unmatched, both calls to unclosed_pair will
1065 succeed. */
bb70624e
JA
1066 if (*text == '`' &&
1067 (in_command_position || (unclosed_pair (rl_line_buffer, start, "`") &&
1068 unclosed_pair (rl_line_buffer, end, "`"))))
28ef6c31 1069 matches = rl_completion_matches (text, command_subst_completion_function);
726f6388 1070
bb70624e
JA
1071#if defined (PROGRAMMABLE_COMPLETION)
1072 /* Attempt programmable completion. */
1073 if (!matches && in_command_position == 0 && prog_completion_enabled &&
7117c2d2 1074 (progcomp_size () > 0) && current_prompt_string == ps1_prompt)
bb70624e
JA
1075 {
1076 int s, e, foundcs;
1077 char *n;
1078
1079 /* XXX - don't free the members */
1080 if (prog_complete_matches)
1081 free (prog_complete_matches);
1082 prog_complete_matches = (char **)NULL;
1083
1084 s = find_cmd_start (start);
1085 e = find_cmd_end (end);
1086 n = find_cmd_name (s);
95732b49 1087 if (e > s && assignment (n, 0) == 0)
f73dda09
JA
1088 prog_complete_matches = programmable_completions (n, text, s, e, &foundcs);
1089 else
1090 foundcs = 0;
bb70624e
JA
1091 FREE (n);
1092 /* XXX - if we found a COMPSPEC for the command, just return whatever
1093 the programmable completion code returns, and disable the default
28ef6c31
JA
1094 filename completion that readline will do unless the COPT_DEFAULT
1095 option has been set with the `-o default' option to complete. */
bb70624e
JA
1096 if (foundcs)
1097 {
28ef6c31 1098 /* If the user specified that the compspec returns filenames, make
f73dda09 1099 sure that readline knows it. */
28ef6c31
JA
1100 if (foundcs & COPT_FILENAMES)
1101 rl_filename_completion_desired = 1;
7117c2d2
JA
1102 /* If the user doesn't want a space appended, tell readline. */
1103 if (foundcs & COPT_NOSPACE)
1104 rl_completion_suppress_append = 1;
bb70624e
JA
1105 /* Turn what the programmable completion code returns into what
1106 readline wants. I should have made compute_lcd_of_matches
1107 external... */
28ef6c31
JA
1108 matches = rl_completion_matches (text, prog_complete_return);
1109 if ((foundcs & COPT_DEFAULT) == 0)
1110 rl_attempted_completion_over = 1; /* no default */
b80f6443
JA
1111 if (matches || ((foundcs & COPT_BASHDEFAULT) == 0))
1112 return (matches);
bb70624e
JA
1113 }
1114 }
1115#endif
1116
b80f6443 1117 if (matches == 0)
0628567a
JA
1118 {
1119 dflags = 0;
1120 if (in_command_position)
1121 dflags |= DEFCOMP_CMDPOS;
1122 matches = bash_default_completion (text, start, end, qc, dflags);
1123 }
b80f6443
JA
1124
1125 return matches;
1126}
1127
1128char **
0628567a 1129bash_default_completion (text, start, end, qc, compflags)
b80f6443 1130 const char *text;
0628567a 1131 int start, end, qc, compflags;
b80f6443
JA
1132{
1133 char **matches;
1134
1135 matches = (char **)NULL;
1136
bb70624e 1137 /* New posix-style command substitution or variable name? */
726f6388 1138 if (!matches && *text == '$')
bb70624e
JA
1139 {
1140 if (qc != '\'' && text[1] == '(') /* ) */
28ef6c31 1141 matches = rl_completion_matches (text, command_subst_completion_function);
bb70624e 1142 else
28ef6c31 1143 matches = rl_completion_matches (text, variable_completion_function);
bb70624e 1144 }
726f6388
JA
1145
1146 /* If the word starts in `~', and there is no slash in the word, then
1147 try completing this word as a username. */
7117c2d2 1148 if (!matches && *text == '~' && !xstrchr (text, '/'))
28ef6c31 1149 matches = rl_completion_matches (text, rl_username_completion_function);
726f6388
JA
1150
1151 /* Another one. Why not? If the word starts in '@', then look through
1152 the world of known hostnames for completion first. */
ccc6cda3 1153 if (!matches && perform_hostname_completion && *text == '@')
28ef6c31 1154 matches = rl_completion_matches (text, hostname_completion_function);
726f6388
JA
1155
1156 /* And last, (but not least) if this word is in a command position, then
1157 complete over possible command names, including aliases, functions,
1158 and command names. */
0628567a 1159 if (matches == 0 && (compflags & DEFCOMP_CMDPOS))
726f6388 1160 {
0628567a
JA
1161 /* If END == START and text[0] == 0, we are trying to complete an empty
1162 command word. */
1163 if (no_empty_command_completion && end == start && text[0] == '\0')
bb70624e
JA
1164 {
1165 matches = (char **)NULL;
28ef6c31 1166 rl_ignore_some_completions_function = bash_ignore_everything;
bb70624e
JA
1167 }
1168 else
1169 {
b80f6443
JA
1170#define CMD_IS_DIR(x) (absolute_pathname(x) == 0 && absolute_program(x) == 0 && *(x) != '~' && test_for_directory (x))
1171
95732b49 1172 dot_in_path = 0;
28ef6c31 1173 matches = rl_completion_matches (text, command_word_completion_function);
b80f6443 1174
bb70624e
JA
1175 /* If we are attempting command completion and nothing matches, we
1176 do not want readline to perform filename completion for us. We
1177 still want to be able to complete partial pathnames, so set the
1178 completion ignore function to something which will remove
1179 filenames and leave directories in the match list. */
1180 if (matches == (char **)NULL)
28ef6c31 1181 rl_ignore_some_completions_function = bash_ignore_filenames;
95732b49
JA
1182 else if (matches[1] == 0 && CMD_IS_DIR(matches[0]) && dot_in_path == 0)
1183 /* If we found a single match, without looking in the current
1184 directory (because it's not in $PATH), but the found name is
1185 also a command in the current directory, suppress appending any
1186 terminating character, since it's ambiguous. */
1187 {
1188 rl_completion_suppress_append = 1;
1189 rl_filename_completion_desired = 0;
1190 }
b80f6443 1191 else if (matches[0] && matches[1] && STREQ (matches[0], matches[1]) && CMD_IS_DIR (matches[0]))
7117c2d2
JA
1192 /* There are multiple instances of the same match (duplicate
1193 completions haven't yet been removed). In this case, all of
1194 the matches will be the same, and the duplicate removal code
95732b49
JA
1195 will distill them all down to one. We turn on
1196 rl_completion_suppress_append for the same reason as above.
7117c2d2
JA
1197 Remember: we only care if there's eventually a single unique
1198 completion. If there are multiple completions this won't
1199 make a difference and the problem won't occur. */
95732b49
JA
1200 {
1201 rl_completion_suppress_append = 1;
1202 rl_filename_completion_desired = 0;
1203 }
bb70624e 1204 }
726f6388
JA
1205 }
1206
ccc6cda3
JA
1207 /* This could be a globbing pattern, so try to expand it using pathname
1208 expansion. */
f73dda09 1209 if (!matches && glob_pattern_p (text))
e8ce775d 1210 {
28ef6c31 1211 matches = rl_completion_matches (text, glob_complete_word);
e8ce775d
JA
1212 /* A glob expression that matches more than one filename is problematic.
1213 If we match more than one filename, punt. */
7117c2d2 1214 if (matches && matches[1] && rl_completion_type == TAB)
e8ce775d 1215 {
7117c2d2 1216 strvec_dispose (matches);
e8ce775d
JA
1217 matches = (char **)0;
1218 }
1219 }
ccc6cda3 1220
726f6388
JA
1221 return (matches);
1222}
1223
1224/* This is the function to call when the word to complete is in a position
1225 where a command word can be found. It grovels $PATH, looking for commands
1226 that match. It also scans aliases, function names, and the shell_builtin
1227 table. */
bb70624e 1228char *
726f6388 1229command_word_completion_function (hint_text, state)
28ef6c31 1230 const char *hint_text;
726f6388
JA
1231 int state;
1232{
1233 static char *hint = (char *)NULL;
1234 static char *path = (char *)NULL;
1235 static char *val = (char *)NULL;
1236 static char *filename_hint = (char *)NULL;
95732b49
JA
1237 static char *dequoted_hint = (char *)NULL;
1238 static int path_index, hint_len, dequoted_len, istate, igncase;
0628567a 1239 static int mapping_over, local_index, searching_path, hint_is_dir;
726f6388
JA
1240 static SHELL_VAR **varlist = (SHELL_VAR **)NULL;
1241#if defined (ALIAS)
ccc6cda3 1242 static alias_t **alias_list = (alias_t **)NULL;
726f6388 1243#endif /* ALIAS */
95732b49 1244 char *temp;
726f6388
JA
1245
1246 /* We have to map over the possibilities for command words. If we have
1247 no state, then make one just for that purpose. */
726f6388
JA
1248 if (!state)
1249 {
95732b49
JA
1250 if (dequoted_hint && dequoted_hint != hint)
1251 free (dequoted_hint);
726f6388
JA
1252 if (hint)
1253 free (hint);
1254
0628567a
JA
1255 mapping_over = searching_path = 0;
1256 hint_is_dir = CMD_IS_DIR (hint_text);
726f6388
JA
1257 val = (char *)NULL;
1258
95732b49
JA
1259 temp = rl_variable_value ("completion-ignore-case");
1260 igncase = strcmp (temp, "on") == 0;
1261
726f6388
JA
1262 /* If this is an absolute program name, do not check it against
1263 aliases, reserved words, functions or builtins. We must check
1264 whether or not it is unique, and, if so, whether that filename
1265 is executable. */
f73dda09 1266 if (absolute_program (hint_text))
726f6388
JA
1267 {
1268 /* Perform tilde expansion on what's passed, so we don't end up
1269 passing filenames with tildes directly to stat(). */
1270 if (*hint_text == '~')
7117c2d2 1271 hint = bash_tilde_expand (hint_text, 0);
726f6388
JA
1272 else
1273 hint = savestring (hint_text);
95732b49
JA
1274
1275 dequoted_hint = hint;
1276 /* If readline's completer found a quote character somewhere, but
1277 didn't set the quote character, there must have been a quote
1278 character embedded in the filename. It can't be at the start of
1279 the filename, so we need to dequote the filename before we look
1280 in the file system for it. */
1281 if (rl_completion_found_quote && rl_completion_quote_character == 0)
1282 {
1283 dequoted_hint = bash_dequote_filename (hint, 0);
1284 free (hint);
1285 hint = dequoted_hint;
1286 }
1287 dequoted_len = hint_len = strlen (hint);
726f6388
JA
1288
1289 if (filename_hint)
1290 free (filename_hint);
95732b49 1291
726f6388
JA
1292 filename_hint = savestring (hint);
1293
1294 mapping_over = 4;
1295 istate = 0;
1296 goto inner;
1297 }
1298
95732b49
JA
1299 dequoted_hint = hint = savestring (hint_text);
1300 dequoted_len = hint_len = strlen (hint);
726f6388 1301
95732b49
JA
1302 if (rl_completion_found_quote && rl_completion_quote_character == 0)
1303 {
1304 dequoted_hint = bash_dequote_filename (hint, 0);
1305 dequoted_len = strlen (dequoted_hint);
1306 }
1307
726f6388 1308 path = get_string_value ("PATH");
95732b49 1309 path_index = dot_in_path = 0;
726f6388
JA
1310
1311 /* Initialize the variables for each type of command word. */
1312 local_index = 0;
1313
1314 if (varlist)
1315 free (varlist);
1316
1317 varlist = all_visible_functions ();
1318
1319#if defined (ALIAS)
1320 if (alias_list)
1321 free (alias_list);
1322
1323 alias_list = all_aliases ();
1324#endif /* ALIAS */
1325 }
1326
1327 /* mapping_over says what we are currently hacking. Note that every case
1328 in this list must fall through when there are no more possibilities. */
1329
1330 switch (mapping_over)
1331 {
1332 case 0: /* Aliases come first. */
1333#if defined (ALIAS)
1334 while (alias_list && alias_list[local_index])
1335 {
1336 register char *alias;
1337
1338 alias = alias_list[local_index++]->name;
1339
1340 if (STREQN (alias, hint, hint_len))
1341 return (savestring (alias));
1342 }
1343#endif /* ALIAS */
1344 local_index = 0;
1345 mapping_over++;
1346
1347 case 1: /* Then shell reserved words. */
1348 {
1349 while (word_token_alist[local_index].word)
1350 {
1351 register char *reserved_word;
1352
1353 reserved_word = word_token_alist[local_index++].word;
1354
1355 if (STREQN (reserved_word, hint, hint_len))
1356 return (savestring (reserved_word));
1357 }
1358 local_index = 0;
1359 mapping_over++;
1360 }
1361
1362 case 2: /* Then function names. */
1363 while (varlist && varlist[local_index])
1364 {
1365 register char *varname;
1366
1367 varname = varlist[local_index++]->name;
1368
1369 if (STREQN (varname, hint, hint_len))
1370 return (savestring (varname));
1371 }
1372 local_index = 0;
1373 mapping_over++;
1374
1375 case 3: /* Then shell builtins. */
1376 for (; local_index < num_shell_builtins; local_index++)
1377 {
1378 /* Ignore it if it doesn't have a function pointer or if it
1379 is not currently enabled. */
1380 if (!shell_builtins[local_index].function ||
1381 (shell_builtins[local_index].flags & BUILTIN_ENABLED) == 0)
1382 continue;
1383
1384 if (STREQN (shell_builtins[local_index].name, hint, hint_len))
1385 {
1386 int i = local_index++;
1387
1388 return (savestring (shell_builtins[i].name));
1389 }
1390 }
1391 local_index = 0;
1392 mapping_over++;
1393 }
1394
0628567a
JA
1395 /* If the text passed is a directory in the current directory, return it
1396 as a possible match. Executables in directories in the current
1397 directory can be specified using relative pathnames and successfully
1398 executed even when `.' is not in $PATH. */
1399 if (hint_is_dir)
1400 {
1401 hint_is_dir = 0; /* only return the hint text once */
1402 return (savestring (hint_text));
1403 }
1404
ccc6cda3 1405 /* Repeatedly call filename_completion_function while we have
726f6388
JA
1406 members of PATH left. Question: should we stat each file?
1407 Answer: we call executable_file () on each file. */
1408 outer:
1409
1410 istate = (val != (char *)NULL);
1411
1412 if (!istate)
1413 {
1414 char *current_path;
1415
1416 /* Get the next directory from the path. If there is none, then we
1417 are all done. */
1418 if (!path || !path[path_index] ||
1419 (current_path = extract_colon_unit (path, &path_index)) == 0)
1420 return ((char *)NULL);
1421
0628567a 1422 searching_path = 1;
726f6388
JA
1423 if (*current_path == 0)
1424 {
1425 free (current_path);
1426 current_path = savestring (".");
1427 }
1428
1429 if (*current_path == '~')
1430 {
1431 char *t;
1432
7117c2d2 1433 t = bash_tilde_expand (current_path, 0);
726f6388
JA
1434 free (current_path);
1435 current_path = t;
1436 }
1437
95732b49
JA
1438 if (current_path[0] == '.' && current_path[1] == '\0')
1439 dot_in_path = 1;
1440
726f6388
JA
1441 if (filename_hint)
1442 free (filename_hint);
1443
7117c2d2 1444 filename_hint = sh_makepath (current_path, hint, 0);
726f6388
JA
1445 free (current_path);
1446 }
1447
1448 inner:
28ef6c31 1449 val = rl_filename_completion_function (filename_hint, istate);
726f6388
JA
1450 istate = 1;
1451
ccc6cda3 1452 if (val == 0)
726f6388
JA
1453 {
1454 /* If the hint text is an absolute program, then don't bother
1455 searching through PATH. */
1456 if (absolute_program (hint))
1457 return ((char *)NULL);
1458
1459 goto outer;
1460 }
1461 else
1462 {
d166f048 1463 int match, freetemp;
0628567a
JA
1464#if 0
1465 char *temp; /* shadows previous declaration */
1466#endif
726f6388
JA
1467
1468 if (absolute_program (hint))
1469 {
95732b49
JA
1470 if (igncase == 0)
1471 match = strncmp (val, hint, hint_len) == 0;
1472 else
1473 match = strncasecmp (val, hint, hint_len) == 0;
1474
726f6388
JA
1475 /* If we performed tilde expansion, restore the original
1476 filename. */
1477 if (*hint_text == '~')
1478 {
eb873671
JA
1479 int l, tl, vl, dl;
1480 char *rd;
726f6388
JA
1481 vl = strlen (val);
1482 tl = strlen (hint_text);
eb873671 1483#if 0
726f6388 1484 l = vl - hint_len; /* # of chars added */
eb873671
JA
1485#else
1486 rd = savestring (filename_hint);
1487 bash_directory_expansion (&rd);
1488 dl = strlen (rd);
1489 l = vl - dl; /* # of chars added */
1490 free (rd);
1491#endif
f73dda09 1492 temp = (char *)xmalloc (l + 2 + tl);
726f6388
JA
1493 strcpy (temp, hint_text);
1494 strcpy (temp + tl, val + vl - l);
1495 }
1496 else
1497 temp = savestring (val);
d166f048 1498 freetemp = 1;
726f6388
JA
1499 }
1500 else
1501 {
1502 temp = strrchr (val, '/');
1503
1504 if (temp)
1505 {
1506 temp++;
95732b49
JA
1507 if (igncase == 0)
1508 freetemp = match = strncmp (temp, hint, hint_len) == 0;
1509 else
1510 freetemp = match = strncasecmp (temp, hint, hint_len) == 0;
726f6388
JA
1511 if (match)
1512 temp = savestring (temp);
1513 }
1514 else
d166f048 1515 freetemp = match = 0;
726f6388
JA
1516 }
1517
0628567a 1518#if 0
ccc6cda3
JA
1519 /* If we have found a match, and it is an executable file or a
1520 directory name, return it. */
28ef6c31 1521 if (match && executable_or_directory (val))
0628567a
JA
1522#else
1523 /* If we have found a match, and it is an executable file, return it.
1524 We don't return directory names when searching $PATH, since the
1525 bash execution code won't find executables in directories which
1526 appear in directories in $PATH when they're specified using
1527 relative pathnames. */
1528 if (match && (searching_path ? executable_file (val) : executable_or_directory (val)))
1529#endif
726f6388
JA
1530 {
1531 free (val);
1532 val = ""; /* So it won't be NULL. */
1533 return (temp);
1534 }
1535 else
1536 {
d166f048
JA
1537 if (freetemp)
1538 free (temp);
726f6388
JA
1539 free (val);
1540 goto inner;
1541 }
1542 }
1543}
1544
d166f048 1545/* Completion inside an unterminated command substitution. */
726f6388
JA
1546static char *
1547command_subst_completion_function (text, state)
28ef6c31 1548 const char *text;
ccc6cda3 1549 int state;
726f6388
JA
1550{
1551 static char **matches = (char **)NULL;
28ef6c31
JA
1552 static const char *orig_start;
1553 static char *filename_text = (char *)NULL;
726f6388 1554 static int cmd_index, start_len;
ccc6cda3 1555 char *value;
726f6388
JA
1556
1557 if (state == 0)
1558 {
1559 if (filename_text)
1560 free (filename_text);
1561 orig_start = text;
1562 if (*text == '`')
28ef6c31 1563 text++;
cce855bc 1564 else if (*text == '$' && text[1] == '(') /* ) */
28ef6c31 1565 text += 2;
b80f6443
JA
1566 /* If the text was quoted, suppress any quote character that the
1567 readline completion code would insert. */
1568 rl_completion_suppress_quote = 1;
726f6388
JA
1569 start_len = text - orig_start;
1570 filename_text = savestring (text);
1571 if (matches)
1572 free (matches);
7117c2d2
JA
1573
1574 /*
1575 * At this point we can entertain the idea of re-parsing
1576 * `filename_text' into a (possibly incomplete) command name and
1577 * arguments, and doing completion based on that. This is
1578 * currently very rudimentary, but it is a small improvement.
1579 */
1580 for (value = filename_text + strlen (filename_text) - 1; value > filename_text; value--)
1581 if (whitespace (*value) || member (*value, COMMAND_SEPARATORS))
1582 break;
1583 if (value <= filename_text)
1584 matches = rl_completion_matches (filename_text, command_word_completion_function);
1585 else
1586 {
1587 value++;
1588 start_len += value - filename_text;
1589 if (whitespace (value[-1]))
1590 matches = rl_completion_matches (value, rl_filename_completion_function);
1591 else
1592 matches = rl_completion_matches (value, command_word_completion_function);
1593 }
1594
1595 /* If there is more than one match, rl_completion_matches has already
1596 put the lcd in matches[0]. Skip over it. */
1597 cmd_index = matches && matches[0] && matches[1];
95732b49
JA
1598
1599 /* If there's a single match and it's a directory, set the append char
1600 to the expected `/'. Otherwise, don't append anything. */
1601 if (matches && matches[0] && matches[1] == 0 && test_for_directory (matches[0]))
1602 rl_completion_append_character = '/';
1603 else
1604 rl_completion_suppress_append = 1;
726f6388
JA
1605 }
1606
1607 if (!matches || !matches[cmd_index])
1608 {
1609 rl_filename_quoting_desired = 0; /* disable quoting */
1610 return ((char *)NULL);
1611 }
1612 else
1613 {
f73dda09 1614 value = (char *)xmalloc (1 + start_len + strlen (matches[cmd_index]));
726f6388
JA
1615
1616 if (start_len == 1)
28ef6c31 1617 value[0] = *orig_start;
726f6388 1618 else
28ef6c31 1619 strncpy (value, orig_start, start_len);
726f6388
JA
1620
1621 strcpy (value + start_len, matches[cmd_index]);
1622
1623 cmd_index++;
1624 return (value);
1625 }
1626}
1627
1628/* Okay, now we write the entry_function for variable completion. */
1629static char *
1630variable_completion_function (text, state)
28ef6c31 1631 const char *text;
726f6388 1632 int state;
726f6388 1633{
bb70624e 1634 static char **varlist = (char **)NULL;
726f6388
JA
1635 static int varlist_index;
1636 static char *varname = (char *)NULL;
1637 static int namelen;
1638 static int first_char, first_char_loc;
1639
1640 if (!state)
1641 {
1642 if (varname)
1643 free (varname);
1644
1645 first_char_loc = 0;
1646 first_char = text[0];
1647
1648 if (first_char == '$')
1649 first_char_loc++;
1650
ccc6cda3 1651 if (text[first_char_loc] == '{')
28ef6c31 1652 first_char_loc++;
ccc6cda3 1653
726f6388
JA
1654 varname = savestring (text + first_char_loc);
1655
1656 namelen = strlen (varname);
1657 if (varlist)
7117c2d2 1658 strvec_dispose (varlist);
726f6388 1659
bb70624e
JA
1660 varlist = all_variables_matching_prefix (varname);
1661 varlist_index = 0;
726f6388
JA
1662 }
1663
1664 if (!varlist || !varlist[varlist_index])
1665 {
1666 return ((char *)NULL);
1667 }
1668 else
1669 {
f73dda09
JA
1670 char *value;
1671
1672 value = (char *)xmalloc (4 + strlen (varlist[varlist_index]));
726f6388
JA
1673
1674 if (first_char_loc)
ccc6cda3
JA
1675 {
1676 value[0] = first_char;
1677 if (first_char_loc == 2)
1678 value[1] = '{';
1679 }
726f6388 1680
bb70624e 1681 strcpy (value + first_char_loc, varlist[varlist_index]);
ccc6cda3 1682 if (first_char_loc == 2)
28ef6c31 1683 strcat (value, "}");
726f6388
JA
1684
1685 varlist_index++;
1686 return (value);
1687 }
1688}
1689
1690/* How about a completion function for hostnames? */
1691static char *
1692hostname_completion_function (text, state)
28ef6c31 1693 const char *text;
726f6388 1694 int state;
726f6388
JA
1695{
1696 static char **list = (char **)NULL;
1697 static int list_index = 0;
1698 static int first_char, first_char_loc;
1699
1700 /* If we don't have any state, make some. */
ccc6cda3 1701 if (state == 0)
726f6388 1702 {
ccc6cda3 1703 FREE (list);
726f6388
JA
1704
1705 list = (char **)NULL;
1706
1707 first_char_loc = 0;
1708 first_char = *text;
1709
1710 if (first_char == '@')
1711 first_char_loc++;
1712
f73dda09 1713 list = hostnames_matching ((char *)text+first_char_loc);
726f6388
JA
1714 list_index = 0;
1715 }
1716
1717 if (list && list[list_index])
1718 {
ccc6cda3 1719 char *t;
726f6388 1720
f73dda09 1721 t = (char *)xmalloc (2 + strlen (list[list_index]));
726f6388
JA
1722 *t = first_char;
1723 strcpy (t + first_char_loc, list[list_index]);
1724 list_index++;
1725 return (t);
1726 }
ccc6cda3
JA
1727
1728 return ((char *)NULL);
726f6388
JA
1729}
1730
7117c2d2
JA
1731/*
1732 * A completion function for service names from /etc/services (or wherever).
1733 */
1734char *
1735bash_servicename_completion_function (text, state)
1736 const char *text;
1737 int state;
1738{
1739#if defined (__WIN32__) || defined (__OPENNT) || !defined (HAVE_GETSERVENT)
1740 return ((char *)NULL);
1741#else
1742 static char *sname = (char *)NULL;
1743 static struct servent *srvent;
1744 static int snamelen, firstc;
1745 char *value;
1746 char **alist, *aentry;
1747 int afound;
1748
1749 if (state == 0)
1750 {
1751 FREE (sname);
1752 firstc = *text;
1753
1754 sname = savestring (text);
1755 snamelen = strlen (sname);
1756 setservent (0);
1757 }
1758
1759 while (srvent = getservent ())
1760 {
1761 afound = 0;
1762 if (snamelen == 0 || (STREQN (sname, srvent->s_name, snamelen)))
1763 break;
1764 /* Not primary, check aliases */
0628567a 1765 for (alist = srvent->s_aliases; *alist; alist++)
7117c2d2 1766 {
0628567a 1767 aentry = *alist;
7117c2d2
JA
1768 if (STREQN (sname, aentry, snamelen))
1769 {
1770 afound = 1;
1771 break;
1772 }
1773 }
1774
1775 if (afound)
1776 break;
1777 }
1778
1779 if (srvent == 0)
1780 {
1781 endservent ();
1782 return ((char *)NULL);
1783 }
1784
1785 value = afound ? savestring (aentry) : savestring (srvent->s_name);
1786 return value;
1787#endif
1788}
1789
1790/*
1791 * A completion function for group names from /etc/group (or wherever).
1792 */
f73dda09
JA
1793char *
1794bash_groupname_completion_function (text, state)
1795 const char *text;
1796 int state;
1797{
1798#if defined (__WIN32__) || defined (__OPENNT) || !defined (HAVE_GRP_H)
1799 return ((char *)NULL);
1800#else
1801 static char *gname = (char *)NULL;
1802 static struct group *grent;
1803 static int gnamelen;
1804 char *value;
1805
1806 if (state == 0)
1807 {
1808 FREE (gname);
1809 gname = savestring (text);
1810 gnamelen = strlen (gname);
1811
1812 setgrent ();
1813 }
1814
1815 while (grent = getgrent ())
1816 {
1817 if (gnamelen == 0 || (STREQN (gname, grent->gr_name, gnamelen)))
1818 break;
1819 }
1820
1821 if (grent == 0)
1822 {
1823 endgrent ();
1824 return ((char *)NULL);
1825 }
1826
1827 value = savestring (grent->gr_name);
1828 return (value);
1829#endif
1830}
1831
cce855bc
JA
1832/* Functions to perform history and alias expansions on the current line. */
1833
1834#if defined (BANG_HISTORY)
1835/* Perform history expansion on the current line. If no history expansion
1836 is done, pre_process_line() returns what it was passed, so we need to
1837 allocate a new line here. */
726f6388
JA
1838static char *
1839history_expand_line_internal (line)
1840 char *line;
1841{
1842 char *new_line;
b80f6443 1843 int old_verify;
726f6388 1844
b80f6443
JA
1845 old_verify = hist_verify;
1846 hist_verify = 0;
726f6388 1847 new_line = pre_process_line (line, 0, 0);
b80f6443
JA
1848 hist_verify = old_verify;
1849
d166f048 1850 return (new_line == line) ? savestring (line) : new_line;
726f6388 1851}
726f6388
JA
1852#endif
1853
1854/* There was an error in expansion. Let the preprocessor print
1855 the error here. */
1856static void
1857cleanup_expansion_error ()
1858{
1859 char *to_free;
b80f6443
JA
1860#if defined (BANG_HISTORY)
1861 int old_verify;
1862
1863 old_verify = hist_verify;
1864 hist_verify = 0;
1865#endif
726f6388
JA
1866
1867 fprintf (rl_outstream, "\r\n");
1868 to_free = pre_process_line (rl_line_buffer, 1, 0);
b80f6443
JA
1869#if defined (BANG_HISTORY)
1870 hist_verify = old_verify;
1871#endif
d166f048 1872 if (to_free != rl_line_buffer)
b80f6443 1873 FREE (to_free);
726f6388
JA
1874 putc ('\r', rl_outstream);
1875 rl_forced_update_display ();
1876}
1877
1878/* If NEW_LINE differs from what is in the readline line buffer, add an
1879 undo record to get from the readline line buffer contents to the new
1880 line and make NEW_LINE the current readline line. */
1881static void
1882maybe_make_readline_line (new_line)
1883 char *new_line;
1884{
1885 if (strcmp (new_line, rl_line_buffer) != 0)
1886 {
1887 rl_point = rl_end;
1888
1889 rl_add_undo (UNDO_BEGIN, 0, 0, 0);
1890 rl_delete_text (0, rl_point);
7117c2d2 1891 rl_point = rl_end = rl_mark = 0;
726f6388
JA
1892 rl_insert_text (new_line);
1893 rl_add_undo (UNDO_END, 0, 0, 0);
1894 }
1895}
1896
1897/* Make NEW_LINE be the current readline line. This frees NEW_LINE. */
1898static void
1899set_up_new_line (new_line)
1900 char *new_line;
1901{
f73dda09
JA
1902 int old_point, at_end;
1903
1904 old_point = rl_point;
1905 at_end = rl_point == rl_end;
726f6388
JA
1906
1907 /* If the line was history and alias expanded, then make that
1908 be one thing to undo. */
1909 maybe_make_readline_line (new_line);
1910 free (new_line);
1911
1912 /* Place rl_point where we think it should go. */
1913 if (at_end)
1914 rl_point = rl_end;
1915 else if (old_point < rl_end)
1916 {
1917 rl_point = old_point;
1918 if (!whitespace (rl_line_buffer[rl_point]))
b72432fd 1919 rl_forward_word (1, 0);
726f6388
JA
1920 }
1921}
1922
cce855bc
JA
1923#if defined (ALIAS)
1924/* Expand aliases in the current readline line. */
1925static int
28ef6c31
JA
1926alias_expand_line (count, ignore)
1927 int count, ignore;
cce855bc
JA
1928{
1929 char *new_line;
1930
1931 new_line = alias_expand (rl_line_buffer);
1932
1933 if (new_line)
1934 {
1935 set_up_new_line (new_line);
1936 return (0);
1937 }
1938 else
1939 {
1940 cleanup_expansion_error ();
1941 return (1);
1942 }
1943}
1944#endif
1945
1946#if defined (BANG_HISTORY)
726f6388 1947/* History expand the line. */
cce855bc 1948static int
28ef6c31
JA
1949history_expand_line (count, ignore)
1950 int count, ignore;
726f6388
JA
1951{
1952 char *new_line;
1953
1954 new_line = history_expand_line_internal (rl_line_buffer);
1955
1956 if (new_line)
cce855bc
JA
1957 {
1958 set_up_new_line (new_line);
1959 return (0);
1960 }
726f6388 1961 else
cce855bc
JA
1962 {
1963 cleanup_expansion_error ();
1964 return (1);
1965 }
1966}
1967
1968/* Expand history substitutions in the current line and then insert a
28ef6c31 1969 space (hopefully close to where we were before). */
cce855bc 1970static int
28ef6c31
JA
1971tcsh_magic_space (count, ignore)
1972 int count, ignore;
cce855bc 1973{
28ef6c31
JA
1974 int dist_from_end, old_point;
1975
1976 old_point = rl_point;
1977 dist_from_end = rl_end - rl_point;
1978 if (history_expand_line (count, ignore) == 0)
cce855bc 1979 {
28ef6c31
JA
1980 /* Try a simple heuristic from Stephen Gildea <gildea@intouchsys.com>.
1981 This works if all expansions were before rl_point or if no expansions
1982 were performed. */
1983 rl_point = (old_point == 0) ? old_point : rl_end - dist_from_end;
cce855bc
JA
1984 rl_insert (1, ' ');
1985 return (0);
1986 }
1987 else
1988 return (1);
726f6388 1989}
95732b49 1990#endif /* BANG_HISTORY */
ccc6cda3 1991
726f6388 1992/* History and alias expand the line. */
cce855bc 1993static int
28ef6c31
JA
1994history_and_alias_expand_line (count, ignore)
1995 int count, ignore;
726f6388
JA
1996{
1997 char *new_line;
1998
95732b49
JA
1999 new_line = 0;
2000#if defined (BANG_HISTORY)
b80f6443 2001 new_line = history_expand_line_internal (rl_line_buffer);
95732b49 2002#endif
726f6388
JA
2003
2004#if defined (ALIAS)
2005 if (new_line)
2006 {
2007 char *alias_line;
2008
2009 alias_line = alias_expand (new_line);
2010 free (new_line);
2011 new_line = alias_line;
2012 }
2013#endif /* ALIAS */
2014
2015 if (new_line)
cce855bc
JA
2016 {
2017 set_up_new_line (new_line);
2018 return (0);
2019 }
726f6388 2020 else
cce855bc
JA
2021 {
2022 cleanup_expansion_error ();
2023 return (1);
2024 }
726f6388
JA
2025}
2026
2027/* History and alias expand the line, then perform the shell word
cce855bc
JA
2028 expansions by calling expand_string. This can't use set_up_new_line()
2029 because we want the variable expansions as a separate undo'able
2030 set of operations. */
28ef6c31
JA
2031static int
2032shell_expand_line (count, ignore)
2033 int count, ignore;
726f6388
JA
2034{
2035 char *new_line;
ccc6cda3 2036 WORD_LIST *expanded_string;
726f6388 2037
95732b49
JA
2038 new_line = 0;
2039#if defined (BANG_HISTORY)
b80f6443 2040 new_line = history_expand_line_internal (rl_line_buffer);
95732b49 2041#endif
726f6388
JA
2042
2043#if defined (ALIAS)
2044 if (new_line)
2045 {
2046 char *alias_line;
2047
2048 alias_line = alias_expand (new_line);
2049 free (new_line);
2050 new_line = alias_line;
2051 }
2052#endif /* ALIAS */
2053
2054 if (new_line)
2055 {
2056 int old_point = rl_point;
2057 int at_end = rl_point == rl_end;
2058
2059 /* If the line was history and alias expanded, then make that
2060 be one thing to undo. */
2061 maybe_make_readline_line (new_line);
2062 free (new_line);
2063
2064 /* If there is variable expansion to perform, do that as a separate
2065 operation to be undone. */
d166f048
JA
2066 new_line = savestring (rl_line_buffer);
2067 expanded_string = expand_string (new_line, 0);
2068 FREE (new_line);
ccc6cda3
JA
2069 if (expanded_string == 0)
2070 {
f73dda09 2071 new_line = (char *)xmalloc (1);
ccc6cda3
JA
2072 new_line[0] = '\0';
2073 }
2074 else
2075 {
2076 new_line = string_list (expanded_string);
2077 dispose_words (expanded_string);
2078 }
726f6388 2079
ccc6cda3
JA
2080 maybe_make_readline_line (new_line);
2081 free (new_line);
726f6388 2082
ccc6cda3
JA
2083 /* Place rl_point where we think it should go. */
2084 if (at_end)
2085 rl_point = rl_end;
2086 else if (old_point < rl_end)
2087 {
2088 rl_point = old_point;
2089 if (!whitespace (rl_line_buffer[rl_point]))
b72432fd 2090 rl_forward_word (1, 0);
ccc6cda3 2091 }
28ef6c31 2092 return 0;
726f6388
JA
2093 }
2094 else
28ef6c31
JA
2095 {
2096 cleanup_expansion_error ();
2097 return 1;
2098 }
726f6388
JA
2099}
2100
ccc6cda3
JA
2101/* If FIGNORE is set, then don't match files with the given suffixes when
2102 completing filenames. If only one of the possibilities has an acceptable
726f6388
JA
2103 suffix, delete the others, else just return and let the completer
2104 signal an error. It is called by the completer when real
2105 completions are done on filenames by the completer's internal
2106 function, not for completion lists (M-?) and not on "other"
ccc6cda3 2107 completion types, such as hostnames or commands. */
726f6388 2108
ccc6cda3 2109static struct ignorevar fignore =
726f6388 2110{
ccc6cda3
JA
2111 "FIGNORE",
2112 (struct ign *)0,
2113 0,
2114 (char *)0,
f73dda09 2115 (sh_iv_item_func_t *) 0,
ccc6cda3 2116};
726f6388 2117
726f6388 2118static void
ccc6cda3 2119_ignore_completion_names (names, name_func)
726f6388 2120 char **names;
f73dda09 2121 sh_ignore_func_t *name_func;
726f6388
JA
2122{
2123 char **newnames;
2124 int idx, nidx;
cce855bc
JA
2125 char **oldnames;
2126 int oidx;
726f6388
JA
2127
2128 /* If there is only one completion, see if it is acceptable. If it is
2129 not, free it up. In any case, short-circuit and return. This is a
2130 special case because names[0] is not the prefix of the list of names
2131 if there is only one completion; it is the completion itself. */
2132 if (names[1] == (char *)0)
2133 {
b80f6443
JA
2134 if (force_fignore)
2135 if ((*name_func) (names[0]) == 0)
2136 {
2137 free (names[0]);
2138 names[0] = (char *)NULL;
2139 }
2140
726f6388
JA
2141 return;
2142 }
2143
2144 /* Allocate space for array to hold list of pointers to matching
2145 filenames. The pointers are copied back to NAMES when done. */
2146 for (nidx = 1; names[nidx]; nidx++)
2147 ;
7117c2d2 2148 newnames = strvec_create (nidx + 1);
b80f6443
JA
2149
2150 if (force_fignore == 0)
2151 {
2152 oldnames = strvec_create (nidx - 1);
2153 oidx = 0;
2154 }
726f6388
JA
2155
2156 newnames[0] = names[0];
2157 for (idx = nidx = 1; names[idx]; idx++)
2158 {
2159 if ((*name_func) (names[idx]))
2160 newnames[nidx++] = names[idx];
b80f6443
JA
2161 else if (force_fignore == 0)
2162 oldnames[oidx++] = names[idx];
726f6388 2163 else
28ef6c31 2164 free (names[idx]);
726f6388
JA
2165 }
2166
2167 newnames[nidx] = (char *)NULL;
2168
2169 /* If none are acceptable then let the completer handle it. */
2170 if (nidx == 1)
2171 {
b80f6443
JA
2172 if (force_fignore)
2173 {
2174 free (names[0]);
2175 names[0] = (char *)NULL;
2176 }
2177 else
2178 free (oldnames);
2179
726f6388
JA
2180 free (newnames);
2181 return;
2182 }
2183
b80f6443
JA
2184 if (force_fignore == 0)
2185 {
2186 while (oidx)
2187 free (oldnames[--oidx]);
2188 free (oldnames);
2189 }
cce855bc 2190
726f6388
JA
2191 /* If only one is acceptable, copy it to names[0] and return. */
2192 if (nidx == 2)
2193 {
2194 free (names[0]);
2195 names[0] = newnames[1];
2196 names[1] = (char *)NULL;
2197 free (newnames);
2198 return;
2199 }
ccc6cda3 2200
726f6388
JA
2201 /* Copy the acceptable names back to NAMES, set the new array end,
2202 and return. */
2203 for (nidx = 1; newnames[nidx]; nidx++)
2204 names[nidx] = newnames[nidx];
2205 names[nidx] = (char *)NULL;
ccc6cda3
JA
2206 free (newnames);
2207}
2208
2209static int
2210name_is_acceptable (name)
f73dda09 2211 const char *name;
ccc6cda3
JA
2212{
2213 struct ign *p;
2214 int nlen;
2215
2216 for (nlen = strlen (name), p = fignore.ignores; p->val; p++)
2217 {
2218 if (nlen > p->len && p->len > 0 && STREQ (p->val, &name[nlen - p->len]))
2219 return (0);
2220 }
2221
2222 return (1);
726f6388
JA
2223}
2224
b72432fd
JA
2225#if 0
2226static int
2227ignore_dot_names (name)
2228 char *name;
2229{
2230 return (name[0] != '.');
2231}
2232#endif
2233
28ef6c31 2234static int
726f6388
JA
2235filename_completion_ignore (names)
2236 char **names;
2237{
b72432fd
JA
2238#if 0
2239 if (glob_dot_filenames == 0)
2240 _ignore_completion_names (names, ignore_dot_names);
2241#endif
2242
ccc6cda3 2243 setup_ignore_patterns (&fignore);
726f6388 2244
ccc6cda3 2245 if (fignore.num_ignores == 0)
28ef6c31 2246 return 0;
726f6388 2247
ccc6cda3 2248 _ignore_completion_names (names, name_is_acceptable);
28ef6c31
JA
2249
2250 return 0;
726f6388
JA
2251}
2252
2253/* Return 1 if NAME is a directory. */
2254static int
2255test_for_directory (name)
f73dda09 2256 const char *name;
726f6388
JA
2257{
2258 struct stat finfo;
2259 char *fn;
2260
7117c2d2 2261 fn = bash_tilde_expand (name, 0);
726f6388
JA
2262 if (stat (fn, &finfo) != 0)
2263 {
2264 free (fn);
2265 return 0;
2266 }
2267 free (fn);
2268 return (S_ISDIR (finfo.st_mode));
2269}
2270
2271/* Remove files from NAMES, leaving directories. */
28ef6c31 2272static int
726f6388
JA
2273bash_ignore_filenames (names)
2274 char **names;
2275{
ccc6cda3 2276 _ignore_completion_names (names, test_for_directory);
28ef6c31 2277 return 0;
726f6388
JA
2278}
2279
bb70624e
JA
2280static int
2281return_zero (name)
f73dda09 2282 const char *name;
bb70624e
JA
2283{
2284 return 0;
2285}
2286
28ef6c31 2287static int
bb70624e
JA
2288bash_ignore_everything (names)
2289 char **names;
2290{
2291 _ignore_completion_names (names, return_zero);
28ef6c31 2292 return 0;
bb70624e
JA
2293}
2294
eb873671
JA
2295/* Simulate the expansions that will be performed by
2296 rl_filename_completion_function. This must be called with the address of
2297 a pointer to malloc'd memory. */
95732b49 2298static void
eb873671
JA
2299bash_directory_expansion (dirname)
2300 char **dirname;
2301{
0628567a 2302 char *d, *nd;
eb873671
JA
2303
2304 d = savestring (*dirname);
2305
2306 if (rl_directory_rewrite_hook)
2307 (*rl_directory_rewrite_hook) (&d);
2308
2309 if (rl_directory_completion_hook && (*rl_directory_completion_hook) (&d))
2310 {
2311 free (*dirname);
2312 *dirname = d;
2313 }
0628567a
JA
2314 else if (rl_completion_found_quote)
2315 {
2316 nd = bash_dequote_filename (d, rl_completion_quote_character);
2317 free (*dirname);
2318 free (d);
2319 *dirname = nd;
2320 }
eb873671
JA
2321}
2322
726f6388
JA
2323/* Handle symbolic link references and other directory name
2324 expansions while hacking completion. */
2325static int
2326bash_directory_completion_hook (dirname)
2327 char **dirname;
2328{
b72432fd 2329 char *local_dirname, *new_dirname, *t;
bb70624e 2330 int return_value, should_expand_dirname;
726f6388 2331 WORD_LIST *wl;
b80f6443 2332 struct stat sb;
726f6388 2333
bb70624e 2334 return_value = should_expand_dirname = 0;
726f6388 2335 local_dirname = *dirname;
bb70624e
JA
2336
2337#if 0
7117c2d2 2338 should_expand_dirname = xstrchr (local_dirname, '$') || xstrchr (local_dirname, '`');
bb70624e 2339#else
7117c2d2 2340 if (xstrchr (local_dirname, '$'))
bb70624e
JA
2341 should_expand_dirname = 1;
2342 else
2343 {
7117c2d2 2344 t = xstrchr (local_dirname, '`');
bb70624e
JA
2345 if (t && unclosed_pair (local_dirname, strlen (local_dirname), "`") == 0)
2346 should_expand_dirname = 1;
2347 }
2348#endif
2349
b80f6443
JA
2350#if defined (HAVE_LSTAT)
2351 if (should_expand_dirname && lstat (local_dirname, &sb) == 0)
2352#else
2353 if (should_expand_dirname && stat (local_dirname, &sb) == 0)
2354#endif
2355 should_expand_dirname = 0;
2356
bb70624e 2357 if (should_expand_dirname)
726f6388 2358 {
bb70624e 2359 new_dirname = savestring (local_dirname);
7117c2d2 2360 wl = expand_prompt_string (new_dirname, 0); /* does the right thing */
726f6388
JA
2361 if (wl)
2362 {
2363 *dirname = string_list (wl);
2364 /* Tell the completer to replace the directory name only if we
2365 actually expanded something. */
2366 return_value = STREQ (local_dirname, *dirname) == 0;
2367 free (local_dirname);
b72432fd 2368 free (new_dirname);
726f6388
JA
2369 dispose_words (wl);
2370 local_dirname = *dirname;
2371 }
2372 else
2373 {
b72432fd 2374 free (new_dirname);
726f6388 2375 free (local_dirname);
f73dda09 2376 *dirname = (char *)xmalloc (1);
ccc6cda3 2377 **dirname = '\0';
726f6388
JA
2378 return 1;
2379 }
2380 }
0628567a
JA
2381 else
2382 {
2383 /* Dequote the filename even if we don't expand it. */
2384 new_dirname = bash_dequote_filename (local_dirname, rl_completion_quote_character);
2385 free (local_dirname);
2386 local_dirname = *dirname = new_dirname;
2387 }
726f6388
JA
2388
2389 if (!no_symbolic_links && (local_dirname[0] != '.' || local_dirname[1]))
2390 {
2391 char *temp1, *temp2;
2392 int len1, len2;
2393
2394 t = get_working_directory ("symlink-hook");
2395 temp1 = make_absolute (local_dirname, t);
2396 free (t);
28ef6c31 2397 temp2 = sh_canonpath (temp1, PATH_CHECKDOTDOT|PATH_CHECKEXISTS);
ccc6cda3
JA
2398 /* If we can't canonicalize, bail. */
2399 if (temp2 == 0)
2400 {
2401 free (temp1);
2402 return 1;
2403 }
726f6388
JA
2404 len1 = strlen (temp1);
2405 if (temp1[len1 - 1] == '/')
28ef6c31 2406 {
726f6388 2407 len2 = strlen (temp2);
95732b49
JA
2408 if (len2 > 2) /* don't append `/' to `/' or `//' */
2409 {
2410 temp2 = (char *)xrealloc (temp2, len2 + 2);
2411 temp2[len2] = '/';
2412 temp2[len2 + 1] = '\0';
2413 }
28ef6c31 2414 }
726f6388
JA
2415 free (local_dirname);
2416 *dirname = temp2;
2417 free (temp1);
2418 }
2419 return (return_value);
2420}
2421
726f6388 2422static char **history_completion_array = (char **)NULL;
ccc6cda3
JA
2423static int harry_size;
2424static int harry_len;
726f6388
JA
2425
2426static void
2427build_history_completion_array ()
2428{
ccc6cda3
JA
2429 register int i, j;
2430 HIST_ENTRY **hlist;
2431 char **tokens;
726f6388
JA
2432
2433 /* First, clear out the current dynamic history completion list. */
2434 if (harry_size)
2435 {
7117c2d2 2436 strvec_dispose (history_completion_array);
726f6388
JA
2437 history_completion_array = (char **)NULL;
2438 harry_size = 0;
2439 harry_len = 0;
2440 }
2441
2442 /* Next, grovel each line of history, making each shell-sized token
2443 a separate entry in the history_completion_array. */
ccc6cda3 2444 hlist = history_list ();
726f6388 2445
ccc6cda3
JA
2446 if (hlist)
2447 {
2448 for (i = 0; hlist[i]; i++)
2449 {
2450 /* Separate each token, and place into an array. */
2451 tokens = history_tokenize (hlist[i]->line);
726f6388 2452
ccc6cda3
JA
2453 for (j = 0; tokens && tokens[j]; j++)
2454 {
2455 if (harry_len + 2 > harry_size)
7117c2d2 2456 history_completion_array = strvec_resize (history_completion_array, harry_size += 10);
726f6388 2457
ccc6cda3
JA
2458 history_completion_array[harry_len++] = tokens[j];
2459 history_completion_array[harry_len] = (char *)NULL;
2460 }
2461 free (tokens);
2462 }
726f6388 2463
ccc6cda3 2464 /* Sort the complete list of tokens. */
7117c2d2 2465 qsort (history_completion_array, harry_len, sizeof (char *), (QSFUNC *)strvec_strcmp);
ccc6cda3 2466 }
726f6388
JA
2467}
2468
2469static char *
2470history_completion_generator (hint_text, state)
f73dda09 2471 const char *hint_text;
726f6388
JA
2472 int state;
2473{
ccc6cda3 2474 static int local_index, len;
f73dda09 2475 static const char *text;
726f6388
JA
2476
2477 /* If this is the first call to the generator, then initialize the
2478 list of strings to complete over. */
ccc6cda3 2479 if (state == 0)
726f6388
JA
2480 {
2481 local_index = 0;
2482 build_history_completion_array ();
2483 text = hint_text;
2484 len = strlen (text);
2485 }
2486
2487 while (history_completion_array && history_completion_array[local_index])
2488 {
2489 if (strncmp (text, history_completion_array[local_index++], len) == 0)
2490 return (savestring (history_completion_array[local_index - 1]));
2491 }
2492 return ((char *)NULL);
2493}
2494
28ef6c31 2495static int
726f6388
JA
2496dynamic_complete_history (count, key)
2497 int count, key;
2498{
f73dda09
JA
2499 int r;
2500
28ef6c31
JA
2501 rl_compentry_func_t *orig_func;
2502 rl_completion_func_t *orig_attempt_func;
726f6388
JA
2503
2504 orig_func = rl_completion_entry_function;
2505 orig_attempt_func = rl_attempted_completion_function;
28ef6c31
JA
2506 rl_completion_entry_function = history_completion_generator;
2507 rl_attempted_completion_function = (rl_completion_func_t *)NULL;
726f6388 2508
7117c2d2 2509 /* XXX - use rl_completion_mode here? */
28ef6c31 2510 if (rl_last_func == dynamic_complete_history)
f73dda09 2511 r = rl_complete_internal ('?');
726f6388 2512 else
f73dda09 2513 r = rl_complete_internal (TAB);
726f6388
JA
2514
2515 rl_completion_entry_function = orig_func;
2516 rl_attempted_completion_function = orig_attempt_func;
f73dda09 2517 return r;
726f6388
JA
2518}
2519
726f6388 2520#if defined (SPECIFIC_COMPLETION_FUNCTIONS)
28ef6c31 2521static int
726f6388
JA
2522bash_complete_username (ignore, ignore2)
2523 int ignore, ignore2;
2524{
7117c2d2 2525 return bash_complete_username_internal (rl_completion_mode (bash_complete_username));
726f6388
JA
2526}
2527
28ef6c31 2528static int
726f6388
JA
2529bash_possible_username_completions (ignore, ignore2)
2530 int ignore, ignore2;
2531{
28ef6c31 2532 return bash_complete_username_internal ('?');
726f6388
JA
2533}
2534
28ef6c31 2535static int
726f6388
JA
2536bash_complete_username_internal (what_to_do)
2537 int what_to_do;
2538{
28ef6c31 2539 return bash_specific_completion (what_to_do, rl_username_completion_function);
726f6388
JA
2540}
2541
28ef6c31 2542static int
726f6388
JA
2543bash_complete_filename (ignore, ignore2)
2544 int ignore, ignore2;
2545{
7117c2d2 2546 return bash_complete_filename_internal (rl_completion_mode (bash_complete_filename));
726f6388
JA
2547}
2548
28ef6c31 2549static int
726f6388
JA
2550bash_possible_filename_completions (ignore, ignore2)
2551 int ignore, ignore2;
2552{
28ef6c31 2553 return bash_complete_filename_internal ('?');
726f6388
JA
2554}
2555
28ef6c31 2556static int
726f6388
JA
2557bash_complete_filename_internal (what_to_do)
2558 int what_to_do;
2559{
28ef6c31
JA
2560 rl_compentry_func_t *orig_func;
2561 rl_completion_func_t *orig_attempt_func;
2562 rl_icppfunc_t *orig_dir_func;
b80f6443 2563 /*const*/ char *orig_rl_completer_word_break_characters;
28ef6c31 2564 int r;
726f6388
JA
2565
2566 orig_func = rl_completion_entry_function;
2567 orig_attempt_func = rl_attempted_completion_function;
2568 orig_dir_func = rl_directory_completion_hook;
2569 orig_rl_completer_word_break_characters = rl_completer_word_break_characters;
28ef6c31
JA
2570 rl_completion_entry_function = rl_filename_completion_function;
2571 rl_attempted_completion_function = (rl_completion_func_t *)NULL;
2572 rl_directory_completion_hook = (rl_icppfunc_t *)NULL;
726f6388
JA
2573 rl_completer_word_break_characters = " \t\n\"\'";
2574
28ef6c31 2575 r = rl_complete_internal (what_to_do);
726f6388
JA
2576
2577 rl_completion_entry_function = orig_func;
2578 rl_attempted_completion_function = orig_attempt_func;
2579 rl_directory_completion_hook = orig_dir_func;
2580 rl_completer_word_break_characters = orig_rl_completer_word_break_characters;
28ef6c31
JA
2581
2582 return r;
726f6388
JA
2583}
2584
28ef6c31 2585static int
726f6388
JA
2586bash_complete_hostname (ignore, ignore2)
2587 int ignore, ignore2;
2588{
7117c2d2 2589 return bash_complete_hostname_internal (rl_completion_mode (bash_complete_hostname));
726f6388
JA
2590}
2591
28ef6c31 2592static int
726f6388
JA
2593bash_possible_hostname_completions (ignore, ignore2)
2594 int ignore, ignore2;
2595{
28ef6c31 2596 return bash_complete_hostname_internal ('?');
726f6388
JA
2597}
2598
28ef6c31 2599static int
726f6388
JA
2600bash_complete_variable (ignore, ignore2)
2601 int ignore, ignore2;
2602{
7117c2d2 2603 return bash_complete_variable_internal (rl_completion_mode (bash_complete_variable));
726f6388
JA
2604}
2605
28ef6c31 2606static int
726f6388
JA
2607bash_possible_variable_completions (ignore, ignore2)
2608 int ignore, ignore2;
2609{
28ef6c31 2610 return bash_complete_variable_internal ('?');
726f6388
JA
2611}
2612
28ef6c31 2613static int
726f6388
JA
2614bash_complete_command (ignore, ignore2)
2615 int ignore, ignore2;
2616{
7117c2d2 2617 return bash_complete_command_internal (rl_completion_mode (bash_complete_command));
726f6388
JA
2618}
2619
28ef6c31 2620static int
726f6388
JA
2621bash_possible_command_completions (ignore, ignore2)
2622 int ignore, ignore2;
2623{
28ef6c31 2624 return bash_complete_command_internal ('?');
726f6388
JA
2625}
2626
28ef6c31 2627static int
726f6388
JA
2628bash_complete_hostname_internal (what_to_do)
2629 int what_to_do;
2630{
28ef6c31 2631 return bash_specific_completion (what_to_do, hostname_completion_function);
726f6388
JA
2632}
2633
28ef6c31 2634static int
726f6388
JA
2635bash_complete_variable_internal (what_to_do)
2636 int what_to_do;
2637{
28ef6c31 2638 return bash_specific_completion (what_to_do, variable_completion_function);
726f6388
JA
2639}
2640
28ef6c31 2641static int
726f6388
JA
2642bash_complete_command_internal (what_to_do)
2643 int what_to_do;
2644{
28ef6c31 2645 return bash_specific_completion (what_to_do, command_word_completion_function);
726f6388
JA
2646}
2647
7117c2d2
JA
2648static char *globtext;
2649static char *globorig;
2650
ccc6cda3
JA
2651static char *
2652glob_complete_word (text, state)
28ef6c31 2653 const char *text;
ccc6cda3
JA
2654 int state;
2655{
2656 static char **matches = (char **)NULL;
2657 static int ind;
7117c2d2 2658 int glen;
eb873671 2659 char *ret, *ttext;
ccc6cda3
JA
2660
2661 if (state == 0)
2662 {
e8ce775d 2663 rl_filename_completion_desired = 1;
7117c2d2
JA
2664 FREE (matches);
2665 if (globorig != globtext)
2666 FREE (globorig);
2667 FREE (globtext);
2668
eb873671
JA
2669 ttext = bash_tilde_expand (text, 0);
2670
7117c2d2
JA
2671 if (rl_explicit_arg)
2672 {
eb873671
JA
2673 globorig = savestring (ttext);
2674 glen = strlen (ttext);
7117c2d2 2675 globtext = (char *)xmalloc (glen + 2);
eb873671 2676 strcpy (globtext, ttext);
7117c2d2
JA
2677 globtext[glen] = '*';
2678 globtext[glen+1] = '\0';
2679 }
2680 else
eb873671
JA
2681 globtext = globorig = savestring (ttext);
2682
2683 if (ttext != text)
2684 free (ttext);
7117c2d2
JA
2685
2686 matches = shell_glob_filename (globtext);
ccc6cda3 2687 if (GLOB_FAILED (matches))
28ef6c31 2688 matches = (char **)NULL;
ccc6cda3
JA
2689 ind = 0;
2690 }
2691
2692 ret = matches ? matches[ind] : (char *)NULL;
2693 ind++;
2694 return ret;
2695}
2696
28ef6c31 2697static int
ccc6cda3
JA
2698bash_glob_completion_internal (what_to_do)
2699 int what_to_do;
2700{
28ef6c31 2701 return bash_specific_completion (what_to_do, glob_complete_word);
ccc6cda3
JA
2702}
2703
7117c2d2
JA
2704/* A special quoting function so we don't end up quoting globbing characters
2705 in the word if there are no matches or multiple matches. */
2706static char *
2707bash_glob_quote_filename (s, rtype, qcp)
2708 char *s;
2709 int rtype;
2710 char *qcp;
2711{
2712 if (globorig && qcp && *qcp == '\0' && STREQ (s, globorig))
2713 return (savestring (s));
2714 else
2715 return (bash_quote_filename (s, rtype, qcp));
2716}
2717
2718static int
2719bash_glob_complete_word (count, key)
2720 int count, key;
2721{
2722 int r;
2723 rl_quote_func_t *orig_quoting_function;
2724
b80f6443
JA
2725 if (rl_editing_mode == EMACS_EDITING_MODE)
2726 rl_explicit_arg = 1; /* force `*' append */
7117c2d2
JA
2727 orig_quoting_function = rl_filename_quoting_function;
2728 rl_filename_quoting_function = bash_glob_quote_filename;
2729
2730 r = bash_glob_completion_internal (rl_completion_mode (bash_glob_complete_word));
2731
2732 rl_filename_quoting_function = orig_quoting_function;
2733 return r;
2734}
2735
28ef6c31 2736static int
ccc6cda3
JA
2737bash_glob_expand_word (count, key)
2738 int count, key;
2739{
28ef6c31 2740 return bash_glob_completion_internal ('*');
ccc6cda3
JA
2741}
2742
28ef6c31 2743static int
ccc6cda3
JA
2744bash_glob_list_expansions (count, key)
2745 int count, key;
2746{
28ef6c31 2747 return bash_glob_completion_internal ('?');
ccc6cda3
JA
2748}
2749
28ef6c31 2750static int
726f6388
JA
2751bash_specific_completion (what_to_do, generator)
2752 int what_to_do;
28ef6c31 2753 rl_compentry_func_t *generator;
726f6388 2754{
28ef6c31
JA
2755 rl_compentry_func_t *orig_func;
2756 rl_completion_func_t *orig_attempt_func;
2757 int r;
726f6388
JA
2758
2759 orig_func = rl_completion_entry_function;
2760 orig_attempt_func = rl_attempted_completion_function;
2761 rl_completion_entry_function = generator;
28ef6c31 2762 rl_attempted_completion_function = NULL;
726f6388 2763
28ef6c31 2764 r = rl_complete_internal (what_to_do);
726f6388
JA
2765
2766 rl_completion_entry_function = orig_func;
2767 rl_attempted_completion_function = orig_attempt_func;
28ef6c31
JA
2768
2769 return r;
726f6388
JA
2770}
2771
2772#endif /* SPECIFIC_COMPLETION_FUNCTIONS */
ccc6cda3 2773
b80f6443
JA
2774#if defined (VI_MODE)
2775/* Completion, from vi mode's point of view. This is a modified version of
2776 rl_vi_complete which uses the bash globbing code to implement what POSIX
2777 specifies, which is to append a `*' and attempt filename generation (which
2778 has the side effect of expanding any globbing characters in the word). */
2779static int
2780bash_vi_complete (count, key)
2781 int count, key;
2782{
2783#if defined (SPECIFIC_COMPLETION_FUNCTIONS)
2784 int p, r;
2785 char *t;
2786
2787 if ((rl_point < rl_end) && (!whitespace (rl_line_buffer[rl_point])))
2788 {
2789 if (!whitespace (rl_line_buffer[rl_point + 1]))
2790 rl_vi_end_word (1, 'E');
2791 rl_point++;
2792 }
2793
2794 /* Find boundaries of current word, according to vi definition of a
2795 `bigword'. */
2796 t = 0;
2797 if (rl_point > 0)
2798 {
2799 p = rl_point;
2800 rl_vi_bWord (1, 'B');
2801 r = rl_point;
2802 rl_point = p;
2803 p = r;
2804
2805 t = substring (rl_line_buffer, p, rl_point);
2806 }
2807
2808 if (t && glob_pattern_p (t) == 0)
2809 rl_explicit_arg = 1; /* XXX - force glob_complete_word to append `*' */
2810 FREE (t);
2811
2812 if (key == '*') /* Expansion and replacement. */
2813 r = bash_glob_expand_word (count, key);
2814 else if (key == '=') /* List possible completions. */
2815 r = bash_glob_list_expansions (count, key);
2816 else if (key == '\\') /* Standard completion */
2817 r = bash_glob_complete_word (count, key);
2818 else
2819 r = rl_complete (0, key);
2820
2821 if (key == '*' || key == '\\')
2822 rl_vi_start_inserting (key, 1, 1);
2823
2824 return (r);
2825#else
2826 return rl_vi_complete (count, key);
2827#endif /* !SPECIFIC_COMPLETION_FUNCTIONS */
2828}
2829#endif /* VI_MODE */
2830
ccc6cda3 2831/* Filename quoting for completion. */
bb70624e
JA
2832/* A function to strip unquoted quote characters (single quotes, double
2833 quotes, and backslashes). It allows single quotes to appear
2834 within double quotes, and vice versa. It should be smarter. */
ccc6cda3
JA
2835static char *
2836bash_dequote_filename (text, quote_char)
2837 char *text;
28ef6c31 2838 int quote_char;
ccc6cda3
JA
2839{
2840 char *ret, *p, *r;
2841 int l, quoted;
2842
2843 l = strlen (text);
f73dda09 2844 ret = (char *)xmalloc (l + 1);
ccc6cda3
JA
2845 for (quoted = quote_char, p = text, r = ret; p && *p; p++)
2846 {
2847 /* Allow backslash-quoted characters to pass through unscathed. */
2848 if (*p == '\\')
2849 {
2850 *r++ = *++p;
2851 if (*p == '\0')
2852 break;
2853 continue;
2854 }
2855 /* Close quote. */
2856 if (quoted && *p == quoted)
28ef6c31
JA
2857 {
2858 quoted = 0;
2859 continue;
2860 }
ccc6cda3
JA
2861 /* Open quote. */
2862 if (quoted == 0 && (*p == '\'' || *p == '"'))
28ef6c31
JA
2863 {
2864 quoted = *p;
2865 continue;
2866 }
ccc6cda3
JA
2867 *r++ = *p;
2868 }
2869 *r = '\0';
2870 return ret;
2871}
2872
d166f048
JA
2873/* Quote characters that the readline completion code would treat as
2874 word break characters with backslashes. Pass backslash-quoted
2875 characters through without examination. */
2876static char *
2877quote_word_break_chars (text)
2878 char *text;
2879{
2880 char *ret, *r, *s;
2881 int l;
2882
2883 l = strlen (text);
f73dda09 2884 ret = (char *)xmalloc ((2 * l) + 1);
d166f048
JA
2885 for (s = text, r = ret; *s; s++)
2886 {
2887 /* Pass backslash-quoted characters through, including the backslash. */
2888 if (*s == '\\')
2889 {
2890 *r++ = '\\';
2891 *r++ = *++s;
2892 if (*s == '\0')
2893 break;
2894 continue;
2895 }
2896 /* OK, we have an unquoted character. Check its presence in
2897 rl_completer_word_break_characters. */
7117c2d2 2898 if (xstrchr (rl_completer_word_break_characters, *s))
28ef6c31 2899 *r++ = '\\';
d166f048
JA
2900 *r++ = *s;
2901 }
2902 *r = '\0';
2903 return ret;
2904}
2905
2906/* Quote a filename using double quotes, single quotes, or backslashes
2907 depending on the value of completion_quoting_style. If we're
2908 completing using backslashes, we need to quote some additional
2909 characters (those that readline treats as word breaks), so we call
7117c2d2
JA
2910 quote_word_break_chars on the result. This returns newly-allocated
2911 memory. */
ccc6cda3
JA
2912static char *
2913bash_quote_filename (s, rtype, qcp)
2914 char *s;
2915 int rtype;
2916 char *qcp;
2917{
2918 char *rtext, *mtext, *ret;
2919 int rlen, cs;
2920
2921 rtext = (char *)NULL;
2922
2923 /* If RTYPE == MULT_MATCH, it means that there is
2924 more than one match. In this case, we do not add
2925 the closing quote or attempt to perform tilde
2926 expansion. If RTYPE == SINGLE_MATCH, we try
2927 to perform tilde expansion, because single and double
2928 quotes inhibit tilde expansion by the shell. */
2929
ccc6cda3
JA
2930 cs = completion_quoting_style;
2931 /* Might need to modify the default completion style based on *qcp,
bb70624e
JA
2932 since it's set to any user-provided opening quote. We also change
2933 to single-quoting if there is no user-provided opening quote and
2934 the word being completed contains newlines, since those are not
2935 quoted correctly using backslashes (a backslash-newline pair is
2936 special to the shell parser). */
95732b49 2937 if (*qcp == '\0' && cs == COMPLETE_BSQUOTE && xstrchr (s, '\n'))
bb70624e
JA
2938 cs = COMPLETE_SQUOTE;
2939 else if (*qcp == '"')
ccc6cda3
JA
2940 cs = COMPLETE_DQUOTE;
2941 else if (*qcp == '\'')
2942 cs = COMPLETE_SQUOTE;
2943#if defined (BANG_HISTORY)
2944 else if (*qcp == '\0' && history_expansion && cs == COMPLETE_DQUOTE &&
95732b49 2945 history_expansion_inhibited == 0 && xstrchr (s, '!'))
ccc6cda3 2946 cs = COMPLETE_BSQUOTE;
d166f048
JA
2947
2948 if (*qcp == '"' && history_expansion && cs == COMPLETE_DQUOTE &&
95732b49 2949 history_expansion_inhibited == 0 && xstrchr (s, '!'))
d166f048
JA
2950 {
2951 cs = COMPLETE_BSQUOTE;
2952 *qcp = '\0';
2953 }
ccc6cda3
JA
2954#endif
2955
95732b49
JA
2956 /* Don't tilde-expand backslash-quoted filenames, since only single and
2957 double quotes inhibit tilde expansion. */
2958 mtext = s;
2959 if (mtext[0] == '~' && rtype == SINGLE_MATCH && cs != COMPLETE_BSQUOTE)
2960 mtext = bash_tilde_expand (s, 0);
2961
ccc6cda3
JA
2962 switch (cs)
2963 {
2964 case COMPLETE_DQUOTE:
28ef6c31 2965 rtext = sh_double_quote (mtext);
ccc6cda3
JA
2966 break;
2967 case COMPLETE_SQUOTE:
28ef6c31 2968 rtext = sh_single_quote (mtext);
ccc6cda3
JA
2969 break;
2970 case COMPLETE_BSQUOTE:
28ef6c31 2971 rtext = sh_backslash_quote (mtext);
ccc6cda3
JA
2972 break;
2973 }
2974
2975 if (mtext != s)
2976 free (mtext);
2977
d166f048
JA
2978 /* We may need to quote additional characters: those that readline treats
2979 as word breaks that are not quoted by backslash_quote. */
2980 if (rtext && cs == COMPLETE_BSQUOTE)
2981 {
2982 mtext = quote_word_break_chars (rtext);
2983 free (rtext);
2984 rtext = mtext;
2985 }
2986
ccc6cda3
JA
2987 /* Leave the opening quote intact. The readline completion code takes
2988 care of avoiding doubled opening quotes. */
2989 rlen = strlen (rtext);
f73dda09 2990 ret = (char *)xmalloc (rlen + 1);
ccc6cda3
JA
2991 strcpy (ret, rtext);
2992
2993 /* If there are multiple matches, cut off the closing quote. */
2994 if (rtype == MULT_MATCH && cs != COMPLETE_BSQUOTE)
2995 ret[rlen - 1] = '\0';
2996 free (rtext);
2997 return ret;
2998}
2999
bb70624e
JA
3000/* Support for binding readline key sequences to Unix commands. */
3001static Keymap cmd_xmap;
3002
3003static int
3004bash_execute_unix_command (count, key)
3005 int count; /* ignored */
3006 int key;
3007{
3008 Keymap ckmap; /* current keymap */
3009 Keymap xkmap; /* unix command executing keymap */
3010 register int i;
3011 char *cmd;
b80f6443 3012 sh_parser_state_t ps;
bb70624e
JA
3013
3014 /* First, we need to find the right command to execute. This is tricky,
3015 because we might have already indirected into another keymap. */
3016 ckmap = rl_get_keymap ();
3017 if (ckmap != rl_executing_keymap)
3018 {
3019 /* bogus. we have to search. only handle one level of indirection. */
3020 for (i = 0; i < KEYMAP_SIZE; i++)
3021 {
3022 if (ckmap[i].type == ISKMAP && (Keymap)ckmap[i].function == rl_executing_keymap)
3023 break;
3024 }
3025 if (i < KEYMAP_SIZE)
28ef6c31 3026 xkmap = (Keymap)cmd_xmap[i].function;
bb70624e
JA
3027 else
3028 {
28ef6c31 3029 rl_crlf ();
b80f6443 3030 internal_error (_("bash_execute_unix_command: cannot find keymap for command"));
28ef6c31
JA
3031 rl_forced_update_display ();
3032 return 1;
bb70624e
JA
3033 }
3034 }
3035 else
3036 xkmap = cmd_xmap;
3037
3038 cmd = (char *)xkmap[key].function;
3039
3040 if (cmd == 0)
3041 {
28ef6c31 3042 rl_ding ();
bb70624e
JA
3043 return 1;
3044 }
3045
28ef6c31 3046 rl_crlf (); /* move to a new line */
bb70624e 3047
b80f6443 3048 save_parser_state (&ps);
7117c2d2 3049
bb70624e 3050 cmd = savestring (cmd);
7117c2d2
JA
3051 parse_and_execute (cmd, "bash_execute_unix_command", SEVAL_NOHIST);
3052
b80f6443 3053 restore_parser_state (&ps);
bb70624e
JA
3054
3055 /* and restore the readline buffer and display after command execution. */
3056 rl_forced_update_display ();
3057 return 0;
3058}
3059
3060static void
3061init_unix_command_map ()
3062{
3063 cmd_xmap = rl_make_bare_keymap ();
3064}
3065
3066static int
3067isolate_sequence (string, ind, need_dquote, startp)
3068 char *string;
3069 int ind, need_dquote, *startp;
3070{
3071 register int i;
3072 int c, passc, delim;
3073
3074 for (i = ind; string[i] && whitespace (string[i]); i++)
3075 ;
3076 /* NEED_DQUOTE means that the first non-white character *must* be `"'. */
3077 if (need_dquote && string[i] != '"')
3078 {
b80f6443 3079 builtin_error (_("%s: first non-whitespace character is not `\"'"), string);
bb70624e
JA
3080 return -1;
3081 }
3082
3083 /* We can have delimited strings even if NEED_DQUOTE == 0, like the command
3084 string to bind the key sequence to. */
3085 delim = (string[i] == '"' || string[i] == '\'') ? string[i] : 0;
3086
3087 if (startp)
3088 *startp = delim ? ++i : i;
3089
3090 for (passc = 0; c = string[i]; i++)
3091 {
3092 if (passc)
3093 {
3094 passc = 0;
3095 continue;
3096 }
3097 if (c == '\\')
3098 {
3099 passc++;
3100 continue;
3101 }
3102 if (c == delim)
28ef6c31 3103 break;
bb70624e
JA
3104 }
3105
3106 if (delim && string[i] != delim)
3107 {
b80f6443 3108 builtin_error (_("no closing `%c' in %s"), delim, string);
bb70624e
JA
3109 return -1;
3110 }
3111
3112 return i;
3113}
3114
3115int
3116bind_keyseq_to_unix_command (line)
3117 char *line;
3118{
3119 Keymap kmap;
3120 char *kseq, *value;
f73dda09 3121 int i, kstart;
bb70624e
JA
3122
3123 if (cmd_xmap == 0)
3124 init_unix_command_map ();
3125
3126 kmap = rl_get_keymap ();
3127
3128 /* We duplicate some of the work done by rl_parse_and_bind here, but
3129 this code only has to handle `"keyseq": ["]command["]' and can
3130 generate an error for anything else. */
3131 i = isolate_sequence (line, 0, 1, &kstart);
3132 if (i < 0)
3133 return -1;
3134
3135 /* Create the key sequence string to pass to rl_generic_bind */
3136 kseq = substring (line, kstart, i);
3137
3138 for ( ; line[i] && line[i] != ':'; i++)
3139 ;
3140 if (line[i] != ':')
3141 {
b80f6443 3142 builtin_error (_("%s: missing colon separator"), line);
bb70624e
JA
3143 return -1;
3144 }
3145
3146 i = isolate_sequence (line, i + 1, 0, &kstart);
3147 if (i < 0)
3148 return -1;
3149
3150 /* Create the value string containing the command to execute. */
3151 value = substring (line, kstart, i);
3152
3153 /* Save the command to execute and the key sequence in the CMD_XMAP */
3154 rl_generic_bind (ISMACR, kseq, value, cmd_xmap);
3155
3156 /* and bind the key sequence in the current keymap to a function that
3157 understands how to execute from CMD_XMAP */
b80f6443 3158 rl_bind_keyseq_in_map (kseq, bash_execute_unix_command, kmap);
bb70624e
JA
3159
3160 return 0;
3161}
3162
3163/* Used by the programmable completion code. Complete TEXT as a filename,
3164 but return only directories as matches. Dequotes the filename before
3165 attempting to find matches. */
3166char **
3167bash_directory_completion_matches (text)
28ef6c31 3168 const char *text;
bb70624e
JA
3169{
3170 char **m1;
3171 char *dfn;
3172 int qc;
3173
b80f6443 3174 qc = rl_dispatching ? rl_completion_quote_character : 0;
28ef6c31
JA
3175 dfn = bash_dequote_filename ((char *)text, qc);
3176 m1 = rl_completion_matches (dfn, rl_filename_completion_function);
bb70624e
JA
3177 free (dfn);
3178
3179 if (m1 == 0 || m1[0] == 0)
3180 return m1;
3181 /* We don't bother recomputing the lcd of the matches, because it will just
3182 get thrown away by the programmable completion code and recomputed
3183 later. */
3184 (void)bash_ignore_filenames (m1);
3185 return m1;
3186}
b80f6443
JA
3187
3188char *
3189bash_dequote_text (text)
3190 const char *text;
3191{
3192 char *dtxt;
3193 int qc;
3194
3195 qc = (text[0] == '"' || text[0] == '\'') ? text[0] : 0;
3196 dtxt = bash_dequote_filename ((char *)text, qc);
3197 return (dtxt);
3198}
ccc6cda3 3199#endif /* READLINE */