diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2018-05-11 23:41:25 +0800 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2018-05-15 13:57:27 +0800 |
commit | 469c5fd4f57622b1a6571172898ab29430319d4a (patch) | |
tree | 028af010f14484aa3263d68e5cb262cba60fdb60 /src | |
parent | Release 0.5.10.1. (diff) | |
download | dash-469c5fd4f57622b1a6571172898ab29430319d4a.tar.gz dash-469c5fd4f57622b1a6571172898ab29430319d4a.zip |
parser: Fix incorrect eating of backslash newlines
With the introduction of synstack->syntax, a number of references to the syntax variable was missed during the conversion. This causes backslash newlines to be incorrectly removed in single quote context. This patch also combines these calls into a new helper function pgetc_top. Fixes: ab1cecb40478 ("parser: Add syntax stack for recursive...") Reported-by: Leah Neukirchen <leah@vuxu.org> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'src')
-rw-r--r-- | src/parser.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/parser.c b/src/parser.c index 8e40781..8bd3db4 100644 --- a/src/parser.c +++ b/src/parser.c @@ -853,6 +853,11 @@ static int pgetc_eatbnl(void) return c; } +static int pgetc_top(struct synstack *stack) +{ + return stack->syntax == SQSYNTAX ? pgetc() : pgetc_eatbnl(); +} + static void synstack_push(struct synstack **stack, struct synstack *next, const char *syntax) { @@ -915,7 +920,7 @@ readtoken1(int firstc, char const *syntax, char *eofmark, int striptabs) attyline(); if (synstack->syntax == BASESYNTAX) return readtoken(); - c = syntax == SQSYNTAX ? pgetc() : pgetc_eatbnl(); + c = pgetc_top(synstack); goto loop; } #endif @@ -929,7 +934,7 @@ readtoken1(int firstc, char const *syntax, char *eofmark, int striptabs) goto endword; /* exit outer loop */ USTPUTC(c, out); nlprompt(); - c = syntax == SQSYNTAX ? pgetc() : pgetc_eatbnl(); + c = pgetc_top(synstack); goto loop; /* continue outer loop */ case CWORD: USTPUTC(c, out); @@ -1056,7 +1061,7 @@ toggledq: USTPUTC(c, out); } } - c = syntax == SQSYNTAX ? pgetc() : pgetc_eatbnl(); + c = pgetc_top(synstack); } } endword: |