hush: fix "case ... in <newline> word)..."

This commit is contained in:
Denis Vlasenko 2008-07-31 10:09:26 +00:00
parent fbeeb328b8
commit f173607520
3 changed files with 20 additions and 1 deletions

View File

@ -3659,6 +3659,15 @@ static int parse_stream(o_string *dest, struct p_context *ctx,
* a newline as a command separator. * a newline as a command separator.
* [why we don't handle it exactly like ';'? --vda] */ * [why we don't handle it exactly like ';'? --vda] */
if (end_trigger && ch == '\n') { if (end_trigger && ch == '\n') {
#if ENABLE_HUSH_CASE
/* "case ... in <newline> word) ..." -
* newlines are ignored (but ';' wouldn't be) */
if (dest->length == 0 // && argv[0] == NULL
&& ctx->ctx_res_w == RES_MATCH
) {
continue;
}
#endif
done_pipe(ctx, PIPE_SEQ); done_pipe(ctx, PIPE_SEQ);
} }
} }
@ -3839,7 +3848,7 @@ static int parse_stream(o_string *dest, struct p_context *ctx,
done_word(dest, ctx); done_word(dest, ctx);
#if ENABLE_HUSH_CASE #if ENABLE_HUSH_CASE
if (ctx->ctx_res_w == RES_MATCH) if (ctx->ctx_res_w == RES_MATCH)
break; break; /* we are in case's "word | word)" */
#endif #endif
if (next == '|') { if (next == '|') {
i_getch(input); i_getch(input);
@ -3853,6 +3862,7 @@ static int parse_stream(o_string *dest, struct p_context *ctx,
break; break;
case '(': case '(':
#if ENABLE_HUSH_CASE #if ENABLE_HUSH_CASE
/* "case... in [(]word)..." - skip '(' */
if (dest->length == 0 // && argv[0] == NULL if (dest->length == 0 // && argv[0] == NULL
&& ctx->ctx_res_w == RES_MATCH && ctx->ctx_res_w == RES_MATCH
) { ) {

View File

@ -1,4 +1,5 @@
OK_1 OK_1
OK_1
OK_21 OK_21
OK_22 OK_22
OK_23 OK_23

View File

@ -1,5 +1,13 @@
case w in a) echo SKIP;; w) echo OK_1;; w) echo WRONG;; esac case w in a) echo SKIP;; w) echo OK_1;; w) echo WRONG;; esac
case w in
a) echo SKIP;;
w)echo OK_1 ;;
w)
echo WRONG
;;
esac
t=w t=w
case $t in a) echo SKIP;; w) echo OK_21;; w) echo WRONG;; esac; case $t in a) echo SKIP;; w) echo OK_21;; w) echo WRONG;; esac;
case "$t" in a) echo SKIP;; w) echo OK_22;; w) echo WRONG;; esac; case "$t" in a) echo SKIP;; w) echo OK_22;; w) echo WRONG;; esac;