Author: jmorlan
Date: Sat Mar 28 22:36:22 2009
New Revision: 40272
URL:
http://svn.reactos.org/svn/reactos?rev=40272&view=rev
Log:
- Implement CMD /A and /U switches.
- CLS: Fill console with current color rather than original; if standard output is not a
console, print a form-feed character.
- COLOR: If standard output is not a console, do nothing.
Modified:
trunk/reactos/base/shell/cmd/cls.c
trunk/reactos/base/shell/cmd/cmd.c
trunk/reactos/base/shell/cmd/color.c
trunk/reactos/base/shell/cmd/console.c
Modified: trunk/reactos/base/shell/cmd/cls.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/cls.c?rev=4…
==============================================================================
--- trunk/reactos/base/shell/cmd/cls.c [iso-8859-1] (original)
+++ trunk/reactos/base/shell/cmd/cls.c [iso-8859-1] Sat Mar 28 22:36:22 2009
@@ -32,6 +32,7 @@
INT cmd_cls (LPTSTR param)
{
+ HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbi;
COORD coPos;
DWORD dwWritten;
@@ -42,17 +43,22 @@
return 0;
}
- GetConsoleScreenBufferInfo(hConsole, &csbi);
-
- coPos.X = 0;
- coPos.Y = 0;
- FillConsoleOutputAttribute(hConsole, wColor,
- csbi.dwSize.X * csbi.dwSize.Y,
- coPos, &dwWritten);
- FillConsoleOutputCharacter(hConsole, _T(' '),
- csbi.dwSize.X * csbi.dwSize.Y,
- coPos, &dwWritten);
- SetConsoleCursorPosition(hConsole, coPos);
+ if (GetConsoleScreenBufferInfo(hOutput, &csbi))
+ {
+ coPos.X = 0;
+ coPos.Y = 0;
+ FillConsoleOutputAttribute(hOutput, csbi.wAttributes,
+ csbi.dwSize.X * csbi.dwSize.Y,
+ coPos, &dwWritten);
+ FillConsoleOutputCharacter(hOutput, _T(' '),
+ csbi.dwSize.X * csbi.dwSize.Y,
+ coPos, &dwWritten);
+ SetConsoleCursorPosition(hOutput, coPos);
+ }
+ else
+ {
+ ConOutChar(_T('\f'));
+ }
return 0;
}
Modified: trunk/reactos/base/shell/cmd/cmd.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/cmd.c?rev=4…
==============================================================================
--- trunk/reactos/base/shell/cmd/cmd.c [iso-8859-1] (original)
+++ trunk/reactos/base/shell/cmd/cmd.c [iso-8859-1] Sat Mar 28 22:36:22 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 bUnicodeOutput = FALSE;
BOOL bDisableBatchEcho = FALSE;
BOOL bDelayedExpansion = FALSE;
DWORD dwChildProcessId = 0;
@@ -171,7 +172,6 @@
static NtReadVirtualMemoryProc NtReadVirtualMemoryPtr = NULL;
#ifdef INCLUDE_CMD_COLOR
-WORD wColor; /* current color */
WORD wDefColor; /* default color */
#endif
@@ -1818,6 +1818,10 @@
}
bCanExit = FALSE;
}
+ else if (option == _T('A'))
+ {
+ bUnicodeOutput = FALSE;
+ }
else if (option == _T('C') || option == _T('K') || option ==
_T('R'))
{
/* Remainder of command line is a command to be run */
@@ -1840,10 +1844,13 @@
{
/* process /t (color) argument */
wDefColor = (WORD)_tcstoul(&ptr[3], &ptr, 16);
- wColor = wDefColor;
- SetScreenColor (wColor, TRUE);
+ SetScreenColor(wDefColor, TRUE);
}
#endif
+ else if (option == _T('U'))
+ {
+ bUnicodeOutput = TRUE;
+ }
else if (option == _T('V'))
{
bDelayedExpansion = _tcsnicmp(&ptr[2], _T(":OFF"), 4);
@@ -1956,8 +1963,7 @@
ConErrFormatMessage(GetLastError());
return(1);
}
- wColor = Info.wAttributes;
- wDefColor = wColor;
+ wDefColor = Info.wAttributes;
InputCodePage= GetConsoleCP();
OutputCodePage = GetConsoleOutputCP();
Modified: trunk/reactos/base/shell/cmd/color.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/color.c?rev…
==============================================================================
--- trunk/reactos/base/shell/cmd/color.c [iso-8859-1] (original)
+++ trunk/reactos/base/shell/cmd/color.c [iso-8859-1] Sat Mar 28 22:36:22 2009
@@ -30,6 +30,7 @@
VOID SetScreenColor (WORD wColor, BOOL bNoFill)
{
+ HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD dwWritten;
CONSOLE_SCREEN_BUFFER_INFO csbi;
COORD coPos;
@@ -65,6 +66,8 @@
*/
INT CommandColor (LPTSTR rest)
{
+ WORD wColor;
+
if (_tcsncmp (rest, _T("/?"), 2) == 0)
{
ConOutResPaging(TRUE,STRING_COLOR_HELP1);
@@ -84,6 +87,7 @@
if ( _tcslen(&rest[0])==1)
{
+ HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
if ( (_tcscmp(&rest[0], _T("0")) >=0 ) &&
(_tcscmp(&rest[0], _T("9")) <=0 ) )
{
SetConsoleTextAttribute (hConsole, (WORD)_ttoi(rest));
Modified: trunk/reactos/base/shell/cmd/console.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/console.c?r…
==============================================================================
--- trunk/reactos/base/shell/cmd/console.c [iso-8859-1] (original)
+++ trunk/reactos/base/shell/cmd/console.c [iso-8859-1] Sat Mar 28 22:36:22 2009
@@ -128,61 +128,45 @@
SetConsoleMode (hFile, dwOldMode);
}
-static VOID ConChar(TCHAR c, DWORD nStdHandle)
+static VOID ConWrite(TCHAR *str, DWORD len, DWORD nStdHandle)
{
DWORD dwWritten;
- CHAR cc;
+ HANDLE hOutput = GetStdHandle(nStdHandle);
+
+ if (WriteConsole(hOutput, str, len, &dwWritten, NULL))
+ return;
+
+ /* We're writing to a file or pipe instead of the console. Convert the
+ * string from TCHARs to the desired output format, if the two differ */
+ if (bUnicodeOutput)
+ {
+#ifndef _UNICODE
+ WCHAR buffer[len];
+ len = MultiByteToWideChar(OutputCodePage, 0, str, len, buffer, len, NULL, NULL);
+ str = (PVOID)buffer;
+#endif
+ WriteFile(hOutput, str, len * sizeof(WCHAR), &dwWritten, NULL);
+ }
+ else
+ {
#ifdef _UNICODE
- CHAR as[2];
- WCHAR ws[2];
- ws[0] = c;
- ws[1] = 0;
- WideCharToMultiByte( OutputCodePage, 0, ws, 2, as, 2, NULL, NULL);
- cc = as[0];
-#else
- cc = c;
+ CHAR buffer[len * MB_LEN_MAX];
+ len = WideCharToMultiByte(OutputCodePage, 0, str, len, buffer, len * MB_LEN_MAX, NULL,
NULL);
+ str = (PVOID)buffer;
#endif
- WriteFile (GetStdHandle (nStdHandle),
- &cc,
- 1,
- &dwWritten,
- NULL);
+ WriteFile(hOutput, str, len, &dwWritten, NULL);
+ }
}
VOID ConOutChar (TCHAR c)
{
- ConChar(c, STD_OUTPUT_HANDLE);
+ ConWrite(&c, 1, STD_OUTPUT_HANDLE);
}
VOID ConPuts(LPTSTR szText, DWORD nStdHandle)
{
- DWORD dwWritten;
- HANDLE hStdHandle;
- PCHAR pBuf;
- INT len;
-
- len = _tcslen(szText);
-#ifdef _UNICODE
- pBuf = cmd_alloc(len * 2 + 1);
- len = WideCharToMultiByte(OutputCodePage, 0, szText, len + 1, pBuf, len * 2 + 1, NULL,
NULL) - 1;
-#else
- pBuf = szText;
-#endif
- hStdHandle = GetStdHandle(nStdHandle);
-
- WriteFile (hStdHandle,
- pBuf,
- len,
- &dwWritten,
- NULL);
- WriteFile (hStdHandle,
- _T("\n"),
- 1,
- &dwWritten,
- NULL);
-#ifdef _UNICODE
- cmd_free(pBuf);
-#endif
+ ConWrite(szText, _tcslen(szText), nStdHandle);
+ ConWrite(_T("\n"), 1, nStdHandle);
}
VOID ConOutResPaging(BOOL NewPage, UINT resID)
@@ -208,28 +192,8 @@
VOID ConPrintf(LPTSTR szFormat, va_list arg_ptr, DWORD nStdHandle)
{
- INT len;
- PCHAR pBuf;
TCHAR szOut[OUTPUT_BUFFER_SIZE];
- DWORD dwWritten;
-
- len = _vstprintf(szOut, szFormat, arg_ptr);
-#ifdef _UNICODE
- pBuf = cmd_alloc(len * 2 + 1);
- len = WideCharToMultiByte(OutputCodePage, 0, szOut, len + 1, pBuf, len * 2 + 1, NULL,
NULL) - 1;
-#else
- pBuf = szOut;
-#endif
-
- WriteFile (GetStdHandle (nStdHandle),
- pBuf,
- len,
- &dwWritten,
- NULL);
-
-#ifdef _UNICODE
- cmd_free(pBuf);
-#endif
+ ConWrite(szOut, _vstprintf(szOut, szFormat, arg_ptr), nStdHandle);
}
INT ConPrintfPaging(BOOL NewPage, LPTSTR szFormat, va_list arg_ptr, DWORD nStdHandle)
@@ -398,7 +362,7 @@
VOID ConErrChar (TCHAR c)
{
- ConChar(c, STD_ERROR_HANDLE);
+ ConWrite(&c, 1, STD_ERROR_HANDLE);
}