[CMD] Don't reset bCtrlBreak too early.
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sat, 28 Apr 2018 22:53:49 +0000 (00:53 +0200)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sat, 28 Apr 2018 22:53:49 +0000 (00:53 +0200)
This allows to break commands such as:

C:\ReactOS\system32> for %f in (*.*) do dir

as one would expect: stop the currently running 'dir' and the 'for'.
"bCtrlBreak" doesn't need to be volatile too.

base/shell/cmd/cmd.c
base/shell/cmd/cmd.h
base/shell/cmd/misc.c

index d8414e0..25ddae0 100644 (file)
@@ -151,7 +151,7 @@ typedef NTSTATUS (WINAPI *NtReadVirtualMemoryProc)(HANDLE, PVOID, PVOID, ULONG,
 
 BOOL bExit = FALSE;       /* indicates EXIT was typed */
 BOOL bCanExit = TRUE;     /* indicates if this shell is exitable */
-volatile BOOL bCtrlBreak = FALSE;  /* Ctrl-Break or Ctrl-C hit */
+BOOL bCtrlBreak = FALSE;  /* Ctrl-Break or Ctrl-C hit */
 BOOL bIgnoreEcho = FALSE; /* Set this to TRUE to prevent a newline, when executing a command */
 static BOOL bWaitForCommand = FALSE; /* When we are executing something passed on the commandline after /c or /k */
 INT  nErrorLevel = 0;     /* Errorlevel of last launched external program */
@@ -1448,6 +1448,9 @@ ProcessInput(VOID)
 
     while (!bCanExit || !bExit)
     {
+        /* Reset the Ctrl-Break / Ctrl-C state */
+        bCtrlBreak = FALSE;
+
         Cmd = ParseCommand(NULL);
         if (!Cmd)
             continue;
@@ -1500,7 +1503,7 @@ BOOL WINAPI BreakHandler(DWORD dwCtrlType)
 
     /* FIXME: Handle batch files */
 
-    //ConOutPrintf(_T("^C"));
+    // ConOutPrintf(_T("^C"));
 
     return TRUE;
 }
index 285916c..6a2f680 100644 (file)
@@ -47,7 +47,7 @@
 extern LPTSTR lpOriginalEnvironment;
 extern WORD   wColor;
 extern WORD   wDefColor;
-extern volatile BOOL   bCtrlBreak;
+extern BOOL   bCtrlBreak;
 extern BOOL   bIgnoreEcho;
 extern BOOL   bExit;
 extern BOOL   bDisableBatchEcho;
index d7d7af3..a6d2f54 100644 (file)
@@ -129,7 +129,7 @@ VOID GetPathCase( TCHAR * Path, TCHAR * OutPath)
  * Check if Ctrl-Break was pressed during the last calls
  */
 
-BOOL CheckCtrlBreak (INT mode)
+BOOL CheckCtrlBreak(INT mode)
 {
     static BOOL bLeaveAll = FALSE; /* leave all batch files */
     TCHAR options[4]; /* Yes, No, All */
@@ -138,10 +138,11 @@ BOOL CheckCtrlBreak (INT mode)
     switch (mode)
     {
         case BREAK_OUTOFBATCH:
-            bLeaveAll = 0;
+            bLeaveAll = FALSE;
             return FALSE;
 
         case BREAK_BATCHFILE:
+        {
             if (bLeaveAll)
                 return TRUE;
 
@@ -160,11 +161,15 @@ BOOL CheckCtrlBreak (INT mode)
             ConOutChar(_T('\n'));
 
             if (c == options[1])
-                return bCtrlBreak = FALSE; /* ignore */
+            {
+                bCtrlBreak = FALSE; /* ignore */
+                return FALSE;
+            }
 
             /* leave all batch files */
             bLeaveAll = ((c == options[2]) || (c == _T('\3')));
             break;
+        }
 
         case BREAK_INPUT:
             if (!bCtrlBreak)
@@ -173,7 +178,6 @@ BOOL CheckCtrlBreak (INT mode)
     }
 
     /* state processed */
-    bCtrlBreak = FALSE;
     return TRUE;
 }