From f173607520e0455d267a7a4100e5018f30000c56 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Thu, 31 Jul 2008 10:09:26 +0000 Subject: [PATCH] hush: fix "case ... in word)..." --- shell/hush.c | 12 +++++++++++- shell/hush_test/hush-misc/case1.right | 1 + shell/hush_test/hush-misc/case1.tests | 8 ++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/shell/hush.c b/shell/hush.c index 564b62c54..8be0ecf1c 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -3659,6 +3659,15 @@ static int parse_stream(o_string *dest, struct p_context *ctx, * a newline as a command separator. * [why we don't handle it exactly like ';'? --vda] */ if (end_trigger && ch == '\n') { +#if ENABLE_HUSH_CASE + /* "case ... in 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); } } @@ -3839,7 +3848,7 @@ static int parse_stream(o_string *dest, struct p_context *ctx, done_word(dest, ctx); #if ENABLE_HUSH_CASE if (ctx->ctx_res_w == RES_MATCH) - break; + break; /* we are in case's "word | word)" */ #endif if (next == '|') { i_getch(input); @@ -3853,6 +3862,7 @@ static int parse_stream(o_string *dest, struct p_context *ctx, break; case '(': #if ENABLE_HUSH_CASE + /* "case... in [(]word)..." - skip '(' */ if (dest->length == 0 // && argv[0] == NULL && ctx->ctx_res_w == RES_MATCH ) { diff --git a/shell/hush_test/hush-misc/case1.right b/shell/hush_test/hush-misc/case1.right index 9b88658af..e9e371ac0 100644 --- a/shell/hush_test/hush-misc/case1.right +++ b/shell/hush_test/hush-misc/case1.right @@ -1,4 +1,5 @@ OK_1 +OK_1 OK_21 OK_22 OK_23 diff --git a/shell/hush_test/hush-misc/case1.tests b/shell/hush_test/hush-misc/case1.tests index 15f60f3a6..0174893ec 100755 --- a/shell/hush_test/hush-misc/case1.tests +++ b/shell/hush_test/hush-misc/case1.tests @@ -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 + 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_22;; w) echo WRONG;; esac;