cmd: Move WCMD_part_execute function to avoid forward declaration
Frédéric Delanoy
frederic.delanoy at gmail.com
Thu Nov 17 18:25:45 CST 2011
---
programs/cmd/builtins.c | 203 +++++++++++++++++++++++------------------------
1 files changed, 99 insertions(+), 104 deletions(-)
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c
index 59fbc8e..bb64b66 100644
--- a/programs/cmd/builtins.c
+++ b/programs/cmd/builtins.c
@@ -41,10 +41,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(cmd);
-static void WCMD_part_execute(CMD_LIST **commands, const WCHAR *firstcmd,
- const WCHAR *variable, const WCHAR *value,
- BOOL isIF, BOOL conditionTRUE);
-
static struct env_stack *saved_environment;
struct env_stack *pushd_directories;
@@ -922,6 +918,105 @@ void WCMD_echo (const WCHAR *command)
HeapFree(GetProcessHeap(), 0, trimmed);
}
+/*****************************************************************************
+ * WCMD_part_execute
+ *
+ * Execute a command, and any && or bracketed follow on to the command. The
+ * first command to be executed may not be at the front of the
+ * commands->thiscommand string (eg. it may point after a DO or ELSE)
+ */
+static void WCMD_part_execute(CMD_LIST **cmdList, const WCHAR *firstcmd,
+ const WCHAR *variable, const WCHAR *value,
+ BOOL isIF, BOOL conditionTRUE)
+{
+ CMD_LIST *curPosition = *cmdList;
+ int myDepth = (*cmdList)->bracketDepth;
+
+ WINE_TRACE("cmdList(%p), firstCmd(%p), with variable '%s'='%s', doIt(%d)\n",
+ cmdList, wine_dbgstr_w(firstcmd),
+ wine_dbgstr_w(variable), wine_dbgstr_w(value),
+ conditionTRUE);
+
+ /* Skip leading whitespace between condition and the command */
+ while (firstcmd && *firstcmd && (*firstcmd==' ' || *firstcmd=='\t')) firstcmd++;
+
+ /* Process the first command, if there is one */
+ if (conditionTRUE && firstcmd && *firstcmd) {
+ WCHAR *command = WCMD_strdupW(firstcmd);
+ WCMD_execute (firstcmd, (*cmdList)->redirects, variable, value, cmdList);
+ HeapFree(GetProcessHeap(), 0, command);
+ }
+
+
+ /* If it didn't move the position, step to next command */
+ if (curPosition == *cmdList) *cmdList = (*cmdList)->nextcommand;
+
+ /* Process any other parts of the command */
+ if (*cmdList) {
+ BOOL processThese = TRUE;
+
+ if (isIF) processThese = conditionTRUE;
+
+ while (*cmdList) {
+ static const WCHAR ifElse[] = {'e','l','s','e'};
+
+ /* execute all appropriate commands */
+ curPosition = *cmdList;
+
+ WINE_TRACE("Processing cmdList(%p) - delim(%d) bd(%d / %d)\n",
+ *cmdList,
+ (*cmdList)->prevDelim,
+ (*cmdList)->bracketDepth, myDepth);
+
+ /* Execute any statements appended to the line */
+ /* FIXME: Only if previous call worked for && or failed for || */
+ if ((*cmdList)->prevDelim == CMD_ONFAILURE ||
+ (*cmdList)->prevDelim == CMD_ONSUCCESS) {
+ if (processThese && (*cmdList)->command) {
+ WCMD_execute ((*cmdList)->command, (*cmdList)->redirects, variable,
+ value, cmdList);
+ }
+ if (curPosition == *cmdList) *cmdList = (*cmdList)->nextcommand;
+
+ /* Execute any appended to the statement with (...) */
+ } else if ((*cmdList)->bracketDepth > myDepth) {
+ if (processThese) {
+ *cmdList = WCMD_process_commands(*cmdList, TRUE, variable, value);
+ WINE_TRACE("Back from processing commands, (next = %p)\n", *cmdList);
+ }
+ if (curPosition == *cmdList) *cmdList = (*cmdList)->nextcommand;
+
+ /* End of the command - does 'ELSE ' follow as the next command? */
+ } else {
+ if (isIF
+ && WCMD_keyword_ws_found(ifElse, sizeof(ifElse)/sizeof(ifElse[0]),
+ (*cmdList)->command)) {
+
+ /* Swap between if and else processing */
+ processThese = !processThese;
+
+ /* Process the ELSE part */
+ if (processThese) {
+ const int keyw_len = sizeof(ifElse)/sizeof(ifElse[0]) + 1;
+ WCHAR *cmd = ((*cmdList)->command) + keyw_len;
+
+ /* Skip leading whitespace between condition and the command */
+ while (*cmd && (*cmd==' ' || *cmd=='\t')) cmd++;
+ if (*cmd) {
+ WCMD_execute (cmd, (*cmdList)->redirects, variable, value, cmdList);
+ }
+ }
+ if (curPosition == *cmdList) *cmdList = (*cmdList)->nextcommand;
+ } else {
+ WINE_TRACE("Found end of this IF statement (next = %p)\n", *cmdList);
+ break;
+ }
+ }
+ }
+ }
+ return;
+}
+
/**************************************************************************
* WCMD_for
*
@@ -1249,106 +1344,6 @@ void WCMD_for (WCHAR *p, CMD_LIST **cmdList) {
if (cmdEnd && cmdEnd->command == NULL) *cmdList = cmdEnd->nextcommand;
}
-
-/*****************************************************************************
- * WCMD_part_execute
- *
- * Execute a command, and any && or bracketed follow on to the command. The
- * first command to be executed may not be at the front of the
- * commands->thiscommand string (eg. it may point after a DO or ELSE)
- */
-static void WCMD_part_execute(CMD_LIST **cmdList, const WCHAR *firstcmd,
- const WCHAR *variable, const WCHAR *value,
- BOOL isIF, BOOL conditionTRUE) {
-
- CMD_LIST *curPosition = *cmdList;
- int myDepth = (*cmdList)->bracketDepth;
-
- WINE_TRACE("cmdList(%p), firstCmd(%p), with variable '%s'='%s', doIt(%d)\n",
- cmdList, wine_dbgstr_w(firstcmd),
- wine_dbgstr_w(variable), wine_dbgstr_w(value),
- conditionTRUE);
-
- /* Skip leading whitespace between condition and the command */
- while (firstcmd && *firstcmd && (*firstcmd==' ' || *firstcmd=='\t')) firstcmd++;
-
- /* Process the first command, if there is one */
- if (conditionTRUE && firstcmd && *firstcmd) {
- WCHAR *command = WCMD_strdupW(firstcmd);
- WCMD_execute (firstcmd, (*cmdList)->redirects, variable, value, cmdList);
- HeapFree(GetProcessHeap(), 0, command);
- }
-
-
- /* If it didn't move the position, step to next command */
- if (curPosition == *cmdList) *cmdList = (*cmdList)->nextcommand;
-
- /* Process any other parts of the command */
- if (*cmdList) {
- BOOL processThese = TRUE;
-
- if (isIF) processThese = conditionTRUE;
-
- while (*cmdList) {
- static const WCHAR ifElse[] = {'e','l','s','e'};
-
- /* execute all appropriate commands */
- curPosition = *cmdList;
-
- WINE_TRACE("Processing cmdList(%p) - delim(%d) bd(%d / %d)\n",
- *cmdList,
- (*cmdList)->prevDelim,
- (*cmdList)->bracketDepth, myDepth);
-
- /* Execute any statements appended to the line */
- /* FIXME: Only if previous call worked for && or failed for || */
- if ((*cmdList)->prevDelim == CMD_ONFAILURE ||
- (*cmdList)->prevDelim == CMD_ONSUCCESS) {
- if (processThese && (*cmdList)->command) {
- WCMD_execute ((*cmdList)->command, (*cmdList)->redirects, variable,
- value, cmdList);
- }
- if (curPosition == *cmdList) *cmdList = (*cmdList)->nextcommand;
-
- /* Execute any appended to the statement with (...) */
- } else if ((*cmdList)->bracketDepth > myDepth) {
- if (processThese) {
- *cmdList = WCMD_process_commands(*cmdList, TRUE, variable, value);
- WINE_TRACE("Back from processing commands, (next = %p)\n", *cmdList);
- }
- if (curPosition == *cmdList) *cmdList = (*cmdList)->nextcommand;
-
- /* End of the command - does 'ELSE ' follow as the next command? */
- } else {
- if (isIF
- && WCMD_keyword_ws_found(ifElse, sizeof(ifElse)/sizeof(ifElse[0]),
- (*cmdList)->command)) {
-
- /* Swap between if and else processing */
- processThese = !processThese;
-
- /* Process the ELSE part */
- if (processThese) {
- const int keyw_len = sizeof(ifElse)/sizeof(ifElse[0]) + 1;
- WCHAR *cmd = ((*cmdList)->command) + keyw_len;
-
- /* Skip leading whitespace between condition and the command */
- while (*cmd && (*cmd==' ' || *cmd=='\t')) cmd++;
- if (*cmd) {
- WCMD_execute (cmd, (*cmdList)->redirects, variable, value, cmdList);
- }
- }
- if (curPosition == *cmdList) *cmdList = (*cmdList)->nextcommand;
- } else {
- WINE_TRACE("Found end of this IF statement (next = %p)\n", *cmdList);
- break;
- }
- }
- }
- }
- return;
-}
-
/**************************************************************************
* WCMD_give_help
*
--
1.7.7.2
More information about the wine-patches
mailing list