diff options
-rw-r--r-- | Src/cond.c | 7 | ||||
-rw-r--r-- | Src/parse.c | 13 | ||||
-rw-r--r-- | Test/04redirect.ztst | 5 | ||||
-rw-r--r-- | Test/07cond.ztst | 9 |
4 files changed, 28 insertions, 6 deletions
diff --git a/Src/cond.c b/Src/cond.c index 4a78bd5e7..1df5b5617 100644 --- a/Src/cond.c +++ b/Src/cond.c @@ -43,7 +43,8 @@ evalcond(Estate state) { struct stat *st; char *left, *right = NULL; - wordcode code = *state->pc++; + Wordcode pcode = state->pc++; + wordcode code = *pcode; int ctype = WC_COND_TYPE(code); switch (ctype) { @@ -57,7 +58,7 @@ evalcond(Estate state) fprintf(stderr, " %s", condstr[ctype]); return evalcond(state); } else { - state->pc += WC_COND_SKIP(code) - 1; + state->pc = pcode + (WC_COND_SKIP(code) + 1); return 0; } case COND_OR: @@ -66,7 +67,7 @@ evalcond(Estate state) fprintf(stderr, " %s", condstr[ctype]); return evalcond(state); } else { - state->pc += WC_COND_SKIP(code) - 1; + state->pc = pcode + (WC_COND_SKIP(code) + 1); return 1; } case COND_MOD: diff --git a/Src/parse.c b/Src/parse.c index 11aa0b60f..ecb88536b 100644 --- a/Src/parse.c +++ b/Src/parse.c @@ -1727,7 +1727,7 @@ yyerror(int noerr) * Word code layout: * * WC_END - * - only used for empty functions + * - end of program code * * WC_LIST * - data contains type (sync, ...) @@ -2217,6 +2217,14 @@ ecomp(struct node *n) } } break; + case N_COND: + eccond((Cond) n); + break; +#ifdef DEBUG + default: + dputs("BUG: node type not handled in ecomp()."); + break; +#endif } } @@ -2335,8 +2343,7 @@ execompile(List list) ecsoffs = ecnpats = 0; ec(list); - if (!ecused) - ecadd(WCB_END()); + ecadd(WCB_END()); ret = (Eprog) zhalloc(sizeof(*ret)); ret->len = ((ecnpats * sizeof(Patprog)) + diff --git a/Test/04redirect.ztst b/Test/04redirect.ztst index 37b0915a0..d7156e856 100644 --- a/Test/04redirect.ztst +++ b/Test/04redirect.ztst @@ -191,6 +191,11 @@ 1:null redir with NULLCMD unset ?ZTST_execchunk:2: redirection with no command + echo this should still work >out1 + print "$(<out1)" +0:null redir in $(...) with NULLCMD unset +>this should still work + READNULLCMD=cat print cat input >out1 <out1 diff --git a/Test/07cond.ztst b/Test/07cond.ztst index aba12030b..f4127072f 100644 --- a/Test/07cond.ztst +++ b/Test/07cond.ztst @@ -140,3 +140,12 @@ [[ -e /dev/fd/0 ]] 0:/dev/fd support in conds + + [[ ( -z foo && -z foo ) || -z foo ]] +1:complex conds with skipping + + [ '' != bar -a '' = '' ] +0:strings with `[' builtin + + [ `echo 0` -lt `echo 1` ] +0:substituion in `[' builtin |