← Commit list

f17360752

Denis Vlasenko
Denis Vlasenko
2008-07-31
FAILED Duration: 20s

Subject

hush: fix "case ... in word)..."

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

shell/hush.c+11 -1
@@ -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 <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);
}
}
@@ -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
) {
shell/hush_test/hush-misc/case1.right+1 -0
@@ -1,4 +1,5 @@
OK_1
+OK_1
OK_21
OK_22
OK_23
shell/hush_test/hush-misc/case1.tests+8 -0
@@ -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;