|
|
@ -1041,7 +1041,8 @@ IfrToString (
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
default:
|
|
|
|
return EFI_UNSUPPORTED;
|
|
|
|
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
|
|
|
|
return EFI_SUCCESS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
UnicodeSPrint (Buffer, BufferSize, PrintFormat, Value.Value.u64);
|
|
|
|
UnicodeSPrint (Buffer, BufferSize, PrintFormat, Value.Value.u64);
|
|
|
|
String = Buffer;
|
|
|
|
String = Buffer;
|
|
|
@ -1077,7 +1078,8 @@ IfrToString (
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
default:
|
|
|
|
return EFI_UNSUPPORTED;
|
|
|
|
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
|
|
|
|
return EFI_SUCCESS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Result->Type = EFI_IFR_TYPE_STRING;
|
|
|
|
Result->Type = EFI_IFR_TYPE_STRING;
|
|
|
@ -1113,7 +1115,8 @@ IfrToUint (
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (Value.Type >= EFI_IFR_TYPE_OTHER && Value.Type != EFI_IFR_TYPE_BUFFER) {
|
|
|
|
if (Value.Type >= EFI_IFR_TYPE_OTHER && Value.Type != EFI_IFR_TYPE_BUFFER) {
|
|
|
|
return EFI_UNSUPPORTED;
|
|
|
|
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
|
|
|
|
return EFI_SUCCESS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Status = EFI_SUCCESS;
|
|
|
|
Status = EFI_SUCCESS;
|
|
|
@ -1140,7 +1143,8 @@ IfrToUint (
|
|
|
|
} else if (Value.Type == EFI_IFR_TYPE_BUFFER) {
|
|
|
|
} else if (Value.Type == EFI_IFR_TYPE_BUFFER) {
|
|
|
|
if (Value.BufferLen > 8) {
|
|
|
|
if (Value.BufferLen > 8) {
|
|
|
|
FreePool (Value.Buffer);
|
|
|
|
FreePool (Value.Buffer);
|
|
|
|
return EFI_UNSUPPORTED;
|
|
|
|
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
|
|
|
|
return EFI_SUCCESS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Result->Value.u64 = *(UINT64*) Value.Buffer;
|
|
|
|
Result->Value.u64 = *(UINT64*) Value.Buffer;
|
|
|
|
FreePool (Value.Buffer);
|
|
|
|
FreePool (Value.Buffer);
|
|
|
@ -1186,14 +1190,20 @@ IfrCatenate (
|
|
|
|
Status = EFI_SUCCESS;
|
|
|
|
Status = EFI_SUCCESS;
|
|
|
|
ZeroMem (Value, sizeof (Value));
|
|
|
|
ZeroMem (Value, sizeof (Value));
|
|
|
|
|
|
|
|
|
|
|
|
for (Index = 0; Index < 2; Index++) {
|
|
|
|
Status = PopExpression (&Value[0]);
|
|
|
|
Status = PopExpression (&Value[Index]);
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
goto Done;
|
|
|
|
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 && Value[Index].Type != EFI_IFR_TYPE_BUFFER) {
|
|
|
|
if (Value[Index].Type != EFI_IFR_TYPE_STRING && Value[Index].Type != EFI_IFR_TYPE_BUFFER) {
|
|
|
|
Status = EFI_UNSUPPORTED;
|
|
|
|
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
|
|
|
|
Status = EFI_SUCCESS;
|
|
|
|
goto Done;
|
|
|
|
goto Done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -1263,7 +1273,7 @@ IfrMatch (
|
|
|
|
)
|
|
|
|
)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
EFI_STATUS Status;
|
|
|
|
EFI_STATUS Status;
|
|
|
|
EFI_HII_VALUE Value;
|
|
|
|
EFI_HII_VALUE Value[2];
|
|
|
|
CHAR16 *String[2];
|
|
|
|
CHAR16 *String[2];
|
|
|
|
UINTN Index;
|
|
|
|
UINTN Index;
|
|
|
|
|
|
|
|
|
|
|
@ -1274,18 +1284,26 @@ IfrMatch (
|
|
|
|
String[0] = NULL;
|
|
|
|
String[0] = NULL;
|
|
|
|
String[1] = NULL;
|
|
|
|
String[1] = NULL;
|
|
|
|
Status = EFI_SUCCESS;
|
|
|
|
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++) {
|
|
|
|
for (Index = 0; Index < 2; Index++) {
|
|
|
|
Status = PopExpression (&Value);
|
|
|
|
if (Value[Index].Type != EFI_IFR_TYPE_STRING) {
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
|
|
|
|
Status = EFI_SUCCESS;
|
|
|
|
goto Done;
|
|
|
|
goto Done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (Value.Type != EFI_IFR_TYPE_STRING) {
|
|
|
|
String[Index] = GetToken (Value[Index].Value.string, FormSet->HiiHandle);
|
|
|
|
Status = EFI_UNSUPPORTED;
|
|
|
|
|
|
|
|
goto Done;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
String[Index] = GetToken (Value.Value.string, FormSet->HiiHandle);
|
|
|
|
|
|
|
|
if (String [Index] == NULL) {
|
|
|
|
if (String [Index] == NULL) {
|
|
|
|
Status = EFI_NOT_FOUND;
|
|
|
|
Status = EFI_NOT_FOUND;
|
|
|
|
goto Done;
|
|
|
|
goto Done;
|
|
|
@ -1326,24 +1344,38 @@ IfrFind (
|
|
|
|
)
|
|
|
|
)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
EFI_STATUS Status;
|
|
|
|
EFI_STATUS Status;
|
|
|
|
EFI_HII_VALUE Value;
|
|
|
|
EFI_HII_VALUE Value[3];
|
|
|
|
CHAR16 *String[2];
|
|
|
|
CHAR16 *String[2];
|
|
|
|
UINTN Base;
|
|
|
|
UINTN Base;
|
|
|
|
CHAR16 *StringPtr;
|
|
|
|
CHAR16 *StringPtr;
|
|
|
|
UINTN Index;
|
|
|
|
UINTN Index;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ZeroMem (Value, sizeof (Value));
|
|
|
|
|
|
|
|
|
|
|
|
if (Format > EFI_IFR_FF_CASE_INSENSITIVE) {
|
|
|
|
if (Format > EFI_IFR_FF_CASE_INSENSITIVE) {
|
|
|
|
return EFI_UNSUPPORTED;
|
|
|
|
return EFI_INVALID_PARAMETER;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Status = PopExpression (&Value);
|
|
|
|
Status = PopExpression (&Value[0]);
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
return Status;
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (Value.Type > EFI_IFR_TYPE_NUM_SIZE_64) {
|
|
|
|
|
|
|
|
return EFI_UNSUPPORTED;
|
|
|
|
Status = PopExpression (&Value[1]);
|
|
|
|
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Base = (UINTN) Value.Value.u64;
|
|
|
|
|
|
|
|
|
|
|
|
Status = PopExpression (&Value[2]);
|
|
|
|
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
|
|
|
|
return Status;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (Value[0].Type > EFI_IFR_TYPE_NUM_SIZE_64) {
|
|
|
|
|
|
|
|
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
|
|
|
|
return EFI_SUCCESS;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
Base = (UINTN) Value[0].Value.u64;
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// String[0] - sub-string
|
|
|
|
// String[0] - sub-string
|
|
|
@ -1352,17 +1384,13 @@ IfrFind (
|
|
|
|
String[0] = NULL;
|
|
|
|
String[0] = NULL;
|
|
|
|
String[1] = NULL;
|
|
|
|
String[1] = NULL;
|
|
|
|
for (Index = 0; Index < 2; Index++) {
|
|
|
|
for (Index = 0; Index < 2; Index++) {
|
|
|
|
Status = PopExpression (&Value);
|
|
|
|
if (Value[Index + 1].Type != EFI_IFR_TYPE_STRING) {
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
|
|
|
|
Status = EFI_SUCCESS;
|
|
|
|
goto Done;
|
|
|
|
goto Done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (Value.Type != EFI_IFR_TYPE_STRING) {
|
|
|
|
String[Index] = GetToken (Value[Index + 1].Value.string, FormSet->HiiHandle);
|
|
|
|
Status = EFI_UNSUPPORTED;
|
|
|
|
|
|
|
|
goto Done;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
String[Index] = GetToken (Value.Value.string, FormSet->HiiHandle);
|
|
|
|
|
|
|
|
if (String[Index] == NULL) {
|
|
|
|
if (String[Index] == NULL) {
|
|
|
|
Status = EFI_NOT_FOUND;
|
|
|
|
Status = EFI_NOT_FOUND;
|
|
|
|
goto Done;
|
|
|
|
goto Done;
|
|
|
@ -1413,7 +1441,7 @@ IfrMid (
|
|
|
|
)
|
|
|
|
)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
EFI_STATUS Status;
|
|
|
|
EFI_STATUS Status;
|
|
|
|
EFI_HII_VALUE Value;
|
|
|
|
EFI_HII_VALUE Value[3];
|
|
|
|
CHAR16 *String;
|
|
|
|
CHAR16 *String;
|
|
|
|
UINTN Base;
|
|
|
|
UINTN Base;
|
|
|
|
UINTN Length;
|
|
|
|
UINTN Length;
|
|
|
@ -1421,33 +1449,41 @@ IfrMid (
|
|
|
|
UINT8 *Buffer;
|
|
|
|
UINT8 *Buffer;
|
|
|
|
UINT16 BufferLen;
|
|
|
|
UINT16 BufferLen;
|
|
|
|
|
|
|
|
|
|
|
|
Status = PopExpression (&Value);
|
|
|
|
ZeroMem (Value, sizeof (Value));
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
|
|
|
|
return Status;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (Value.Type > EFI_IFR_TYPE_NUM_SIZE_64) {
|
|
|
|
|
|
|
|
return EFI_UNSUPPORTED;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
Length = (UINTN) Value.Value.u64;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Status = PopExpression (&Value);
|
|
|
|
Status = PopExpression (&Value[0]);
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
return Status;
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (Value.Type > EFI_IFR_TYPE_NUM_SIZE_64) {
|
|
|
|
|
|
|
|
return EFI_UNSUPPORTED;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
Base = (UINTN) Value.Value.u64;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Status = PopExpression (&Value);
|
|
|
|
Status = PopExpression (&Value[1]);
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
return Status;
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (Value.Type != EFI_IFR_TYPE_STRING && Value.Type != EFI_IFR_TYPE_BUFFER) {
|
|
|
|
|
|
|
|
return EFI_UNSUPPORTED;
|
|
|
|
Status = PopExpression (&Value[2]);
|
|
|
|
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
|
|
|
|
return Status;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (Value[0].Type > EFI_IFR_TYPE_NUM_SIZE_64) {
|
|
|
|
|
|
|
|
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
|
|
|
|
return EFI_SUCCESS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (Value.Type == EFI_IFR_TYPE_STRING) {
|
|
|
|
Length = (UINTN) Value[0].Value.u64;
|
|
|
|
String = GetToken (Value.Value.string, FormSet->HiiHandle);
|
|
|
|
|
|
|
|
|
|
|
|
if (Value[1].Type > EFI_IFR_TYPE_NUM_SIZE_64) {
|
|
|
|
|
|
|
|
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
|
|
|
|
return EFI_SUCCESS;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
Base = (UINTN) Value[1].Value.u64;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (Value[2].Type != EFI_IFR_TYPE_STRING && Value[2].Type != EFI_IFR_TYPE_BUFFER) {
|
|
|
|
|
|
|
|
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
|
|
|
|
return EFI_SUCCESS;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (Value[2].Type == EFI_IFR_TYPE_STRING) {
|
|
|
|
|
|
|
|
String = GetToken (Value[2].Value.string, FormSet->HiiHandle);
|
|
|
|
if (String == NULL) {
|
|
|
|
if (String == NULL) {
|
|
|
|
return EFI_NOT_FOUND;
|
|
|
|
return EFI_NOT_FOUND;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -1466,8 +1502,8 @@ IfrMid (
|
|
|
|
|
|
|
|
|
|
|
|
FreePool (String);
|
|
|
|
FreePool (String);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
Buffer = Value.Buffer;
|
|
|
|
Buffer = Value[2].Buffer;
|
|
|
|
BufferLen = Value.BufferLen;
|
|
|
|
BufferLen = Value[2].BufferLen;
|
|
|
|
|
|
|
|
|
|
|
|
Result->Type = EFI_IFR_TYPE_BUFFER;
|
|
|
|
Result->Type = EFI_IFR_TYPE_BUFFER;
|
|
|
|
if (Length == 0 || Base >= BufferLen) {
|
|
|
|
if (Length == 0 || Base >= BufferLen) {
|
|
|
@ -1477,10 +1513,10 @@ IfrMid (
|
|
|
|
Result->BufferLen = (UINT16)((BufferLen - Base) < Length ? (BufferLen - Base) : Length);
|
|
|
|
Result->BufferLen = (UINT16)((BufferLen - Base) < Length ? (BufferLen - Base) : Length);
|
|
|
|
Result->Buffer = AllocateZeroPool (Result->BufferLen);
|
|
|
|
Result->Buffer = AllocateZeroPool (Result->BufferLen);
|
|
|
|
ASSERT (Result->Buffer != NULL);
|
|
|
|
ASSERT (Result->Buffer != NULL);
|
|
|
|
CopyMem (Result->Buffer, &Value.Buffer[Base], Result->BufferLen);
|
|
|
|
CopyMem (Result->Buffer, &Value[2].Buffer[Base], Result->BufferLen);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FreePool (Value.Buffer);
|
|
|
|
FreePool (Value[2].Buffer);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return Status;
|
|
|
|
return Status;
|
|
|
@ -1504,7 +1540,7 @@ IfrToken (
|
|
|
|
)
|
|
|
|
)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
EFI_STATUS Status;
|
|
|
|
EFI_STATUS Status;
|
|
|
|
EFI_HII_VALUE Value;
|
|
|
|
EFI_HII_VALUE Value[3];
|
|
|
|
CHAR16 *String[2];
|
|
|
|
CHAR16 *String[2];
|
|
|
|
UINTN Count;
|
|
|
|
UINTN Count;
|
|
|
|
CHAR16 *Delimiter;
|
|
|
|
CHAR16 *Delimiter;
|
|
|
@ -1512,14 +1548,28 @@ IfrToken (
|
|
|
|
CHAR16 *StringPtr;
|
|
|
|
CHAR16 *StringPtr;
|
|
|
|
UINTN Index;
|
|
|
|
UINTN Index;
|
|
|
|
|
|
|
|
|
|
|
|
Status = PopExpression (&Value);
|
|
|
|
ZeroMem (Value, sizeof (Value));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Status = PopExpression (&Value[0]);
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
return Status;
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (Value.Type > EFI_IFR_TYPE_NUM_SIZE_64) {
|
|
|
|
|
|
|
|
return EFI_UNSUPPORTED;
|
|
|
|
Status = PopExpression (&Value[1]);
|
|
|
|
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Count = (UINTN) Value.Value.u64;
|
|
|
|
|
|
|
|
|
|
|
|
Status = PopExpression (&Value[2]);
|
|
|
|
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
|
|
|
|
return Status;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (Value[0].Type > EFI_IFR_TYPE_NUM_SIZE_64) {
|
|
|
|
|
|
|
|
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
|
|
|
|
return EFI_SUCCESS;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
Count = (UINTN) Value[0].Value.u64;
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// String[0] - Delimiter
|
|
|
|
// String[0] - Delimiter
|
|
|
@ -1528,17 +1578,13 @@ IfrToken (
|
|
|
|
String[0] = NULL;
|
|
|
|
String[0] = NULL;
|
|
|
|
String[1] = NULL;
|
|
|
|
String[1] = NULL;
|
|
|
|
for (Index = 0; Index < 2; Index++) {
|
|
|
|
for (Index = 0; Index < 2; Index++) {
|
|
|
|
Status = PopExpression (&Value);
|
|
|
|
if (Value[Index + 1].Type != EFI_IFR_TYPE_STRING) {
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
|
|
|
|
Status = EFI_SUCCESS;
|
|
|
|
goto Done;
|
|
|
|
goto Done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (Value.Type != EFI_IFR_TYPE_STRING) {
|
|
|
|
String[Index] = GetToken (Value[Index + 1].Value.string, FormSet->HiiHandle);
|
|
|
|
Status = EFI_UNSUPPORTED;
|
|
|
|
|
|
|
|
goto Done;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
String[Index] = GetToken (Value.Value.string, FormSet->HiiHandle);
|
|
|
|
|
|
|
|
if (String[Index] == NULL) {
|
|
|
|
if (String[Index] == NULL) {
|
|
|
|
Status = EFI_NOT_FOUND;
|
|
|
|
Status = EFI_NOT_FOUND;
|
|
|
|
goto Done;
|
|
|
|
goto Done;
|
|
|
@ -1609,7 +1655,7 @@ IfrSpan (
|
|
|
|
)
|
|
|
|
)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
EFI_STATUS Status;
|
|
|
|
EFI_STATUS Status;
|
|
|
|
EFI_HII_VALUE Value;
|
|
|
|
EFI_HII_VALUE Value[3];
|
|
|
|
CHAR16 *String[2];
|
|
|
|
CHAR16 *String[2];
|
|
|
|
CHAR16 *Charset;
|
|
|
|
CHAR16 *Charset;
|
|
|
|
UINTN Base;
|
|
|
|
UINTN Base;
|
|
|
@ -1617,14 +1663,28 @@ IfrSpan (
|
|
|
|
CHAR16 *StringPtr;
|
|
|
|
CHAR16 *StringPtr;
|
|
|
|
BOOLEAN Found;
|
|
|
|
BOOLEAN Found;
|
|
|
|
|
|
|
|
|
|
|
|
Status = PopExpression (&Value);
|
|
|
|
ZeroMem (Value, sizeof (Value));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Status = PopExpression (&Value[0]);
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
return Status;
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (Value.Type > EFI_IFR_TYPE_NUM_SIZE_64) {
|
|
|
|
|
|
|
|
return EFI_UNSUPPORTED;
|
|
|
|
Status = PopExpression (&Value[1]);
|
|
|
|
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Base = (UINTN) Value.Value.u64;
|
|
|
|
|
|
|
|
|
|
|
|
Status = PopExpression (&Value[2]);
|
|
|
|
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
|
|
|
|
return Status;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (Value[0].Type > EFI_IFR_TYPE_NUM_SIZE_64) {
|
|
|
|
|
|
|
|
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
|
|
|
|
return EFI_SUCCESS;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
Base = (UINTN) Value[0].Value.u64;
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// String[0] - Charset
|
|
|
|
// String[0] - Charset
|
|
|
@ -1633,17 +1693,13 @@ IfrSpan (
|
|
|
|
String[0] = NULL;
|
|
|
|
String[0] = NULL;
|
|
|
|
String[1] = NULL;
|
|
|
|
String[1] = NULL;
|
|
|
|
for (Index = 0; Index < 2; Index++) {
|
|
|
|
for (Index = 0; Index < 2; Index++) {
|
|
|
|
Status = PopExpression (&Value);
|
|
|
|
if (Value[Index + 1].Type != EFI_IFR_TYPE_STRING) {
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
|
|
|
|
Status = EFI_SUCCESS;
|
|
|
|
goto Done;
|
|
|
|
goto Done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (Value.Type != EFI_IFR_TYPE_STRING) {
|
|
|
|
String[Index] = GetToken (Value[Index + 1].Value.string, FormSet->HiiHandle);
|
|
|
|
Status = EFI_UNSUPPORTED;
|
|
|
|
|
|
|
|
goto Done;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
String[Index] = GetToken (Value.Value.string, FormSet->HiiHandle);
|
|
|
|
|
|
|
|
if (String [Index] == NULL) {
|
|
|
|
if (String [Index] == NULL) {
|
|
|
|
Status = EFI_NOT_FOUND;
|
|
|
|
Status = EFI_NOT_FOUND;
|
|
|
|
goto Done;
|
|
|
|
goto Done;
|
|
|
@ -1651,7 +1707,8 @@ IfrSpan (
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (Base >= StrLen (String[1])) {
|
|
|
|
if (Base >= StrLen (String[1])) {
|
|
|
|
Status = EFI_UNSUPPORTED;
|
|
|
|
Result->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
|
|
|
|
Status = EFI_SUCCESS;
|
|
|
|
goto Done;
|
|
|
|
goto Done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -1750,22 +1807,24 @@ ExtendValueToU64 (
|
|
|
|
|
|
|
|
|
|
|
|
@param Value1 Expression value to compare on left-hand.
|
|
|
|
@param Value1 Expression value to compare on left-hand.
|
|
|
|
@param Value2 Expression value to compare on right-hand.
|
|
|
|
@param Value2 Expression value to compare on right-hand.
|
|
|
|
|
|
|
|
@param Result Return value after compare.
|
|
|
|
|
|
|
|
retval 0 Two operators equal.
|
|
|
|
|
|
|
|
return Positive value if Value1 is greater than Value2.
|
|
|
|
|
|
|
|
retval Negative value if Value1 is less than Value2.
|
|
|
|
@param HiiHandle Only required for string compare.
|
|
|
|
@param HiiHandle Only required for string compare.
|
|
|
|
|
|
|
|
|
|
|
|
@retval EFI_INVALID_PARAMETER Could not perform compare on two values.
|
|
|
|
@retval other Could not perform compare on two values.
|
|
|
|
@retval 0 Two operators equal.
|
|
|
|
@retval EFI_SUCCESS Compare the value success.
|
|
|
|
@return Positive value if Value1 is greater than Value2.
|
|
|
|
|
|
|
|
@retval Negative value if Value1 is less than Value2.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
**/
|
|
|
|
INTN
|
|
|
|
EFI_STATUS
|
|
|
|
CompareHiiValue (
|
|
|
|
CompareHiiValue (
|
|
|
|
IN EFI_HII_VALUE *Value1,
|
|
|
|
IN EFI_HII_VALUE *Value1,
|
|
|
|
IN EFI_HII_VALUE *Value2,
|
|
|
|
IN EFI_HII_VALUE *Value2,
|
|
|
|
|
|
|
|
OUT INTN *Result,
|
|
|
|
IN EFI_HII_HANDLE HiiHandle OPTIONAL
|
|
|
|
IN EFI_HII_HANDLE HiiHandle OPTIONAL
|
|
|
|
)
|
|
|
|
)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
INTN Result;
|
|
|
|
|
|
|
|
INT64 Temp64;
|
|
|
|
INT64 Temp64;
|
|
|
|
CHAR16 *Str1;
|
|
|
|
CHAR16 *Str1;
|
|
|
|
CHAR16 *Str2;
|
|
|
|
CHAR16 *Str2;
|
|
|
@ -1773,7 +1832,7 @@ CompareHiiValue (
|
|
|
|
|
|
|
|
|
|
|
|
if (Value1->Type >= EFI_IFR_TYPE_OTHER || Value2->Type >= EFI_IFR_TYPE_OTHER ) {
|
|
|
|
if (Value1->Type >= EFI_IFR_TYPE_OTHER || Value2->Type >= EFI_IFR_TYPE_OTHER ) {
|
|
|
|
if (Value1->Type != EFI_IFR_TYPE_BUFFER && Value2->Type != EFI_IFR_TYPE_BUFFER) {
|
|
|
|
if (Value1->Type != EFI_IFR_TYPE_BUFFER && Value2->Type != EFI_IFR_TYPE_BUFFER) {
|
|
|
|
return EFI_INVALID_PARAMETER;
|
|
|
|
return EFI_UNSUPPORTED;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -1782,7 +1841,7 @@ CompareHiiValue (
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// Both Operator should be type of String
|
|
|
|
// Both Operator should be type of String
|
|
|
|
//
|
|
|
|
//
|
|
|
|
return EFI_INVALID_PARAMETER;
|
|
|
|
return EFI_UNSUPPORTED;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (Value1->Value.string == 0 || Value2->Value.string == 0) {
|
|
|
|
if (Value1->Value.string == 0 || Value2->Value.string == 0) {
|
|
|
@ -1793,7 +1852,8 @@ CompareHiiValue (
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (Value1->Value.string == Value2->Value.string) {
|
|
|
|
if (Value1->Value.string == Value2->Value.string) {
|
|
|
|
return 0;
|
|
|
|
*Result = 0;
|
|
|
|
|
|
|
|
return EFI_SUCCESS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Str1 = GetToken (Value1->Value.string, HiiHandle);
|
|
|
|
Str1 = GetToken (Value1->Value.string, HiiHandle);
|
|
|
@ -1801,21 +1861,21 @@ CompareHiiValue (
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// String not found
|
|
|
|
// String not found
|
|
|
|
//
|
|
|
|
//
|
|
|
|
return EFI_INVALID_PARAMETER;
|
|
|
|
return EFI_NOT_FOUND;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Str2 = GetToken (Value2->Value.string, HiiHandle);
|
|
|
|
Str2 = GetToken (Value2->Value.string, HiiHandle);
|
|
|
|
if (Str2 == NULL) {
|
|
|
|
if (Str2 == NULL) {
|
|
|
|
FreePool (Str1);
|
|
|
|
FreePool (Str1);
|
|
|
|
return EFI_INVALID_PARAMETER;
|
|
|
|
return EFI_NOT_FOUND;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Result = StrCmp (Str1, Str2);
|
|
|
|
*Result = StrCmp (Str1, Str2);
|
|
|
|
|
|
|
|
|
|
|
|
FreePool (Str1);
|
|
|
|
FreePool (Str1);
|
|
|
|
FreePool (Str2);
|
|
|
|
FreePool (Str2);
|
|
|
|
|
|
|
|
|
|
|
|
return Result;
|
|
|
|
return EFI_SUCCESS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (Value1->Type == EFI_IFR_TYPE_BUFFER || Value2->Type == EFI_IFR_TYPE_BUFFER ) {
|
|
|
|
if (Value1->Type == EFI_IFR_TYPE_BUFFER || Value2->Type == EFI_IFR_TYPE_BUFFER ) {
|
|
|
@ -1823,19 +1883,19 @@ CompareHiiValue (
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// Both Operator should be type of Buffer.
|
|
|
|
// Both Operator should be type of Buffer.
|
|
|
|
//
|
|
|
|
//
|
|
|
|
return EFI_INVALID_PARAMETER;
|
|
|
|
return EFI_UNSUPPORTED;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Len = Value1->BufferLen > Value2->BufferLen ? Value2->BufferLen : Value1->BufferLen;
|
|
|
|
Len = Value1->BufferLen > Value2->BufferLen ? Value2->BufferLen : Value1->BufferLen;
|
|
|
|
Result = CompareMem (Value1->Buffer, Value2->Buffer, Len);
|
|
|
|
*Result = CompareMem (Value1->Buffer, Value2->Buffer, Len);
|
|
|
|
if ((Result == 0) && (Value1->BufferLen != Value2->BufferLen))
|
|
|
|
if ((*Result == 0) && (Value1->BufferLen != Value2->BufferLen))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// In this case, means base on samll number buffer, the data is same
|
|
|
|
// In this case, means base on samll number buffer, the data is same
|
|
|
|
// So which value has more data, which value is bigger.
|
|
|
|
// So which value has more data, which value is bigger.
|
|
|
|
//
|
|
|
|
//
|
|
|
|
Result = Value1->BufferLen > Value2->BufferLen ? 1 : -1;
|
|
|
|
*Result = Value1->BufferLen > Value2->BufferLen ? 1 : -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return Result;
|
|
|
|
return EFI_SUCCESS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
//
|
|
|
@ -1843,14 +1903,14 @@ CompareHiiValue (
|
|
|
|
//
|
|
|
|
//
|
|
|
|
Temp64 = (INT64) (Value1->Value.u64 - Value2->Value.u64);
|
|
|
|
Temp64 = (INT64) (Value1->Value.u64 - Value2->Value.u64);
|
|
|
|
if (Temp64 > 0) {
|
|
|
|
if (Temp64 > 0) {
|
|
|
|
Result = 1;
|
|
|
|
*Result = 1;
|
|
|
|
} else if (Temp64 < 0) {
|
|
|
|
} else if (Temp64 < 0) {
|
|
|
|
Result = -1;
|
|
|
|
*Result = -1;
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
Result = 0;
|
|
|
|
*Result = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return Result;
|
|
|
|
return EFI_SUCCESS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -2180,13 +2240,18 @@ EvaluateExpression (
|
|
|
|
case EFI_IFR_EQ_ID_VAL_OP:
|
|
|
|
case EFI_IFR_EQ_ID_VAL_OP:
|
|
|
|
Question = IdToQuestion (FormSet, Form, OpCode->QuestionId);
|
|
|
|
Question = IdToQuestion (FormSet, Form, OpCode->QuestionId);
|
|
|
|
if (Question == NULL) {
|
|
|
|
if (Question == NULL) {
|
|
|
|
Status = EFI_NOT_FOUND;
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
goto Done;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Result = CompareHiiValue (&Question->HiiValue, &OpCode->Value, NULL);
|
|
|
|
Status = CompareHiiValue (&Question->HiiValue, &OpCode->Value, &Result, NULL);
|
|
|
|
if (Result == EFI_INVALID_PARAMETER) {
|
|
|
|
if (Status == EFI_UNSUPPORTED) {
|
|
|
|
Status = EFI_INVALID_PARAMETER;
|
|
|
|
Status = EFI_SUCCESS;
|
|
|
|
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
goto Done;
|
|
|
|
goto Done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Value->Value.b = (BOOLEAN) ((Result == 0) ? TRUE : FALSE);
|
|
|
|
Value->Value.b = (BOOLEAN) ((Result == 0) ? TRUE : FALSE);
|
|
|
@ -2195,19 +2260,23 @@ EvaluateExpression (
|
|
|
|
case EFI_IFR_EQ_ID_ID_OP:
|
|
|
|
case EFI_IFR_EQ_ID_ID_OP:
|
|
|
|
Question = IdToQuestion (FormSet, Form, OpCode->QuestionId);
|
|
|
|
Question = IdToQuestion (FormSet, Form, OpCode->QuestionId);
|
|
|
|
if (Question == NULL) {
|
|
|
|
if (Question == NULL) {
|
|
|
|
Status = EFI_NOT_FOUND;
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
goto Done;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Question2 = IdToQuestion (FormSet, Form, OpCode->QuestionId2);
|
|
|
|
Question2 = IdToQuestion (FormSet, Form, OpCode->QuestionId2);
|
|
|
|
if (Question2 == NULL) {
|
|
|
|
if (Question2 == NULL) {
|
|
|
|
Status = EFI_NOT_FOUND;
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
goto Done;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Result = CompareHiiValue (&Question->HiiValue, &Question2->HiiValue, FormSet->HiiHandle);
|
|
|
|
Status = CompareHiiValue (&Question->HiiValue, &Question2->HiiValue, &Result, FormSet->HiiHandle);
|
|
|
|
if (Result == EFI_INVALID_PARAMETER) {
|
|
|
|
if (Status == EFI_UNSUPPORTED) {
|
|
|
|
Status = EFI_INVALID_PARAMETER;
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
|
|
|
|
Status = EFI_SUCCESS;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
goto Done;
|
|
|
|
goto Done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Value->Value.b = (BOOLEAN) ((Result == 0) ? TRUE : FALSE);
|
|
|
|
Value->Value.b = (BOOLEAN) ((Result == 0) ? TRUE : FALSE);
|
|
|
@ -2216,8 +2285,8 @@ EvaluateExpression (
|
|
|
|
case EFI_IFR_EQ_ID_VAL_LIST_OP:
|
|
|
|
case EFI_IFR_EQ_ID_VAL_LIST_OP:
|
|
|
|
Question = IdToQuestion (FormSet, Form, OpCode->QuestionId);
|
|
|
|
Question = IdToQuestion (FormSet, Form, OpCode->QuestionId);
|
|
|
|
if (Question == NULL) {
|
|
|
|
if (Question == NULL) {
|
|
|
|
Status = EFI_NOT_FOUND;
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
goto Done;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Value->Value.b = FALSE;
|
|
|
|
Value->Value.b = FALSE;
|
|
|
@ -2395,33 +2464,33 @@ EvaluateExpression (
|
|
|
|
// Validate the expression value
|
|
|
|
// Validate the expression value
|
|
|
|
//
|
|
|
|
//
|
|
|
|
if ((Value->Type > EFI_IFR_TYPE_NUM_SIZE_64) || (Value->Value.u64 > 0xffff)) {
|
|
|
|
if ((Value->Type > EFI_IFR_TYPE_NUM_SIZE_64) || (Value->Value.u64 > 0xffff)) {
|
|
|
|
Status = EFI_NOT_FOUND;
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
goto Done;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (OpCode->DevicePath != 0) {
|
|
|
|
if (OpCode->DevicePath != 0) {
|
|
|
|
StrPtr = GetToken (OpCode->DevicePath, FormSet->HiiHandle);
|
|
|
|
StrPtr = GetToken (OpCode->DevicePath, FormSet->HiiHandle);
|
|
|
|
if (StrPtr == NULL) {
|
|
|
|
if (StrPtr == NULL) {
|
|
|
|
Status = EFI_NOT_FOUND;
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
goto Done;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!GetQuestionValueFromForm((EFI_DEVICE_PATH_PROTOCOL*)StrPtr, NULL, &OpCode->Guid, Value->Value.u16, &QuestionVal)){
|
|
|
|
if (!GetQuestionValueFromForm((EFI_DEVICE_PATH_PROTOCOL*)StrPtr, NULL, &OpCode->Guid, Value->Value.u16, &QuestionVal)){
|
|
|
|
Status = EFI_NOT_FOUND;
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
goto Done;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Value = &QuestionVal;
|
|
|
|
Value = &QuestionVal;
|
|
|
|
} else if (CompareGuid (&OpCode->Guid, &gZeroGuid) != 0) {
|
|
|
|
} else if (CompareGuid (&OpCode->Guid, &gZeroGuid) != 0) {
|
|
|
|
if (!GetQuestionValueFromForm(NULL, FormSet->HiiHandle, &OpCode->Guid, Value->Value.u16, &QuestionVal)){
|
|
|
|
if (!GetQuestionValueFromForm(NULL, FormSet->HiiHandle, &OpCode->Guid, Value->Value.u16, &QuestionVal)){
|
|
|
|
Status = EFI_NOT_FOUND;
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
goto Done;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Value = &QuestionVal;
|
|
|
|
Value = &QuestionVal;
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
Question = IdToQuestion (FormSet, Form, Value->Value.u16);
|
|
|
|
Question = IdToQuestion (FormSet, Form, Value->Value.u16);
|
|
|
|
if (Question == NULL) {
|
|
|
|
if (Question == NULL) {
|
|
|
|
Status = EFI_NOT_FOUND;
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
goto Done;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
//
|
|
|
@ -2437,16 +2506,17 @@ EvaluateExpression (
|
|
|
|
//
|
|
|
|
//
|
|
|
|
RuleExpression = RuleIdToExpression (Form, OpCode->RuleId);
|
|
|
|
RuleExpression = RuleIdToExpression (Form, OpCode->RuleId);
|
|
|
|
if (RuleExpression == NULL) {
|
|
|
|
if (RuleExpression == NULL) {
|
|
|
|
Status = EFI_NOT_FOUND;
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
goto Done;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// Evaluate this rule expression
|
|
|
|
// Evaluate this rule expression
|
|
|
|
//
|
|
|
|
//
|
|
|
|
Status = EvaluateExpression (FormSet, Form, RuleExpression);
|
|
|
|
Status = EvaluateExpression (FormSet, Form, RuleExpression);
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
if (EFI_ERROR (Status) || RuleExpression->Result.Type == EFI_IFR_TYPE_UNDEFINED) {
|
|
|
|
goto Done;
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Value = &RuleExpression->Result;
|
|
|
|
Value = &RuleExpression->Result;
|
|
|
@ -2483,8 +2553,8 @@ EvaluateExpression (
|
|
|
|
goto Done;
|
|
|
|
goto Done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (Value->Type != EFI_IFR_TYPE_STRING && Value->Type != EFI_IFR_TYPE_BUFFER) {
|
|
|
|
if (Value->Type != EFI_IFR_TYPE_STRING && Value->Type != EFI_IFR_TYPE_BUFFER) {
|
|
|
|
Status = EFI_INVALID_PARAMETER;
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
goto Done;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (Value->Type == EFI_IFR_TYPE_STRING) {
|
|
|
|
if (Value->Type == EFI_IFR_TYPE_STRING) {
|
|
|
@ -2510,8 +2580,8 @@ EvaluateExpression (
|
|
|
|
goto Done;
|
|
|
|
goto Done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (Value->Type != EFI_IFR_TYPE_BOOLEAN) {
|
|
|
|
if (Value->Type != EFI_IFR_TYPE_BOOLEAN) {
|
|
|
|
Status = EFI_INVALID_PARAMETER;
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
goto Done;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Value->Value.b = (BOOLEAN) (!Value->Value.b);
|
|
|
|
Value->Value.b = (BOOLEAN) (!Value->Value.b);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
@ -2529,14 +2599,14 @@ EvaluateExpression (
|
|
|
|
// Validate the expression value
|
|
|
|
// Validate the expression value
|
|
|
|
//
|
|
|
|
//
|
|
|
|
if ((Value->Type > EFI_IFR_TYPE_NUM_SIZE_64) || (Value->Value.u64 > 0xffff)) {
|
|
|
|
if ((Value->Type > EFI_IFR_TYPE_NUM_SIZE_64) || (Value->Value.u64 > 0xffff)) {
|
|
|
|
Status = EFI_NOT_FOUND;
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
goto Done;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Question = IdToQuestion (FormSet, Form, Value->Value.u16);
|
|
|
|
Question = IdToQuestion (FormSet, Form, Value->Value.u16);
|
|
|
|
if (Question == NULL) {
|
|
|
|
if (Question == NULL) {
|
|
|
|
Status = EFI_NOT_FOUND;
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
goto Done;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Value = &Question->HiiValue;
|
|
|
|
Value = &Question->HiiValue;
|
|
|
@ -2555,8 +2625,8 @@ EvaluateExpression (
|
|
|
|
// Validate the expression value
|
|
|
|
// Validate the expression value
|
|
|
|
//
|
|
|
|
//
|
|
|
|
if ((Value->Type > EFI_IFR_TYPE_NUM_SIZE_64) || (Value->Value.u64 > 0xffff)) {
|
|
|
|
if ((Value->Type > EFI_IFR_TYPE_NUM_SIZE_64) || (Value->Value.u64 > 0xffff)) {
|
|
|
|
Status = EFI_NOT_FOUND;
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
goto Done;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Value->Type = EFI_IFR_TYPE_STRING;
|
|
|
|
Value->Type = EFI_IFR_TYPE_STRING;
|
|
|
@ -2608,15 +2678,14 @@ EvaluateExpression (
|
|
|
|
IfrStrToUpper (StrPtr);
|
|
|
|
IfrStrToUpper (StrPtr);
|
|
|
|
if (StrCmp (StrPtr, L"TRUE") == 0){
|
|
|
|
if (StrCmp (StrPtr, L"TRUE") == 0){
|
|
|
|
Value->Value.b = TRUE;
|
|
|
|
Value->Value.b = TRUE;
|
|
|
|
|
|
|
|
Value->Type = EFI_IFR_TYPE_BOOLEAN;
|
|
|
|
} else if (StrCmp (StrPtr, L"FALSE") == 0) {
|
|
|
|
} else if (StrCmp (StrPtr, L"FALSE") == 0) {
|
|
|
|
Value->Value.b = FALSE;
|
|
|
|
Value->Value.b = FALSE;
|
|
|
|
|
|
|
|
Value->Type = EFI_IFR_TYPE_BOOLEAN;
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
Status = EFI_INVALID_PARAMETER;
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
FreePool (StrPtr);
|
|
|
|
|
|
|
|
goto Done;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
FreePool (StrPtr);
|
|
|
|
FreePool (StrPtr);
|
|
|
|
Value->Type = EFI_IFR_TYPE_BOOLEAN;
|
|
|
|
|
|
|
|
} else if (Value->Type == EFI_IFR_TYPE_BUFFER) {
|
|
|
|
} else if (Value->Type == EFI_IFR_TYPE_BUFFER) {
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// When converting from a buffer, if the buffer is all zeroes,
|
|
|
|
// When converting from a buffer, if the buffer is all zeroes,
|
|
|
@ -2659,8 +2728,8 @@ EvaluateExpression (
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (Value->Type != EFI_IFR_TYPE_STRING) {
|
|
|
|
if (Value->Type != EFI_IFR_TYPE_STRING) {
|
|
|
|
Status = EFI_UNSUPPORTED;
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
goto Done;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
StrPtr = GetToken (Value->Value.string, FormSet->HiiHandle);
|
|
|
|
StrPtr = GetToken (Value->Value.string, FormSet->HiiHandle);
|
|
|
@ -2687,8 +2756,8 @@ EvaluateExpression (
|
|
|
|
goto Done;
|
|
|
|
goto Done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (Value->Type > EFI_IFR_TYPE_DATE) {
|
|
|
|
if (Value->Type > EFI_IFR_TYPE_DATE) {
|
|
|
|
Status = EFI_INVALID_PARAMETER;
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
goto Done;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;
|
|
|
|
Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;
|
|
|
@ -2832,10 +2901,6 @@ EvaluateExpression (
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
goto Done;
|
|
|
|
goto Done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (Data2.Type > EFI_IFR_TYPE_DATE) {
|
|
|
|
|
|
|
|
Status = EFI_INVALID_PARAMETER;
|
|
|
|
|
|
|
|
goto Done;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// Pop another expression from the expression stack
|
|
|
|
// Pop another expression from the expression stack
|
|
|
@ -2844,9 +2909,16 @@ EvaluateExpression (
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
goto Done;
|
|
|
|
goto Done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (Data2.Type > EFI_IFR_TYPE_DATE) {
|
|
|
|
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (Data1.Type > EFI_IFR_TYPE_DATE) {
|
|
|
|
if (Data1.Type > EFI_IFR_TYPE_DATE) {
|
|
|
|
Status = EFI_INVALID_PARAMETER;
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
goto Done;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;
|
|
|
|
Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;
|
|
|
@ -2903,10 +2975,6 @@ EvaluateExpression (
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
goto Done;
|
|
|
|
goto Done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (Data2.Type != EFI_IFR_TYPE_BOOLEAN) {
|
|
|
|
|
|
|
|
Status = EFI_INVALID_PARAMETER;
|
|
|
|
|
|
|
|
goto Done;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// Pop another expression from the expression stack
|
|
|
|
// Pop another expression from the expression stack
|
|
|
@ -2915,9 +2983,15 @@ EvaluateExpression (
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
goto Done;
|
|
|
|
goto Done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (Data2.Type != EFI_IFR_TYPE_BOOLEAN) {
|
|
|
|
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (Data1.Type != EFI_IFR_TYPE_BOOLEAN) {
|
|
|
|
if (Data1.Type != EFI_IFR_TYPE_BOOLEAN) {
|
|
|
|
Status = EFI_INVALID_PARAMETER;
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
goto Done;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (OpCode->Operand == EFI_IFR_AND_OP) {
|
|
|
|
if (OpCode->Operand == EFI_IFR_AND_OP) {
|
|
|
@ -2940,12 +3014,6 @@ EvaluateExpression (
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
goto Done;
|
|
|
|
goto Done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (Data2.Type > EFI_IFR_TYPE_BOOLEAN &&
|
|
|
|
|
|
|
|
Data2.Type != EFI_IFR_TYPE_STRING &&
|
|
|
|
|
|
|
|
Data2.Type != EFI_IFR_TYPE_BUFFER) {
|
|
|
|
|
|
|
|
Status = EFI_INVALID_PARAMETER;
|
|
|
|
|
|
|
|
goto Done;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// Pop another expression from the expression stack
|
|
|
|
// Pop another expression from the expression stack
|
|
|
@ -2955,14 +3023,33 @@ EvaluateExpression (
|
|
|
|
goto Done;
|
|
|
|
goto Done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Result = CompareHiiValue (&Data1, &Data2, FormSet->HiiHandle);
|
|
|
|
if (Data2.Type > EFI_IFR_TYPE_BOOLEAN &&
|
|
|
|
|
|
|
|
Data2.Type != EFI_IFR_TYPE_STRING &&
|
|
|
|
|
|
|
|
Data2.Type != EFI_IFR_TYPE_BUFFER) {
|
|
|
|
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (Data1.Type > EFI_IFR_TYPE_BOOLEAN &&
|
|
|
|
|
|
|
|
Data1.Type != EFI_IFR_TYPE_STRING &&
|
|
|
|
|
|
|
|
Data1.Type != EFI_IFR_TYPE_BUFFER) {
|
|
|
|
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Status = CompareHiiValue (&Data1, &Data2, &Result, FormSet->HiiHandle);
|
|
|
|
if (Data1.Type == EFI_IFR_TYPE_BUFFER) {
|
|
|
|
if (Data1.Type == EFI_IFR_TYPE_BUFFER) {
|
|
|
|
FreePool (Data1.Buffer);
|
|
|
|
FreePool (Data1.Buffer);
|
|
|
|
FreePool (Data2.Buffer);
|
|
|
|
FreePool (Data2.Buffer);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (Result == EFI_INVALID_PARAMETER) {
|
|
|
|
if (Status == EFI_UNSUPPORTED) {
|
|
|
|
Status = EFI_INVALID_PARAMETER;
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
|
|
|
|
Status = EFI_SUCCESS;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
goto Done;
|
|
|
|
goto Done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -3037,8 +3124,8 @@ EvaluateExpression (
|
|
|
|
goto Done;
|
|
|
|
goto Done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (Data1.Type != EFI_IFR_TYPE_BOOLEAN) {
|
|
|
|
if (Data1.Type != EFI_IFR_TYPE_BOOLEAN) {
|
|
|
|
Status = EFI_INVALID_PARAMETER;
|
|
|
|
Value->Type = EFI_IFR_TYPE_UNDEFINED;
|
|
|
|
goto Done;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (Data1.Value.b) {
|
|
|
|
if (Data1.Value.b) {
|
|
|
@ -3095,7 +3182,7 @@ EvaluateExpression (
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// Compare the expression value with current value
|
|
|
|
// Compare the expression value with current value
|
|
|
|
//
|
|
|
|
//
|
|
|
|
if (CompareHiiValue (&Data1, &SubExpression->Result, NULL) == 0) {
|
|
|
|
if ((CompareHiiValue (&Data1, &SubExpression->Result, &Result, NULL) == EFI_SUCCESS) && (Result == 0)) {
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// Try get the map value.
|
|
|
|
// Try get the map value.
|
|
|
|
//
|
|
|
|
//
|
|
|
@ -3138,7 +3225,7 @@ EvaluateExpression (
|
|
|
|
default:
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (EFI_ERROR (Status)) {
|
|
|
|
if (EFI_ERROR (Status) || Value->Type == EFI_IFR_TYPE_UNDEFINED) {
|
|
|
|
goto Done;
|
|
|
|
goto Done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|