From 85fc6ab4038a1bce0ffd9007e4c649dcca6b600f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 4 May 2006 22:46:29 +0000 Subject: [PATCH] applied bash 2.05b patches (only 002 was previously applied) git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17325 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/bin/bash/bashline.c | 7 +++++-- src/bin/bash/lib/readline/bind.c | 2 +- src/bin/bash/lib/readline/display.c | 26 ++++++++++++++------------ src/bin/bash/lib/readline/mbutil.c | 20 ++++++++++++++------ src/bin/bash/lib/readline/vi_mode.c | 7 +++++-- src/bin/bash/subst.c | 9 ++++----- 6 files changed, 43 insertions(+), 28 deletions(-) diff --git a/src/bin/bash/bashline.c b/src/bin/bash/bashline.c index 8874314b94..0e011b3390 100644 --- a/src/bin/bash/bashline.c +++ b/src/bin/bash/bashline.c @@ -1044,7 +1044,10 @@ attempt_shell_completion (text, start, end) } else { +#define CMD_IS_DIR(x) (absolute_pathname(x) == 0 && *(x) != '~' && test_for_directory (x)) + matches = rl_completion_matches (text, command_word_completion_function); + /* If we are attempting command completion and nothing matches, we do not want readline to perform filename completion for us. We still want to be able to complete partial pathnames, so set the @@ -1052,7 +1055,7 @@ attempt_shell_completion (text, start, end) filenames and leave directories in the match list. */ if (matches == (char **)NULL) rl_ignore_some_completions_function = bash_ignore_filenames; - else if (matches[1] == 0 && *matches[0] != '/') + else if (matches[1] == 0 && CMD_IS_DIR(matches[0])) /* Turn off rl_filename_completion_desired so readline doesn't append a slash if there is a directory with the same name in the current directory, or other filename-specific things. @@ -1061,7 +1064,7 @@ attempt_shell_completion (text, start, end) looking in the current directory anyway, so there's no conflict. */ rl_filename_completion_desired = 0; - else if (matches[0] && matches[1] && STREQ (matches[0], matches[1]) && *matches[0] != '/') + else if (matches[0] && matches[1] && STREQ (matches[0], matches[1]) && CMD_IS_DIR (matches[0])) /* There are multiple instances of the same match (duplicate completions haven't yet been removed). In this case, all of the matches will be the same, and the duplicate removal code diff --git a/src/bin/bash/lib/readline/bind.c b/src/bin/bash/lib/readline/bind.c index 65ef401e20..7103888148 100644 --- a/src/bin/bash/lib/readline/bind.c +++ b/src/bin/bash/lib/readline/bind.c @@ -311,7 +311,7 @@ rl_generic_bind (type, keyseq, data, map) mapped to something, `abc' to be mapped to something else, and the function bound to `a' to be executed when the user types `abx', leaving `bx' in the input queue. */ - if (k.function /* && k.type == ISFUNC */) + if (k.function && ((k.type == ISFUNC && k.function != rl_do_lowercase_version) || k.type == ISMACR)) { map[ANYOTHERKEY] = k; k.function = 0; diff --git a/src/bin/bash/lib/readline/display.c b/src/bin/bash/lib/readline/display.c index 5150ea6a07..f1b86a4362 100644 --- a/src/bin/bash/lib/readline/display.c +++ b/src/bin/bash/lib/readline/display.c @@ -70,7 +70,7 @@ static void insert_some_chars PARAMS((char *, int, int)); static void cr PARAMS((void)); #if defined (HANDLE_MULTIBYTE) -static int _rl_col_width PARAMS((char *, int, int)); +static int _rl_col_width PARAMS((const char *, int, int)); static int *_rl_wrapped_line; #else # define _rl_col_width(l, s, e) (((e) <= (s)) ? 0 : (e) - (s)) @@ -1348,9 +1348,9 @@ update_line (old, new, current_line, omax, nmax, inv_botlin) { _rl_output_some_chars (nfd + lendiff, temp - lendiff); #if 0 - _rl_last_c_pos += _rl_col_width (nfd+lendiff, 0, temp-lendiff) - col_lendiff; -#else _rl_last_c_pos += _rl_col_width (nfd+lendiff, 0, temp-col_lendiff); +#else + _rl_last_c_pos += _rl_col_width (nfd+lendiff, 0, temp-lendiff); #endif } } @@ -1510,8 +1510,15 @@ _rl_move_cursor_relative (new, data) #if defined (HANDLE_MULTIBYTE) /* If we have multibyte characters, NEW is indexed by the buffer point in a multibyte string, but _rl_last_c_pos is the display position. In - this case, NEW's display position is not obvious. */ - if ((MB_CUR_MAX == 1 || rl_byte_oriented ) && _rl_last_c_pos == new) return; + this case, NEW's display position is not obvious and must be + calculated. */ + if (MB_CUR_MAX == 1 || rl_byte_oriented) + { + if (_rl_last_c_pos == new) + return; + } + else if (_rl_last_c_pos == _rl_col_width (data, 0, new)) + return; #else if (_rl_last_c_pos == new) return; #endif @@ -1594,11 +1601,7 @@ _rl_move_cursor_relative (new, data) #endif { if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) - { - tputs (_rl_term_cr, 1, _rl_output_character_function); - for (i = 0; i < new; i++) - putc (data[i], rl_outstream); - } + _rl_backspace (_rl_last_c_pos - _rl_col_width (data, 0, new)); else _rl_backspace (_rl_last_c_pos - new); } @@ -2117,7 +2120,7 @@ _rl_current_display_line () scan from the beginning of the string to take the state into account. */ static int _rl_col_width (str, start, end) - char *str; + const char *str; int start, end; { wchar_t wc; @@ -2193,4 +2196,3 @@ _rl_col_width (str, start, end) return width; } #endif /* HANDLE_MULTIBYTE */ - diff --git a/src/bin/bash/lib/readline/mbutil.c b/src/bin/bash/lib/readline/mbutil.c index 50302f01ba..8794d02ddc 100644 --- a/src/bin/bash/lib/readline/mbutil.c +++ b/src/bin/bash/lib/readline/mbutil.c @@ -205,14 +205,16 @@ _rl_get_char_len (src, ps) if (tmp == (size_t)(-2)) { /* shorted to compose multibyte char */ - memset (ps, 0, sizeof(mbstate_t)); + if (ps) + memset (ps, 0, sizeof(mbstate_t)); return -2; } else if (tmp == (size_t)(-1)) { /* invalid to compose multibyte char */ /* initialize the conversion state */ - memset (ps, 0, sizeof(mbstate_t)); + if (ps) + memset (ps, 0, sizeof(mbstate_t)); return -1; } else if (tmp == (size_t)0) @@ -225,9 +227,12 @@ _rl_get_char_len (src, ps) return 1. Otherwise return 0. */ int _rl_compare_chars (buf1, pos1, ps1, buf2, pos2, ps2) - char *buf1, *buf2; - mbstate_t *ps1, *ps2; - int pos1, pos2; + char *buf1; + int pos1; + mbstate_t *ps1; + char *buf2; + int pos2; + mbstate_t *ps2; { int i, w1, w2; @@ -276,8 +281,11 @@ _rl_adjust_point(string, point, ps) pos++; /* clear the state of the byte sequence, because in this case effect of mbstate is undefined */ - memset (ps, 0, sizeof (mbstate_t)); + if (ps) + memset (ps, 0, sizeof (mbstate_t)); } + else if (tmp == 0) + pos++; else pos += tmp; } diff --git a/src/bin/bash/lib/readline/vi_mode.c b/src/bin/bash/lib/readline/vi_mode.c index 5d146b3f70..89303644c5 100644 --- a/src/bin/bash/lib/readline/vi_mode.c +++ b/src/bin/bash/lib/readline/vi_mode.c @@ -680,7 +680,8 @@ _rl_vi_change_mbchar_case (count) int count; { wchar_t wc; - char mb[MB_LEN_MAX]; + char mb[MB_LEN_MAX+1]; + int mblen; mbstate_t ps; memset (&ps, 0, sizeof (mbstate_t)); @@ -703,7 +704,9 @@ _rl_vi_change_mbchar_case (count) /* Vi is kind of strange here. */ if (wc) { - wctomb (mb, wc); + mblen = wctomb (mb, wc); + if (mblen >= 0) + mb[mblen] = '\0'; rl_begin_undo_group (); rl_delete (1, 0); rl_insert_text (mb); diff --git a/src/bin/bash/subst.c b/src/bin/bash/subst.c index 9ebc465a4b..13e0e31f9e 100644 --- a/src/bin/bash/subst.c +++ b/src/bin/bash/subst.c @@ -1638,11 +1638,10 @@ string_list_dollar_at (list, quoted) /* This performs word splitting and quoted null character removal on STRING. */ -#if 0 -#define issep(c) ((separators)[1] ? (member ((c), separators)) : (c) == (separators)[0]) -#else -#define issep(c) ((separators)[1] ? isifs(c) : (c) == (separators)[0]) -#endif +#define issep(c) \ + (((separators)[0]) ? ((separators)[1] ? isifs(c) \ + : (c) == (separators)[0]) \ + : 0) WORD_LIST * list_string (string, separators, quoted)