Crtl-C gives a new line when reading input
[reactos.git] / reactos / subsys / system / cmd / cmd.c
index d97f56d..e62a014 100644 (file)
@@ -176,10 +176,45 @@ WORD wDefColor;           /* default color */
 #endif
 
 /*
- *  is character a delimeter when used on first word?
+ * convert
  *
+ * insert commas into a number
  */
+INT
+ConvertULargeInteger (ULARGE_INTEGER num, LPTSTR des, INT len, BOOL bPutSeperator)
+{
+       TCHAR temp[32];
+       INT c = 0;
+       INT n = 0;
+
+       if (num.QuadPart == 0)
+       {
+               des[0] = _T('0');
+               des[1] = _T('\0');
+               n = 1;
+       }
+       else
+       {
+               temp[31] = 0;
+               while (num.QuadPart > 0)
+               {
+                       if ((((c + 1) % (nNumberGroups + 1)) == 0) && (bPutSeperator))
+                               temp[30 - c++] = cThousandSeparator;
+                        temp[30 - c++] = (TCHAR)(num.QuadPart % 10) + _T('0');
+                       num.QuadPart /= 10;
+               }
+
+               for (n = 0; n <= c; n++)
+                       des[n] = temp[31 - c + n];
+       }
 
+       return n;
+}
+
+/*
+ * is character a delimeter when used on first word?
+ *
+ */
 static BOOL IsDelimiter (TCHAR c)
 {
        return (c == _T('/') || c == _T('=') || c == _T('\0') || _istspace (c));
@@ -597,9 +632,12 @@ DoCommand (LPTSTR line)
                }
                */
 
-               /* Skip over whitespace to rest of line */
-               while (_istspace (*rest))
+               /* Skip over whitespace to rest of line, exclude 'echo' command */
+               if (_tcsicmp (com, _T("echo"))) 
+               {
+                       while (_istspace (*rest))
                        rest++;
+               }
 
                /* Scan internal command table */
                for (cmdptr = cmds;; cmdptr++)
@@ -643,6 +681,8 @@ DoCommand (LPTSTR line)
                        }
                }
        }
+       /* Just in case a CTRL+C slipped through a command */
+       bCtrlBreak = FALSE;
        free(com);
 }
 
@@ -1173,7 +1213,9 @@ GetEnvVarOrSpecial ( LPCTSTR varName )
                return ret;
        }
 
-       return _T(""); /* not found - return empty string */
+       GrowIfNecessary(_tcslen(varName) + 2, &ret, &retlen);
+       _stprintf(ret,_T("%%%s%%"),varName);
+       return ret; /* not found - return orginal string */
 }
 
 LPCTSTR
@@ -1315,11 +1357,11 @@ ProcessInput (BOOL bFlag)
                        {
                                UINT envNameLen;
                                LPCTSTR envVal = GetParsedEnvVar ( ip, &envNameLen, bModeSetA );
-                               if ( !envVal )
-                                       return 1;
-                               ip += envNameLen;
-                               cp = _stpcpy ( cp, envVal );
-                               continue;
+                               if ( envVal )
+                               {
+                                       ip += envNameLen;
+                                       cp = _stpcpy ( cp, envVal );
+                               }
                        }
 
                        if (_istcntrl (*ip))
@@ -1407,7 +1449,7 @@ ProcessInput (BOOL bFlag)
                        ConOutPuts (commandline);
                }
 
-               if (*commandline)
+               if (*commandline && !CheckCtrlBreak(BREAK_INPUT))
                {
                        ParseCommandLine (commandline);
                        if (bEcho && !bIgnoreEcho && (!bIsBatch || bEchoThisLine))
@@ -1427,8 +1469,25 @@ ProcessInput (BOOL bFlag)
 BOOL WINAPI BreakHandler (DWORD dwCtrlType)
 {
 
+       DWORD                   dwWritten;
+       INPUT_RECORD    rec;
        static BOOL SelfGenerated = FALSE;
-
+    
+    rec.EventType = KEY_EVENT;
+    rec.Event.KeyEvent.bKeyDown = TRUE;
+    rec.Event.KeyEvent.wRepeatCount = 1;
+    rec.Event.KeyEvent.wVirtualKeyCode = _T('C');
+    rec.Event.KeyEvent.wVirtualScanCode = _T('C') - 35;
+    rec.Event.KeyEvent.uChar.AsciiChar = _T('C');
+    rec.Event.KeyEvent.uChar.UnicodeChar = _T('C');
+    rec.Event.KeyEvent.dwControlKeyState = RIGHT_CTRL_PRESSED; 
+
+    WriteConsoleInput(
+        hIn,
+        &rec,
+        1,
+               &dwWritten);
+        
        if ((dwCtrlType != CTRL_C_EVENT) &&
            (dwCtrlType != CTRL_BREAK_EVENT))
        {