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