[ros-diffs] [jmorlan] 40244: - Implement CMD /D, /Q, and /R switches - Do %envvar% expansions in CMD /C or /K commands - Make SETLOCAL recognize ENABLEEXTENSIONS and DISABLEEXTENSIONS, although it doesn't do anything yet - Make VERIFY set the errorlevel (documented in SETLOCAL /?). Also make it recognize when ON/OFF is followed by space - Make ECHOSERR actually print to stderr, not stdout - Make echoed display of ( ... ) blocks look nicer (Bug 4022) - Fix some other minor display bugs

jmorlan at svn.reactos.org jmorlan at svn.reactos.org
Thu Mar 26 02:14:26 CET 2009


Author: jmorlan
Date: Thu Mar 26 04:14:25 2009
New Revision: 40244

URL: http://svn.reactos.org/svn/reactos?rev=40244&view=rev
Log:
- Implement CMD /D, /Q, and /R switches
- Do %envvar% expansions in CMD /C or /K commands
- Make SETLOCAL recognize ENABLEEXTENSIONS and DISABLEEXTENSIONS, although it doesn't do anything yet
- Make VERIFY set the errorlevel (documented in SETLOCAL /?). Also make it recognize when ON/OFF is followed by space
- Make ECHOSERR actually print to stderr, not stdout
- Make echoed display of ( ... ) blocks look nicer (Bug 4022)
- Fix some other minor display bugs

Modified:
    trunk/reactos/base/shell/cmd/batch.c
    trunk/reactos/base/shell/cmd/cmd.c
    trunk/reactos/base/shell/cmd/cmd.h
    trunk/reactos/base/shell/cmd/echo.c
    trunk/reactos/base/shell/cmd/error.c
    trunk/reactos/base/shell/cmd/for.c
    trunk/reactos/base/shell/cmd/parser.c
    trunk/reactos/base/shell/cmd/setlocal.c
    trunk/reactos/base/shell/cmd/verify.c

Modified: trunk/reactos/base/shell/cmd/batch.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/batch.c?rev=40244&r1=40243&r2=40244&view=diff
==============================================================================
--- trunk/reactos/base/shell/cmd/batch.c [iso-8859-1] (original)
+++ trunk/reactos/base/shell/cmd/batch.c [iso-8859-1] Thu Mar 26 04:14:25 2009
@@ -293,9 +293,10 @@
 
 		/* JPP 19980807 */
 		/* Echo batch file line */
-		if (bEcho && Cmd->Type != C_QUIET)
+		if (bEcho && !bDisableBatchEcho && Cmd->Type != C_QUIET)
 		{
-			ConOutChar(_T('\n'));
+			if (!bIgnoreEcho)
+				ConOutChar(_T('\n'));
 			PrintPrompt();
 			EchoCommand(Cmd);
 			ConOutChar(_T('\n'));

Modified: trunk/reactos/base/shell/cmd/cmd.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/cmd.c?rev=40244&r1=40243&r2=40244&view=diff
==============================================================================
--- trunk/reactos/base/shell/cmd/cmd.c [iso-8859-1] (original)
+++ trunk/reactos/base/shell/cmd/cmd.c [iso-8859-1] Thu Mar 26 04:14:25 2009
@@ -157,6 +157,7 @@
 BOOL bIgnoreEcho = FALSE; /* Set this to TRUE to prevent a newline, when executing a command */
 INT  nErrorLevel = 0;     /* Errorlevel of last launched external program */
 BOOL bChildProcessRunning = FALSE;
+BOOL bDisableBatchEcho = FALSE;
 BOOL bDelayedExpansion = FALSE;
 DWORD dwChildProcessId = 0;
 OSVERSIONINFO osvi;
@@ -1509,7 +1510,11 @@
 		{
 			/* JPP 19980807 - if echo off, don't print prompt */
 			if (bEcho)
+			{
+				if (!bIgnoreEcho)
+					ConOutChar('\n');
 				PrintPrompt();
+			}
 		}
 
 		ReadCommand (readline, CMDLINE_LENGTH - 1);
@@ -1542,10 +1547,7 @@
 			continue;
 
 		ExecuteCommand(Cmd);
-		if (bEcho && !bIgnoreEcho)
-			ConOutChar ('\n');
 		FreeCommand(Cmd);
-		bIgnoreEcho = FALSE;
 	}
 	while (!bCanExit || !bExit);
 
