## @file\r
# This file is used to define helper class and function for DEC parser\r
#\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
#\r
-# This program and the accompanying materials are licensed and made available \r
-# under the terms and conditions of the BSD License which accompanies this \r
-# distribution. The full text of the license may be found at \r
-# http://opensource.org/licenses/bsd-license.php\r
-#\r
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+# SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
'''\r
DecParserMisc\r
from Library.DataType import TAB_COMMENT_EDK1_SPLIT\r
from Library.ExpressionValidate import IsValidBareCString\r
from Library.ParserValidate import IsValidCFormatGuid\r
+from Library.ExpressionValidate import IsValidFeatureFlagExp\r
from Library.ExpressionValidate import IsValidLogicalExpr\r
from Library.ExpressionValidate import IsValidStringTest\r
from Library.Misc import CheckGuidRegFormat\r
# Remove spaces\r
#\r
# @param Line: The string to be cleaned\r
-# @param CommentCharacter: Comment char, used to ignore comment content, \r
+# @param CommentCharacter: Comment char, used to ignore comment content,\r
# default is DataType.TAB_COMMENT_SPLIT\r
#\r
def CleanString(Line, CommentCharacter=TAB_COMMENT_SPLIT, \\r
return Line, Comment\r
\r
\r
-## IsValidHexByte\r
+## IsValidNumValUint8\r
#\r
-# Check if Token is HexByte: <HexByte> ::= 0x <HexDigit>{1,2}\r
+# Check if Token is NumValUint8: <NumValUint8> ::= {<ShortNum>} {<UINT8>} {<Expression>}\r
#\r
# @param Token: Token to be checked\r
#\r
-def IsValidHexByte(Token):\r
+def IsValidNumValUint8(Token):\r
+ Valid = True\r
+ Cause = ""\r
+ TokenValue = None\r
Token = Token.strip()\r
- if not Token.lower().startswith('0x') or not (len(Token) < 5 and len(Token) > 2):\r
- return False\r
+ if Token.lower().startswith('0x'):\r
+ Base = 16\r
+ else:\r
+ Base = 10\r
try:\r
- Token = long(Token, 0)\r
+ TokenValue = int(Token, Base)\r
except BaseException:\r
+ Valid, Cause = IsValidLogicalExpr(Token, True)\r
+ if Cause:\r
+ pass\r
+ if not Valid:\r
return False\r
- return True\r
+ if TokenValue and (TokenValue < 0 or TokenValue > 0xFF):\r
+ return False\r
+ else:\r
+ return True\r
\r
## IsValidNList\r
#\r
-# Check if Value has the format of <HexByte> ["," <HexByte>]{0,}\r
-# <HexByte> ::= "0x" <HexDigit>{1,2}\r
+# Check if Value has the format of <NumValUint8> ["," <NumValUint8>]{0,}\r
+# <NumValUint8> ::= {<ShortNum>} {<UINT8>} {<Expression>}\r
#\r
# @param Value: Value to be checked\r
#\r
if Par.End():\r
return False\r
while not Par.End():\r
- Token = Par.GetToken(',\t ')\r
- if not IsValidHexByte(Token):\r
+ Token = Par.GetToken(',')\r
+ if not IsValidNumValUint8(Token):\r
return False\r
if Par.Expect(','):\r
if Par.End():\r
if Par.End():\r
return False\r
while not Par.End():\r
- Token = Par.GetToken(',}\t ')\r
+ Token = Par.GetToken(',}')\r
#\r
- # 0xa, 0xaa\r
+ # ShortNum, UINT8, Expression\r
#\r
- if not IsValidHexByte(Token):\r
+ if not IsValidNumValUint8(Token):\r
return False\r
if Par.Expect(','):\r
if Par.End():\r
# @param Value: The pcd Value\r
#\r
def IsValidPcdDatum(Type, Value):\r
+ if not Value:\r
+ return False, ST.ERR_DECPARSE_PCD_VALUE_EMPTY\r
+ Valid = True\r
+ Cause = ""\r
if Type not in ["UINT8", "UINT16", "UINT32", "UINT64", "VOID*", "BOOLEAN"]:\r
return False, ST.ERR_DECPARSE_PCD_TYPE\r
if Type == "VOID*":\r
if Value in ['TRUE', 'FALSE', 'true', 'false', 'True', 'False',\r
'0x1', '0x01', '1', '0x0', '0x00', '0']:\r
return True, ""\r
- Valid, Cause = IsValidStringTest(Value)\r
+ Valid, Cause = IsValidStringTest(Value, True)\r
if not Valid:\r
- Valid, Cause = IsValidLogicalExpr(Value)\r
+ Valid, Cause = IsValidFeatureFlagExp(Value, True)\r
if not Valid:\r
return False, Cause\r
else:\r
Value = Value.lstrip('0')\r
if not Value:\r
return True, ""\r
- Value = long(Value, 0)\r
- TypeLenMap = {\r
- #\r
- # 0x00 - 0xff\r
- #\r
- 'UINT8' : 2,\r
- #\r
- # 0x0000 - 0xffff\r
- #\r
- 'UINT16' : 4,\r
- #\r
- # 0x00000000 - 0xffffffff\r
- #\r
- 'UINT32' : 8,\r
- #\r
- # 0x0 - 0xffffffffffffffff\r
- #\r
- 'UINT64' : 16\r
- }\r
- HexStr = hex(Value)\r
- #\r
- # First two chars of HexStr are 0x and tail char is L\r
- #\r
- if TypeLenMap[Type] < len(HexStr) - 3:\r
+ Value = int(Value, 0)\r
+ MAX_VAL_TYPE = {"BOOLEAN": 0x01, 'UINT8': 0xFF, 'UINT16': 0xFFFF, 'UINT32': 0xFFFFFFFF,\r
+ 'UINT64': 0xFFFFFFFFFFFFFFFF}\r
+ if Value > MAX_VAL_TYPE[Type]:\r
return False, ST.ERR_DECPARSE_PCD_INT_EXCEED % (StrVal, Type)\r
except BaseException:\r
- return False, ST.ERR_DECPARSE_PCD_INT % (Value, Type)\r
+ Valid, Cause = IsValidLogicalExpr(Value, True)\r
+ if not Valid:\r
+ return False, Cause\r
\r
return True, ""\r
\r
\r
## AssertChar\r
#\r
- # Assert char at current index of string is AssertChar, or will report \r
+ # Assert char at current index of string is AssertChar, or will report\r
# error message\r
#\r
# @param AssertChar: AssertChar\r