https://git.reactos.org/?p=reactos.git;a=commitdiff;h=87a5403318f4b64f2d8b0c56ebc69b89889ad6c8

commit 87a5403318f4b64f2d8b0c56ebc69b89889ad6c8
Author:     Hermès Bélusca-Maïto <[email protected]>
AuthorDate: Sat Jul 18 23:41:56 2020 +0200
Commit:     Hermès Bélusca-Maïto <[email protected]>
CommitDate: Wed Sep 23 00:22:47 2020 +0200

    [CMD] Add a MSCMD_BATCH_ECHO define for enabling Windows' CMD.EXE way of 
preserving/restoring the echo flag across batch calls.
    
    Observation shows that this is done only when the top-level batch file
    is being run (and then terminates); the echo flag is not restored to its
    previous state when a child batch file terminates and gives main back to
    its parent batch.
---
 base/shell/cmd/batch.c | 20 ++++++++++++++++++++
 base/shell/cmd/batch.h | 10 ++++++++++
 2 files changed, 30 insertions(+)

diff --git a/base/shell/cmd/batch.c b/base/shell/cmd/batch.c
index 5015bd338ea..1876b84deab 100644
--- a/base/shell/cmd/batch.c
+++ b/base/shell/cmd/batch.c
@@ -66,6 +66,10 @@
 BATCH_TYPE BatType = NONE;
 PBATCH_CONTEXT bc = NULL;
 
+#ifdef MSCMD_BATCH_ECHO
+BOOL bBcEcho = TRUE;
+#endif
+
 BOOL bEcho = TRUE;  /* The echo flag */
 
 /* Buffer for reading Batch file lines */
@@ -195,8 +199,10 @@ VOID ExitBatch(VOID)
     UndoRedirection(bc->RedirList, NULL);
     FreeRedirection(bc->RedirList);
 
+#ifndef MSCMD_BATCH_ECHO
     /* Preserve echo state across batch calls */
     bEcho = bc->bEcho;
+#endif
 
     while (bc->setlocal)
         cmd_endlocal(_T(""));
@@ -213,6 +219,10 @@ VOID ExitBatch(VOID)
     {
         CheckCtrlBreak(BREAK_OUTOFBATCH);
         BatType = NONE;
+
+#ifdef MSCMD_BATCH_ECHO
+        bEcho = bBcEcho;
+#endif
     }
 }
 
@@ -352,7 +362,9 @@ INT Batch(LPTSTR fullname, LPTSTR firstword, LPTSTR param, 
PARSED_COMMAND *Cmd)
     }
 
     bc->mempos = 0;    /* Go to the beginning of the batch file */
+#ifndef MSCMD_BATCH_ECHO
     bc->bEcho = bEcho; /* Preserve echo across batch calls */
+#endif
     for (i = 0; i < 10; i++)
         bc->shiftlevel[i] = i;
 
@@ -381,6 +393,10 @@ INT Batch(LPTSTR fullname, LPTSTR firstword, LPTSTR param, 
PARSED_COMMAND *Cmd)
         {
             BatType = CMD_TYPE;
         }
+
+#ifdef MSCMD_BATCH_ECHO
+        bBcEcho = bEcho;
+#endif
     }
 
     /* Check if this is a "CALL :label" */
@@ -424,6 +440,10 @@ INT Batch(LPTSTR fullname, LPTSTR firstword, LPTSTR param, 
PARSED_COMMAND *Cmd)
     {
         /* Reset the top-level batch context type */
         BatType = NONE;
+
+#ifdef MSCMD_BATCH_ECHO
+        bEcho = bBcEcho;
+#endif
     }
 
     /* Restore the FOR variables */
diff --git a/base/shell/cmd/batch.h b/base/shell/cmd/batch.h
index 25b8857b1c3..982965c794a 100644
--- a/base/shell/cmd/batch.h
+++ b/base/shell/cmd/batch.h
@@ -19,6 +19,10 @@ typedef enum _BATCH_TYPE
     CMD_TYPE    /* New-style NT OS/2 batch file */
 } BATCH_TYPE;
 
+
+/* Enable this define for Windows' CMD batch-echo behaviour compatibility */
+#define MSCMD_BATCH_ECHO
+
 typedef struct _BATCH_CONTEXT
 {
     struct _BATCH_CONTEXT *prev;
@@ -30,7 +34,9 @@ typedef struct _BATCH_CONTEXT
     LPTSTR params;
     LPTSTR raw_params;  /* Holds the raw params given by the input */
     INT    shiftlevel[10];
+#ifndef MSCMD_BATCH_ECHO
     BOOL   bEcho;       /* Preserve echo flag across batch calls */
+#endif
     REDIRECTION *RedirList;
     PARSED_COMMAND *current;
     struct _SETLOCAL *setlocal;
@@ -53,6 +59,10 @@ extern BATCH_TYPE BatType;
 extern PBATCH_CONTEXT bc;
 extern PFOR_CONTEXT fc;
 
+#ifdef MSCMD_BATCH_ECHO
+extern BOOL bBcEcho;
+#endif
+
 extern BOOL bEcho;       /* The echo flag */
 
 #define BATCH_BUFFSIZE  8192

Reply via email to