diff --git a/reactos/base/shell/cmd/batch.c b/reactos/base/shell/cmd/batch.c index 7ed024c113e..6b6c95cb306 100644 --- a/reactos/base/shell/cmd/batch.c +++ b/reactos/base/shell/cmd/batch.c @@ -88,7 +88,7 @@ LPTSTR FindArg(TCHAR Char, BOOL *IsParam0) TRACE ("FindArg: (%d)\n", n); - if (bc == NULL || n < 0 || n > 9) + if (n < 0 || n > 9) return NULL; n += bc->shiftlevel; @@ -167,38 +167,32 @@ LPTSTR BatchParams (LPTSTR s1, LPTSTR s2) * message */ -VOID ExitBatch (LPTSTR msg) +VOID ExitBatch() { - TRACE ("ExitBatch: (\'%s\')\n", debugstr_aw(msg)); + TRACE ("ExitBatch\n"); - if (bc != NULL) + if (bc->hBatchFile) { - if (bc->hBatchFile) - { - CloseHandle (bc->hBatchFile); - bc->hBatchFile = INVALID_HANDLE_VALUE; - } - - if (bc->raw_params) - cmd_free(bc->raw_params); - - if (bc->params) - cmd_free(bc->params); - - UndoRedirection(bc->RedirList, NULL); - FreeRedirection(bc->RedirList); - - /* Preserve echo state across batch calls */ - bEcho = bc->bEcho; - - while (bc->setlocal) - cmd_endlocal(_T("")); - - bc = bc->prev; + CloseHandle (bc->hBatchFile); + bc->hBatchFile = INVALID_HANDLE_VALUE; } - if (msg && *msg) - ConOutPrintf (_T("%s\n"), msg); + if (bc->raw_params) + cmd_free(bc->raw_params); + + if (bc->params) + cmd_free(bc->params); + + UndoRedirection(bc->RedirList, NULL); + FreeRedirection(bc->RedirList); + + /* Preserve echo state across batch calls */ + bEcho = bc->bEcho; + + while (bc->setlocal) + cmd_endlocal(_T("")); + + bc = bc->prev; } @@ -212,6 +206,7 @@ VOID ExitBatch (LPTSTR msg) BOOL Batch (LPTSTR fullname, LPTSTR firstword, LPTSTR param, PARSED_COMMAND *Cmd) { BATCH_CONTEXT new; + LPFOR_CONTEXT saved_fc; HANDLE hFile; SetLastError(0); @@ -228,9 +223,6 @@ BOOL Batch (LPTSTR fullname, LPTSTR firstword, LPTSTR param, PARSED_COMMAND *Cmd return FALSE; } - /* Kill any and all FOR contexts */ - fc = NULL; - if (bc != NULL && Cmd == bc->current) { /* Then we are transferring to another batch */ @@ -252,7 +244,7 @@ BOOL Batch (LPTSTR fullname, LPTSTR firstword, LPTSTR param, PARSED_COMMAND *Cmd /* Get its SETLOCAL stack so it can be migrated to the new context */ setlocal = bc->setlocal; bc->setlocal = NULL; - ExitBatch(NULL); + ExitBatch(); } /* Create a new context. This function will not @@ -285,6 +277,10 @@ BOOL Batch (LPTSTR fullname, LPTSTR firstword, LPTSTR param, PARSED_COMMAND *Cmd if (*firstword == _T(':')) cmd_goto(firstword); + /* If we are calling from inside a FOR, hide the FOR variables */ + saved_fc = fc; + fc = NULL; + /* If we have created a new context, don't return * until this batch file has completed. */ while (bc == &new && !bExit) @@ -310,6 +306,7 @@ BOOL Batch (LPTSTR fullname, LPTSTR firstword, LPTSTR param, PARSED_COMMAND *Cmd TRACE ("Batch: returns TRUE\n"); + fc = saved_fc; return TRUE; } @@ -317,9 +314,6 @@ VOID AddBatchRedirection(REDIRECTION **RedirList) { REDIRECTION **ListEnd; - if(!bc) - return; - /* Prepend the list to the batch context's list */ ListEnd = RedirList; while (*ListEnd) @@ -343,17 +337,13 @@ VOID AddBatchRedirection(REDIRECTION **RedirList) LPTSTR ReadBatchLine () { - /* No batch */ - if (bc == NULL) - return NULL; - TRACE ("ReadBatchLine ()\n"); /* User halt */ if (CheckCtrlBreak (BREAK_BATCHFILE)) { while (bc) - ExitBatch (NULL); + ExitBatch(); return NULL; } @@ -361,7 +351,7 @@ LPTSTR ReadBatchLine () { TRACE ("ReadBatchLine(): Reached EOF!\n"); /* End of file.... */ - ExitBatch (NULL); + ExitBatch(); return NULL; } diff --git a/reactos/base/shell/cmd/batch.h b/reactos/base/shell/cmd/batch.h index bdebedc8623..63a4376f3a0 100644 --- a/reactos/base/shell/cmd/batch.h +++ b/reactos/base/shell/cmd/batch.h @@ -46,7 +46,7 @@ extern TCHAR textline[BATCH_BUFFSIZE]; /* Buffer for reading Batch file lines */ LPTSTR FindArg (TCHAR, BOOL *); LPTSTR BatchParams (LPTSTR, LPTSTR); -VOID ExitBatch (LPTSTR); +VOID ExitBatch (); BOOL Batch (LPTSTR, LPTSTR, LPTSTR, PARSED_COMMAND *); LPTSTR ReadBatchLine(); VOID AddBatchRedirection(REDIRECTION **); diff --git a/reactos/base/shell/cmd/goto.c b/reactos/base/shell/cmd/goto.c index 21217103f1b..192022713e7 100644 --- a/reactos/base/shell/cmd/goto.c +++ b/reactos/base/shell/cmd/goto.c @@ -38,7 +38,6 @@ INT cmd_goto (LPTSTR param) { - TCHAR szMsg[RC_STRING_MAX_SIZE]; LPTSTR tmp, tmp2; LONG lNewPosHigh = 0; @@ -58,8 +57,8 @@ INT cmd_goto (LPTSTR param) if (*param == _T('\0')) { - LoadString(CMD_ModuleHandle, STRING_GOTO_ERROR1, szMsg, RC_STRING_MAX_SIZE); - ExitBatch(szMsg); + ConErrResPrintf(STRING_GOTO_ERROR1); + ExitBatch(); return 1; } @@ -117,7 +116,7 @@ INT cmd_goto (LPTSTR param) } ConErrResPrintf(STRING_GOTO_ERROR2, param); - ExitBatch(NULL); + ExitBatch(); return 1; } diff --git a/reactos/base/shell/cmd/internal.c b/reactos/base/shell/cmd/internal.c index 75836db3305..6e1c9d6f55c 100644 --- a/reactos/base/shell/cmd/internal.c +++ b/reactos/base/shell/cmd/internal.c @@ -665,7 +665,7 @@ INT CommandExit (LPTSTR param) param++; if (_istdigit(*param)) nErrorLevel = _ttoi(param); - ExitBatch (NULL); + ExitBatch(); } else