@@ -1676,7 +1678,8 @@
                            (LPBYTE)autorun, 
                            &len) == ERROR_SUCCESS)
 	    {
-		    ParseCommandLine (autorun);
+			if (*autorun)
+				ParseCommandLine(autorun);
 	    }
     }
 
@@ -1748,9 +1751,9 @@
 	TCHAR lpBuffer[2];
 
 	//INT len;
-	TCHAR *ptr, *cmdLine;
+	TCHAR *ptr, *cmdLine, option = 0;
 	BOOL AlwaysStrip = FALSE;
-	BOOL ShowVersion = TRUE;
+	BOOL AutoRun = TRUE;
 
 	/* get version information */
 	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
@@ -1793,12 +1796,13 @@
 	{
 		if (*ptr == _T('/'))
 		{
-			if (ptr[1] == _T('?'))
+			option = _totupper(ptr[1]);
+			if (option == _T('?'))
 			{
 				ConOutResPaging(TRUE,STRING_CMD_HELP8);
 				cmd_exit(0);
 			}
-			else if (_totlower(ptr[1]) == _T('p'))
+			else if (option == _T('P'))
 			{
 				if (!IsExistingFile (_T("\\autoexec.bat")))
 				{
@@ -1815,27 +1819,25 @@
 				}
 				bCanExit = FALSE;
 			}
-			else if (_totlower(ptr[1]) == _T('c'))
-			{
-				/* This just runs a program and exits */
-				GetCmdLineCommand(commandline, &ptr[2], AlwaysStrip);
-				ParseCommandLine(commandline);
-				cmd_exit(nErrorLevel);
-			}
-			else if (_totlower(ptr[1]) == _T('k'))
-			{
-				/* This just runs a program and remains */
-				GetCmdLineCommand(commandline, &ptr[2], AlwaysStrip);
-				ParseCommandLine(commandline);
-				ShowVersion = FALSE;
+			else if (option == _T('C') || option == _T('K') || option == _T('R'))
+			{
+				/* Remainder of command line is a command to be run */
 				break;
 			}
-			else if (_totlower(ptr[1]) == _T('s'))
+			else if (option == _T('D'))
+			{
+				AutoRun = FALSE;
+			}
+			else if (option == _T('Q'))
+			{
+				bDisableBatchEcho = TRUE;
+			}
+			else if (option == _T('S'))
 			{
 				AlwaysStrip = TRUE;
 			}
 #ifdef INCLUDE_CMD_COLOR
-			else if (!_tcsnicmp(ptr, _T("/t:"), 3))
+			else if (!_tcsnicmp(ptr, _T("/T:"), 3))
 			{
 				/* process /t (color) argument */
 				wDefColor = (WORD)_tcstoul(&ptr[3], &ptr, 16);
@@ -1843,24 +1845,21 @@
 				SetScreenColor (wColor, TRUE);
 			}
 #endif
-			else if (_totlower(ptr[1]) == _T('v'))
-			{
-				bDelayedExpansion = _tcsnicmp(&ptr[2], _T(":off"), 4);
-			}
-		}
-	}
-
-	if (ShowVersion)
-    {
-        /* Display a simple version string */
+			else if (option == _T('V'))
+			{
+				bDelayedExpansion = _tcsnicmp(&ptr[2], _T(":OFF"), 4);
+			}
+		}
+	}
+
+	if (!*ptr)
+	{
+		/* If neither /C or /K was given, display a simple version string */
 		ConOutResPrintf(STRING_REACTOS_VERSION, 
-            _T(KERNEL_RELEASE_STR),
-            _T(KERNEL_VERSION_BUILD_STR));
-
-	    ConOutPuts (_T("(C) Copyright 1998-") _T(COPYRIGHT_YEAR) _T(" ReactOS Team.\n"));
-    }
-
-    ExecuteAutoRunFile ();
+			_T(KERNEL_RELEASE_STR),
+			_T(KERNEL_VERSION_BUILD_STR));
+		ConOutPuts(_T("(C) Copyright 1998-") _T(COPYRIGHT_YEAR) _T(" ReactOS Team."));
+	}
 
 #ifdef FEATURE_DIR_STACK
 	/* initialize directory stack */
