/*++ 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; }