ash,hush: handle a few more bkslash-newline cases
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
32e183e63e
commit
1e5111b0f8
@ -12649,7 +12649,7 @@ xxreadtoken(void)
|
||||
break; /* return readtoken1(...) */
|
||||
|
||||
if ((int)(p - xxreadtoken_chars) >= xxreadtoken_singles) {
|
||||
int cc = pgetc();
|
||||
int cc = pgetc_eatbnl();
|
||||
if (cc == c) { /* double occurrence? */
|
||||
p += xxreadtoken_doubles + 1;
|
||||
} else {
|
||||
|
4
shell/ash_test/ash-parsing/bkslash_newline1.right
Normal file
4
shell/ash_test/ash-parsing/bkslash_newline1.right
Normal file
@ -0,0 +1,4 @@
|
||||
and1
|
||||
and2
|
||||
or1
|
||||
ok
|
8
shell/ash_test/ash-parsing/bkslash_newline1.tests
Executable file
8
shell/ash_test/ash-parsing/bkslash_newline1.tests
Executable file
@ -0,0 +1,8 @@
|
||||
echo and1 &\
|
||||
& echo and2
|
||||
|
||||
echo or1 |\
|
||||
| echo NOT SHOWN
|
||||
|
||||
case w in a) echo SKIP;\
|
||||
; w) echo ok;; esac;
|
4
shell/ash_test/ash-parsing/bkslash_newline2.right
Normal file
4
shell/ash_test/ash-parsing/bkslash_newline2.right
Normal file
@ -0,0 +1,4 @@
|
||||
Line with one backslash:
|
||||
\
|
||||
|
||||
Ok:0
|
4
shell/ash_test/ash-parsing/bkslash_newline2.tests
Executable file
4
shell/ash_test/ash-parsing/bkslash_newline2.tests
Executable file
@ -0,0 +1,4 @@
|
||||
echo Line with one backslash:
|
||||
echo '\
|
||||
'
|
||||
echo Ok:$?
|
14
shell/hush.c
14
shell/hush.c
@ -4980,8 +4980,14 @@ static struct pipe *parse_stream(char **pstring,
|
||||
nommu_addchr(&ctx.as_string, ch);
|
||||
|
||||
next = '\0';
|
||||
if (ch != '\n')
|
||||
if (ch != '\n') {
|
||||
next = i_peek(input);
|
||||
/* Can't use i_peek_and_eat_bkslash_nl(input) here:
|
||||
* echo '\
|
||||
* '
|
||||
* will break.
|
||||
*/
|
||||
}
|
||||
|
||||
is_special = "{}<>;&|()#'" /* special outside of "str" */
|
||||
"\\$\"" IF_HUSH_TICK("`") /* always special */
|
||||
@ -5375,7 +5381,7 @@ static struct pipe *parse_stream(char **pstring,
|
||||
/* Eat multiple semicolons, detect
|
||||
* whether it means something special */
|
||||
while (1) {
|
||||
ch = i_peek(input);
|
||||
ch = i_peek_and_eat_bkslash_nl(input);
|
||||
if (ch != ';')
|
||||
break;
|
||||
ch = i_getch(input);
|
||||
@ -5397,6 +5403,8 @@ static struct pipe *parse_stream(char **pstring,
|
||||
if (done_word(&dest, &ctx)) {
|
||||
goto parse_error;
|
||||
}
|
||||
if (next == '\\')
|
||||
next = i_peek_and_eat_bkslash_nl(input);
|
||||
if (next == '&') {
|
||||
ch = i_getch(input);
|
||||
nommu_addchr(&ctx.as_string, ch);
|
||||
@ -5413,6 +5421,8 @@ static struct pipe *parse_stream(char **pstring,
|
||||
if (ctx.ctx_res_w == RES_MATCH)
|
||||
break; /* we are in case's "word | word)" */
|
||||
#endif
|
||||
if (next == '\\')
|
||||
next = i_peek_and_eat_bkslash_nl(input);
|
||||
if (next == '|') { /* || */
|
||||
ch = i_getch(input);
|
||||
nommu_addchr(&ctx.as_string, ch);
|
||||
|
4
shell/hush_test/hush-parsing/bkslash_newline1.right
Normal file
4
shell/hush_test/hush-parsing/bkslash_newline1.right
Normal file
@ -0,0 +1,4 @@
|
||||
and1
|
||||
and2
|
||||
or1
|
||||
ok
|
8
shell/hush_test/hush-parsing/bkslash_newline1.tests
Executable file
8
shell/hush_test/hush-parsing/bkslash_newline1.tests
Executable file
@ -0,0 +1,8 @@
|
||||
echo and1 &\
|
||||
& echo and2
|
||||
|
||||
echo or1 |\
|
||||
| echo NOT SHOWN
|
||||
|
||||
case w in a) echo SKIP;\
|
||||
; w) echo ok;; esac;
|
4
shell/hush_test/hush-parsing/bkslash_newline2.right
Normal file
4
shell/hush_test/hush-parsing/bkslash_newline2.right
Normal file
@ -0,0 +1,4 @@
|
||||
Line with one backslash:
|
||||
\
|
||||
|
||||
Ok:0
|
4
shell/hush_test/hush-parsing/bkslash_newline2.tests
Executable file
4
shell/hush_test/hush-parsing/bkslash_newline2.tests
Executable file
@ -0,0 +1,4 @@
|
||||
echo Line with one backslash:
|
||||
echo '\
|
||||
'
|
||||
echo Ok:$?
|
Loading…
Reference in New Issue
Block a user