@@ -1882,6 +1881,18 @@
 
 	/* add ctrl break handler */
 	AddBreakHandler ();
+
+	if (AutoRun)
+		ExecuteAutoRunFile();
+
+	if (*ptr)
+	{
+		/* Do the /C or /K command */
+		GetCmdLineCommand(commandline, &ptr[2], AlwaysStrip);
+		ParseCommandLine(commandline);
+		if (option != _T('K'))
+			cmd_exit(nErrorLevel);
+	}
 }
 
 

Modified: trunk/reactos/base/shell/cmd/cmd.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/cmd.h?rev=40244&r1=40243&r2=40244&view=diff
==============================================================================
--- trunk/reactos/base/shell/cmd/cmd.h [iso-8859-1] (original)
+++ trunk/reactos/base/shell/cmd/cmd.h [iso-8859-1] Thu Mar 26 04:14:25 2009
@@ -60,6 +60,7 @@
 extern BOOL   bCtrlBreak;
 extern BOOL   bIgnoreEcho;
 extern BOOL   bExit;
+extern BOOL   bDisableBatchEcho;
 extern BOOL   bDelayedExpansion;
 extern INT    nErrorLevel;
 extern SHORT  maxx;
@@ -211,6 +212,7 @@
 
 
 /* Prototypes for ECHO.C */
+BOOL OnOffCommand(LPTSTR param, LPBOOL flag, INT message);
 INT  CommandEcho (LPTSTR);
 INT  CommandEchos (LPTSTR);
 INT  CommandEchoerr (LPTSTR);

Modified: trunk/reactos/base/shell/cmd/echo.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/echo.c?rev=40244&r1=40243&r2=40244&view=diff
==============================================================================
--- trunk/reactos/base/shell/cmd/echo.c [iso-8859-1] (original)
+++ trunk/reactos/base/shell/cmd/echo.c [iso-8859-1] Thu Mar 26 04:14:25 2009
@@ -28,10 +28,43 @@
 
 #include <precomp.h>
 
+BOOL
+OnOffCommand(LPTSTR param, LPBOOL flag, INT message)
+{
+	TCHAR *p2;
+	if (_tcsnicmp(param, D_OFF, sizeof(D_OFF)/sizeof(TCHAR) - 1) == 0)
+	{
+		p2 = param + sizeof(D_OFF)/sizeof(TCHAR) - 1;
+		while (_istspace(*p2))
+			p2++;
+		if (*p2 == _T('\0'))
+		{
+			*flag = FALSE;
+			return TRUE;
+		}
+	}
+	else if (_tcsnicmp(param, D_ON, sizeof(D_ON)/sizeof(TCHAR) - 1) == 0)
+	{
+		p2 = param + sizeof(D_ON)/sizeof(TCHAR) - 1;
+		while (_istspace(*p2))
+			p2++;
+		if (*p2 == _T('\0'))
+		{
+			*flag = TRUE;
+			return TRUE;
+		}
+	}
+	else if (*param == _T('\0'))
+	{
+		ConOutResPrintf(message, *flag ? D_ON : D_OFF);
+		return TRUE;
+	}
+	return FALSE;
+}
 
 INT CommandEcho (LPTSTR param)
 {
-        LPTSTR p1, p2;
+	LPTSTR p1;
 
 	TRACE ("CommandEcho: '%s'\n", debugstr_aw(param));
 
@@ -46,45 +79,16 @@
 		        return 0;
 	        }
 
-                if (_tcsnicmp (p1, D_OFF, sizeof(D_OFF)/sizeof(TCHAR) - 1) == 0)
-                {
-                        p2 = p1 + sizeof(D_OFF)/sizeof(TCHAR) - 1;
-                        while (_istspace(*p2))
-                                p2++;
-                        if (*p2 == _T('\0'))
-                        {
-                                bEcho = FALSE;
-                                return 0;
-                        }
-                }
-		else if (_tcsnicmp (p1, D_ON, sizeof(D_ON)/sizeof(TCHAR) - 1) == 0)
-                {
-                        p2 = p1 + sizeof(D_ON)/sizeof(TCHAR) - 1;
-                        while (_istspace(*p2))
-                                p2++;
-                        if (*p2 == _T('\0'))
-                        {
-			        bEcho = TRUE;
-                                return 0;
-                        }
-                }
-		if (*p1 != _T('\0'))
-		{
-			/* skip the first character */
-			ConOutPuts(param + 1);
-		}
-		else
-		{
-			ConOutResPrintf(STRING_ECHO_HELP5, bEcho ? D_ON : D_OFF);
-		}
-
+	if (!OnOffCommand(p1, &bEcho, STRING_ECHO_HELP5))
+	{
+		/* skip the first character */
+		ConOutPuts(param + 1);
+	}
 	return 0;
 }
 
