]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Update the code to follow the spec when evaluate the expression.
authorydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 31 Jan 2012 08:08:10 +0000 (08:08 +0000)
committerydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 31 Jan 2012 08:08:10 +0000 (08:08 +0000)
Signed-off-by: ydong10
Reviewed-by: lgao4
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12973 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/SetupBrowserDxe/Expression.c
MdeModulePkg/Universal/SetupBrowserDxe/InputHandler.c
MdeModulePkg/Universal/SetupBrowserDxe/ProcessOptions.c
MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
MdeModulePkg/Universal/SetupBrowserDxe/Ui.h

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