|
|
/*++
Copyright (c) 1988-1999 Microsoft Corporation
Module Name:
cother.c
Abstract:
Miscellaneous commands
--*/
#include "cmd.h"
extern TCHAR Fmt19[] ; /* M006 */ extern PTCHAR pszTitleOrg; extern WORD wDefaultColor; extern TCHAR GotoStr[] ; extern TCHAR GotoEofStr[] ; extern int LastRetCode ;
/*** eCls - execute the Cls command
* * Purpose: * Output to STDOUT, the ANSI escape sequences used to clear a screen. * * int eCls(struct cmdnode *n) * * Args: * n - the parse tree node containing the cls command * * Returns: * SUCCESS always. * * Notes: * M001 - Replaced old ANSI sequence with VIO interface. * M006 - To insure we get correct background color, we print a space * and then read the cell just printed using it to clear with. */
int eCls( struct cmdnode *n ) {
CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenInfo; HANDLE handle; #ifdef WIN95_CMD
DWORD dwWritten; DWORD nCells; #else
COORD ScrollTarget; CHAR_INFO chinfo; SMALL_RECT ScrollRect; #endif
UNREFERENCED_PARAMETER( n );
//
// for compatibility with DOS errorlevels, don't set LastRetCode for cls
//
if (!FileIsDevice(STDOUT)) { cmd_printf( TEXT("\014") ); // ^L
return(SUCCESS) ; }
handle = GetStdHandle(STD_OUTPUT_HANDLE); if (!GetConsoleScreenBufferInfo( handle, &ConsoleScreenInfo)) {
cmd_printf( TEXT("\014") ); // ^L
return(SUCCESS) ; }
#ifndef WIN95_CMD
ScrollTarget.Y = (SHORT)(0 - ConsoleScreenInfo.dwSize.Y); ScrollTarget.X = 0;
ScrollRect.Top = 0; ScrollRect.Left = 0; ScrollRect.Bottom = ConsoleScreenInfo.dwSize.Y; ScrollRect.Right = ConsoleScreenInfo.dwSize.X; chinfo.Char.UnicodeChar = TEXT(' '); chinfo.Attributes = ConsoleScreenInfo.wAttributes; ScrollConsoleScreenBuffer(handle, &ScrollRect, NULL, ScrollTarget, &chinfo);
ConsoleScreenInfo.dwCursorPosition.X = 0; ConsoleScreenInfo.dwCursorPosition.Y = 0;
#else
ConsoleScreenInfo.dwCursorPosition.X = 0; ConsoleScreenInfo.dwCursorPosition.Y = 0;
nCells = ConsoleScreenInfo.dwSize.Y*ConsoleScreenInfo.dwSize.X;
FillConsoleOutputCharacterA( handle, ' ', nCells, ConsoleScreenInfo.dwCursorPosition, &dwWritten);
FillConsoleOutputAttribute( handle, ConsoleScreenInfo.wAttributes, nCells, ConsoleScreenInfo.dwCursorPosition, &dwWritten );
#endif
SetConsoleCursorPosition( GetStdHandle(STD_OUTPUT_HANDLE), ConsoleScreenInfo.dwCursorPosition ); return(SUCCESS) ; }
extern unsigned DosErr ;
/*** eExit - execute the Exit command
* * Purpose: * Set the LastRetCode to SUCCESS because this command can never fail. * Then call SigHand() and let it decide whether or not to exit. * * eExit(struct cmdnode *n) * * Args: * n - the parse tree node containing the exit command * */
int eExit( struct cmdnode *n ) { TCHAR *tas; LONG exitCode;
tas = n->argptr;
//
// Find first non-blank argument.
//
while (tas && *tas && *tas <= SPACE) tas += 1;
//
// If first argument is /B, then remember that in cmdnode
//
if (tas != NULL && !_tcsnicmp(tas, TEXT("/B"), 2)) { n->type = GOTYP; n->argptr = GotoEofStr;
//
// Skip over /B and trailing spaces
//
tas += 2; while (tas && *tas && *tas <= SPACE) tas += 1; }
//
// See numeric argument given. If so, set LastRetCode
// with it.
//
if (tas && _stscanf( tas, TEXT("%d"), &exitCode ) == 1) { LastRetCode = exitCode; }
if (n->type == GOTYP && CurrentBatchFile != NULL) return eGoto(n); else { ResetConTitle(pszTitleOrg); CMDexit(LastRetCode); }
return(SUCCESS) ; }
/*** eVerify - execute the Verify command
* * Purpose: * To set the verify mode or display the current verify mode. * * int eVerify(struct cmdnode *n) * * Args: * n - the parse tree node containing the verify command * * Returns: * SUCCESS if a valid argument was given. * FAILURE if an invalid argument was given. * */
int eVerify( struct cmdnode *n ) { return( LastRetCode = VerifyWork(n) ); }
int VerifyWork( struct cmdnode *n ) { int oocret ; /* The return code from OnOffCheck() */
DEBUG((OCGRP, VELVL, "eVERIFY: Entered.")) ;
switch (oocret = OnOffCheck(n->argptr, OOC_ERROR)) { case OOC_EMPTY:
/* M005 */ PutStdOut(((GetSetVerMode(GSVM_GET)) ? MSG_VERIFY_ON : MSG_VERIFY_OFF), NOARGS); break ;
case OOC_OTHER: return(FAILURE) ;
default: GetSetVerMode((BYTE)oocret) ; } ;
return(SUCCESS) ; }
BOOLEAN Verify=FALSE;
/*** GetSetVerMode - change the verify mode
* * Purpose: * Get old verify mode and, optionally, set verify mode as specified. * * TCHAR GetSetVerMode(TCHAR newmode) * * Args: * newmode - the new verify mode or GSVM_GET if mode isn't to be changed * * Returns: * The old verify mode. * */
BOOLEAN GetSetVerMode( BYTE newmode ) { if (newmode != GSVM_GET) { Verify = (BOOLEAN)(newmode == GSVM_ON ? TRUE : FALSE); } return Verify; }
// execute the COLOR internal command....
int eColor( struct cmdnode *n ) { WORD wColor = 0; int ocRet, digit; TCHAR* arg;
ocRet = OnOffCheck( n->argptr, OOC_NOERROR ); switch( ocRet ) { case OOC_EMPTY: wColor = wDefaultColor; // reset to default
break; case OOC_OTHER: arg = n->argptr;
arg = SkipWhiteSpace( arg );
for( ; *arg && _istxdigit(*arg) ; ++arg) { digit = (int) (*arg <= TEXT('9')) ? (int)*arg - (int)'0' : (int)_totlower(*arg)-(int)'W' ; wColor = (wColor << 4)+digit ; }
arg = SkipWhiteSpace( arg );
// make sure nothing left and value between 0 and 0xff...
if ( !(*arg) && (wColor < 0x100) ) break; // else fall through to display help....
default: // display help string....
BeginHelpPause(); PutStdOut( MSG_HELP_COLOR, NOARGS ); EndHelpPause(); return SUCCESS; }
return LastRetCode = SetColor(wColor); }
// set the console to a given color -- if a console....
int SetColor( WORD attr ) { CONSOLE_SCREEN_BUFFER_INFO csbi; HANDLE hStdOut; COORD coord; DWORD dwWritten;
//
// Fail if foreground and background color the same.
//
if ((attr & 0xF) == ((attr >> 4) & 0xF)) { return FAILURE; }
// get the handle....
hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); // get the console info....
if (GetConsoleScreenBufferInfo( hStdOut, &csbi)) { // fill the screen with the color attribute....
coord.Y = 0; coord.X = 0; FillConsoleOutputAttribute( hStdOut, attr, csbi.dwSize.Y*csbi.dwSize.X, coord, &dwWritten ); // make sure the color sticks....
SetConsoleTextAttribute( hStdOut, attr ); return SUCCESS; }
return FAILURE; }
|