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

172 lines
3.2 KiB
C

/*++
Copyright (c) 1999 Intel Corporation
Module Name:
goto.c
Abstract:
Shell Environment batch goto command
Revision History
--*/
#include "shelle.h"
/*
* Statics
*/
STATIC CHAR16 *TargetLabel;
/*/////////////////////////////////////////////////////////////////////
Function Name:
SEnvCmdGoto
Description:
Transfers execution of batch file to location following a label (:labelname).
*/
EFI_STATUS
SEnvCmdGoto(
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
CHAR16 **Argv;
UINTN Argc = 0;
EFI_STATUS Status = EFI_SUCCESS;
InitializeShellApplication (ImageHandle, SystemTable);
Argv = SI->Argv;
Argc = SI->Argc;
if ( !SEnvBatchIsActive() ) {
Print( L"Error: GOTO command only supported in script files\n" );
Status = EFI_UNSUPPORTED;
goto Done;
}
if ( Argc > 2 ) {
Status = EFI_INVALID_PARAMETER;
goto Done;
}
TargetLabel = StrDuplicate( Argv[1] );
if ( !TargetLabel ) {
Status = EFI_OUT_OF_RESOURCES;
goto Done;
}
SEnvBatchSetGotoActive();
Done:
return Status;
}
/*/////////////////////////////////////////////////////////////////////
Function Name:
SEnvCheckForGotoTarget
Description:
Check to see if we have found the target label of a GOTO command.
*/
EFI_STATUS
SEnvCheckForGotoTarget(
IN CHAR16 *Candidate,
IN UINT64 GotoFilePos,
IN UINT64 FilePosition,
OUT UINTN *GotoTargetStatus
)
{
EFI_STATUS Status = EFI_SUCCESS;
if ( !Candidate ) {
Status = EFI_INVALID_PARAMETER;
goto Done;
}
/*
* See if we found the label (strip the leading ':' off the candidate)
* or if we have searched the whole file without finding it.
*/
if ( StriCmp( &Candidate[1], TargetLabel ) == 0 ) {
*GotoTargetStatus = GOTO_TARGET_FOUND;
goto Done;
} else if ( GotoFilePos == FilePosition ) {
*GotoTargetStatus = GOTO_TARGET_DOESNT_EXIST;
goto Done;
} else {
*GotoTargetStatus = GOTO_TARGET_NOT_FOUND;
goto Done;
}
Done:
return Status;
}
/*/////////////////////////////////////////////////////////////////////
Function Name:
SEnvPrintLabelNotFound
Description:
Print an error message when a label referenced by a GOTO is not
found in the script file..
*/
VOID
SEnvPrintLabelNotFound(
VOID
)
{
Print( L"GOTO target label \":%s\" not found\n", TargetLabel );
return;
}
/*/////////////////////////////////////////////////////////////////////
Function Name:
SEnvInitTargetLabel
Description:
Initialize the target label for the GOTO command.
*/
VOID
SEnvInitTargetLabel(
VOID
)
{
TargetLabel = NULL;
return;
}
/*/////////////////////////////////////////////////////////////////////
Function Name:
SEnvFreeTargetLabel
Description:
Free the target label saved from the GOTO command.
*/
VOID
SEnvFreeTargetLabel(
VOID
)
{
if ( TargetLabel ) {
FreePool( TargetLabel );
TargetLabel = NULL;
}
return;
}