blob: fa4055e21d65d1b6caf90adbf1a89b07ebf60ad8 [file] [log] [blame]
Jari Aalto726f6381996-08-26 18:22:31 +00001/* bashline.c -- Bash's interface to the readline library. */
2
Jari Aalto06285672006-10-10 14:15:34 +00003/* Copyright (C) 1987-2006 Free Software Foundation, Inc.
Jari Aalto726f6381996-08-26 18:22:31 +00004
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
Jari Aaltobb706242000-03-17 21:46:59 +00009 the Free Software Foundation; either version 2, or (at your option)
Jari Aalto726f6381996-08-26 18:22:31 +000010 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
Jari Aaltobb706242000-03-17 21:46:59 +000019 Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
Jari Aalto726f6381996-08-26 18:22:31 +000020
Jari Aaltoccc6cda1996-12-23 17:02:34 +000021#include "config.h"
22
23#if defined (READLINE)
24
Jari Aalto726f6381996-08-26 18:22:31 +000025#include "bashtypes.h"
26#include "posixstat.h"
27
Jari Aaltoccc6cda1996-12-23 17:02:34 +000028#if defined (HAVE_UNISTD_H)
29# include <unistd.h>
30#endif
31
Jari Aaltof73dda02001-11-13 17:56:06 +000032#if defined (HAVE_GRP_H)
33# include <grp.h>
34#endif
35
Jari Aalto7117c2d2002-07-17 14:10:11 +000036#if defined (HAVE_NETDB_H)
37# include <netdb.h>
38#endif
39
Jari Aalto726f6381996-08-26 18:22:31 +000040#include <stdio.h>
Jari Aaltof73dda02001-11-13 17:56:06 +000041#include "chartypes.h"
Jari Aalto726f6381996-08-26 18:22:31 +000042#include "bashansi.h"
Jari Aaltob80f6442004-07-27 13:29:18 +000043#include "bashintl.h"
44
Jari Aaltoccc6cda1996-12-23 17:02:34 +000045#include "shell.h"
Jari Aalto7117c2d2002-07-17 14:10:11 +000046#include "input.h"
Jari Aaltoccc6cda1996-12-23 17:02:34 +000047#include "builtins.h"
48#include "bashhist.h"
49#include "bashline.h"
50#include "execute_cmd.h"
Jari Aaltocce855b1998-04-17 19:52:44 +000051#include "findcmd.h"
Jari Aaltoccc6cda1996-12-23 17:02:34 +000052#include "pathexp.h"
53#include "builtins/common.h"
Jari Aalto726f6381996-08-26 18:22:31 +000054#include <readline/rlconf.h>
55#include <readline/readline.h>
56#include <readline/history.h>
Jari Aaltoccc6cda1996-12-23 17:02:34 +000057
58#include <glob/glob.h>
Jari Aalto726f6381996-08-26 18:22:31 +000059
60#if defined (ALIAS)
61# include "alias.h"
62#endif
63
Jari Aaltobb706242000-03-17 21:46:59 +000064#if defined (PROGRAMMABLE_COMPLETION)
65# include "pcomplete.h"
66#endif
67
Jari Aalto7117c2d2002-07-17 14:10:11 +000068/* 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
Jari Aalto726f6381996-08-26 18:22:31 +000076#if defined (BRACE_COMPLETION)
Jari Aalto28ef6c32001-04-06 19:14:31 +000077extern int bash_brace_completion __P((int, int));
Jari Aalto726f6381996-08-26 18:22:31 +000078#endif /* BRACE_COMPLETION */
79
Jari Aalto28ef6c32001-04-06 19:14:31 +000080/* Forward declarations */
81
Jari Aalto726f6381996-08-26 18:22:31 +000082/* Functions bound to keys in Readline for Bash users. */
Jari Aalto28ef6c32001-04-06 19:14:31 +000083static 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
Jari Aaltocce855b1998-04-17 19:52:44 +000090#if defined (BANG_HISTORY)
Jari Aaltof73dda02001-11-13 17:56:06 +000091static char *history_expand_line_internal __P((char *));
Jari Aalto28ef6c32001-04-06 19:14:31 +000092static int history_expand_line __P((int, int));
93static int tcsh_magic_space __P((int, int));
Jari Aaltocce855b1998-04-17 19:52:44 +000094#endif /* BANG_HISTORY */
95#ifdef ALIAS
Jari Aalto28ef6c32001-04-06 19:14:31 +000096static int alias_expand_line __P((int, int));
Jari Aaltocce855b1998-04-17 19:52:44 +000097#endif
98#if defined (BANG_HISTORY) && defined (ALIAS)
Jari Aalto28ef6c32001-04-06 19:14:31 +000099static int history_and_alias_expand_line __P((int, int));
Jari Aaltocce855b1998-04-17 19:52:44 +0000100#endif
101
Jari Aalto726f6381996-08-26 18:22:31 +0000102/* Helper functions for Readline. */
Jari Aalto95732b42005-12-07 14:08:12 +0000103static void bash_directory_expansion __P((char **));
Jari Aaltof73dda02001-11-13 17:56:06 +0000104static int bash_directory_completion_hook __P((char **));
105static int filename_completion_ignore __P((char **));
Jari Aalto28ef6c32001-04-06 19:14:31 +0000106static int bash_push_line __P((void));
Jari Aalto726f6381996-08-26 18:22:31 +0000107
Jari Aaltof73dda02001-11-13 17:56:06 +0000108static 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));
Jari Aalto28ef6c32001-04-06 19:14:31 +0000113static 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));
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000117
Jari Aaltof73dda02001-11-13 17:56:06 +0000118static void build_history_completion_array __P((void));
119static char *history_completion_generator __P((const char *, int));
Jari Aalto28ef6c32001-04-06 19:14:31 +0000120static int dynamic_complete_history __P((int, int));
Jari Aalto726f6381996-08-26 18:22:31 +0000121
Jari Aaltof73dda02001-11-13 17:56:06 +0000122static void initialize_hostname_list __P((void));
Jari Aalto28ef6c32001-04-06 19:14:31 +0000123static void add_host_name __P((char *));
Jari Aaltof73dda02001-11-13 17:56:06 +0000124static 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 *));
Jari Aalto28ef6c32001-04-06 19:14:31 +0000131
132static char *bash_dequote_filename __P((char *, int));
Jari Aaltof73dda02001-11-13 17:56:06 +0000133static char *quote_word_break_chars __P((char *));
Jari Aalto28ef6c32001-04-06 19:14:31 +0000134static char *bash_quote_filename __P((char *, int, char *));
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000135
Jari Aaltof73dda02001-11-13 17:56:06 +0000136static 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
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000142#if defined (ALIAS)
Jari Aalto28ef6c32001-04-06 19:14:31 +0000143static int posix_edit_macros __P((int, int));
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000144#endif
Jari Aalto726f6381996-08-26 18:22:31 +0000145
Jari Aaltobb706242000-03-17 21:46:59 +0000146#if defined (PROGRAMMABLE_COMPLETION)
Jari Aaltof73dda02001-11-13 17:56:06 +0000147static 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
Jari Aaltobb706242000-03-17 21:46:59 +0000152static char **prog_complete_matches;
Jari Aaltobb706242000-03-17 21:46:59 +0000153#endif
154
Jari Aalto726f6381996-08-26 18:22:31 +0000155/* Variables used here but defined in other files. */
Jari Aaltob80f6442004-07-27 13:29:18 +0000156#if defined (BANG_HISTORY)
157extern int hist_verify;
158#endif
159
160extern int current_command_line_count, last_command_exit_value;
Jari Aalto726f6381996-08-26 18:22:31 +0000161extern int posixly_correct, no_symbolic_links;
Jari Aalto726f6381996-08-26 18:22:31 +0000162extern char *current_prompt_string, *ps1_prompt;
163extern STRING_INT_ALIST word_token_alist[];
Jari Aaltob80f6442004-07-27 13:29:18 +0000164extern sh_builtin_func_t *last_shell_builtin, *this_shell_builtin;
Jari Aalto726f6381996-08-26 18:22:31 +0000165
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)
Jari Aalto28ef6c32001-04-06 19:14:31 +0000173static 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));
Jari Aaltof73dda02001-11-13 17:56:06 +0000191
192static char *glob_complete_word __P((const char *, int));
193static int bash_glob_completion_internal __P((int));
Jari Aalto7117c2d2002-07-17 14:10:11 +0000194static int bash_glob_complete_word __P((int, int));
Jari Aaltof73dda02001-11-13 17:56:06 +0000195static int bash_glob_expand_word __P((int, int));
196static int bash_glob_list_expansions __P((int, int));
Jari Aaltob80f6442004-07-27 13:29:18 +0000197
Jari Aalto726f6381996-08-26 18:22:31 +0000198#endif /* SPECIFIC_COMPLETION_FUNCTIONS */
199
Jari Aalto7117c2d2002-07-17 14:10:11 +0000200static int edit_and_execute_command __P((int, int, int, char *));
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000201#if defined (VI_MODE)
Jari Aalto28ef6c32001-04-06 19:14:31 +0000202static int vi_edit_and_execute_command __P((int, int));
Jari Aaltob80f6442004-07-27 13:29:18 +0000203static int bash_vi_complete __P((int, int));
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000204#endif
Jari Aalto7117c2d2002-07-17 14:10:11 +0000205static int emacs_edit_and_execute_command __P((int, int));
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000206
Jari Aalto726f6381996-08-26 18:22:31 +0000207/* Non-zero once initalize_readline () has been called. */
208int bash_readline_initialized = 0;
209
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000210/* 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
Jari Aaltobb706242000-03-17 21:46:59 +0000215/* If non-zero, we don't do command completion on an empty line. */
216int no_empty_command_completion;
217
Jari Aaltob80f6442004-07-27 13:29:18 +0000218/* 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
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000223static char *bash_completer_word_break_characters = " \t\n\"'@><=;|&(:";
224static char *bash_nohostname_word_break_characters = " \t\n\"'><=;|&(:";
Jari Aaltob80f6442004-07-27 13:29:18 +0000225/* )) */
Jari Aalto726f6381996-08-26 18:22:31 +0000226
Jari Aalto28ef6c32001-04-06 19:14:31 +0000227static rl_hook_func_t *old_rl_startup_hook = (rl_hook_func_t *)NULL;
Jari Aalto726f6381996-08-26 18:22:31 +0000228
Jari Aalto95732b42005-12-07 14:08:12 +0000229static int dot_in_path = 0;
230
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000231/* 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
Jari Aalto06285672006-10-10 14:15:34 +0000241/* Flag values for the final argument to bash_default_completion */
242#define DEFCOMP_CMDPOS 1
243
Jari Aalto726f6381996-08-26 18:22:31 +0000244/* 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{
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000250 if (on_or_off)
251 rl_variable_bind ("comment-begin", "#");
Jari Aalto726f6381996-08-26 18:22:31 +0000252#if defined (VI_MODE)
Jari Aalto7117c2d2002-07-17 14:10:11 +0000253 rl_bind_key_in_map (CTRL ('I'), on_or_off ? rl_insert : rl_complete, vi_insertion_keymap);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000254#endif
255}
256
Jari Aaltob80f6442004-07-27 13:29:18 +0000257/* When this function returns, rl_completer_word_break_characters points to
258 dynamically allocated memory. */
Jari Aaltof73dda02001-11-13 17:56:06 +0000259int
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000260enable_hostname_completion (on_or_off)
261 int on_or_off;
262{
Jari Aaltof73dda02001-11-13 17:56:06 +0000263 int old_value;
Jari Aaltob80f6442004-07-27 13:29:18 +0000264 char *at, *nv, *nval;
Jari Aaltof73dda02001-11-13 17:56:06 +0000265
266 old_value = perform_hostname_completion;
267
Jari Aalto726f6381996-08-26 18:22:31 +0000268 if (on_or_off)
269 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000270 perform_hostname_completion = 1;
271 rl_special_prefixes = "$@";
Jari Aalto726f6381996-08-26 18:22:31 +0000272 }
273 else
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000274 {
275 perform_hostname_completion = 0;
276 rl_special_prefixes = "$";
Jari Aaltob80f6442004-07-27 13:29:18 +0000277 }
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))
Jari Aaltoeb873672004-11-09 21:37:25 +0000301 return old_value;
Jari Aaltob80f6442004-07-27 13:29:18 +0000302
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;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000326 }
Jari Aaltof73dda02001-11-13 17:56:06 +0000327
328 return (old_value);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000329}
Jari Aalto726f6381996-08-26 18:22:31 +0000330
331/* Called once from parse.y if we are going to use readline. */
332void
333initialize_readline ()
334{
Jari Aaltob80f6442004-07-27 13:29:18 +0000335 rl_command_func_t *func;
336 char kseq[2];
337
Jari Aalto726f6381996-08-26 18:22:31 +0000338 if (bash_readline_initialized)
339 return;
340
341 rl_terminal_name = get_string_value ("TERM");
342 rl_instream = stdin;
343 rl_outstream = stderr;
Jari Aalto726f6381996-08-26 18:22:31 +0000344
345 /* Allow conditional parsing of the ~/.inputrc file. */
346 rl_readline_name = "Bash";
347
Jari Aalto28ef6c32001-04-06 19:14:31 +0000348 /* 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);
Jari Aaltocce855b1998-04-17 19:52:44 +0000351#ifdef BANG_HISTORY
Jari Aalto28ef6c32001-04-06 19:14:31 +0000352 rl_add_defun ("history-expand-line", history_expand_line, -1);
353 rl_add_defun ("magic-space", tcsh_magic_space, -1);
Jari Aaltocce855b1998-04-17 19:52:44 +0000354#endif
355
Jari Aaltod166f041997-06-05 14:59:13 +0000356#ifdef ALIAS
Jari Aalto28ef6c32001-04-06 19:14:31 +0000357 rl_add_defun ("alias-expand-line", alias_expand_line, -1);
Jari Aaltobc4cd231998-07-23 14:37:54 +0000358# ifdef BANG_HISTORY
Jari Aalto28ef6c32001-04-06 19:14:31 +0000359 rl_add_defun ("history-and-alias-expand-line", history_and_alias_expand_line, -1);
Jari Aaltobc4cd231998-07-23 14:37:54 +0000360# endif
Jari Aaltod166f041997-06-05 14:59:13 +0000361#endif
362
Jari Aalto726f6381996-08-26 18:22:31 +0000363 /* Backwards compatibility. */
364 rl_add_defun ("insert-last-argument", rl_yank_last_arg, -1);
365
Jari Aalto28ef6c32001-04-06 19:14:31 +0000366 rl_add_defun ("operate-and-get-next", operate_and_get_next, -1);
367 rl_add_defun ("display-shell-version", display_shell_version, -1);
Jari Aalto7117c2d2002-07-17 14:10:11 +0000368 rl_add_defun ("edit-and-execute-command", emacs_edit_and_execute_command, -1);
Jari Aalto726f6381996-08-26 18:22:31 +0000369
Jari Aalto28ef6c32001-04-06 19:14:31 +0000370#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);
Jari Aalto7117c2d2002-07-17 14:10:11 +0000385 rl_add_defun ("glob-complete-word", bash_glob_complete_word, -1);
Jari Aalto28ef6c32001-04-06 19:14:31 +0000386 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);
391
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. */
Jari Aaltob80f6442004-07-27 13:29:18 +0000397 rl_bind_key_if_unbound_in_map (CTRL('E'), shell_expand_line, emacs_meta_keymap);
Jari Aalto28ef6c32001-04-06 19:14:31 +0000398
Jari Aalto28ef6c32001-04-06 19:14:31 +0000399#ifdef BANG_HISTORY
Jari Aaltob80f6442004-07-27 13:29:18 +0000400 rl_bind_key_if_unbound_in_map ('^', history_expand_line, emacs_meta_keymap);
Jari Aalto28ef6c32001-04-06 19:14:31 +0000401#endif
402
Jari Aaltob80f6442004-07-27 13:29:18 +0000403 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);
Jari Aalto726f6381996-08-26 18:22:31 +0000405
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. */
Jari Aaltob80f6442004-07-27 13:29:18 +0000409 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);
Jari Aalto726f6381996-08-26 18:22:31 +0000418#if defined (VI_MODE)
419 rl_unbind_key_in_map (CTRL('E'), vi_movement_keymap);
420#endif
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000421
Jari Aalto726f6381996-08-26 18:22:31 +0000422#if defined (BRACE_COMPLETION)
Jari Aaltob80f6442004-07-27 13:29:18 +0000423 rl_bind_key_if_unbound_in_map ('{', bash_brace_completion, emacs_meta_keymap); /*}*/
Jari Aalto726f6381996-08-26 18:22:31 +0000424#endif /* BRACE_COMPLETION */
425
426#if defined (SPECIFIC_COMPLETION_FUNCTIONS)
Jari Aaltob80f6442004-07-27 13:29:18 +0000427 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);
Jari Aalto726f6381996-08-26 18:22:31 +0000429
Jari Aaltob80f6442004-07-27 13:29:18 +0000430 /* 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);
Jari Aalto726f6381996-08-26 18:22:31 +0000437
Jari Aaltob80f6442004-07-27 13:29:18 +0000438 rl_bind_key_if_unbound_in_map ('~', bash_possible_username_completions, emacs_ctlx_keymap);
Jari Aalto726f6381996-08-26 18:22:31 +0000439
Jari Aaltob80f6442004-07-27 13:29:18 +0000440 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);
Jari Aalto726f6381996-08-26 18:22:31 +0000442
Jari Aaltob80f6442004-07-27 13:29:18 +0000443 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);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000445
Jari Aaltob80f6442004-07-27 13:29:18 +0000446 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);
Jari Aalto726f6381996-08-26 18:22:31 +0000452
453#endif /* SPECIFIC_COMPLETION_FUNCTIONS */
454
Jari Aalto95732b42005-12-07 14:08:12 +0000455 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);
Jari Aalto726f6381996-08-26 18:22:31 +0000460
461 /* Tell the completer that we want a crack first. */
Jari Aalto28ef6c32001-04-06 19:14:31 +0000462 rl_attempted_completion_function = attempt_shell_completion;
Jari Aalto726f6381996-08-26 18:22:31 +0000463
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. */
Jari Aalto28ef6c32001-04-06 19:14:31 +0000469 rl_ignore_some_completions_function = filename_completion_ignore;
Jari Aalto726f6381996-08-26 18:22:31 +0000470
Jari Aalto7117c2d2002-07-17 14:10:11 +0000471 /* Bind C-xC-e to invoke emacs and run result as commands. */
Jari Aaltob80f6442004-07-27 13:29:18 +0000472 rl_bind_key_if_unbound_in_map (CTRL ('E'), emacs_edit_and_execute_command, emacs_ctlx_keymap);
Jari Aalto726f6381996-08-26 18:22:31 +0000473#if defined (VI_MODE)
Jari Aaltob80f6442004-07-27 13:29:18 +0000474 rl_bind_key_if_unbound_in_map ('v', vi_edit_and_execute_command, vi_movement_keymap);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000475# if defined (ALIAS)
Jari Aaltob80f6442004-07-27 13:29:18 +0000476 rl_bind_key_if_unbound_in_map ('@', posix_edit_macros, vi_movement_keymap);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000477# endif
Jari Aaltob80f6442004-07-27 13:29:18 +0000478
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);
Jari Aalto726f6381996-08-26 18:22:31 +0000482#endif
483
484 rl_completer_quote_characters = "'\"";
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000485
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. */
Jari Aalto28ef6c32001-04-06 19:14:31 +0000492 rl_filename_quote_characters = " \t\n\\\"'@<>=;|&()#$`?*[!:{"; /*}*/
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000493 rl_filename_quoting_function = bash_quote_filename;
494 rl_filename_dequoting_function = bash_dequote_filename;
495 rl_char_is_quoted_p = char_is_quoted;
Jari Aalto726f6381996-08-26 18:22:31 +0000496
Jari Aalto7117c2d2002-07-17 14:10:11 +0000497#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. */
Jari Aalto726f6381996-08-26 18:22:31 +0000502 if (posixly_correct)
503 posix_readline_initialize (1);
Jari Aalto7117c2d2002-07-17 14:10:11 +0000504#endif
Jari Aalto726f6381996-08-26 18:22:31 +0000505
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;
Jari Aalto28ef6c32001-04-06 19:14:31 +0000519 rl_completion_entry_function = NULL;
Jari Aalto726f6381996-08-26 18:22:31 +0000520 rl_directory_completion_hook = bash_directory_completion_hook;
Jari Aalto28ef6c32001-04-06 19:14:31 +0000521 rl_ignore_some_completions_function = filename_completion_ignore;
Jari Aalto726f6381996-08-26 18:22:31 +0000522}
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. */
Jari Aalto28ef6c32001-04-06 19:14:31 +0000529static int
Jari Aalto726f6381996-08-26 18:22:31 +0000530bash_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 }
Jari Aalto28ef6c32001-04-06 19:14:31 +0000539 return 0;
Jari Aalto726f6381996-08-26 18:22:31 +0000540}
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{
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000548 FREE (push_to_readline);
Jari Aalto726f6381996-08-26 18:22:31 +0000549
550 push_to_readline = savestring (line);
551 old_rl_startup_hook = rl_startup_hook;
Jari Aalto28ef6c32001-04-06 19:14:31 +0000552 rl_startup_hook = bash_push_line;
Jari Aalto726f6381996-08-26 18:22:31 +0000553
554 return (0);
555}
556
Jari Aalto28ef6c32001-04-06 19:14:31 +0000557static int
Jari Aalto726f6381996-08-26 18:22:31 +0000558display_shell_version (count, c)
559 int count, c;
560{
Jari Aalto28ef6c32001-04-06 19:14:31 +0000561 rl_crlf ();
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000562 show_shell_version (0);
Jari Aalto726f6381996-08-26 18:22:31 +0000563 putc ('\r', rl_outstream);
564 fflush (rl_outstream);
565 rl_on_new_line ();
566 rl_redisplay ();
Jari Aalto28ef6c32001-04-06 19:14:31 +0000567 return 0;
Jari Aalto726f6381996-08-26 18:22:31 +0000568}
569
570/* **************************************************************** */
571/* */
572/* Readline Stuff */
573/* */
574/* **************************************************************** */
575
576/* If the user requests hostname completion, then simply build a list
Jari Aaltobb706242000-03-17 21:46:59 +0000577 of hosts, and complete from that forever more, or at least until
578 HOSTFILE is unset. */
Jari Aalto726f6381996-08-26 18:22:31 +0000579
Jari Aaltobb706242000-03-17 21:46:59 +0000580/* THIS SHOULD BE A STRINGLIST. */
Jari Aalto726f6381996-08-26 18:22:31 +0000581/* The kept list of hostnames. */
582static char **hostname_list = (char **)NULL;
583
584/* The physical size of the above list. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000585static int hostname_list_size;
Jari Aalto726f6381996-08-26 18:22:31 +0000586
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000587/* The number of hostnames in the above list. */
588static int hostname_list_length;
Jari Aalto726f6381996-08-26 18:22:31 +0000589
590/* Whether or not HOSTNAME_LIST has been initialized. */
591int hostname_list_initialized = 0;
592
Jari Aalto726f6381996-08-26 18:22:31 +0000593/* Initialize the hostname completion table. */
594static void
595initialize_hostname_list ()
596{
597 char *temp;
598
599 temp = get_string_value ("HOSTFILE");
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000600 if (temp == 0)
Jari Aalto726f6381996-08-26 18:22:31 +0000601 temp = get_string_value ("hostname_completion_file");
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000602 if (temp == 0)
603 temp = DEFAULT_HOSTS_FILE;
Jari Aalto726f6381996-08-26 18:22:31 +0000604
605 snarf_hosts_from_file (temp);
Jari Aalto726f6381996-08-26 18:22:31 +0000606
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 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000618 hostname_list_size = (hostname_list_size + 32) - (hostname_list_size % 32);
Jari Aalto7117c2d2002-07-17 14:10:11 +0000619 hostname_list = strvec_resize (hostname_list, hostname_list_size);
Jari Aalto726f6381996-08-26 18:22:31 +0000620 }
621
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000622 hostname_list[hostname_list_length++] = savestring (name);
623 hostname_list[hostname_list_length] = (char *)NULL;
Jari Aalto726f6381996-08-26 18:22:31 +0000624}
625
626#define cr_whitespace(c) ((c) == '\r' || (c) == '\n' || whitespace(c))
627
628static void
629snarf_hosts_from_file (filename)
630 char *filename;
631{
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000632 FILE *file;
Jari Aalto726f6381996-08-26 18:22:31 +0000633 char *temp, buffer[256], name[256];
634 register int i, start;
635
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000636 file = fopen (filename, "r");
637 if (file == 0)
Jari Aalto726f6381996-08-26 18:22:31 +0000638 return;
639
640 while (temp = fgets (buffer, 255, file))
641 {
642 /* Skip to first character. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000643 for (i = 0; buffer[i] && cr_whitespace (buffer[i]); i++)
644 ;
Jari Aalto726f6381996-08-26 18:22:31 +0000645
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000646 /* If comment or blank line, ignore. */
647 if (buffer[i] == '\0' || buffer[i] == '#')
Jari Aalto726f6381996-08-26 18:22:31 +0000648 continue;
649
650 /* If `preprocessor' directive, do the include. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000651 if (strncmp (buffer + i, "$include ", 9) == 0)
Jari Aalto726f6381996-08-26 18:22:31 +0000652 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000653 char *incfile, *t;
Jari Aalto726f6381996-08-26 18:22:31 +0000654
655 /* Find start of filename. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000656 for (incfile = buffer + i + 9; *incfile && whitespace (*incfile); incfile++)
657 ;
Jari Aalto726f6381996-08-26 18:22:31 +0000658
659 /* Find end of filename. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000660 for (t = incfile; *t && cr_whitespace (*t) == 0; t++)
661 ;
Jari Aalto726f6381996-08-26 18:22:31 +0000662
663 *t = '\0';
664
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000665 snarf_hosts_from_file (incfile);
Jari Aalto726f6381996-08-26 18:22:31 +0000666 continue;
667 }
668
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000669 /* Skip internet address if present. */
Jari Aaltof73dda02001-11-13 17:56:06 +0000670 if (DIGIT (buffer[i]))
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000671 for (; buffer[i] && cr_whitespace (buffer[i]) == 0; i++);
Jari Aalto726f6381996-08-26 18:22:31 +0000672
673 /* Gobble up names. Each name is separated with whitespace. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000674 while (buffer[i])
Jari Aalto726f6381996-08-26 18:22:31 +0000675 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000676 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)
Jari Aalto726f6381996-08-26 18:22:31 +0000685 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
Jari Aaltobb706242000-03-17 21:46:59 +0000694/* 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
Jari Aalto726f6381996-08-26 18:22:31 +0000715/* 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{
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000722 register int i, len, nmatch, rsize;
723 char **result;
Jari Aalto726f6381996-08-26 18:22:31 +0000724
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000725 if (hostname_list_initialized == 0)
726 initialize_hostname_list ();
Jari Aalto726f6381996-08-26 18:22:31 +0000727
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000728 if (hostname_list_initialized == 0)
729 return ((char **)NULL);
Jari Aalto726f6381996-08-26 18:22:31 +0000730
731 /* Special case. If TEXT consists of nothing, then the whole list is
732 what is desired. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000733 if (*text == '\0')
Jari Aalto726f6381996-08-26 18:22:31 +0000734 {
Jari Aalto7117c2d2002-07-17 14:10:11 +0000735 result = strvec_create (1 + hostname_list_length);
Jari Aalto726f6381996-08-26 18:22:31 +0000736 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. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000743 len = strlen (text);
744 result = (char **)NULL;
745 for (i = nmatch = rsize = 0; i < hostname_list_length; i++)
Jari Aalto726f6381996-08-26 18:22:31 +0000746 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000747 if (STREQN (text, hostname_list[i], len) == 0)
Jari Aalto28ef6c32001-04-06 19:14:31 +0000748 continue;
Jari Aalto726f6381996-08-26 18:22:31 +0000749
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000750 /* OK, it matches. Add it to the list. */
Jari Aaltobc4cd231998-07-23 14:37:54 +0000751 if (nmatch >= (rsize - 1))
Jari Aalto726f6381996-08-26 18:22:31 +0000752 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000753 rsize = (rsize + 16) - (rsize % 16);
Jari Aalto7117c2d2002-07-17 14:10:11 +0000754 result = strvec_resize (result, rsize);
Jari Aalto726f6381996-08-26 18:22:31 +0000755 }
756
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000757 result[nmatch++] = hostname_list[i];
Jari Aalto726f6381996-08-26 18:22:31 +0000758 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000759 if (nmatch)
760 result[nmatch] = (char *)NULL;
761 return (result);
Jari Aalto726f6381996-08-26 18:22:31 +0000762}
763
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000764/* The equivalent of the Korn shell C-o operate-and-get-next-history-line
Jari Aalto726f6381996-08-26 18:22:31 +0000765 editing command. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000766static int saved_history_line_to_use = -1;
Jari Aalto726f6381996-08-26 18:22:31 +0000767
Jari Aalto28ef6c32001-04-06 19:14:31 +0000768static int
Jari Aalto726f6381996-08-26 18:22:31 +0000769set_saved_history ()
770{
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000771 if (saved_history_line_to_use >= 0)
Jari Aaltob72432f1999-02-19 17:11:39 +0000772 rl_get_previous_history (history_length - saved_history_line_to_use, 0);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000773 saved_history_line_to_use = -1;
Jari Aalto726f6381996-08-26 18:22:31 +0000774 rl_startup_hook = old_rl_startup_hook;
Jari Aaltof73dda02001-11-13 17:56:06 +0000775 return (0);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000776}
Jari Aalto726f6381996-08-26 18:22:31 +0000777
Jari Aalto28ef6c32001-04-06 19:14:31 +0000778static int
Jari Aalto726f6381996-08-26 18:22:31 +0000779operate_and_get_next (count, c)
780 int count, c;
781{
782 int where;
783
784 /* Accept the current line. */
Jari Aaltob72432f1999-02-19 17:11:39 +0000785 rl_newline (1, c);
Jari Aalto726f6381996-08-26 18:22:31 +0000786
787 /* Find the current line, and find the next line to use. */
788 where = where_history ();
789
Jari Aalto28ef6c32001-04-06 19:14:31 +0000790 if ((history_is_stifled () && (history_length >= history_max_entries)) ||
Jari Aalto726f6381996-08-26 18:22:31 +0000791 (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;
Jari Aalto28ef6c32001-04-06 19:14:31 +0000797 rl_startup_hook = set_saved_history;
798
799 return 0;
Jari Aalto726f6381996-08-26 18:22:31 +0000800}
801
Jari Aalto726f6381996-08-26 18:22:31 +0000802/* 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
Jari Aaltob80f6442004-07-27 13:29:18 +0000806#define VI_EDIT_COMMAND "fc -e \"${VISUAL:-${EDITOR:-vi}}\""
807#define EMACS_EDIT_COMMAND "fc -e \"${VISUAL:-${EDITOR:-emacs}}\""
Jari Aalto95732b42005-12-07 14:08:12 +0000808#define POSIX_VI_EDIT_COMMAND "fc -e vi"
Jari Aalto726f6381996-08-26 18:22:31 +0000809
Jari Aalto28ef6c32001-04-06 19:14:31 +0000810static int
Jari Aalto7117c2d2002-07-17 14:10:11 +0000811edit_and_execute_command (count, c, editing_mode, edit_command)
812 int count, c, editing_mode;
813 char *edit_command;
Jari Aalto726f6381996-08-26 18:22:31 +0000814{
815 char *command;
Jari Aaltof73dda02001-11-13 17:56:06 +0000816 int r, cclc, rrs;
817
818 rrs = rl_readline_state;
819 cclc = current_command_line_count;
Jari Aalto726f6381996-08-26 18:22:31 +0000820
821 /* Accept the current line. */
Jari Aaltob72432f1999-02-19 17:11:39 +0000822 rl_newline (1, c);
Jari Aalto726f6381996-08-26 18:22:31 +0000823
824 if (rl_explicit_arg)
825 {
Jari Aalto7117c2d2002-07-17 14:10:11 +0000826 command = (char *)xmalloc (strlen (edit_command) + 8);
827 sprintf (command, "%s %d", edit_command, count);
Jari Aalto726f6381996-08-26 18:22:31 +0000828 }
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 ();
Jari Aaltod166f041997-06-05 14:59:13 +0000836 bash_add_history (rl_line_buffer);
837 bash_add_history ("");
Jari Aalto726f6381996-08-26 18:22:31 +0000838 history_lines_this_session++;
839 using_history ();
Jari Aalto7117c2d2002-07-17 14:10:11 +0000840 command = savestring (edit_command);
Jari Aalto726f6381996-08-26 18:22:31 +0000841 }
Jari Aalto7117c2d2002-07-17 14:10:11 +0000842
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);
Jari Aaltof73dda02001-11-13 17:56:06 +0000847
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. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000853 rl_line_buffer[0] = '\0'; /* XXX */
Jari Aaltof73dda02001-11-13 17:56:06 +0000854 rl_point = rl_end = 0;
855 rl_done = 0;
856 rl_readline_state = rrs;
857
858 rl_forced_update_display ();
Jari Aalto28ef6c32001-04-06 19:14:31 +0000859
860 return r;
Jari Aalto726f6381996-08-26 18:22:31 +0000861}
Jari Aalto7117c2d2002-07-17 14:10:11 +0000862
863#if defined (VI_MODE)
864static int
865vi_edit_and_execute_command (count, c)
866 int count, c;
867{
Jari Aalto95732b42005-12-07 14:08:12 +0000868 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));
Jari Aalto7117c2d2002-07-17 14:10:11 +0000872}
Jari Aalto726f6381996-08-26 18:22:31 +0000873#endif /* VI_MODE */
874
Jari Aalto7117c2d2002-07-17 14:10:11 +0000875static 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
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000882#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
Jari Aalto726f6381996-08-26 18:22:31 +0000905/* **************************************************************** */
906/* */
907/* How To Do Shell Completion */
908/* */
909/* **************************************************************** */
910
Jari Aaltobb706242000-03-17 21:46:59 +0000911#define COMMAND_SEPARATORS ";|&{(`"
Jari Aaltob80f6442004-07-27 13:29:18 +0000912/* )} */
Jari Aaltobb706242000-03-17 21:46:59 +0000913
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)
Jari Aaltof73dda02001-11-13 17:56:06 +0000935/*
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 */
Jari Aaltobb706242000-03-17 21:46:59 +0000940static 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)
Jari Aaltof73dda02001-11-13 17:56:06 +0000983 const char *text;
Jari Aaltobb706242000-03-17 21:46:59 +0000984 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
Jari Aalto726f6381996-08-26 18:22:31 +0000998/* 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)
Jari Aalto28ef6c32001-04-06 19:14:31 +00001002 const char *text;
Jari Aalto726f6381996-08-26 18:22:31 +00001003 int start, end;
1004{
Jari Aalto06285672006-10-10 14:15:34 +00001005 int in_command_position, ti, saveti, qc, dflags;
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001006 char **matches, *command_separator_chars;
Jari Aalto726f6381996-08-26 18:22:31 +00001007
Jari Aaltobb706242000-03-17 21:46:59 +00001008 command_separator_chars = COMMAND_SEPARATORS;
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001009 matches = (char **)NULL;
Jari Aalto28ef6c32001-04-06 19:14:31 +00001010 rl_ignore_some_completions_function = filename_completion_ignore;
Jari Aalto726f6381996-08-26 18:22:31 +00001011
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;
Jari Aaltobb706242000-03-17 21:46:59 +00001017 saveti = qc = -1;
Jari Aalto726f6381996-08-26 18:22:31 +00001018
1019 while ((ti > -1) && (whitespace (rl_line_buffer[ti])))
1020 ti--;
1021
Jari Aaltobb706242000-03-17 21:46:59 +00001022#if 1
1023 /* If this is an open quote, maybe we're trying to complete a quoted
1024 command name. */
Jari Aaltob80f6442004-07-27 13:29:18 +00001025 if (ti >= 0 && (rl_line_buffer[ti] == '"' || rl_line_buffer[ti] == '\''))
Jari Aaltobb706242000-03-17 21:46:59 +00001026 {
1027 qc = rl_line_buffer[ti];
1028 saveti = ti--;
1029 while (ti > -1 && (whitespace (rl_line_buffer[ti])))
Jari Aalto28ef6c32001-04-06 19:14:31 +00001030 ti--;
Jari Aaltobb706242000-03-17 21:46:59 +00001031 }
1032#endif
1033
Jari Aalto726f6381996-08-26 18:22:31 +00001034 in_command_position = 0;
1035 if (ti < 0)
1036 {
1037 /* Only do command completion at the start of a line when we
Jari Aalto28ef6c32001-04-06 19:14:31 +00001038 are prompting at the top level. */
Jari Aalto726f6381996-08-26 18:22:31 +00001039 if (current_prompt_string == ps1_prompt)
1040 in_command_position++;
1041 }
1042 else if (member (rl_line_buffer[ti], command_separator_chars))
1043 {
Jari Aalto726f6381996-08-26 18:22:31 +00001044 in_command_position++;
1045
Jari Aaltobb706242000-03-17 21:46:59 +00001046 if (check_redir (ti) == 1)
Jari Aalto28ef6c32001-04-06 19:14:31 +00001047 in_command_position = 0;
Jari Aalto726f6381996-08-26 18:22:31 +00001048 }
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
Jari Aaltod166f041997-06-05 14:59:13 +00001056 /* Check that we haven't incorrectly flagged a closed command substitution
1057 as indicating we're in a command position. */
Jari Aaltoe8ce7751997-09-22 20:22:27 +00001058 if (in_command_position && ti >= 0 && rl_line_buffer[ti] == '`' &&
Jari Aaltobb706242000-03-17 21:46:59 +00001059 *text != '`' && unclosed_pair (rl_line_buffer, end, "`") == 0)
Jari Aaltod166f041997-06-05 14:59:13 +00001060 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. */
Jari Aaltobb706242000-03-17 21:46:59 +00001066 if (*text == '`' &&
1067 (in_command_position || (unclosed_pair (rl_line_buffer, start, "`") &&
1068 unclosed_pair (rl_line_buffer, end, "`"))))
Jari Aalto28ef6c32001-04-06 19:14:31 +00001069 matches = rl_completion_matches (text, command_subst_completion_function);
Jari Aalto726f6381996-08-26 18:22:31 +00001070
Jari Aaltobb706242000-03-17 21:46:59 +00001071#if defined (PROGRAMMABLE_COMPLETION)
1072 /* Attempt programmable completion. */
1073 if (!matches && in_command_position == 0 && prog_completion_enabled &&
Jari Aalto7117c2d2002-07-17 14:10:11 +00001074 (progcomp_size () > 0) && current_prompt_string == ps1_prompt)
Jari Aaltobb706242000-03-17 21:46:59 +00001075 {
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);
Jari Aalto95732b42005-12-07 14:08:12 +00001087 if (e > s && assignment (n, 0) == 0)
Jari Aaltof73dda02001-11-13 17:56:06 +00001088 prog_complete_matches = programmable_completions (n, text, s, e, &foundcs);
1089 else
1090 foundcs = 0;
Jari Aaltobb706242000-03-17 21:46:59 +00001091 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
Jari Aalto28ef6c32001-04-06 19:14:31 +00001094 filename completion that readline will do unless the COPT_DEFAULT
1095 option has been set with the `-o default' option to complete. */
Jari Aaltobb706242000-03-17 21:46:59 +00001096 if (foundcs)
1097 {
Jari Aalto28ef6c32001-04-06 19:14:31 +00001098 /* If the user specified that the compspec returns filenames, make
Jari Aaltof73dda02001-11-13 17:56:06 +00001099 sure that readline knows it. */
Jari Aalto28ef6c32001-04-06 19:14:31 +00001100 if (foundcs & COPT_FILENAMES)
1101 rl_filename_completion_desired = 1;
Jari Aalto7117c2d2002-07-17 14:10:11 +00001102 /* If the user doesn't want a space appended, tell readline. */
1103 if (foundcs & COPT_NOSPACE)
1104 rl_completion_suppress_append = 1;
Jari Aaltobb706242000-03-17 21:46:59 +00001105 /* Turn what the programmable completion code returns into what
1106 readline wants. I should have made compute_lcd_of_matches
1107 external... */
Jari Aalto28ef6c32001-04-06 19:14:31 +00001108 matches = rl_completion_matches (text, prog_complete_return);
1109 if ((foundcs & COPT_DEFAULT) == 0)
1110 rl_attempted_completion_over = 1; /* no default */
Jari Aaltob80f6442004-07-27 13:29:18 +00001111 if (matches || ((foundcs & COPT_BASHDEFAULT) == 0))
1112 return (matches);
Jari Aaltobb706242000-03-17 21:46:59 +00001113 }
1114 }
1115#endif
1116
Jari Aaltob80f6442004-07-27 13:29:18 +00001117 if (matches == 0)
Jari Aalto06285672006-10-10 14:15:34 +00001118 {
1119 dflags = 0;
1120 if (in_command_position)
1121 dflags |= DEFCOMP_CMDPOS;
1122 matches = bash_default_completion (text, start, end, qc, dflags);
1123 }
Jari Aaltob80f6442004-07-27 13:29:18 +00001124
1125 return matches;
1126}
1127
1128char **
Jari Aalto06285672006-10-10 14:15:34 +00001129bash_default_completion (text, start, end, qc, compflags)
Jari Aaltob80f6442004-07-27 13:29:18 +00001130 const char *text;
Jari Aalto06285672006-10-10 14:15:34 +00001131 int start, end, qc, compflags;
Jari Aaltob80f6442004-07-27 13:29:18 +00001132{
1133 char **matches;
1134
1135 matches = (char **)NULL;
1136
Jari Aaltobb706242000-03-17 21:46:59 +00001137 /* New posix-style command substitution or variable name? */
Jari Aalto726f6381996-08-26 18:22:31 +00001138 if (!matches && *text == '$')
Jari Aaltobb706242000-03-17 21:46:59 +00001139 {
1140 if (qc != '\'' && text[1] == '(') /* ) */
Jari Aalto28ef6c32001-04-06 19:14:31 +00001141 matches = rl_completion_matches (text, command_subst_completion_function);
Jari Aaltobb706242000-03-17 21:46:59 +00001142 else
Jari Aalto28ef6c32001-04-06 19:14:31 +00001143 matches = rl_completion_matches (text, variable_completion_function);
Jari Aaltobb706242000-03-17 21:46:59 +00001144 }
Jari Aalto726f6381996-08-26 18:22:31 +00001145
1146 /* If the word starts in `~', and there is no slash in the word, then
1147 try completing this word as a username. */
Jari Aalto7117c2d2002-07-17 14:10:11 +00001148 if (!matches && *text == '~' && !xstrchr (text, '/'))
Jari Aalto28ef6c32001-04-06 19:14:31 +00001149 matches = rl_completion_matches (text, rl_username_completion_function);
Jari Aalto726f6381996-08-26 18:22:31 +00001150
1151 /* Another one. Why not? If the word starts in '@', then look through
1152 the world of known hostnames for completion first. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001153 if (!matches && perform_hostname_completion && *text == '@')
Jari Aalto28ef6c32001-04-06 19:14:31 +00001154 matches = rl_completion_matches (text, hostname_completion_function);
Jari Aalto726f6381996-08-26 18:22:31 +00001155
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. */
Jari Aalto06285672006-10-10 14:15:34 +00001159 if (matches == 0 && (compflags & DEFCOMP_CMDPOS))
Jari Aalto726f6381996-08-26 18:22:31 +00001160 {
Jari Aalto06285672006-10-10 14:15:34 +00001161 /* 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')
Jari Aaltobb706242000-03-17 21:46:59 +00001164 {
1165 matches = (char **)NULL;
Jari Aalto28ef6c32001-04-06 19:14:31 +00001166 rl_ignore_some_completions_function = bash_ignore_everything;
Jari Aaltobb706242000-03-17 21:46:59 +00001167 }
1168 else
1169 {
Jari Aaltob80f6442004-07-27 13:29:18 +00001170#define CMD_IS_DIR(x) (absolute_pathname(x) == 0 && absolute_program(x) == 0 && *(x) != '~' && test_for_directory (x))
1171
Jari Aalto95732b42005-12-07 14:08:12 +00001172 dot_in_path = 0;
Jari Aalto28ef6c32001-04-06 19:14:31 +00001173 matches = rl_completion_matches (text, command_word_completion_function);
Jari Aaltob80f6442004-07-27 13:29:18 +00001174
Jari Aaltobb706242000-03-17 21:46:59 +00001175 /* 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)
Jari Aalto28ef6c32001-04-06 19:14:31 +00001181 rl_ignore_some_completions_function = bash_ignore_filenames;
Jari Aalto95732b42005-12-07 14:08:12 +00001182 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 }
Jari Aaltob80f6442004-07-27 13:29:18 +00001191 else if (matches[0] && matches[1] && STREQ (matches[0], matches[1]) && CMD_IS_DIR (matches[0]))
Jari Aalto7117c2d2002-07-17 14:10:11 +00001192 /* 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
Jari Aalto95732b42005-12-07 14:08:12 +00001195 will distill them all down to one. We turn on
1196 rl_completion_suppress_append for the same reason as above.
Jari Aalto7117c2d2002-07-17 14:10:11 +00001197 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. */
Jari Aalto95732b42005-12-07 14:08:12 +00001200 {
1201 rl_completion_suppress_append = 1;
1202 rl_filename_completion_desired = 0;
1203 }
Jari Aaltobb706242000-03-17 21:46:59 +00001204 }
Jari Aalto726f6381996-08-26 18:22:31 +00001205 }
1206
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001207 /* This could be a globbing pattern, so try to expand it using pathname
1208 expansion. */
Jari Aaltof73dda02001-11-13 17:56:06 +00001209 if (!matches && glob_pattern_p (text))
Jari Aaltoe8ce7751997-09-22 20:22:27 +00001210 {
Jari Aalto28ef6c32001-04-06 19:14:31 +00001211 matches = rl_completion_matches (text, glob_complete_word);
Jari Aaltoe8ce7751997-09-22 20:22:27 +00001212 /* A glob expression that matches more than one filename is problematic.
1213 If we match more than one filename, punt. */
Jari Aalto7117c2d2002-07-17 14:10:11 +00001214 if (matches && matches[1] && rl_completion_type == TAB)
Jari Aaltoe8ce7751997-09-22 20:22:27 +00001215 {
Jari Aalto7117c2d2002-07-17 14:10:11 +00001216 strvec_dispose (matches);
Jari Aaltoe8ce7751997-09-22 20:22:27 +00001217 matches = (char **)0;
1218 }
1219 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001220
Jari Aalto726f6381996-08-26 18:22:31 +00001221 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. */
Jari Aaltobb706242000-03-17 21:46:59 +00001228char *
Jari Aalto726f6381996-08-26 18:22:31 +00001229command_word_completion_function (hint_text, state)
Jari Aalto28ef6c32001-04-06 19:14:31 +00001230 const char *hint_text;
Jari Aalto726f6381996-08-26 18:22:31 +00001231 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;
Jari Aalto95732b42005-12-07 14:08:12 +00001237 static char *dequoted_hint = (char *)NULL;
1238 static int path_index, hint_len, dequoted_len, istate, igncase;
Jari Aalto06285672006-10-10 14:15:34 +00001239 static int mapping_over, local_index, searching_path, hint_is_dir;
Jari Aalto726f6381996-08-26 18:22:31 +00001240 static SHELL_VAR **varlist = (SHELL_VAR **)NULL;
1241#if defined (ALIAS)
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001242 static alias_t **alias_list = (alias_t **)NULL;
Jari Aalto726f6381996-08-26 18:22:31 +00001243#endif /* ALIAS */
Jari Aalto95732b42005-12-07 14:08:12 +00001244 char *temp;
Jari Aalto726f6381996-08-26 18:22:31 +00001245
1246 /* We have to map over the possibilities for command words. If we have
1247 no state, then make one just for that purpose. */
Jari Aalto726f6381996-08-26 18:22:31 +00001248 if (!state)
1249 {
Jari Aalto95732b42005-12-07 14:08:12 +00001250 if (dequoted_hint && dequoted_hint != hint)
1251 free (dequoted_hint);
Jari Aalto726f6381996-08-26 18:22:31 +00001252 if (hint)
1253 free (hint);
1254
Jari Aalto06285672006-10-10 14:15:34 +00001255 mapping_over = searching_path = 0;
1256 hint_is_dir = CMD_IS_DIR (hint_text);
Jari Aalto726f6381996-08-26 18:22:31 +00001257 val = (char *)NULL;
1258
Jari Aalto95732b42005-12-07 14:08:12 +00001259 temp = rl_variable_value ("completion-ignore-case");
1260 igncase = strcmp (temp, "on") == 0;
1261
Jari Aalto726f6381996-08-26 18:22:31 +00001262 /* 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. */
Jari Aaltof73dda02001-11-13 17:56:06 +00001266 if (absolute_program (hint_text))
Jari Aalto726f6381996-08-26 18:22:31 +00001267 {
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 == '~')
Jari Aalto7117c2d2002-07-17 14:10:11 +00001271 hint = bash_tilde_expand (hint_text, 0);
Jari Aalto726f6381996-08-26 18:22:31 +00001272 else
1273 hint = savestring (hint_text);
Jari Aalto95732b42005-12-07 14:08:12 +00001274
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);
Jari Aalto726f6381996-08-26 18:22:31 +00001288
1289 if (filename_hint)
1290 free (filename_hint);
Jari Aalto95732b42005-12-07 14:08:12 +00001291
Jari Aalto726f6381996-08-26 18:22:31 +00001292 filename_hint = savestring (hint);
1293
1294 mapping_over = 4;
1295 istate = 0;
1296 goto inner;
1297 }
1298
Jari Aalto95732b42005-12-07 14:08:12 +00001299 dequoted_hint = hint = savestring (hint_text);
1300 dequoted_len = hint_len = strlen (hint);
Jari Aalto726f6381996-08-26 18:22:31 +00001301
Jari Aalto95732b42005-12-07 14:08:12 +00001302 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
Jari Aalto726f6381996-08-26 18:22:31 +00001308 path = get_string_value ("PATH");
Jari Aalto95732b42005-12-07 14:08:12 +00001309 path_index = dot_in_path = 0;
Jari Aalto726f6381996-08-26 18:22:31 +00001310
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
Jari Aalto06285672006-10-10 14:15:34 +00001395 /* 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
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001405 /* Repeatedly call filename_completion_function while we have
Jari Aalto726f6381996-08-26 18:22:31 +00001406 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
Jari Aalto06285672006-10-10 14:15:34 +00001422 searching_path = 1;
Jari Aalto726f6381996-08-26 18:22:31 +00001423 if (*current_path == 0)
1424 {
1425 free (current_path);
1426 current_path = savestring (".");
1427 }
1428
1429 if (*current_path == '~')
1430 {
1431 char *t;
1432
Jari Aalto7117c2d2002-07-17 14:10:11 +00001433 t = bash_tilde_expand (current_path, 0);
Jari Aalto726f6381996-08-26 18:22:31 +00001434 free (current_path);
1435 current_path = t;
1436 }
1437
Jari Aalto95732b42005-12-07 14:08:12 +00001438 if (current_path[0] == '.' && current_path[1] == '\0')
1439 dot_in_path = 1;
1440
Jari Aalto726f6381996-08-26 18:22:31 +00001441 if (filename_hint)
1442 free (filename_hint);
1443
Jari Aalto7117c2d2002-07-17 14:10:11 +00001444 filename_hint = sh_makepath (current_path, hint, 0);
Jari Aalto726f6381996-08-26 18:22:31 +00001445 free (current_path);
1446 }
1447
1448 inner:
Jari Aalto28ef6c32001-04-06 19:14:31 +00001449 val = rl_filename_completion_function (filename_hint, istate);
Jari Aalto726f6381996-08-26 18:22:31 +00001450 istate = 1;
1451
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001452 if (val == 0)
Jari Aalto726f6381996-08-26 18:22:31 +00001453 {
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 {
Jari Aaltod166f041997-06-05 14:59:13 +00001463 int match, freetemp;
Jari Aalto06285672006-10-10 14:15:34 +00001464#if 0
1465 char *temp; /* shadows previous declaration */
1466#endif
Jari Aalto726f6381996-08-26 18:22:31 +00001467
1468 if (absolute_program (hint))
1469 {
Jari Aalto95732b42005-12-07 14:08:12 +00001470 if (igncase == 0)
1471 match = strncmp (val, hint, hint_len) == 0;
1472 else
1473 match = strncasecmp (val, hint, hint_len) == 0;
1474
Jari Aalto726f6381996-08-26 18:22:31 +00001475 /* If we performed tilde expansion, restore the original
1476 filename. */
1477 if (*hint_text == '~')
1478 {
Jari Aaltoeb873672004-11-09 21:37:25 +00001479 int l, tl, vl, dl;
1480 char *rd;
Jari Aalto726f6381996-08-26 18:22:31 +00001481 vl = strlen (val);
1482 tl = strlen (hint_text);
Jari Aaltoeb873672004-11-09 21:37:25 +00001483#if 0
Jari Aalto726f6381996-08-26 18:22:31 +00001484 l = vl - hint_len; /* # of chars added */
Jari Aaltoeb873672004-11-09 21:37:25 +00001485#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
Jari Aaltof73dda02001-11-13 17:56:06 +00001492 temp = (char *)xmalloc (l + 2 + tl);
Jari Aalto726f6381996-08-26 18:22:31 +00001493 strcpy (temp, hint_text);
1494 strcpy (temp + tl, val + vl - l);
1495 }
1496 else
1497 temp = savestring (val);
Jari Aaltod166f041997-06-05 14:59:13 +00001498 freetemp = 1;
Jari Aalto726f6381996-08-26 18:22:31 +00001499 }
1500 else
1501 {
1502 temp = strrchr (val, '/');
1503
1504 if (temp)
1505 {
1506 temp++;
Jari Aalto95732b42005-12-07 14:08:12 +00001507 if (igncase == 0)
1508 freetemp = match = strncmp (temp, hint, hint_len) == 0;
1509 else
1510 freetemp = match = strncasecmp (temp, hint, hint_len) == 0;
Jari Aalto726f6381996-08-26 18:22:31 +00001511 if (match)
1512 temp = savestring (temp);
1513 }
1514 else
Jari Aaltod166f041997-06-05 14:59:13 +00001515 freetemp = match = 0;
Jari Aalto726f6381996-08-26 18:22:31 +00001516 }
1517
Jari Aalto06285672006-10-10 14:15:34 +00001518#if 0
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001519 /* If we have found a match, and it is an executable file or a
1520 directory name, return it. */
Jari Aalto28ef6c32001-04-06 19:14:31 +00001521 if (match && executable_or_directory (val))
Jari Aalto06285672006-10-10 14:15:34 +00001522#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
Jari Aalto726f6381996-08-26 18:22:31 +00001530 {
1531 free (val);
1532 val = ""; /* So it won't be NULL. */
1533 return (temp);
1534 }
1535 else
1536 {
Jari Aaltod166f041997-06-05 14:59:13 +00001537 if (freetemp)
1538 free (temp);
Jari Aalto726f6381996-08-26 18:22:31 +00001539 free (val);
1540 goto inner;
1541 }
1542 }
1543}
1544
Jari Aaltod166f041997-06-05 14:59:13 +00001545/* Completion inside an unterminated command substitution. */
Jari Aalto726f6381996-08-26 18:22:31 +00001546static char *
1547command_subst_completion_function (text, state)
Jari Aalto28ef6c32001-04-06 19:14:31 +00001548 const char *text;
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001549 int state;
Jari Aalto726f6381996-08-26 18:22:31 +00001550{
1551 static char **matches = (char **)NULL;
Jari Aalto28ef6c32001-04-06 19:14:31 +00001552 static const char *orig_start;
1553 static char *filename_text = (char *)NULL;
Jari Aalto726f6381996-08-26 18:22:31 +00001554 static int cmd_index, start_len;
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001555 char *value;
Jari Aalto726f6381996-08-26 18:22:31 +00001556
1557 if (state == 0)
1558 {
1559 if (filename_text)
1560 free (filename_text);
1561 orig_start = text;
1562 if (*text == '`')
Jari Aalto28ef6c32001-04-06 19:14:31 +00001563 text++;
Jari Aaltocce855b1998-04-17 19:52:44 +00001564 else if (*text == '$' && text[1] == '(') /* ) */
Jari Aalto28ef6c32001-04-06 19:14:31 +00001565 text += 2;
Jari Aaltob80f6442004-07-27 13:29:18 +00001566 /* If the text was quoted, suppress any quote character that the
1567 readline completion code would insert. */
1568 rl_completion_suppress_quote = 1;
Jari Aalto726f6381996-08-26 18:22:31 +00001569 start_len = text - orig_start;
1570 filename_text = savestring (text);
1571 if (matches)
1572 free (matches);
Jari Aalto7117c2d2002-07-17 14:10:11 +00001573
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];
Jari Aalto95732b42005-12-07 14:08:12 +00001598
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;
Jari Aalto726f6381996-08-26 18:22:31 +00001605 }
1606
1607 if (!matches || !matches[cmd_index])
1608 {
1609 rl_filename_quoting_desired = 0; /* disable quoting */
1610 return ((char *)NULL);
1611 }
1612 else
1613 {
Jari Aaltof73dda02001-11-13 17:56:06 +00001614 value = (char *)xmalloc (1 + start_len + strlen (matches[cmd_index]));
Jari Aalto726f6381996-08-26 18:22:31 +00001615
1616 if (start_len == 1)
Jari Aalto28ef6c32001-04-06 19:14:31 +00001617 value[0] = *orig_start;
Jari Aalto726f6381996-08-26 18:22:31 +00001618 else
Jari Aalto28ef6c32001-04-06 19:14:31 +00001619 strncpy (value, orig_start, start_len);
Jari Aalto726f6381996-08-26 18:22:31 +00001620
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)
Jari Aalto28ef6c32001-04-06 19:14:31 +00001631 const char *text;
Jari Aalto726f6381996-08-26 18:22:31 +00001632 int state;
Jari Aalto726f6381996-08-26 18:22:31 +00001633{
Jari Aaltobb706242000-03-17 21:46:59 +00001634 static char **varlist = (char **)NULL;
Jari Aalto726f6381996-08-26 18:22:31 +00001635 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
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001651 if (text[first_char_loc] == '{')
Jari Aalto28ef6c32001-04-06 19:14:31 +00001652 first_char_loc++;
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001653
Jari Aalto726f6381996-08-26 18:22:31 +00001654 varname = savestring (text + first_char_loc);
1655
1656 namelen = strlen (varname);
1657 if (varlist)
Jari Aalto7117c2d2002-07-17 14:10:11 +00001658 strvec_dispose (varlist);
Jari Aaltobb706242000-03-17 21:46:59 +00001659
1660 varlist = all_variables_matching_prefix (varname);
Jari Aalto726f6381996-08-26 18:22:31 +00001661 varlist_index = 0;
1662 }
1663
Jari Aalto726f6381996-08-26 18:22:31 +00001664 if (!varlist || !varlist[varlist_index])
1665 {
1666 return ((char *)NULL);
1667 }
1668 else
1669 {
Jari Aaltof73dda02001-11-13 17:56:06 +00001670 char *value;
1671
1672 value = (char *)xmalloc (4 + strlen (varlist[varlist_index]));
Jari Aalto726f6381996-08-26 18:22:31 +00001673
1674 if (first_char_loc)
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001675 {
1676 value[0] = first_char;
1677 if (first_char_loc == 2)
1678 value[1] = '{';
1679 }
Jari Aalto726f6381996-08-26 18:22:31 +00001680
Jari Aaltobb706242000-03-17 21:46:59 +00001681 strcpy (value + first_char_loc, varlist[varlist_index]);
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001682 if (first_char_loc == 2)
Jari Aalto28ef6c32001-04-06 19:14:31 +00001683 strcat (value, "}");
Jari Aalto726f6381996-08-26 18:22:31 +00001684
1685 varlist_index++;
1686 return (value);
1687 }
1688}
1689
1690/* How about a completion function for hostnames? */
1691static char *
1692hostname_completion_function (text, state)
Jari Aalto28ef6c32001-04-06 19:14:31 +00001693 const char *text;
Jari Aalto726f6381996-08-26 18:22:31 +00001694 int state;
Jari Aalto726f6381996-08-26 18:22:31 +00001695{
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. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001701 if (state == 0)
Jari Aalto726f6381996-08-26 18:22:31 +00001702 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001703 FREE (list);
Jari Aalto726f6381996-08-26 18:22:31 +00001704
1705 list = (char **)NULL;
1706
1707 first_char_loc = 0;
1708 first_char = *text;
1709
1710 if (first_char == '@')
1711 first_char_loc++;
1712
Jari Aaltof73dda02001-11-13 17:56:06 +00001713 list = hostnames_matching ((char *)text+first_char_loc);
Jari Aalto726f6381996-08-26 18:22:31 +00001714 list_index = 0;
1715 }
1716
1717 if (list && list[list_index])
1718 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001719 char *t;
Jari Aalto726f6381996-08-26 18:22:31 +00001720
Jari Aaltof73dda02001-11-13 17:56:06 +00001721 t = (char *)xmalloc (2 + strlen (list[list_index]));
Jari Aalto726f6381996-08-26 18:22:31 +00001722 *t = first_char;
1723 strcpy (t + first_char_loc, list[list_index]);
1724 list_index++;
1725 return (t);
1726 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001727
1728 return ((char *)NULL);
Jari Aalto726f6381996-08-26 18:22:31 +00001729}
1730
Jari Aalto7117c2d2002-07-17 14:10:11 +00001731/*
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 */
Jari Aalto06285672006-10-10 14:15:34 +00001765 for (alist = srvent->s_aliases; *alist; alist++)
Jari Aalto7117c2d2002-07-17 14:10:11 +00001766 {
Jari Aalto06285672006-10-10 14:15:34 +00001767 aentry = *alist;
Jari Aalto7117c2d2002-07-17 14:10:11 +00001768 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 */
Jari Aaltof73dda02001-11-13 17:56:06 +00001793char *
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
Jari Aaltocce855b1998-04-17 19:52:44 +00001832/* 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. */
Jari Aalto726f6381996-08-26 18:22:31 +00001838static char *
1839history_expand_line_internal (line)
1840 char *line;
1841{
1842 char *new_line;
Jari Aaltob80f6442004-07-27 13:29:18 +00001843 int old_verify;
Jari Aalto726f6381996-08-26 18:22:31 +00001844
Jari Aaltob80f6442004-07-27 13:29:18 +00001845 old_verify = hist_verify;
1846 hist_verify = 0;
Jari Aalto726f6381996-08-26 18:22:31 +00001847 new_line = pre_process_line (line, 0, 0);
Jari Aaltob80f6442004-07-27 13:29:18 +00001848 hist_verify = old_verify;
1849
Jari Aaltod166f041997-06-05 14:59:13 +00001850 return (new_line == line) ? savestring (line) : new_line;
Jari Aalto726f6381996-08-26 18:22:31 +00001851}
Jari Aalto726f6381996-08-26 18:22:31 +00001852#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;
Jari Aaltob80f6442004-07-27 13:29:18 +00001860#if defined (BANG_HISTORY)
1861 int old_verify;
1862
1863 old_verify = hist_verify;
1864 hist_verify = 0;
1865#endif
Jari Aalto726f6381996-08-26 18:22:31 +00001866
1867 fprintf (rl_outstream, "\r\n");
1868 to_free = pre_process_line (rl_line_buffer, 1, 0);
Jari Aaltob80f6442004-07-27 13:29:18 +00001869#if defined (BANG_HISTORY)
1870 hist_verify = old_verify;
1871#endif
Jari Aaltod166f041997-06-05 14:59:13 +00001872 if (to_free != rl_line_buffer)
Jari Aaltob80f6442004-07-27 13:29:18 +00001873 FREE (to_free);
Jari Aalto726f6381996-08-26 18:22:31 +00001874 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);
Jari Aalto7117c2d2002-07-17 14:10:11 +00001891 rl_point = rl_end = rl_mark = 0;
Jari Aalto726f6381996-08-26 18:22:31 +00001892 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{
Jari Aaltof73dda02001-11-13 17:56:06 +00001902 int old_point, at_end;
1903
1904 old_point = rl_point;
1905 at_end = rl_point == rl_end;
Jari Aalto726f6381996-08-26 18:22:31 +00001906
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]))
Jari Aaltob72432f1999-02-19 17:11:39 +00001919 rl_forward_word (1, 0);
Jari Aalto726f6381996-08-26 18:22:31 +00001920 }
1921}
1922
Jari Aaltocce855b1998-04-17 19:52:44 +00001923#if defined (ALIAS)
1924/* Expand aliases in the current readline line. */
1925static int
Jari Aalto28ef6c32001-04-06 19:14:31 +00001926alias_expand_line (count, ignore)
1927 int count, ignore;
Jari Aaltocce855b1998-04-17 19:52:44 +00001928{
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)
Jari Aalto726f6381996-08-26 18:22:31 +00001947/* History expand the line. */
Jari Aaltocce855b1998-04-17 19:52:44 +00001948static int
Jari Aalto28ef6c32001-04-06 19:14:31 +00001949history_expand_line (count, ignore)
1950 int count, ignore;
Jari Aalto726f6381996-08-26 18:22:31 +00001951{
1952 char *new_line;
1953
1954 new_line = history_expand_line_internal (rl_line_buffer);
1955
1956 if (new_line)
Jari Aaltocce855b1998-04-17 19:52:44 +00001957 {
1958 set_up_new_line (new_line);
1959 return (0);
1960 }
Jari Aalto726f6381996-08-26 18:22:31 +00001961 else
Jari Aaltocce855b1998-04-17 19:52:44 +00001962 {
1963 cleanup_expansion_error ();
1964 return (1);
1965 }
Jari Aalto726f6381996-08-26 18:22:31 +00001966}
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001967
Jari Aaltocce855b1998-04-17 19:52:44 +00001968/* Expand history substitutions in the current line and then insert a
Jari Aalto28ef6c32001-04-06 19:14:31 +00001969 space (hopefully close to where we were before). */
Jari Aaltocce855b1998-04-17 19:52:44 +00001970static int
Jari Aalto28ef6c32001-04-06 19:14:31 +00001971tcsh_magic_space (count, ignore)
1972 int count, ignore;
Jari Aaltocce855b1998-04-17 19:52:44 +00001973{
Jari Aalto28ef6c32001-04-06 19:14:31 +00001974 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)
Jari Aaltocce855b1998-04-17 19:52:44 +00001979 {
Jari Aalto28ef6c32001-04-06 19:14:31 +00001980 /* 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;
Jari Aaltocce855b1998-04-17 19:52:44 +00001984 rl_insert (1, ' ');
1985 return (0);
1986 }
1987 else
1988 return (1);
1989}
Jari Aalto95732b42005-12-07 14:08:12 +00001990#endif /* BANG_HISTORY */
Jari Aaltocce855b1998-04-17 19:52:44 +00001991
Jari Aalto726f6381996-08-26 18:22:31 +00001992/* History and alias expand the line. */
Jari Aaltocce855b1998-04-17 19:52:44 +00001993static int
Jari Aalto28ef6c32001-04-06 19:14:31 +00001994history_and_alias_expand_line (count, ignore)
1995 int count, ignore;
Jari Aalto726f6381996-08-26 18:22:31 +00001996{
1997 char *new_line;
1998
Jari Aalto95732b42005-12-07 14:08:12 +00001999 new_line = 0;
2000#if defined (BANG_HISTORY)
Jari Aaltob80f6442004-07-27 13:29:18 +00002001 new_line = history_expand_line_internal (rl_line_buffer);
Jari Aalto95732b42005-12-07 14:08:12 +00002002#endif
Jari Aalto726f6381996-08-26 18:22:31 +00002003
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)
Jari Aaltocce855b1998-04-17 19:52:44 +00002016 {
2017 set_up_new_line (new_line);
2018 return (0);
2019 }
Jari Aalto726f6381996-08-26 18:22:31 +00002020 else
Jari Aaltocce855b1998-04-17 19:52:44 +00002021 {
2022 cleanup_expansion_error ();
2023 return (1);
2024 }
Jari Aalto726f6381996-08-26 18:22:31 +00002025}
2026
2027/* History and alias expand the line, then perform the shell word
Jari Aaltocce855b1998-04-17 19:52:44 +00002028 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. */
Jari Aalto28ef6c32001-04-06 19:14:31 +00002031static int
2032shell_expand_line (count, ignore)
2033 int count, ignore;
Jari Aalto726f6381996-08-26 18:22:31 +00002034{
2035 char *new_line;
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002036 WORD_LIST *expanded_string;
Jari Aalto726f6381996-08-26 18:22:31 +00002037
Jari Aalto95732b42005-12-07 14:08:12 +00002038 new_line = 0;
2039#if defined (BANG_HISTORY)
Jari Aaltob80f6442004-07-27 13:29:18 +00002040 new_line = history_expand_line_internal (rl_line_buffer);
Jari Aalto95732b42005-12-07 14:08:12 +00002041#endif
Jari Aalto726f6381996-08-26 18:22:31 +00002042
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. */
Jari Aaltod166f041997-06-05 14:59:13 +00002066 new_line = savestring (rl_line_buffer);
2067 expanded_string = expand_string (new_line, 0);
2068 FREE (new_line);
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002069 if (expanded_string == 0)
2070 {
Jari Aaltof73dda02001-11-13 17:56:06 +00002071 new_line = (char *)xmalloc (1);
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002072 new_line[0] = '\0';
2073 }
2074 else
2075 {
2076 new_line = string_list (expanded_string);
2077 dispose_words (expanded_string);
2078 }
Jari Aalto726f6381996-08-26 18:22:31 +00002079
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002080 maybe_make_readline_line (new_line);
2081 free (new_line);
Jari Aalto726f6381996-08-26 18:22:31 +00002082
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002083 /* 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]))
Jari Aaltob72432f1999-02-19 17:11:39 +00002090 rl_forward_word (1, 0);
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002091 }
Jari Aalto28ef6c32001-04-06 19:14:31 +00002092 return 0;
Jari Aalto726f6381996-08-26 18:22:31 +00002093 }
2094 else
Jari Aalto28ef6c32001-04-06 19:14:31 +00002095 {
2096 cleanup_expansion_error ();
2097 return 1;
2098 }
Jari Aalto726f6381996-08-26 18:22:31 +00002099}
2100
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002101/* 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
Jari Aalto726f6381996-08-26 18:22:31 +00002103 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"
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002107 completion types, such as hostnames or commands. */
Jari Aalto726f6381996-08-26 18:22:31 +00002108
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002109static struct ignorevar fignore =
2110{
2111 "FIGNORE",
2112 (struct ign *)0,
2113 0,
2114 (char *)0,
Jari Aaltof73dda02001-11-13 17:56:06 +00002115 (sh_iv_item_func_t *) 0,
Jari Aalto726f6381996-08-26 18:22:31 +00002116};
2117
Jari Aalto726f6381996-08-26 18:22:31 +00002118static void
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002119_ignore_completion_names (names, name_func)
Jari Aalto726f6381996-08-26 18:22:31 +00002120 char **names;
Jari Aaltof73dda02001-11-13 17:56:06 +00002121 sh_ignore_func_t *name_func;
Jari Aalto726f6381996-08-26 18:22:31 +00002122{
2123 char **newnames;
2124 int idx, nidx;
Jari Aaltocce855b1998-04-17 19:52:44 +00002125 char **oldnames;
2126 int oidx;
Jari Aalto726f6381996-08-26 18:22:31 +00002127
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 {
Jari Aaltob80f6442004-07-27 13:29:18 +00002134 if (force_fignore)
2135 if ((*name_func) (names[0]) == 0)
2136 {
2137 free (names[0]);
2138 names[0] = (char *)NULL;
2139 }
2140
Jari Aalto726f6381996-08-26 18:22:31 +00002141 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 ;
Jari Aalto7117c2d2002-07-17 14:10:11 +00002148 newnames = strvec_create (nidx + 1);
Jari Aaltob80f6442004-07-27 13:29:18 +00002149
2150 if (force_fignore == 0)
2151 {
2152 oldnames = strvec_create (nidx - 1);
2153 oidx = 0;
2154 }
Jari Aalto726f6381996-08-26 18:22:31 +00002155
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];
Jari Aaltob80f6442004-07-27 13:29:18 +00002161 else if (force_fignore == 0)
Jari Aaltocce855b1998-04-17 19:52:44 +00002162 oldnames[oidx++] = names[idx];
Jari Aaltob80f6442004-07-27 13:29:18 +00002163 else
2164 free (names[idx]);
Jari Aalto726f6381996-08-26 18:22:31 +00002165 }
2166
2167 newnames[nidx] = (char *)NULL;
2168
2169 /* If none are acceptable then let the completer handle it. */
2170 if (nidx == 1)
2171 {
Jari Aaltob80f6442004-07-27 13:29:18 +00002172 if (force_fignore)
2173 {
2174 free (names[0]);
2175 names[0] = (char *)NULL;
2176 }
2177 else
2178 free (oldnames);
2179
Jari Aalto726f6381996-08-26 18:22:31 +00002180 free (newnames);
2181 return;
2182 }
2183
Jari Aaltob80f6442004-07-27 13:29:18 +00002184 if (force_fignore == 0)
2185 {
2186 while (oidx)
2187 free (oldnames[--oidx]);
2188 free (oldnames);
2189 }
Jari Aaltocce855b1998-04-17 19:52:44 +00002190
Jari Aalto726f6381996-08-26 18:22:31 +00002191 /* 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 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002200
Jari Aalto726f6381996-08-26 18:22:31 +00002201 /* 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;
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002206 free (newnames);
2207}
2208
2209static int
2210name_is_acceptable (name)
Jari Aaltof73dda02001-11-13 17:56:06 +00002211 const char *name;
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002212{
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);
Jari Aalto726f6381996-08-26 18:22:31 +00002223}
2224
Jari Aaltob72432f1999-02-19 17:11:39 +00002225#if 0
2226static int
2227ignore_dot_names (name)
2228 char *name;
2229{
2230 return (name[0] != '.');
2231}
2232#endif
2233
Jari Aalto28ef6c32001-04-06 19:14:31 +00002234static int
Jari Aalto726f6381996-08-26 18:22:31 +00002235filename_completion_ignore (names)
2236 char **names;
2237{
Jari Aaltob72432f1999-02-19 17:11:39 +00002238#if 0
2239 if (glob_dot_filenames == 0)
2240 _ignore_completion_names (names, ignore_dot_names);
2241#endif
2242
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002243 setup_ignore_patterns (&fignore);
Jari Aalto726f6381996-08-26 18:22:31 +00002244
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002245 if (fignore.num_ignores == 0)
Jari Aalto28ef6c32001-04-06 19:14:31 +00002246 return 0;
Jari Aalto726f6381996-08-26 18:22:31 +00002247
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002248 _ignore_completion_names (names, name_is_acceptable);
Jari Aalto28ef6c32001-04-06 19:14:31 +00002249
2250 return 0;
Jari Aalto726f6381996-08-26 18:22:31 +00002251}
2252
2253/* Return 1 if NAME is a directory. */
2254static int
2255test_for_directory (name)
Jari Aaltof73dda02001-11-13 17:56:06 +00002256 const char *name;
Jari Aalto726f6381996-08-26 18:22:31 +00002257{
2258 struct stat finfo;
2259 char *fn;
2260
Jari Aalto7117c2d2002-07-17 14:10:11 +00002261 fn = bash_tilde_expand (name, 0);
Jari Aalto726f6381996-08-26 18:22:31 +00002262 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. */
Jari Aalto28ef6c32001-04-06 19:14:31 +00002272static int
Jari Aalto726f6381996-08-26 18:22:31 +00002273bash_ignore_filenames (names)
2274 char **names;
2275{
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002276 _ignore_completion_names (names, test_for_directory);
Jari Aalto28ef6c32001-04-06 19:14:31 +00002277 return 0;
Jari Aalto726f6381996-08-26 18:22:31 +00002278}
2279
Jari Aaltobb706242000-03-17 21:46:59 +00002280static int
2281return_zero (name)
Jari Aaltof73dda02001-11-13 17:56:06 +00002282 const char *name;
Jari Aaltobb706242000-03-17 21:46:59 +00002283{
2284 return 0;
2285}
2286
Jari Aalto28ef6c32001-04-06 19:14:31 +00002287static int
Jari Aaltobb706242000-03-17 21:46:59 +00002288bash_ignore_everything (names)
2289 char **names;
2290{
2291 _ignore_completion_names (names, return_zero);
Jari Aalto28ef6c32001-04-06 19:14:31 +00002292 return 0;
Jari Aaltobb706242000-03-17 21:46:59 +00002293}
2294
Jari Aaltoeb873672004-11-09 21:37:25 +00002295/* 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. */
Jari Aalto95732b42005-12-07 14:08:12 +00002298static void
Jari Aaltoeb873672004-11-09 21:37:25 +00002299bash_directory_expansion (dirname)
2300 char **dirname;
2301{
Jari Aalto06285672006-10-10 14:15:34 +00002302 char *d, *nd;
Jari Aaltoeb873672004-11-09 21:37:25 +00002303
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 }
Jari Aalto06285672006-10-10 14:15:34 +00002314 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 }
Jari Aaltoeb873672004-11-09 21:37:25 +00002321}
2322
Jari Aalto726f6381996-08-26 18:22:31 +00002323/* Handle symbolic link references and other directory name
2324 expansions while hacking completion. */
2325static int
2326bash_directory_completion_hook (dirname)
2327 char **dirname;
2328{
Jari Aaltob72432f1999-02-19 17:11:39 +00002329 char *local_dirname, *new_dirname, *t;
Jari Aaltobb706242000-03-17 21:46:59 +00002330 int return_value, should_expand_dirname;
Jari Aalto726f6381996-08-26 18:22:31 +00002331 WORD_LIST *wl;
Jari Aaltob80f6442004-07-27 13:29:18 +00002332 struct stat sb;
Jari Aalto726f6381996-08-26 18:22:31 +00002333
Jari Aaltobb706242000-03-17 21:46:59 +00002334 return_value = should_expand_dirname = 0;
Jari Aalto726f6381996-08-26 18:22:31 +00002335 local_dirname = *dirname;
Jari Aaltobb706242000-03-17 21:46:59 +00002336
2337#if 0
Jari Aalto7117c2d2002-07-17 14:10:11 +00002338 should_expand_dirname = xstrchr (local_dirname, '$') || xstrchr (local_dirname, '`');
Jari Aaltobb706242000-03-17 21:46:59 +00002339#else
Jari Aalto7117c2d2002-07-17 14:10:11 +00002340 if (xstrchr (local_dirname, '$'))
Jari Aaltobb706242000-03-17 21:46:59 +00002341 should_expand_dirname = 1;
2342 else
Jari Aalto726f6381996-08-26 18:22:31 +00002343 {
Jari Aalto7117c2d2002-07-17 14:10:11 +00002344 t = xstrchr (local_dirname, '`');
Jari Aaltobb706242000-03-17 21:46:59 +00002345 if (t && unclosed_pair (local_dirname, strlen (local_dirname), "`") == 0)
2346 should_expand_dirname = 1;
2347 }
2348#endif
2349
Jari Aaltob80f6442004-07-27 13:29:18 +00002350#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
Jari Aaltobb706242000-03-17 21:46:59 +00002357 if (should_expand_dirname)
2358 {
2359 new_dirname = savestring (local_dirname);
Jari Aaltof1be6662008-11-18 13:15:12 +00002360 wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB); /* does the right thing */
Jari Aalto726f6381996-08-26 18:22:31 +00002361 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);
Jari Aaltob72432f1999-02-19 17:11:39 +00002368 free (new_dirname);
Jari Aalto726f6381996-08-26 18:22:31 +00002369 dispose_words (wl);
2370 local_dirname = *dirname;
2371 }
2372 else
2373 {
Jari Aaltob72432f1999-02-19 17:11:39 +00002374 free (new_dirname);
Jari Aalto726f6381996-08-26 18:22:31 +00002375 free (local_dirname);
Jari Aaltof73dda02001-11-13 17:56:06 +00002376 *dirname = (char *)xmalloc (1);
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002377 **dirname = '\0';
Jari Aalto726f6381996-08-26 18:22:31 +00002378 return 1;
2379 }
2380 }
Jari Aalto06285672006-10-10 14:15:34 +00002381 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 }
Jari Aalto726f6381996-08-26 18:22:31 +00002388
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);
Jari Aalto28ef6c32001-04-06 19:14:31 +00002397 temp2 = sh_canonpath (temp1, PATH_CHECKDOTDOT|PATH_CHECKEXISTS);
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002398 /* If we can't canonicalize, bail. */
2399 if (temp2 == 0)
2400 {
2401 free (temp1);
2402 return 1;
2403 }
Jari Aalto726f6381996-08-26 18:22:31 +00002404 len1 = strlen (temp1);
2405 if (temp1[len1 - 1] == '/')
Jari Aalto28ef6c32001-04-06 19:14:31 +00002406 {
Jari Aalto726f6381996-08-26 18:22:31 +00002407 len2 = strlen (temp2);
Jari Aalto95732b42005-12-07 14:08:12 +00002408 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 }
Jari Aalto28ef6c32001-04-06 19:14:31 +00002414 }
Jari Aalto726f6381996-08-26 18:22:31 +00002415 free (local_dirname);
2416 *dirname = temp2;
2417 free (temp1);
2418 }
2419 return (return_value);
2420}
2421
Jari Aalto726f6381996-08-26 18:22:31 +00002422static char **history_completion_array = (char **)NULL;
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002423static int harry_size;
2424static int harry_len;
Jari Aalto726f6381996-08-26 18:22:31 +00002425
2426static void
2427build_history_completion_array ()
2428{
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002429 register int i, j;
2430 HIST_ENTRY **hlist;
2431 char **tokens;
Jari Aalto726f6381996-08-26 18:22:31 +00002432
2433 /* First, clear out the current dynamic history completion list. */
2434 if (harry_size)
2435 {
Jari Aalto7117c2d2002-07-17 14:10:11 +00002436 strvec_dispose (history_completion_array);
Jari Aalto726f6381996-08-26 18:22:31 +00002437 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. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002444 hlist = history_list ();
Jari Aalto726f6381996-08-26 18:22:31 +00002445
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002446 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);
Jari Aalto726f6381996-08-26 18:22:31 +00002452
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002453 for (j = 0; tokens && tokens[j]; j++)
2454 {
2455 if (harry_len + 2 > harry_size)
Jari Aalto7117c2d2002-07-17 14:10:11 +00002456 history_completion_array = strvec_resize (history_completion_array, harry_size += 10);
Jari Aalto726f6381996-08-26 18:22:31 +00002457
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002458 history_completion_array[harry_len++] = tokens[j];
2459 history_completion_array[harry_len] = (char *)NULL;
2460 }
2461 free (tokens);
2462 }
Jari Aalto726f6381996-08-26 18:22:31 +00002463
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002464 /* Sort the complete list of tokens. */
Jari Aalto7117c2d2002-07-17 14:10:11 +00002465 qsort (history_completion_array, harry_len, sizeof (char *), (QSFUNC *)strvec_strcmp);
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002466 }
Jari Aalto726f6381996-08-26 18:22:31 +00002467}
2468
2469static char *
2470history_completion_generator (hint_text, state)
Jari Aaltof73dda02001-11-13 17:56:06 +00002471 const char *hint_text;
Jari Aalto726f6381996-08-26 18:22:31 +00002472 int state;
2473{
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002474 static int local_index, len;
Jari Aaltof73dda02001-11-13 17:56:06 +00002475 static const char *text;
Jari Aalto726f6381996-08-26 18:22:31 +00002476
2477 /* If this is the first call to the generator, then initialize the
2478 list of strings to complete over. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002479 if (state == 0)
Jari Aalto726f6381996-08-26 18:22:31 +00002480 {
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
Jari Aalto28ef6c32001-04-06 19:14:31 +00002495static int
Jari Aalto726f6381996-08-26 18:22:31 +00002496dynamic_complete_history (count, key)
2497 int count, key;
2498{
Jari Aaltof73dda02001-11-13 17:56:06 +00002499 int r;
2500
Jari Aalto28ef6c32001-04-06 19:14:31 +00002501 rl_compentry_func_t *orig_func;
2502 rl_completion_func_t *orig_attempt_func;
Jari Aalto726f6381996-08-26 18:22:31 +00002503
2504 orig_func = rl_completion_entry_function;
2505 orig_attempt_func = rl_attempted_completion_function;
Jari Aalto28ef6c32001-04-06 19:14:31 +00002506 rl_completion_entry_function = history_completion_generator;
2507 rl_attempted_completion_function = (rl_completion_func_t *)NULL;
Jari Aalto726f6381996-08-26 18:22:31 +00002508
Jari Aalto7117c2d2002-07-17 14:10:11 +00002509 /* XXX - use rl_completion_mode here? */
Jari Aalto28ef6c32001-04-06 19:14:31 +00002510 if (rl_last_func == dynamic_complete_history)
Jari Aaltof73dda02001-11-13 17:56:06 +00002511 r = rl_complete_internal ('?');
Jari Aalto726f6381996-08-26 18:22:31 +00002512 else
Jari Aaltof73dda02001-11-13 17:56:06 +00002513 r = rl_complete_internal (TAB);
Jari Aalto726f6381996-08-26 18:22:31 +00002514
2515 rl_completion_entry_function = orig_func;
2516 rl_attempted_completion_function = orig_attempt_func;
Jari Aaltof73dda02001-11-13 17:56:06 +00002517 return r;
Jari Aalto726f6381996-08-26 18:22:31 +00002518}
2519
Jari Aalto726f6381996-08-26 18:22:31 +00002520#if defined (SPECIFIC_COMPLETION_FUNCTIONS)
Jari Aalto28ef6c32001-04-06 19:14:31 +00002521static int
Jari Aalto726f6381996-08-26 18:22:31 +00002522bash_complete_username (ignore, ignore2)
2523 int ignore, ignore2;
2524{
Jari Aalto7117c2d2002-07-17 14:10:11 +00002525 return bash_complete_username_internal (rl_completion_mode (bash_complete_username));
Jari Aalto726f6381996-08-26 18:22:31 +00002526}
2527
Jari Aalto28ef6c32001-04-06 19:14:31 +00002528static int
Jari Aalto726f6381996-08-26 18:22:31 +00002529bash_possible_username_completions (ignore, ignore2)
2530 int ignore, ignore2;
2531{
Jari Aalto28ef6c32001-04-06 19:14:31 +00002532 return bash_complete_username_internal ('?');
Jari Aalto726f6381996-08-26 18:22:31 +00002533}
2534
Jari Aalto28ef6c32001-04-06 19:14:31 +00002535static int
Jari Aalto726f6381996-08-26 18:22:31 +00002536bash_complete_username_internal (what_to_do)
2537 int what_to_do;
2538{
Jari Aalto28ef6c32001-04-06 19:14:31 +00002539 return bash_specific_completion (what_to_do, rl_username_completion_function);
Jari Aalto726f6381996-08-26 18:22:31 +00002540}
2541
Jari Aalto28ef6c32001-04-06 19:14:31 +00002542static int
Jari Aalto726f6381996-08-26 18:22:31 +00002543bash_complete_filename (ignore, ignore2)
2544 int ignore, ignore2;
2545{
Jari Aalto7117c2d2002-07-17 14:10:11 +00002546 return bash_complete_filename_internal (rl_completion_mode (bash_complete_filename));
Jari Aalto726f6381996-08-26 18:22:31 +00002547}
2548
Jari Aalto28ef6c32001-04-06 19:14:31 +00002549static int
Jari Aalto726f6381996-08-26 18:22:31 +00002550bash_possible_filename_completions (ignore, ignore2)
2551 int ignore, ignore2;
2552{
Jari Aalto28ef6c32001-04-06 19:14:31 +00002553 return bash_complete_filename_internal ('?');
Jari Aalto726f6381996-08-26 18:22:31 +00002554}
2555
Jari Aalto28ef6c32001-04-06 19:14:31 +00002556static int
Jari Aalto726f6381996-08-26 18:22:31 +00002557bash_complete_filename_internal (what_to_do)
2558 int what_to_do;
2559{
Jari Aalto28ef6c32001-04-06 19:14:31 +00002560 rl_compentry_func_t *orig_func;
2561 rl_completion_func_t *orig_attempt_func;
2562 rl_icppfunc_t *orig_dir_func;
Jari Aaltob80f6442004-07-27 13:29:18 +00002563 /*const*/ char *orig_rl_completer_word_break_characters;
Jari Aalto28ef6c32001-04-06 19:14:31 +00002564 int r;
Jari Aalto726f6381996-08-26 18:22:31 +00002565
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;
Jari Aalto28ef6c32001-04-06 19:14:31 +00002570 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;
Jari Aalto726f6381996-08-26 18:22:31 +00002573 rl_completer_word_break_characters = " \t\n\"\'";
2574
Jari Aalto28ef6c32001-04-06 19:14:31 +00002575 r = rl_complete_internal (what_to_do);
Jari Aalto726f6381996-08-26 18:22:31 +00002576
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;
Jari Aalto28ef6c32001-04-06 19:14:31 +00002581
2582 return r;
Jari Aalto726f6381996-08-26 18:22:31 +00002583}
2584
Jari Aalto28ef6c32001-04-06 19:14:31 +00002585static int
Jari Aalto726f6381996-08-26 18:22:31 +00002586bash_complete_hostname (ignore, ignore2)
2587 int ignore, ignore2;
2588{
Jari Aalto7117c2d2002-07-17 14:10:11 +00002589 return bash_complete_hostname_internal (rl_completion_mode (bash_complete_hostname));
Jari Aalto726f6381996-08-26 18:22:31 +00002590}
2591
Jari Aalto28ef6c32001-04-06 19:14:31 +00002592static int
Jari Aalto726f6381996-08-26 18:22:31 +00002593bash_possible_hostname_completions (ignore, ignore2)
2594 int ignore, ignore2;
2595{
Jari Aalto28ef6c32001-04-06 19:14:31 +00002596 return bash_complete_hostname_internal ('?');
Jari Aalto726f6381996-08-26 18:22:31 +00002597}
2598
Jari Aalto28ef6c32001-04-06 19:14:31 +00002599static int
Jari Aalto726f6381996-08-26 18:22:31 +00002600bash_complete_variable (ignore, ignore2)
2601 int ignore, ignore2;
2602{
Jari Aalto7117c2d2002-07-17 14:10:11 +00002603 return bash_complete_variable_internal (rl_completion_mode (bash_complete_variable));
Jari Aalto726f6381996-08-26 18:22:31 +00002604}
2605
Jari Aalto28ef6c32001-04-06 19:14:31 +00002606static int
Jari Aalto726f6381996-08-26 18:22:31 +00002607bash_possible_variable_completions (ignore, ignore2)
2608 int ignore, ignore2;
2609{
Jari Aalto28ef6c32001-04-06 19:14:31 +00002610 return bash_complete_variable_internal ('?');
Jari Aalto726f6381996-08-26 18:22:31 +00002611}
2612
Jari Aalto28ef6c32001-04-06 19:14:31 +00002613static int
Jari Aalto726f6381996-08-26 18:22:31 +00002614bash_complete_command (ignore, ignore2)
2615 int ignore, ignore2;
2616{
Jari Aalto7117c2d2002-07-17 14:10:11 +00002617 return bash_complete_command_internal (rl_completion_mode (bash_complete_command));
Jari Aalto726f6381996-08-26 18:22:31 +00002618}
2619
Jari Aalto28ef6c32001-04-06 19:14:31 +00002620static int
Jari Aalto726f6381996-08-26 18:22:31 +00002621bash_possible_command_completions (ignore, ignore2)
2622 int ignore, ignore2;
2623{
Jari Aalto28ef6c32001-04-06 19:14:31 +00002624 return bash_complete_command_internal ('?');
Jari Aalto726f6381996-08-26 18:22:31 +00002625}
2626
Jari Aalto28ef6c32001-04-06 19:14:31 +00002627static int
Jari Aalto726f6381996-08-26 18:22:31 +00002628bash_complete_hostname_internal (what_to_do)
2629 int what_to_do;
2630{
Jari Aalto28ef6c32001-04-06 19:14:31 +00002631 return bash_specific_completion (what_to_do, hostname_completion_function);
Jari Aalto726f6381996-08-26 18:22:31 +00002632}
2633
Jari Aalto28ef6c32001-04-06 19:14:31 +00002634static int
Jari Aalto726f6381996-08-26 18:22:31 +00002635bash_complete_variable_internal (what_to_do)
2636 int what_to_do;
2637{
Jari Aalto28ef6c32001-04-06 19:14:31 +00002638 return bash_specific_completion (what_to_do, variable_completion_function);
Jari Aalto726f6381996-08-26 18:22:31 +00002639}
2640
Jari Aalto28ef6c32001-04-06 19:14:31 +00002641static int
Jari Aalto726f6381996-08-26 18:22:31 +00002642bash_complete_command_internal (what_to_do)
2643 int what_to_do;
2644{
Jari Aalto28ef6c32001-04-06 19:14:31 +00002645 return bash_specific_completion (what_to_do, command_word_completion_function);
Jari Aalto726f6381996-08-26 18:22:31 +00002646}
2647
Jari Aalto7117c2d2002-07-17 14:10:11 +00002648static char *globtext;
2649static char *globorig;
2650
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002651static char *
2652glob_complete_word (text, state)
Jari Aalto28ef6c32001-04-06 19:14:31 +00002653 const char *text;
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002654 int state;
2655{
2656 static char **matches = (char **)NULL;
2657 static int ind;
Jari Aalto7117c2d2002-07-17 14:10:11 +00002658 int glen;
Jari Aaltoeb873672004-11-09 21:37:25 +00002659 char *ret, *ttext;
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002660
2661 if (state == 0)
2662 {
Jari Aaltoe8ce7751997-09-22 20:22:27 +00002663 rl_filename_completion_desired = 1;
Jari Aalto7117c2d2002-07-17 14:10:11 +00002664 FREE (matches);
2665 if (globorig != globtext)
2666 FREE (globorig);
2667 FREE (globtext);
2668
Jari Aaltoeb873672004-11-09 21:37:25 +00002669 ttext = bash_tilde_expand (text, 0);
2670
Jari Aalto7117c2d2002-07-17 14:10:11 +00002671 if (rl_explicit_arg)
2672 {
Jari Aaltoeb873672004-11-09 21:37:25 +00002673 globorig = savestring (ttext);
2674 glen = strlen (ttext);
Jari Aalto7117c2d2002-07-17 14:10:11 +00002675 globtext = (char *)xmalloc (glen + 2);
Jari Aaltoeb873672004-11-09 21:37:25 +00002676 strcpy (globtext, ttext);
Jari Aalto7117c2d2002-07-17 14:10:11 +00002677 globtext[glen] = '*';
2678 globtext[glen+1] = '\0';
2679 }
2680 else
Jari Aaltoeb873672004-11-09 21:37:25 +00002681 globtext = globorig = savestring (ttext);
2682
2683 if (ttext != text)
2684 free (ttext);
Jari Aalto7117c2d2002-07-17 14:10:11 +00002685
2686 matches = shell_glob_filename (globtext);
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002687 if (GLOB_FAILED (matches))
Jari Aalto28ef6c32001-04-06 19:14:31 +00002688 matches = (char **)NULL;
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002689 ind = 0;
2690 }
2691
2692 ret = matches ? matches[ind] : (char *)NULL;
2693 ind++;
2694 return ret;
2695}
2696
Jari Aalto28ef6c32001-04-06 19:14:31 +00002697static int
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002698bash_glob_completion_internal (what_to_do)
2699 int what_to_do;
2700{
Jari Aalto28ef6c32001-04-06 19:14:31 +00002701 return bash_specific_completion (what_to_do, glob_complete_word);
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002702}
2703
Jari Aalto7117c2d2002-07-17 14:10:11 +00002704/* 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
Jari Aaltob80f6442004-07-27 13:29:18 +00002725 if (rl_editing_mode == EMACS_EDITING_MODE)
2726 rl_explicit_arg = 1; /* force `*' append */
Jari Aalto7117c2d2002-07-17 14:10:11 +00002727 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
Jari Aalto28ef6c32001-04-06 19:14:31 +00002736static int
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002737bash_glob_expand_word (count, key)
2738 int count, key;
2739{
Jari Aalto28ef6c32001-04-06 19:14:31 +00002740 return bash_glob_completion_internal ('*');
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002741}
2742
Jari Aalto28ef6c32001-04-06 19:14:31 +00002743static int
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002744bash_glob_list_expansions (count, key)
2745 int count, key;
2746{
Jari Aalto28ef6c32001-04-06 19:14:31 +00002747 return bash_glob_completion_internal ('?');
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002748}
2749
Jari Aalto28ef6c32001-04-06 19:14:31 +00002750static int
Jari Aalto726f6381996-08-26 18:22:31 +00002751bash_specific_completion (what_to_do, generator)
2752 int what_to_do;
Jari Aalto28ef6c32001-04-06 19:14:31 +00002753 rl_compentry_func_t *generator;
Jari Aalto726f6381996-08-26 18:22:31 +00002754{
Jari Aalto28ef6c32001-04-06 19:14:31 +00002755 rl_compentry_func_t *orig_func;
2756 rl_completion_func_t *orig_attempt_func;
2757 int r;
Jari Aalto726f6381996-08-26 18:22:31 +00002758
2759 orig_func = rl_completion_entry_function;
2760 orig_attempt_func = rl_attempted_completion_function;
2761 rl_completion_entry_function = generator;
Jari Aalto28ef6c32001-04-06 19:14:31 +00002762 rl_attempted_completion_function = NULL;
Jari Aalto726f6381996-08-26 18:22:31 +00002763
Jari Aalto28ef6c32001-04-06 19:14:31 +00002764 r = rl_complete_internal (what_to_do);
Jari Aalto726f6381996-08-26 18:22:31 +00002765
2766 rl_completion_entry_function = orig_func;
2767 rl_attempted_completion_function = orig_attempt_func;
Jari Aalto28ef6c32001-04-06 19:14:31 +00002768
2769 return r;
Jari Aalto726f6381996-08-26 18:22:31 +00002770}
2771
2772#endif /* SPECIFIC_COMPLETION_FUNCTIONS */
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002773
Jari Aaltob80f6442004-07-27 13:29:18 +00002774#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
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002831/* Filename quoting for completion. */
Jari Aaltobb706242000-03-17 21:46:59 +00002832/* 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. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002835static char *
2836bash_dequote_filename (text, quote_char)
2837 char *text;
Jari Aalto28ef6c32001-04-06 19:14:31 +00002838 int quote_char;
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002839{
2840 char *ret, *p, *r;
2841 int l, quoted;
2842
2843 l = strlen (text);
Jari Aaltof73dda02001-11-13 17:56:06 +00002844 ret = (char *)xmalloc (l + 1);
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002845 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)
Jari Aalto28ef6c32001-04-06 19:14:31 +00002857 {
2858 quoted = 0;
2859 continue;
2860 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002861 /* Open quote. */
2862 if (quoted == 0 && (*p == '\'' || *p == '"'))
Jari Aalto28ef6c32001-04-06 19:14:31 +00002863 {
2864 quoted = *p;
2865 continue;
2866 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002867 *r++ = *p;
2868 }
2869 *r = '\0';
2870 return ret;
2871}
2872
Jari Aaltod166f041997-06-05 14:59:13 +00002873/* 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);
Jari Aaltof73dda02001-11-13 17:56:06 +00002884 ret = (char *)xmalloc ((2 * l) + 1);
Jari Aaltod166f041997-06-05 14:59:13 +00002885 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. */
Jari Aalto7117c2d2002-07-17 14:10:11 +00002898 if (xstrchr (rl_completer_word_break_characters, *s))
Jari Aalto28ef6c32001-04-06 19:14:31 +00002899 *r++ = '\\';
Jari Aaltod166f041997-06-05 14:59:13 +00002900 *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
Jari Aalto7117c2d2002-07-17 14:10:11 +00002910 quote_word_break_chars on the result. This returns newly-allocated
2911 memory. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002912static 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
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002930 cs = completion_quoting_style;
2931 /* Might need to modify the default completion style based on *qcp,
Jari Aaltobb706242000-03-17 21:46:59 +00002932 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). */
Jari Aalto95732b42005-12-07 14:08:12 +00002937 if (*qcp == '\0' && cs == COMPLETE_BSQUOTE && xstrchr (s, '\n'))
Jari Aaltobb706242000-03-17 21:46:59 +00002938 cs = COMPLETE_SQUOTE;
2939 else if (*qcp == '"')
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002940 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 &&
Jari Aalto95732b42005-12-07 14:08:12 +00002945 history_expansion_inhibited == 0 && xstrchr (s, '!'))
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002946 cs = COMPLETE_BSQUOTE;
Jari Aaltod166f041997-06-05 14:59:13 +00002947
2948 if (*qcp == '"' && history_expansion && cs == COMPLETE_DQUOTE &&
Jari Aalto95732b42005-12-07 14:08:12 +00002949 history_expansion_inhibited == 0 && xstrchr (s, '!'))
Jari Aaltod166f041997-06-05 14:59:13 +00002950 {
2951 cs = COMPLETE_BSQUOTE;
2952 *qcp = '\0';
2953 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002954#endif
2955
Jari Aalto95732b42005-12-07 14:08:12 +00002956 /* 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
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002962 switch (cs)
2963 {
2964 case COMPLETE_DQUOTE:
Jari Aalto28ef6c32001-04-06 19:14:31 +00002965 rtext = sh_double_quote (mtext);
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002966 break;
2967 case COMPLETE_SQUOTE:
Jari Aalto28ef6c32001-04-06 19:14:31 +00002968 rtext = sh_single_quote (mtext);
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002969 break;
2970 case COMPLETE_BSQUOTE:
Jari Aalto28ef6c32001-04-06 19:14:31 +00002971 rtext = sh_backslash_quote (mtext);
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002972 break;
2973 }
2974
2975 if (mtext != s)
2976 free (mtext);
2977
Jari Aaltod166f041997-06-05 14:59:13 +00002978 /* 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
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002987 /* Leave the opening quote intact. The readline completion code takes
2988 care of avoiding doubled opening quotes. */
2989 rlen = strlen (rtext);
Jari Aaltof73dda02001-11-13 17:56:06 +00002990 ret = (char *)xmalloc (rlen + 1);
Jari Aaltoccc6cda1996-12-23 17:02:34 +00002991 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
Jari Aaltobb706242000-03-17 21:46:59 +00003000/* 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;
Jari Aaltob80f6442004-07-27 13:29:18 +00003012 sh_parser_state_t ps;
Jari Aaltobb706242000-03-17 21:46:59 +00003013
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)
Jari Aalto28ef6c32001-04-06 19:14:31 +00003026 xkmap = (Keymap)cmd_xmap[i].function;
Jari Aaltobb706242000-03-17 21:46:59 +00003027 else
3028 {
Jari Aalto28ef6c32001-04-06 19:14:31 +00003029 rl_crlf ();
Jari Aaltob80f6442004-07-27 13:29:18 +00003030 internal_error (_("bash_execute_unix_command: cannot find keymap for command"));
Jari Aalto28ef6c32001-04-06 19:14:31 +00003031 rl_forced_update_display ();
3032 return 1;
Jari Aaltobb706242000-03-17 21:46:59 +00003033 }
3034 }
3035 else
3036 xkmap = cmd_xmap;
3037
3038 cmd = (char *)xkmap[key].function;
3039
3040 if (cmd == 0)
3041 {
Jari Aalto28ef6c32001-04-06 19:14:31 +00003042 rl_ding ();
Jari Aaltobb706242000-03-17 21:46:59 +00003043 return 1;
3044 }
3045
Jari Aalto28ef6c32001-04-06 19:14:31 +00003046 rl_crlf (); /* move to a new line */
Jari Aaltobb706242000-03-17 21:46:59 +00003047
Jari Aaltob80f6442004-07-27 13:29:18 +00003048 save_parser_state (&ps);
Jari Aalto7117c2d2002-07-17 14:10:11 +00003049
Jari Aaltobb706242000-03-17 21:46:59 +00003050 cmd = savestring (cmd);
Jari Aalto7117c2d2002-07-17 14:10:11 +00003051 parse_and_execute (cmd, "bash_execute_unix_command", SEVAL_NOHIST);
3052
Jari Aaltob80f6442004-07-27 13:29:18 +00003053 restore_parser_state (&ps);
Jari Aaltobb706242000-03-17 21:46:59 +00003054
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 {
Jari Aaltob80f6442004-07-27 13:29:18 +00003079 builtin_error (_("%s: first non-whitespace character is not `\"'"), string);
Jari Aaltobb706242000-03-17 21:46:59 +00003080 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)
Jari Aalto28ef6c32001-04-06 19:14:31 +00003103 break;
Jari Aaltobb706242000-03-17 21:46:59 +00003104 }
3105
3106 if (delim && string[i] != delim)
3107 {
Jari Aaltob80f6442004-07-27 13:29:18 +00003108 builtin_error (_("no closing `%c' in %s"), delim, string);
Jari Aaltobb706242000-03-17 21:46:59 +00003109 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;
Jari Aaltof73dda02001-11-13 17:56:06 +00003121 int i, kstart;
Jari Aaltobb706242000-03-17 21:46:59 +00003122
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 {
Jari Aaltob80f6442004-07-27 13:29:18 +00003142 builtin_error (_("%s: missing colon separator"), line);
Jari Aaltobb706242000-03-17 21:46:59 +00003143 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 */
Jari Aaltob80f6442004-07-27 13:29:18 +00003158 rl_bind_keyseq_in_map (kseq, bash_execute_unix_command, kmap);
Jari Aaltobb706242000-03-17 21:46:59 +00003159
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)
Jari Aalto28ef6c32001-04-06 19:14:31 +00003168 const char *text;
Jari Aaltobb706242000-03-17 21:46:59 +00003169{
3170 char **m1;
3171 char *dfn;
3172 int qc;
3173
Jari Aaltob80f6442004-07-27 13:29:18 +00003174 qc = rl_dispatching ? rl_completion_quote_character : 0;
Jari Aalto28ef6c32001-04-06 19:14:31 +00003175 dfn = bash_dequote_filename ((char *)text, qc);
3176 m1 = rl_completion_matches (dfn, rl_filename_completion_function);
Jari Aaltobb706242000-03-17 21:46:59 +00003177 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}
Jari Aaltob80f6442004-07-27 13:29:18 +00003187
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}
Jari Aaltoccc6cda1996-12-23 17:02:34 +00003199#endif /* READLINE */