+ self.CheckPcdValue()\r
+ \r
+ ##\r
+ # Get error message via language\r
+ # @param ErrorMessageList: Error message tuple list the language and its message\r
+ # @param Lang: the language of setting\r
+ # @return: the error message described in the related UNI file\r
+ def GetEnErrorMessage(self, ErrorMessageList):\r
+ if self.FullPath:\r
+ pass\r
+ Lang = TAB_LANGUAGE_EN_US\r
+ for (Language, Message) in ErrorMessageList:\r
+ if Language == Lang:\r
+ return Message\r
+ for (Language, Message) in ErrorMessageList:\r
+ if Language.find(TAB_LANGUAGE_EN) >= 0:\r
+ return Message\r
+ else:\r
+ try:\r
+ return ErrorMessageList[0][1]\r
+ except IndexError:\r
+ return ''\r
+ return '' \r
+ \r
+ ##\r
+ # Replace the strings for Python eval function.\r
+ # @param ReplaceValue: The string that needs to be replaced. \r
+ # @return: The string was replaced, then eval function is always making out it. \r
+ def ReplaceForEval(self, ReplaceValue, IsRange=False, IsExpr=False):\r
+ if self.FullPath:\r
+ pass\r
+ #\r
+ # deal with "NOT EQ", "NOT LT", "NOT GT", "NOT LE", "NOT GE", "NOT NOT" \r
+ #\r
+ NOTNOT_Pattern = '[\t\s]*NOT[\t\s]+NOT[\t\s]*'\r
+ NOTGE_Pattern = '[\t\s]*NOT[\t\s]+GE[\t\s]*'\r
+ NOTLE_Pattern = '[\t\s]*NOT[\t\s]+LE[\t\s]*'\r
+ NOTGT_Pattern = '[\t\s]*NOT[\t\s]+GT[\t\s]*'\r
+ NOTLT_Pattern = '[\t\s]*NOT[\t\s]+LT[\t\s]*'\r
+ NOTEQ_Pattern = '[\t\s]*NOT[\t\s]+EQ[\t\s]*'\r
+ ReplaceValue = re.compile(NOTNOT_Pattern).sub('', ReplaceValue)\r
+ ReplaceValue = re.compile(NOTLT_Pattern).sub('x >= ', ReplaceValue)\r
+ ReplaceValue = re.compile(NOTGT_Pattern).sub('x <= ', ReplaceValue)\r
+ ReplaceValue = re.compile(NOTLE_Pattern).sub('x > ', ReplaceValue)\r
+ ReplaceValue = re.compile(NOTGE_Pattern).sub('x < ', ReplaceValue)\r
+ ReplaceValue = re.compile(NOTEQ_Pattern).sub('x != ', ReplaceValue)\r
+ \r
+ if IsRange:\r
+ ReplaceValue = ReplaceValue.replace('EQ', 'x ==')\r
+ ReplaceValue = ReplaceValue.replace('LT', 'x <')\r
+ ReplaceValue = ReplaceValue.replace('LE', 'x <=')\r
+ ReplaceValue = ReplaceValue.replace('GT', 'x >')\r
+ ReplaceValue = ReplaceValue.replace('GE', 'x >=')\r
+ ReplaceValue = ReplaceValue.replace('XOR', 'x ^')\r
+ elif IsExpr:\r
+ ReplaceValue = ReplaceValue.replace('EQ', '==')\r
+ ReplaceValue = ReplaceValue.replace('NE', '!=')\r
+ ReplaceValue = ReplaceValue.replace('LT', '<')\r
+ ReplaceValue = ReplaceValue.replace('LE', '<=')\r
+ ReplaceValue = ReplaceValue.replace('GT', '>')\r
+ ReplaceValue = ReplaceValue.replace('GE', '>=') \r
+ ReplaceValue = ReplaceValue.replace('XOR', '^') \r
+ \r
+ ReplaceValue = ReplaceValue.replace('AND', 'and')\r
+ ReplaceValue = ReplaceValue.replace('&&', ' and ')\r
+ ReplaceValue = ReplaceValue.replace('xor', '^')\r
+ ReplaceValue = ReplaceValue.replace('OR', 'or')\r
+ ReplaceValue = ReplaceValue.replace('||', ' or ')\r
+ ReplaceValue = ReplaceValue.replace('NOT', 'not')\r
+ if ReplaceValue.find('!') >= 0 and ReplaceValue[ReplaceValue.index('!') + 1] != '=':\r
+ ReplaceValue = ReplaceValue.replace('!', ' not ') \r
+ if '.' in ReplaceValue:\r
+ Pattern = '[a-zA-Z0-9]{1,}\.[a-zA-Z0-9]{1,}'\r
+ MatchedList = re.findall(Pattern, ReplaceValue)\r
+ for MatchedItem in MatchedList:\r
+ if MatchedItem not in self.PcdDefaultValueDict:\r
+ Logger.Error("Dec File Parser", FORMAT_INVALID, Message=ST.ERR_DECPARSE_PCD_NODEFINED % MatchedItem,\r
+ File=self.FullPath)\r
+ \r
+ ReplaceValue = ReplaceValue.replace(MatchedItem, self.PcdDefaultValueDict[MatchedItem])\r
+\r
+ return ReplaceValue\r
+\r
+ ##\r
+ # Check pcd's default value according to the pcd's description\r
+ #\r
+ def CheckPcdValue(self):\r
+ for Pcd in self.GetPcdList():\r
+ self.PcdDefaultValueDict[TAB_SPLIT.join((Pcd.GetTokenSpaceGuidCName(), Pcd.GetCName())).strip()] = \\r
+ Pcd.GetDefaultValue()\r
+ \r
+ for Pcd in self.GetPcdList():\r
+ ValidationExpressions = []\r
+ PcdGuidName = TAB_SPLIT.join((Pcd.GetTokenSpaceGuidCName(), Pcd.GetCName()))\r
+ Valids = Pcd.GetPcdErrorsList()\r
+ for Valid in Valids:\r
+ Expression = Valid.GetExpression()\r
+ if Expression:\r
+ #\r
+ # Delete the 'L' prefix of a quoted string, this operation is for eval()\r
+ #\r
+ QUOTED_PATTERN = '[\t\s]*L?"[^"]*"'\r
+ QuotedMatchedObj = re.search(QUOTED_PATTERN, Expression)\r
+ if QuotedMatchedObj:\r
+ MatchedStr = QuotedMatchedObj.group().strip()\r
+ if MatchedStr.startswith('L'):\r
+ Expression = Expression.replace(MatchedStr, MatchedStr[1:].strip()) \r
+\r
+ Expression = self.ReplaceForEval(Expression, IsExpr=True)\r
+ Expression = Expression.replace(PcdGuidName, 'x')\r
+ Message = self.GetEnErrorMessage(Valid.GetErrorMessageList())\r
+ ValidationExpressions.append((Expression, Message)) \r
+ \r
+ ValidList = Valid.GetValidValue()\r
+ if ValidList:\r
+ ValidValue = 'x in %s' % [eval(v) for v in ValidList.split(' ') if v]\r
+ Message = self.GetEnErrorMessage(Valid.GetErrorMessageList())\r
+ ValidationExpressions.append((ValidValue, Message))\r
+ \r
+ ValidValueRange = Valid.GetValidValueRange() \r
+ if ValidValueRange:\r
+ ValidValueRange = self.ReplaceForEval(ValidValueRange, IsRange=True)\r
+ if ValidValueRange.find('-') >= 0:\r
+ ValidValueRange = ValidValueRange.replace('-', '<= x <=')\r
+ elif not ValidValueRange.startswith('x ') and not ValidValueRange.startswith('not ') \\r
+ and not ValidValueRange.startswith('not(') and not ValidValueRange.startswith('('):\r
+ ValidValueRange = 'x %s' % ValidValueRange\r
+ Message = self.GetEnErrorMessage(Valid.GetErrorMessageList())\r
+ ValidationExpressions.append((ValidValueRange, Message))\r
+ \r
+ DefaultValue = self.PcdDefaultValueDict[PcdGuidName.strip()]\r
+ #\r
+ # Delete the 'L' prefix of a quoted string, this operation is for eval()\r
+ #\r
+ QUOTED_PATTERN = '[\t\s]*L?"[^"]*"'\r
+ QuotedMatchedObj = re.search(QUOTED_PATTERN, DefaultValue)\r
+ if QuotedMatchedObj:\r
+ MatchedStr = QuotedMatchedObj.group().strip()\r
+ if MatchedStr.startswith('L'):\r
+ DefaultValue = DefaultValue.replace(MatchedStr, MatchedStr[1:].strip())\r
+ \r
+ try:\r
+ DefaultValue = eval(DefaultValue.replace('TRUE', 'True').replace('true', 'True')\r
+ .replace('FALSE', 'False').replace('false', 'False'))\r
+ except BaseException:\r
+ pass\r
+\r
+ for (Expression, Msg) in ValidationExpressions:\r
+ try:\r
+ if not eval(Expression, {'x':DefaultValue}):\r
+ Logger.Error("Dec File Parser", FORMAT_INVALID, ExtraData='%s, value = %s' %\\r
+ (PcdGuidName, DefaultValue), Message=Msg, File=self.FullPath)\r
+ except TypeError:\r
+ Logger.Error("Dec File Parser", FORMAT_INVALID, ExtraData=PcdGuidName, \\r
+ Message=Msg, File=self.FullPath)\r