]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTools: Add PCDs conditional operator function
authorYunhua Feng <yunhuax.feng@intel.com>
Wed, 31 May 2017 05:33:49 +0000 (13:33 +0800)
committerYonghong Zhu <yonghong.zhu@intel.com>
Mon, 10 Jul 2017 01:58:13 +0000 (09:58 +0800)
Parse PCDS value like A >B ? C :D
if A > B is True, the result is C, else the result is D

Cc: Liming Gao <liming.gao@intel.com>
Cc: Yonghong Zhu <yonghong.zhu@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Yunhua Feng <yunhuax.feng@intel.com>
Reviewed-by: Yonghong Zhu <yonghong.zhu@intel.com>
BaseTools/Source/Python/Common/Expression.py

index 6d002f56764f7adddcbf8198600087f8992061f2..ba83e02f75d3bfc00ef2993f80f7a64e221a01cc 100644 (file)
@@ -129,7 +129,7 @@ class ValueExpression(object):
         'IN' : 'in'\r
     }\r
 \r
         'IN' : 'in'\r
     }\r
 \r
-    NonLetterOpLst = ['+', '-', '*', '/', '%', '&', '|', '^', '~', '<<', '>>', '!', '=', '>', '<']\r
+    NonLetterOpLst = ['+', '-', '*', '/', '%', '&', '|', '^', '~', '<<', '>>', '!', '=', '>', '<', '?', ':']\r
 \r
     PcdPattern = re.compile(r'[_a-zA-Z][0-9A-Za-z_]*\.[_a-zA-Z][0-9A-Za-z_]*$')\r
     HexPattern = re.compile(r'0[xX][0-9a-fA-F]+$')\r
 \r
     PcdPattern = re.compile(r'[_a-zA-Z][0-9A-Za-z_]*\.[_a-zA-Z][0-9A-Za-z_]*$')\r
     HexPattern = re.compile(r'0[xX][0-9a-fA-F]+$')\r
@@ -276,7 +276,7 @@ class ValueExpression(object):
             self._Idx = 0\r
             self._Token = ''\r
 \r
             self._Idx = 0\r
             self._Token = ''\r
 \r
-        Val = self._OrExpr()\r
+        Val = self._ConExpr()\r
         RealVal = Val\r
         if type(Val) == type(''):\r
             if Val == 'L""':\r
         RealVal = Val\r
         if type(Val) == type(''):\r
             if Val == 'L""':\r
@@ -312,12 +312,24 @@ class ValueExpression(object):
         Val = EvalFunc()\r
         while self._IsOperator(OpLst):\r
             Op = self._Token\r
         Val = EvalFunc()\r
         while self._IsOperator(OpLst):\r
             Op = self._Token\r
+            if Op == '?':\r
+                Val2 = EvalFunc()\r
+                if self._IsOperator(':'):\r
+                    Val3 = EvalFunc()\r
+                if Val:\r
+                    Val = Val2\r
+                else:\r
+                    Val = Val3\r
+                continue\r
             try:\r
                 Val = self.Eval(Op, Val, EvalFunc())\r
             except WrnExpression, Warn:\r
                 self._WarnExcept = Warn\r
                 Val = Warn.result\r
         return Val\r
             try:\r
                 Val = self.Eval(Op, Val, EvalFunc())\r
             except WrnExpression, Warn:\r
                 self._WarnExcept = Warn\r
                 Val = Warn.result\r
         return Val\r
+    # A [? B]*\r
+    def _ConExpr(self):\r
+        return self._ExprFuncTemplate(self._OrExpr, ['?', ':'])\r
 \r
     # A [|| B]*\r
     def _OrExpr(self):\r
 \r
     # A [|| B]*\r
     def _OrExpr(self):\r
@@ -392,7 +404,7 @@ class ValueExpression(object):
     def _IdenExpr(self):\r
         Tk = self._GetToken()\r
         if Tk == '(':\r
     def _IdenExpr(self):\r
         Tk = self._GetToken()\r
         if Tk == '(':\r
-            Val = self._OrExpr()\r
+            Val = self._ConExpr()\r
             try:\r
                 # _GetToken may also raise BadExpression\r
                 if self._GetToken() != ')':\r
             try:\r
                 # _GetToken may also raise BadExpression\r
                 if self._GetToken() != ')':\r
@@ -474,7 +486,7 @@ class ValueExpression(object):
     def __GetIdToken(self, IsAlphaOp = False):\r
         IdToken = ''\r
         for Ch in self._Expr[self._Idx:]:\r
     def __GetIdToken(self, IsAlphaOp = False):\r
         IdToken = ''\r
         for Ch in self._Expr[self._Idx:]:\r
-            if not self.__IsIdChar(Ch):\r
+            if not self.__IsIdChar(Ch) or ('?' in self._Expr and Ch == ':'):\r
                 break\r
             self._Idx += 1\r
             IdToken += Ch\r
                 break\r
             self._Idx += 1\r
             IdToken += Ch\r
@@ -593,7 +605,7 @@ class ValueExpression(object):
     # Parse operator\r
     def _GetOperator(self):\r
         self.__SkipWS()\r
     # Parse operator\r
     def _GetOperator(self):\r
         self.__SkipWS()\r
-        LegalOpLst = ['&&', '||', '!=', '==', '>=', '<='] + self.NonLetterOpLst\r
+        LegalOpLst = ['&&', '||', '!=', '==', '>=', '<='] + self.NonLetterOpLst + ['?',':']\r
 \r
         self._Token = ''\r
         Expr = self._Expr[self._Idx:]\r
 \r
         self._Token = ''\r
         Expr = self._Expr[self._Idx:]\r