Module: wine Branch: master Commit: 6932e8bd0e063d12338eeaa9526dfd176101fdc8 URL: https://gitlab.winehq.org/wine/wine/-/commit/6932e8bd0e063d12338eeaa9526dfd1...
Author: Eric Pouech epouech@codeweavers.com Date: Mon Jun 24 10:51:27 2024 +0200
cmd: Support help for IF and FOR commands.
Signed-off-by: Eric Pouech epouech@codeweavers.com
---
programs/cmd/wcmdmain.c | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-)
diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 9ad9bc44866..c891e7525b1 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -986,6 +986,16 @@ static const char *debugstr_redirection(const CMD_REDIRECTION *redir) } }
+static CMD_COMMAND *command_create(const WCHAR *ptr, size_t len) +{ + CMD_COMMAND *ret = xalloc(sizeof(CMD_COMMAND)); + + ret->command = xalloc((len + 1) * sizeof(WCHAR)); + memcpy(ret->command, ptr, len * sizeof(WCHAR)); + ret->command[len] = L'\0'; + return ret; +} + static void command_dispose(CMD_COMMAND *cmd) { if (cmd) @@ -2417,6 +2427,13 @@ static BOOL node_builder_parse(struct node_builder *builder, CMD_NODE **result) node_builder_consume(builder); tkn = node_builder_peek_next_token(builder, &pmt); ERROR_IF(tkn != TKN_COMMAND); + if (!wcscmp(pmt.command->command, L"/?")) + { + node_builder_consume(builder); + command_dispose(pmt.command); + left = node_create_single(command_create(L"help if", 7)); + break; + } ERROR_IF(!if_condition_parse(pmt.command->command, &end, &cond)); command_dispose(pmt.command); node_builder_consume(builder); @@ -2451,6 +2468,13 @@ static BOOL node_builder_parse(struct node_builder *builder, CMD_NODE **result) node_builder_consume(builder); tkn = node_builder_peek_next_token(builder, &pmt); ERROR_IF(tkn != TKN_COMMAND); + if (!wcscmp(pmt.command->command, L"/?")) + { + node_builder_consume(builder); + command_dispose(pmt.command); + left = node_create_single(command_create(L"help for", 8)); + break; + } node_builder_consume(builder); for_ctrl = for_control_parse(pmt.command->command); command_dispose(pmt.command); @@ -2627,12 +2651,7 @@ static void lexer_push_command(struct node_builder *builder, } if (*commandLen) { - tkn_pmt.command = xalloc(sizeof(CMD_COMMAND)); - - tkn_pmt.command->command = xalloc((*commandLen + 1) * sizeof(WCHAR)); - memcpy(tkn_pmt.command->command, command, *commandLen * sizeof(WCHAR)); - tkn_pmt.command->command[*commandLen] = L'\0'; - + tkn_pmt.command = command_create(command, *commandLen); node_builder_push_token_parameter(builder, TKN_COMMAND, tkn_pmt); } /* Reset the lengths */