MdeModulePkg: Add match2 opcode support in SetupBrowserDxe and sample code in DriverSampleDxe
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Eric Dong <eric.dong@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com> Reviewed-by: Samer El-Haj-Mahmoud <samer.el-haj-mahmoud@hp.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17340 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
/** @file
|
||||
Utility functions for expression evaluation.
|
||||
|
||||
Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -1475,6 +1475,177 @@ Done:
|
||||
return Status;
|
||||
}
|
||||
|
||||
/**
|
||||
Evaluate opcode EFI_IFR_MATCH2.
|
||||
|
||||
@param FormSet Formset which contains this opcode.
|
||||
@param SyntaxType Syntax type for match2.
|
||||
@param Result Evaluation result for this opcode.
|
||||
|
||||
@retval EFI_SUCCESS Opcode evaluation success.
|
||||
@retval Other Opcode evaluation failed.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
IfrMatch2 (
|
||||
IN FORM_BROWSER_FORMSET *FormSet,
|
||||
IN EFI_GUID *SyntaxType,
|
||||
OUT EFI_HII_VALUE *Result
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_HII_VALUE Value[2];
|
||||
CHAR16 *String[2];
|
||||
UINTN Index;
|
||||
UINTN GuidIndex;
|
||||
EFI_HANDLE *HandleBuffer;
|
||||
UINTN BufferSize;
|
||||
EFI_REGULAR_EXPRESSION_PROTOCOL *RegularExpressionProtocol;
|
||||
UINTN RegExSyntaxTypeListSize;
|
||||
EFI_REGEX_SYNTAX_TYPE *RegExSyntaxTypeList;
|
||||
UINTN CapturesCount;
|
||||
|
||||
//
|
||||
// String[0] - The string to search
|
||||
// String[1] - pattern
|
||||
//
|
||||
String[0] = NULL;
|
||||
String[1] = NULL;
|
||||
HandleBuffer = NULL;
|
||||
RegExSyntaxTypeList = NULL;
|
||||
Status = EFI_SUCCESS;
|
||||
ZeroMem (Value, sizeof (Value));
|
||||
|
||||
Status = PopExpression (&Value[0]);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Done;
|
||||
}
|
||||
|
||||
Status = PopExpression (&Value[1]);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Done;
|
||||
}
|
||||
|
||||
for (Index = 0; Index < 2; Index++) {
|
||||
if (Value[Index].Type != EFI_IFR_TYPE_STRING) {
|
||||
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
||||
Status = EFI_SUCCESS;
|
||||
goto Done;
|
||||
}
|
||||
|
||||
String[Index] = GetToken (Value[Index].Value.string, FormSet->HiiHandle);
|
||||
if (String [Index] == NULL) {
|
||||
Status = EFI_NOT_FOUND;
|
||||
goto Done;
|
||||
}
|
||||
}
|
||||
|
||||
BufferSize = 0;
|
||||
HandleBuffer = NULL;
|
||||
Status = gBS->LocateHandle(
|
||||
ByProtocol,
|
||||
&gEfiRegularExpressionProtocolGuid,
|
||||
NULL,
|
||||
&BufferSize,
|
||||
HandleBuffer);
|
||||
if (Status == EFI_BUFFER_TOO_SMALL) {
|
||||
HandleBuffer = AllocateZeroPool(BufferSize);
|
||||
if (HandleBuffer == NULL) {
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
goto Done;
|
||||
}
|
||||
Status = gBS->LocateHandle(
|
||||
ByProtocol,
|
||||
&gEfiRegularExpressionProtocolGuid,
|
||||
NULL,
|
||||
&BufferSize,
|
||||
HandleBuffer);
|
||||
|
||||
} else if (EFI_ERROR (Status)) {
|
||||
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
||||
Status = EFI_SUCCESS;
|
||||
goto Done;
|
||||
}
|
||||
|
||||
for ( Index = 0; Index < BufferSize / sizeof(EFI_HANDLE); Index ++) {
|
||||
Status = gBS->HandleProtocol (
|
||||
HandleBuffer[Index],
|
||||
&gEfiRegularExpressionProtocolGuid,
|
||||
(VOID**)&RegularExpressionProtocol
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Done;
|
||||
}
|
||||
|
||||
RegExSyntaxTypeListSize = 0;
|
||||
RegExSyntaxTypeList = NULL;
|
||||
|
||||
Status = RegularExpressionProtocol->GetInfo (
|
||||
RegularExpressionProtocol,
|
||||
&RegExSyntaxTypeListSize,
|
||||
RegExSyntaxTypeList
|
||||
);
|
||||
if (Status == EFI_BUFFER_TOO_SMALL) {
|
||||
RegExSyntaxTypeList = AllocateZeroPool(RegExSyntaxTypeListSize);
|
||||
if (RegExSyntaxTypeList == NULL) {
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
goto Done;
|
||||
}
|
||||
Status = RegularExpressionProtocol->GetInfo (
|
||||
RegularExpressionProtocol,
|
||||
&RegExSyntaxTypeListSize,
|
||||
RegExSyntaxTypeList
|
||||
);
|
||||
} else if (EFI_ERROR (Status)) {
|
||||
goto Done;
|
||||
}
|
||||
|
||||
for (GuidIndex = 0; GuidIndex < RegExSyntaxTypeListSize / sizeof(EFI_GUID); GuidIndex++) {
|
||||
if (CompareGuid (&RegExSyntaxTypeList[GuidIndex], SyntaxType)) {
|
||||
//
|
||||
// Find the match type, return the value.
|
||||
//
|
||||
Result->Type = EFI_IFR_TYPE_BOOLEAN;
|
||||
Status = RegularExpressionProtocol->MatchString (
|
||||
RegularExpressionProtocol,
|
||||
String[0],
|
||||
String[1],
|
||||
SyntaxType,
|
||||
&Result->Value.b,
|
||||
NULL,
|
||||
&CapturesCount
|
||||
);
|
||||
goto Done;
|
||||
}
|
||||
}
|
||||
|
||||
if (RegExSyntaxTypeList != NULL) {
|
||||
FreePool (RegExSyntaxTypeList);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Type specified by SyntaxType is not supported
|
||||
// in any of the EFI_REGULAR_EXPRESSION_PROTOCOL instances.
|
||||
//
|
||||
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
||||
Status = EFI_SUCCESS;
|
||||
|
||||
Done:
|
||||
if (String[0] != NULL) {
|
||||
FreePool (String[0]);
|
||||
}
|
||||
if (String[1] != NULL) {
|
||||
FreePool (String[1]);
|
||||
}
|
||||
if (RegExSyntaxTypeList != NULL) {
|
||||
FreePool (RegExSyntaxTypeList);
|
||||
}
|
||||
if (HandleBuffer != NULL) {
|
||||
FreePool (HandleBuffer);
|
||||
}
|
||||
return Status;
|
||||
}
|
||||
|
||||
/**
|
||||
Evaluate opcode EFI_IFR_FIND.
|
||||
@@ -3267,6 +3438,10 @@ EvaluateExpression (
|
||||
Status = IfrMatch (FormSet, Value);
|
||||
break;
|
||||
|
||||
case EFI_IFR_MATCH2_OP:
|
||||
Status = IfrMatch2 (FormSet, &OpCode->Guid, Value);
|
||||
break;
|
||||
|
||||
case EFI_IFR_CATENATE_OP:
|
||||
Status = IfrCatenate (FormSet, Value);
|
||||
break;
|
||||
|
Reference in New Issue
Block a user