From: Eric Pouech epouech@codeweavers.com
Note: this will allow to keep track of explicit blocks.
Semantically speaking, a block can hold redirection and echo off ('@') attributes, so it will also allow to properly propagate and handle these attributes.
Signed-off-by: Eric Pouech epouech@codeweavers.com --- programs/cmd/wcmd.h | 5 +++++ programs/cmd/wcmdmain.c | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+)
diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index 6810598142c..c14affb55ae 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -56,6 +56,7 @@ typedef enum _CMD_OPERATOR CMD_ONFAILURE, /* || */ CMD_ONSUCCESS, /* && */ CMD_PIPE, /* Single | */ + CMD_BLOCK, /* ( block ) */ CMD_IF, /* IF command */ CMD_FOR, /* FOR command */ } CMD_OPERATOR; @@ -131,6 +132,10 @@ typedef struct _CMD_NODE CMD_FOR_CONTROL for_ctrl; struct _CMD_NODE *do_block; }; + struct /* CMD_BLOCK */ + { + struct _CMD_NODE *block; + }; }; } CMD_NODE;
diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 46b89544221..efbc1da9704 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1648,6 +1648,9 @@ void node_dispose_tree(CMD_NODE *node) for_control_dispose(&node->for_ctrl); node_dispose_tree(node->do_block); break; + case CMD_BLOCK: + node_dispose_tree(node->block); + break; } redirection_dispose_list(node->redirects); free(node); @@ -1701,6 +1704,17 @@ static CMD_NODE *node_create_for(CMD_FOR_CONTROL *for_ctrl, CMD_NODE *do_block) return new; }
+static CMD_NODE *node_create_block(CMD_NODE *block) +{ + CMD_NODE *new = xalloc(sizeof(CMD_NODE)); + + new->op = CMD_BLOCK; + new->block = block; + new->redirects = NULL; + + return new; +} + static void init_msvcrt_io_block(STARTUPINFOW* st) { STARTUPINFOW st_p; @@ -2810,6 +2824,7 @@ static BOOL node_builder_parse(struct node_builder *builder, unsigned precedence left = node_create_binary(CMD_CONCAT, left, right); } node_builder_consume(builder); + left = node_create_block(left); /* if we had redirection before '(', add them up front */ if (redir) { @@ -4231,6 +4246,9 @@ RETURN_CODE node_execute(CMD_NODE *node) case CMD_FOR: return_code = for_control_execute(&node->for_ctrl, node->do_block); break; + case CMD_BLOCK: + return_code = node_execute(node->block); + break; default: FIXME("Unexpected operator %u\n", node->op); return_code = ERROR_INVALID_FUNCTION;