ash,hush: handle a few more bkslash-newline cases

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2018-04-01 03:04:55 +02:00
parent 32e183e63e
commit 1e5111b0f8
10 changed files with 53 additions and 3 deletions

View File

@ -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 {

View File

@ -0,0 +1,4 @@
and1
and2
or1
ok

View File

@ -0,0 +1,8 @@
echo and1 &\
& echo and2
echo or1 |\
| echo NOT SHOWN
case w in a) echo SKIP;\
; w) echo ok;; esac;

View File

@ -0,0 +1,4 @@
Line with one backslash:
\
Ok:0

View File

@ -0,0 +1,4 @@
echo Line with one backslash:
echo '\
'
echo Ok:$?

View File

@ -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);

View File

@ -0,0 +1,4 @@
and1
and2
or1
ok

View File

@ -0,0 +1,8 @@
echo and1 &\
& echo and2
echo or1 |\
| echo NOT SHOWN
case w in a) echo SKIP;\
; w) echo ok;; esac;

View File

@ -0,0 +1,4 @@
Line with one backslash:
\
Ok:0

View File

@ -0,0 +1,4 @@
echo Line with one backslash:
echo '\
'
echo Ok:$?