diff options
author | Jari Aalto <jari.aalto@cante.net> | 1998-04-17 19:52:44 +0000 |
---|---|---|
committer | Jari Aalto <jari.aalto@cante.net> | 2009-09-12 16:46:51 +0000 |
commit | cce855bc5b117cb7ae70064131120687bc69fac0 (patch) | |
tree | 39c7a4ec8f6d22ef03df74f2684e6a04fef10399 /bashline.c | |
parent | e8ce775db824de329b81293b4e5d8fbd65624528 (diff) | |
download | android_external_bash-cce855bc5b117cb7ae70064131120687bc69fac0.tar.gz android_external_bash-cce855bc5b117cb7ae70064131120687bc69fac0.tar.bz2 android_external_bash-cce855bc5b117cb7ae70064131120687bc69fac0.zip |
Imported from ../bash-2.02.tar.gz.
Diffstat (limited to 'bashline.c')
-rw-r--r-- | bashline.c | 141 |
1 files changed, 112 insertions, 29 deletions
@@ -36,6 +36,7 @@ #include "bashhist.h" #include "bashline.h" #include "execute_cmd.h" +#include "findcmd.h" #include "pathexp.h" #include "builtins/common.h" #include <readline/rlconf.h> @@ -55,12 +56,19 @@ extern void bash_brace_completion (); /* Functions bound to keys in Readline for Bash users. */ static void shell_expand_line (); static void display_shell_version (), operate_and_get_next (); -static void history_expand_line (), bash_ignore_filenames (); +static void bash_ignore_filenames (); +static void cleanup_expansion_error (), set_up_new_line (); + +#if defined (BANG_HISTORY) +static int history_expand_line (); +static int tcsh_magic_space (); +#endif /* BANG_HISTORY */ #ifdef ALIAS -static void alias_expand_line (); +static int alias_expand_line (); +#endif +#if defined (BANG_HISTORY) && defined (ALIAS) +static int history_and_alias_expand_line (); #endif -static void history_and_alias_expand_line (); -static void cleanup_expansion_error (), set_up_new_line (); /* Helper functions for Readline. */ static int bash_directory_completion_hook (); @@ -196,9 +204,13 @@ initialize_readline () rl_bind_key_in_map (CTRL('E'), (Function *)shell_expand_line, emacs_meta_keymap); /* Bind up our special shell functions. */ +#ifdef BANG_HISTORY rl_add_defun ("history-expand-line", (Function *)history_expand_line, -1); rl_bind_key_in_map ('^', (Function *)history_expand_line, emacs_meta_keymap); + rl_add_defun ("magic-space", (Function *)tcsh_magic_space, -1); +#endif + #ifdef ALIAS rl_add_defun ("alias-expand-line", (Function *)alias_expand_line, -1); rl_add_defun ("history-and-alias-expand-line", (Function *)history_and_alias_expand_line, -1); @@ -1030,7 +1042,7 @@ command_subst_completion_function (text, state) orig_start = text; if (*text == '`') text++; - else if (*text == '$' && text[1] == '(') + else if (*text == '$' && text[1] == '(') /* ) */ text += 2; start_len = text - orig_start; filename_text = savestring (text); @@ -1173,7 +1185,12 @@ hostname_completion_function (text, state) return ((char *)NULL); } -/* History and alias expand the line. */ +/* Functions to perform history and alias expansions on the current line. */ + +#if defined (BANG_HISTORY) +/* Perform history expansion on the current line. If no history expansion + is done, pre_process_line() returns what it was passed, so we need to + allocate a new line here. */ static char * history_expand_line_internal (line) char *line; @@ -1183,22 +1200,6 @@ history_expand_line_internal (line) new_line = pre_process_line (line, 0, 0); return (new_line == line) ? savestring (line) : new_line; } - -#if defined (ALIAS) -/* Expand aliases in the current readline line. */ -static void -alias_expand_line (ignore) - int ignore; -{ - char *new_line; - - new_line = alias_expand (rl_line_buffer); - - if (new_line) - set_up_new_line (new_line); - else - cleanup_expansion_error (); -} #endif /* There was an error in expansion. Let the preprocessor print @@ -1259,8 +1260,32 @@ set_up_new_line (new_line) } } +#if defined (ALIAS) +/* Expand aliases in the current readline line. */ +static int +alias_expand_line (ignore) + int ignore; +{ + char *new_line; + + new_line = alias_expand (rl_line_buffer); + + if (new_line) + { + set_up_new_line (new_line); + return (0); + } + else + { + cleanup_expansion_error (); + return (1); + } +} +#endif + +#if defined (BANG_HISTORY) /* History expand the line. */ -static void +static int history_expand_line (ignore) int ignore; { @@ -1269,13 +1294,35 @@ history_expand_line (ignore) new_line = history_expand_line_internal (rl_line_buffer); if (new_line) - set_up_new_line (new_line); + { + set_up_new_line (new_line); + return (0); + } else - cleanup_expansion_error (); + { + cleanup_expansion_error (); + return (1); + } +} + +/* Expand history substitutions in the current line and then insert a + space wherever set_up_new_line decided to put rl_point. */ +static int +tcsh_magic_space (ignore) + int ignore; +{ + if (history_expand_line (ignore) == 0) + { + rl_insert (1, ' '); + return (0); + } + else + return (1); } +#endif /* History and alias expand the line. */ -static void +static int history_and_alias_expand_line (ignore) int ignore; { @@ -1297,13 +1344,21 @@ history_and_alias_expand_line (ignore) #endif /* ALIAS */ if (new_line) - set_up_new_line (new_line); + { + set_up_new_line (new_line); + return (0); + } else - cleanup_expansion_error (); + { + cleanup_expansion_error (); + return (1); + } } /* History and alias expand the line, then perform the shell word - expansions by calling expand_string. */ + expansions by calling expand_string. This can't use set_up_new_line() + because we want the variable expansions as a separate undo'able + set of operations. */ static void shell_expand_line (ignore) int ignore; @@ -1369,6 +1424,10 @@ shell_expand_line (ignore) cleanup_expansion_error (); } +/* Define NO_FORCE_FIGNORE if you want to match filenames that would + otherwise be ignored if they are the only possible matches. */ +/* #define NO_FORCE_FIGNORE */ + /* If FIGNORE is set, then don't match files with the given suffixes when completing filenames. If only one of the possibilities has an acceptable suffix, delete the others, else just return and let the completer @@ -1393,6 +1452,10 @@ _ignore_completion_names (names, name_func) { char **newnames; int idx, nidx; +#ifdef NO_FORCE_FIGNORE + char **oldnames; + int oidx; +#endif /* If there is only one completion, see if it is acceptable. If it is not, free it up. In any case, short-circuit and return. This is a @@ -1400,11 +1463,13 @@ _ignore_completion_names (names, name_func) if there is only one completion; it is the completion itself. */ if (names[1] == (char *)0) { +#ifndef NO_FORCE_FIGNORE if ((*name_func) (names[0]) == 0) { free (names[0]); names[0] = (char *)NULL; } +#endif return; } @@ -1413,6 +1478,10 @@ _ignore_completion_names (names, name_func) for (nidx = 1; names[nidx]; nidx++) ; newnames = (char **)xmalloc ((nidx + 1) * (sizeof (char *))); +#ifdef NO_FORCE_FIGNORE + oldnames = (char **)xmalloc ((nidx - 1) * (sizeof (char *))); + oidx = 0; +#endif newnames[0] = names[0]; for (idx = nidx = 1; names[idx]; idx++) @@ -1420,7 +1489,11 @@ _ignore_completion_names (names, name_func) if ((*name_func) (names[idx])) newnames[nidx++] = names[idx]; else +#ifndef NO_FORCE_FIGNORE free (names[idx]); +#else + oldnames[oidx++] = names[idx]; +#endif } newnames[nidx] = (char *)NULL; @@ -1428,12 +1501,22 @@ _ignore_completion_names (names, name_func) /* If none are acceptable then let the completer handle it. */ if (nidx == 1) { +#ifndef NO_FORCE_FIGNORE free (names[0]); names[0] = (char *)NULL; +#else + free (oldnames); +#endif free (newnames); return; } +#ifdef NO_FORCE_FIGNORE + while (oidx) + free (oldnames[--oidx]); + free (oldnames); +#endif + /* If only one is acceptable, copy it to names[0] and return. */ if (nidx == 2) { |