-
 INT CommandEchos (LPTSTR param)
 {
-
 	TRACE ("CommandEchos: '%s'\n", debugstr_aw(param));
 
 	if (!_tcsncmp (param, _T("/?"), 2))
@@ -93,16 +97,13 @@
 		return 0;
 	}
 
-	if (*param)
-		ConOutPrintf (_T("%s"), param);
-
+	ConOutPrintf (_T("%s"), param);
 	return 0;
 }
 
 
 INT CommandEchoerr (LPTSTR param)
 {
-
 	TRACE ("CommandEchoerr: '%s'\n", debugstr_aw(param));
 
 	if (!_tcsncmp (param, _T("/?"), 2))
@@ -112,14 +113,12 @@
 	}
 
 	ConErrPuts (param);
-
 	return 0;
 }
 
 
 INT CommandEchoserr (LPTSTR param)
 {
-
 	TRACE ("CommandEchoserr: '%s'\n", debugstr_aw(param));
 
 	if (!_tcsncmp (param, _T("/?"), 2))
@@ -128,9 +127,7 @@
 		return 0;
 	}
 
-	if (*param)
-		ConOutPrintf (_T("%s"), param);
-
+	ConErrPrintf (_T("%s"), param);
 	return 0;
 }
 

Modified: trunk/reactos/base/shell/cmd/error.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/error.c?rev=40244&r1=40243&r2=40244&view=diff
==============================================================================
--- trunk/reactos/base/shell/cmd/error.c [iso-8859-1] (original)
+++ trunk/reactos/base/shell/cmd/error.c [iso-8859-1] Thu Mar 26 04:14:25 2009
@@ -141,7 +141,7 @@
 
 VOID error_invalid_parameter_format (LPTSTR s)
 {
-	ConErrResPuts(STRING_ERROR_INVALID_PARAM_FORMAT);
+	ConErrResPrintf(STRING_ERROR_INVALID_PARAM_FORMAT, s);
   nErrorLevel = 1;
 }
 

Modified: trunk/reactos/base/shell/cmd/for.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/for.c?rev=40244&r1=40243&r2=40244&view=diff
==============================================================================
--- trunk/reactos/base/shell/cmd/for.c [iso-8859-1] (original)
+++ trunk/reactos/base/shell/cmd/for.c [iso-8859-1] Thu Mar 26 04:14:25 2009
@@ -71,9 +71,10 @@
 /* Execute a single instance of a FOR command */
 static void RunInstance(PARSED_COMMAND *Cmd)
 {
-	if (bEcho && Cmd->Subcommands->Type != C_QUIET)
-	{
-		ConOutChar(_T('\n'));
+	if (bEcho && !bDisableBatchEcho && Cmd->Subcommands->Type != C_QUIET)
+	{
+		if (!bIgnoreEcho)
+			ConOutChar(_T('\n'));
 		PrintPrompt();
 		EchoCommand(Cmd->Subcommands);
 		ConOutChar(_T('\n'));

Modified: trunk/reactos/base/shell/cmd/parser.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/parser.c?rev=40244&r1=40243&r2=40244&view=diff
==============================================================================
--- trunk/reactos/base/shell/cmd/parser.c [iso-8859-1] (original)
+++ trunk/reactos/base/shell/cmd/parser.c [iso-8859-1] Thu Mar 26 04:14:25 2009
@@ -701,7 +701,8 @@
 
 	if (Line)
 	{
-		_tcscpy(ParseLine, Line);
+		if (!SubstituteVars(Line, ParseLine, _T('%')))
+			return NULL;
 		bLineContinuations = FALSE;
 	}
 	else
@@ -724,6 +725,11 @@
 			FreeCommand(Cmd);
 			Cmd = NULL;
 		}
+		bIgnoreEcho = FALSE;
+	}
+	else
+	{
+		bIgnoreEcho = TRUE;
 	}
 	return Cmd;
 }
