hush: fix recent breakage from parse_stream() changes

function                                             old     new   delta
parse_stream                                        3808    3821     +13

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2018-04-11 20:00:43 +02:00
parent 44257ad5d0
commit f693b606b7
5 changed files with 32 additions and 22 deletions

View File

@ -0,0 +1 @@
a:[a]

View File

@ -0,0 +1,4 @@
for s in \
a; do
echo "a:[$s]"
done

View File

@ -5075,7 +5075,6 @@ static struct pipe *parse_stream(char **pstring,
debug_printf_parse("parse_stream return %p\n", pi);
return pi;
}
nommu_addchr(&ctx.as_string, ch);
/* Handle "'" and "\" first, as they won't play nice with
* i_peek_and_eat_bkslash_nl() anyway:
@ -5085,6 +5084,28 @@ static struct pipe *parse_stream(char **pstring,
* '
* would break.
*/
if (ch == '\\') {
ch = i_getch(input);
if (ch == '\n')
continue; /* drop \<newline>, get next char */
nommu_addchr(&ctx.as_string, '\\');
o_addchr(&ctx.word, '\\');
if (ch == EOF) {
/* Testcase: eval 'echo Ok\' */
/* bash-4.3.43 was removing backslash,
* but 4.4.19 retains it, most other shells too
*/
continue; /* get next char */
}
/* Example: echo Hello \2>file
* we need to know that word 2 is quoted
*/
ctx.word.has_quoted_part = 1;
nommu_addchr(&ctx.as_string, ch);
o_addchr(&ctx.word, ch);
continue; /* get next char */
}
nommu_addchr(&ctx.as_string, ch);
if (ch == '\'') {
ctx.word.has_quoted_part = 1;
next = i_getch(input);
@ -5110,27 +5131,6 @@ static struct pipe *parse_stream(char **pstring,
}
continue; /* get next char */
}
if (ch == '\\') {
/*nommu_addchr(&ctx.as_string, '\\'); - already done */
o_addchr(&ctx.word, '\\');
ch = i_getch(input);
if (ch == EOF) {
/* Testcase: eval 'echo Ok\' */
#if 0 /* bash-4.3.43 was removing backslash, but 4.4.19 retains it, most other shells too */
/* Remove trailing '\' from ctx.as_string */
ctx.as_string.data[--ctx.as_string.length] = '\0';
#endif
continue; /* get next char */
}
/* Example: echo Hello \2>file
* we need to know that word 2 is quoted
*/
ctx.word.has_quoted_part = 1;
nommu_addchr(&ctx.as_string, ch);
o_addchr(&ctx.word, ch);
continue; /* get next char */
}
next = '\0';
if (ch != '\n')

View File

@ -0,0 +1 @@
a:[a]

View File

@ -0,0 +1,4 @@
for s in \
a; do
echo "a:[$s]"
done