
A || or && at the end of a command should behave just like an if statment that is not complete.
Signed-off-by: Joe Hershberger joe.hershberger@ni.com --- common/hush.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/common/hush.c b/common/hush.c index 4c84c2f..43edcfa 100644 --- a/common/hush.c +++ b/common/hush.c @@ -214,6 +214,7 @@ struct p_context { int old_flag; /* for figuring out valid reserved words */ struct p_context *stack; int type; /* define type of parser : ";$" common or special symbol */ + pipe_style last_followup; /* PIPE_BG, PIPE_SEQ, PIPE_OR, PIPE_AND */ /* How about quoting status? */ };
@@ -2534,7 +2535,7 @@ static int done_command(struct p_context *ctx) ) { #endif debug_printf("done_command: skipping null command\n"); - return 0; + return 1; } else if (prog) { pi->num_progs++; debug_printf("done_command: num_progs incremented to %d\n",pi->num_progs); @@ -2567,9 +2568,15 @@ static int done_command(struct p_context *ctx) static int done_pipe(struct p_context *ctx, pipe_style type) { struct pipe *new_p; - done_command(ctx); /* implicit closure of previous command */ + int ret; + + ret = done_command(ctx); /* implicit closure of previous command */ + /* The current command is null so don't allocate a new one */ + if (ret && type == PIPE_SEQ) + return ret; debug_printf("done_pipe, type %d\n", type); ctx->pipe->followup = type; + ctx->last_followup = type; ctx->pipe->r_mode = ctx->w; new_p=new_pipe(); ctx->pipe->next = new_p; @@ -2962,7 +2969,10 @@ int parse_stream(o_string *dest, struct p_context *ctx, if (end_trigger != '\0' && ch=='\n') done_pipe(ctx,PIPE_SEQ); } - if (ch == end_trigger && !dest->quote && ctx->w==RES_NONE) { + if (ch == end_trigger && !dest->quote && + ctx->w == RES_NONE && + ctx->last_followup != PIPE_AND && + ctx->last_followup != PIPE_OR) { debug_printf("leaving parse_stream (triggered)\n"); return 0; }