@@ -748,10 +754,22 @@
 		return;
 	case C_BLOCK:
 		ConOutChar(_T('('));
-		for (Sub = Cmd->Subcommands; Sub; Sub = Sub->Next)
-		{
+		Sub = Cmd->Subcommands;
+		if (Sub && !Sub->Next)
+		{
+			/* Single-command block: display all on one line */
 			EchoCommand(Sub);
+		}
+		else if (Sub)
+		{
+			/* Multi-command block: display parenthesis on separate lines */
 			ConOutChar(_T('\n'));
+			do
+			{
+				EchoCommand(Sub);
+				ConOutChar(_T('\n'));
+				Sub = Sub->Next;
+			} while (Sub);
 		}
 		ConOutChar(_T(')'));
 		break;

Modified: trunk/reactos/base/shell/cmd/setlocal.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/setlocal.c?rev=40244&r1=40243&r2=40244&view=diff
==============================================================================
--- trunk/reactos/base/shell/cmd/setlocal.c [iso-8859-1] (original)
+++ trunk/reactos/base/shell/cmd/setlocal.c [iso-8859-1] Thu Mar 26 04:14:25 2009
@@ -35,6 +35,8 @@
 INT cmd_setlocal(LPTSTR param)
 {
 	SETLOCAL *Saved;
+	LPTSTR *arg;
+	INT argc, i;
 
 	/* SETLOCAL only works inside a batch file */
 	if (!bc)
@@ -59,14 +61,24 @@
 
 	nErrorLevel = 0;
 
-	if (*param == _T('\0'))
-		/* nothing */;
-	else if (!_tcsicmp(param, _T("enabledelayedexpansion")))
-		bDelayedExpansion = TRUE;
-	else if (!_tcsicmp(param, _T("disabledelayedexpansion")))
-		bDelayedExpansion = FALSE;
-	else
-		error_invalid_parameter_format(param);
+	arg = splitspace(param, &argc);
+	for (i = 0; i < argc; i++)
+	{
+		if (!_tcsicmp(arg[i], _T("enableextensions")))
+			/* not implemented, ignore */;
+		else if (!_tcsicmp(arg[i], _T("disableextensions")))
+			/* not implemented, ignore */;
+		else if (!_tcsicmp(arg[i], _T("enabledelayedexpansion")))
+			bDelayedExpansion = TRUE;
+		else if (!_tcsicmp(arg[i], _T("disabledelayedexpansion")))
+			bDelayedExpansion = FALSE;
+		else
+		{
+			error_invalid_parameter_format(arg[i]);
+			break;
+		}
+	}
+	freep(arg);
 
 	return nErrorLevel;
 }

Modified: trunk/reactos/base/shell/cmd/verify.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/verify.c?rev=40244&r1=40243&r2=40244&view=diff
==============================================================================
--- trunk/reactos/base/shell/cmd/verify.c [iso-8859-1] (original)
+++ trunk/reactos/base/shell/cmd/verify.c [iso-8859-1] Thu Mar 26 04:14:25 2009
@@ -35,22 +35,13 @@
 		return 0;
 	}
 
-  nErrorLevel = 0;
-
-	if (!*param)
+	if (!OnOffCommand(param, &bVerify, STRING_VERIFY_HELP2))
 	{
-		ConOutResPrintf(STRING_VERIFY_HELP2, bVerify ? D_ON : D_OFF);
-	}
-	else if (_tcsicmp (param, D_OFF) == 0)
-		bVerify = FALSE;
-	else if (_tcsicmp (param, D_ON) == 0)
-		bVerify = TRUE;
-	else
-	{
-		ConOutResPuts(STRING_VERIFY_HELP3);
+		ConErrResPuts(STRING_VERIFY_HELP3);
+		return nErrorLevel = 1;
 	}
 
-	return 0;
+	return nErrorLevel = 0;
 }
 
 #endif



More information about the Ros-diffs mailing list