windows-nt/Source/XPSP1/NT/base/efiutil/sdk/shell/shellenv/pause.c
2020-09-26 16:20:57 +08:00

94 lines
2.1 KiB
C

/*++
Copyright (c) 1999 Intel Corporation
Module Name:
pause.c
Abstract:
Internal Shell batch cmd "pause"
Revision History
--*/
#include "shelle.h"
/*
* Internal prototypes
*/
/*///////////////////////////////////////////////////////////////////////
Function Name:
SEnvCmdPause
Description:
Builtin shell command "pause" for interactive continue/abort
functionality from scripts.
*/
EFI_STATUS
SEnvCmdPause (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
CHAR16 **Argv;
UINTN Argc = 0;
UINTN Index = 0;
EFI_STATUS Status = EFI_SUCCESS;
SIMPLE_INPUT_INTERFACE *TextIn = NULL;
SIMPLE_TEXT_OUTPUT_INTERFACE *TextOut = NULL;
EFI_INPUT_KEY Key;
CHAR16 QStr[2];
InitializeShellApplication (ImageHandle, SystemTable);
Argv = SI->Argv;
Argc = SI->Argc;
if ( !SEnvBatchIsActive() ) {
Print( L"Error: PAUSE command only supported in script files\n" );
Status = EFI_UNSUPPORTED;
goto Done;
}
SEnvBatchGetConsole( &TextIn, &TextOut );
Status = TextOut->OutputString( TextOut,
L"Enter 'q' to quit, any other key to continue: " );
if ( EFI_ERROR(Status) ) {
Print( L"PAUSE: error writing prompt\n" );
goto Done;
}
WaitForSingleEvent (TextIn->WaitForKey, 0);
Status = TextIn->ReadKeyStroke( TextIn, &Key );
if ( EFI_ERROR(Status) ) {
Print( L"PAUSE: error reading keystroke\n" );
goto Done;
}
/*
* Check if input character is q or Q, if so set abort flag
*/
if ( Key.UnicodeChar == L'q' || Key.UnicodeChar == L'Q' ) {
SEnvSetBatchAbort();
}
if ( Key.UnicodeChar != (CHAR16)0x0000 ) {
QStr[0] = Key.UnicodeChar;
QStr[1] = (CHAR16)0x0000;
TextOut->OutputString( TextOut, QStr );
}
TextOut->OutputString( TextOut, L"\n\r" );
Done:
return Status;
}