mirror of https://github.com/acidanthera/audk.git
BaseTools: Add PCDs conditional operator function
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>
This commit is contained in:
parent
e9651c1272
commit
bc0d723392
|
@ -129,7 +129,7 @@ class ValueExpression(object):
|
||||||
'IN' : 'in'
|
'IN' : 'in'
|
||||||
}
|
}
|
||||||
|
|
||||||
NonLetterOpLst = ['+', '-', '*', '/', '%', '&', '|', '^', '~', '<<', '>>', '!', '=', '>', '<']
|
NonLetterOpLst = ['+', '-', '*', '/', '%', '&', '|', '^', '~', '<<', '>>', '!', '=', '>', '<', '?', ':']
|
||||||
|
|
||||||
PcdPattern = re.compile(r'[_a-zA-Z][0-9A-Za-z_]*\.[_a-zA-Z][0-9A-Za-z_]*$')
|
PcdPattern = re.compile(r'[_a-zA-Z][0-9A-Za-z_]*\.[_a-zA-Z][0-9A-Za-z_]*$')
|
||||||
HexPattern = re.compile(r'0[xX][0-9a-fA-F]+$')
|
HexPattern = re.compile(r'0[xX][0-9a-fA-F]+$')
|
||||||
|
@ -276,7 +276,7 @@ class ValueExpression(object):
|
||||||
self._Idx = 0
|
self._Idx = 0
|
||||||
self._Token = ''
|
self._Token = ''
|
||||||
|
|
||||||
Val = self._OrExpr()
|
Val = self._ConExpr()
|
||||||
RealVal = Val
|
RealVal = Val
|
||||||
if type(Val) == type(''):
|
if type(Val) == type(''):
|
||||||
if Val == 'L""':
|
if Val == 'L""':
|
||||||
|
@ -312,12 +312,24 @@ class ValueExpression(object):
|
||||||
Val = EvalFunc()
|
Val = EvalFunc()
|
||||||
while self._IsOperator(OpLst):
|
while self._IsOperator(OpLst):
|
||||||
Op = self._Token
|
Op = self._Token
|
||||||
|
if Op == '?':
|
||||||
|
Val2 = EvalFunc()
|
||||||
|
if self._IsOperator(':'):
|
||||||
|
Val3 = EvalFunc()
|
||||||
|
if Val:
|
||||||
|
Val = Val2
|
||||||
|
else:
|
||||||
|
Val = Val3
|
||||||
|
continue
|
||||||
try:
|
try:
|
||||||
Val = self.Eval(Op, Val, EvalFunc())
|
Val = self.Eval(Op, Val, EvalFunc())
|
||||||
except WrnExpression, Warn:
|
except WrnExpression, Warn:
|
||||||
self._WarnExcept = Warn
|
self._WarnExcept = Warn
|
||||||
Val = Warn.result
|
Val = Warn.result
|
||||||
return Val
|
return Val
|
||||||
|
# A [? B]*
|
||||||
|
def _ConExpr(self):
|
||||||
|
return self._ExprFuncTemplate(self._OrExpr, ['?', ':'])
|
||||||
|
|
||||||
# A [|| B]*
|
# A [|| B]*
|
||||||
def _OrExpr(self):
|
def _OrExpr(self):
|
||||||
|
@ -392,7 +404,7 @@ class ValueExpression(object):
|
||||||
def _IdenExpr(self):
|
def _IdenExpr(self):
|
||||||
Tk = self._GetToken()
|
Tk = self._GetToken()
|
||||||
if Tk == '(':
|
if Tk == '(':
|
||||||
Val = self._OrExpr()
|
Val = self._ConExpr()
|
||||||
try:
|
try:
|
||||||
# _GetToken may also raise BadExpression
|
# _GetToken may also raise BadExpression
|
||||||
if self._GetToken() != ')':
|
if self._GetToken() != ')':
|
||||||
|
@ -474,7 +486,7 @@ class ValueExpression(object):
|
||||||
def __GetIdToken(self, IsAlphaOp = False):
|
def __GetIdToken(self, IsAlphaOp = False):
|
||||||
IdToken = ''
|
IdToken = ''
|
||||||
for Ch in self._Expr[self._Idx:]:
|
for Ch in self._Expr[self._Idx:]:
|
||||||
if not self.__IsIdChar(Ch):
|
if not self.__IsIdChar(Ch) or ('?' in self._Expr and Ch == ':'):
|
||||||
break
|
break
|
||||||
self._Idx += 1
|
self._Idx += 1
|
||||||
IdToken += Ch
|
IdToken += Ch
|
||||||
|
@ -593,7 +605,7 @@ class ValueExpression(object):
|
||||||
# Parse operator
|
# Parse operator
|
||||||
def _GetOperator(self):
|
def _GetOperator(self):
|
||||||
self.__SkipWS()
|
self.__SkipWS()
|
||||||
LegalOpLst = ['&&', '||', '!=', '==', '>=', '<='] + self.NonLetterOpLst
|
LegalOpLst = ['&&', '||', '!=', '==', '>=', '<='] + self.NonLetterOpLst + ['?',':']
|
||||||
|
|
||||||
self._Token = ''
|
self._Token = ''
|
||||||
Expr = self._Expr[self._Idx:]
|
Expr = self._Expr[self._Idx:]
|
||||||
|
|
Loading…
Reference in New Issue