diff options
| author | Chet Ramey <chet.ramey@case.edu> | 2023-12-05 11:54:24 -0500 |
|---|---|---|
| committer | Chet Ramey <chet.ramey@case.edu> | 2023-12-05 11:54:24 -0500 |
| commit | ba57a3e752a949da1ba1e5729ec5ae1a7ac06bca (patch) | |
| tree | 40787bb97edc87b6111fb2ff178fdb30ab05c410 | |
| parent | d5ab50bc0214f07222d5a6d2597f5e0d7e3f1f52 (diff) | |
| download | bash-devel.tar.gz | |
readline fix for do-lowercase-version; fix for reading here-documents from aliasesdevel
| -rw-r--r-- | CWRU/CWRU.chlog | 32 | ||||
| -rw-r--r-- | MANIFEST | 1 | ||||
| -rw-r--r-- | lib/readline/isearch.c | 6 | ||||
| -rw-r--r-- | lib/readline/readline.c | 6 | ||||
| -rw-r--r-- | make_cmd.c | 6 | ||||
| -rw-r--r-- | parse.y | 30 | ||||
| -rw-r--r-- | parser.h | 1 | ||||
| -rw-r--r-- | po/pt_BR.gmo | bin | 183592 -> 183592 bytes | |||
| -rw-r--r-- | po/pt_BR.po | 4 | ||||
| -rw-r--r-- | tests/heredoc.right | 8 | ||||
| -rw-r--r-- | tests/heredoc.tests | 3 | ||||
| -rw-r--r-- | tests/heredoc10.sub | 45 | ||||
| -rw-r--r-- | tests/varenv.right | 5 | ||||
| -rw-r--r-- | tests/varenv1.sub | 23 | ||||
| -rw-r--r-- | tests/varenv12.sub | 13 |
15 files changed, 171 insertions, 12 deletions
diff --git a/CWRU/CWRU.chlog b/CWRU/CWRU.chlog index baf1677..c163e28 100644 --- a/CWRU/CWRU.chlog +++ b/CWRU/CWRU.chlog @@ -8109,3 +8109,35 @@ builtins/set.def doc/bashref.texi - update posix mode section with change to unset for interp 1009 + + 12/1 + ---- +lib/readline/readline.c + - _rl_subseq_result: add check before _rl_do_lowercase_version that + _rl_to_lower actually results in a different key sequence + Report and patch from Grisha Levit <grishalevit@gmail.com> + +lib/readline/isearch.c + - _rl_isearch_dispatch: if the function bound to a key and the function + bound to the result of _rl_to_lower for that key are both + rl_do_lowercase_version, just insert the key into the search string + + 12/5 + ---- +parse.y,parser.h + - heredoc_string: new variable to indicate whether or not we're reading + a here-document from an alias (a pushed string). Set in + gather_here_documents individually for each call to + make_here_document. + +parse.y + - read_a_line: if heredoc_string is non-zero, use shell_getc instead + of yy_getc to get the right alias processing + - shell_getc: if heredoc_string is non-zero, don't add a space to the + end of the alias -- it can mess up the here-document delimiter if + the next character is a newline + Report and sample patch from gldrk <me@rarity.fan> + +parse.y,make_cmd.c + - read_a_line,make_here_document: if we're using shell_getc to read + the body of a here-document, let it manage line_number @@ -1246,6 +1246,7 @@ tests/heredoc6.sub f tests/heredoc7.sub f tests/heredoc8.sub f tests/heredoc9.sub f +tests/heredoc10.sub f tests/herestr.tests f tests/herestr.right f tests/herestr1.sub f diff --git a/lib/readline/isearch.c b/lib/readline/isearch.c index 07e76f1..9ddf9ce 100644 --- a/lib/readline/isearch.c +++ b/lib/readline/isearch.c @@ -430,7 +430,11 @@ add_character: { f = cxt->keymap[c].function; if (f == rl_do_lowercase_version) - f = cxt->keymap[_rl_to_lower (c)].function; + { + f = cxt->keymap[_rl_to_lower (c)].function; + if (f == rl_do_lowercase_version) + f = rl_insert; + } } if (f == rl_reverse_search_history) diff --git a/lib/readline/readline.c b/lib/readline/readline.c index 608c65e..dbe57ef 100644 --- a/lib/readline/readline.c +++ b/lib/readline/readline.c @@ -1124,7 +1124,11 @@ _rl_subseq_result (int r, Keymap map, int key, int got_subseq) type = m[ANYOTHERKEY].type; func = m[ANYOTHERKEY].function; if (type == ISFUNC && func == rl_do_lowercase_version) - r = _rl_dispatch (_rl_to_lower ((unsigned char)key), map); + { + int newkey = _rl_to_lower ((unsigned char)key); + /* check that there is actually a lowercase version to avoid infinite recursion */ + r = (newkey != key) ? _rl_dispatch (newkey, map) : 1; + } else if (type == ISFUNC) { /* If we shadowed a function, whatever it is, we somehow need a @@ -573,7 +573,11 @@ make_here_document (REDIRECT *temp, int lineno) here_doc_first_line = 0; line = full_line; - line_number++; + + /* if read_secondary_line uses shell_getc, that handles incrementing + line_number where necessary. */ + if (heredoc_string == 0) + line_number++; /* If set -v is in effect, echo the line read. read_secondary_line/ read_a_line leaves the newline at the end, so don't print another. */ @@ -295,6 +295,9 @@ int parser_state; static REDIRECT *redir_stack[HEREDOC_MAX]; int need_here_doc; +/* Are we reading a here-document from a string? (alias) */ +int heredoc_string; + /* Where shell input comes from. History expansion is performed on each line when the shell is interactive. */ static char *shell_input_line = (char *)NULL; @@ -2143,7 +2146,8 @@ read_a_line (int remove_quoted_newline) /* Allow immediate exit if interrupted during input. */ QUIT; - c = yy_getc (); + /* If we're reading the here-document from an alias, use shell_getc */ + c = heredoc_string ? shell_getc (0) : yy_getc (); /* Ignore null bytes in input. */ if (c == 0) @@ -2155,7 +2159,13 @@ read_a_line (int remove_quoted_newline) if (interactive && bash_input.type == st_stream) clearerr (stdin); if (indx == 0) - return ((char *)NULL); + { + /* if we use shell_getc, that increments line_number on eof */ + if (heredoc_string) + line_number--; + + return ((char *)NULL); + } c = '\n'; } @@ -2177,10 +2187,12 @@ read_a_line (int remove_quoted_newline) else if (c == '\\' && remove_quoted_newline) { QUIT; - peekc = yy_getc (); + /* If we're reading the here-document from an alias, use shell_getc */ + peekc = heredoc_string ? shell_getc (0) : yy_getc (); if (peekc == '\n') { - line_number++; + if (heredoc_string == 0) + line_number++; continue; /* Make the unquoted \<newline> pair disappear. */ } else if (peekc == EOF) @@ -2200,7 +2212,11 @@ read_a_line (int remove_quoted_newline) } else { - yy_ungetc (peekc); + if (heredoc_string) + shell_ungetc (peekc); + else + yy_ungetc (peekc); + pass_next = 1; line_buffer[indx++] = c; /* Preserve the backslash. */ } @@ -2691,12 +2707,13 @@ next_alias_char: return the space that will delimit the token and postpone the pop_string. This set of conditions duplicates what used to be in mk_alexpansion () below, with the addition that we don't add a space if we're currently - reading a quoted string or in a shell comment. */ + reading a quoted string or in a shell comment or here-document. */ #ifndef OLD_ALIAS_HACK if (uc == 0 && pushed_string_list && pushed_string_list->flags != PSH_SOURCE && pushed_string_list->flags != PSH_DPAREN && (parser_state & PST_COMMENT) == 0 && (parser_state & PST_ENDALIAS) == 0 && /* only once */ + heredoc_string == 0 && shell_input_line_index > 0 && shellblank (shell_input_line[shell_input_line_index-1]) == 0 && shell_input_line[shell_input_line_index-1] != '\n' && @@ -3027,6 +3044,7 @@ gather_here_documents (void) while (need_here_doc > 0) { parser_state |= PST_HEREDOC; + heredoc_string = expanding_alias () && (shell_input_line_index < shell_input_line_len); make_here_document (redir_stack[r++], line_number); parser_state &= ~PST_HEREDOC; need_here_doc--; @@ -103,6 +103,7 @@ extern int shell_eof_token; extern int current_token; extern int parser_state; extern int need_here_doc; +extern int heredoc_string; extern int ignoreeof; extern int eof_encountered; diff --git a/po/pt_BR.gmo b/po/pt_BR.gmo Binary files differindex 4c96834..4aecfc3 100644 --- a/po/pt_BR.gmo +++ b/po/pt_BR.gmo diff --git a/po/pt_BR.po b/po/pt_BR.po index eaae6b5..0c5b20e 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: bash 5.2-rc1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-01-11 14:50-0500\n" -"PO-Revision-Date: 2023-01-12 14:27-0300\n" +"PO-Revision-Date: 2023-12-04 14:27-0300\n" "Last-Translator: Rafael Fontenelle <rafaelff@gnome.org>\n" "Language-Team: Brazilian Portuguese <ldpbr-translation@lists.sourceforge.net>\n" "Language: pt_BR\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" -"X-Generator: Gtranslator 42.0\n" +"X-Generator: Gtranslator 45.2\n" "X-Bugs: Report translation errors to the Language-Team address.\n" #: arrayfunc.c:66 diff --git a/tests/heredoc.right b/tests/heredoc.right index d5a4a7d..a504930 100644 --- a/tests/heredoc.right +++ b/tests/heredoc.right @@ -153,8 +153,14 @@ HERE echo 3 4; done } +hello +world +hello +world +here-document +here-document comsub here-string -./heredoc.tests: line 181: warning: here-document at line 178 delimited by end-of-file (wanted `') +./heredoc.tests: line 184: warning: here-document at line 181 delimited by end-of-file (wanted `') hi there '' diff --git a/tests/heredoc.tests b/tests/heredoc.tests index 2f94d1d..d6431b8 100644 --- a/tests/heredoc.tests +++ b/tests/heredoc.tests @@ -168,6 +168,9 @@ ${THIS_SH} ./heredoc8.sub # various tests for printing here-documents in function bodies ${THIS_SH} ./heredoc9.sub +# test various combinations of here-documents and aliases +${THIS_SH} ./heredoc10.sub + echo $( cat <<< "comsub here-string" ) diff --git a/tests/heredoc10.sub b/tests/heredoc10.sub new file mode 100644 index 0000000..aa310e1 --- /dev/null +++ b/tests/heredoc10.sub @@ -0,0 +1,45 @@ +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +# test various forms of reading here-documents from an alias +shopt -s expand_aliases + +# single alias definition contains entire here-document +alias 'foo=cat <<EOF +hello +world +EOF' +foo + +# here-document body continues after alias definition +alias 'foo=cat <<EOF +hello' +foo +world +EOF + +# here-document delimiter in one alias, body in another +shopt -s expand_aliases +alias c='cat <<\END' d='c +here-document +END' +d + +# make sure delimiter is recognized whether the alias ends with a newline or not +shopt -s expand_aliases +alias c='cat <<\END' d='c +here-document +END +' +d diff --git a/tests/varenv.right b/tests/varenv.right index c766898..608b647 100644 --- a/tests/varenv.right +++ b/tests/varenv.right @@ -38,6 +38,9 @@ abcde 30 40 50 +declare -x var="60" +outside +assignment |0|10| 10 |0|10| @@ -159,6 +162,8 @@ inside func: var=two outside 2.1: var=global inside func1: var=value outside 3.0: var=value +inside func1: var=func +outside 3.5: var=outside inside func2: var=global outside 4.0: var=outside foo: hello world diff --git a/tests/varenv1.sub b/tests/varenv1.sub index 8def153..b74de20 100644 --- a/tests/varenv1.sub +++ b/tests/varenv1.sub @@ -39,3 +39,26 @@ var=40 func echo expect 50 var=50 command printenv var + +# this behaves the same in bash and posix mode +export -n var # make sure it's not exported +echo expect 60 +var=60 export var +declare -p var + +# this behaves differently in bash and posix mode: `.' is a special builtin +unset -v var +var=outside +echo 'var=assignment' >$TMPFILE + +echo expect outside +var=temp . $TMPFILE +echo $var + +set -o posix +echo expect assignment +var=temp . $TMPFILE +echo $var + +rm -f $TMPFILE +unset -v var diff --git a/tests/varenv12.sub b/tests/varenv12.sub index 92b3692..441a02f 100644 --- a/tests/varenv12.sub +++ b/tests/varenv12.sub @@ -134,6 +134,19 @@ echo -n 'outside 3.0: ' ; echo "var=${var-<unset>}" unset -v var unset -f func1 +# operations inside a function on temporary variables do not propagate +func1() +{ + export var + echo -n 'inside func1: ' ; echo "var=${var-<unset>}" +} +var=outside +var=func func1 +echo -n 'outside 3.5: ' ; echo "var=${var-<unset>}" + +unset -v var +unset -f func1 + func2() { local var=local |
