## @file\r
# This file is used to parse meta files\r
#\r
-# Copyright (c) 2008 - 2017, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>\r
# (C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP<BR>\r
# This program and the accompanying materials\r
# are licensed and made available under the terms and conditions of the BSD License\r
from CommonDataClass.DataClass import *\r
from Common.DataType import *\r
from Common.String import *\r
-from Common.Misc import GuidStructureStringToGuidString, CheckPcdDatum, PathClass, AnalyzePcdData, AnalyzeDscPcd, AnalyzePcdExpression\r
+from Common.Misc import GuidStructureStringToGuidString, CheckPcdDatum, PathClass, AnalyzePcdData, AnalyzeDscPcd, AnalyzePcdExpression, ParseFieldValue\r
from Common.Expression import *\r
from CommonDataClass.Exceptions import *\r
from Common.LongFilePathSupport import OpenLongFilePath as open\r
self._PostProcessed = False\r
# Different version of meta-file has different way to parse.\r
self._Version = 0\r
+ self._GuidDict = {} # for Parser PCD value {GUID(gTokeSpaceGuidName)}\r
\r
## Store the parsed data in table\r
def _Store(self, *Args):\r
def _SkuIdParser(self):\r
TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT)\r
if len(TokenList) not in (2,3):\r
- EdkLogger.error('Parser', FORMAT_INVALID, "Correct format is '<Integer>|<UiName>[|<UiName>]'",\r
+ EdkLogger.error('Parser', FORMAT_INVALID, "Correct format is '<Number>|<UiName>[|<UiName>]'",\r
ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1)\r
self._ValueList[0:len(TokenList)] = TokenList\r
@ParseMacro\r
def _DefaultStoresParser(self):\r
TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT)\r
if len(TokenList) != 2:\r
- EdkLogger.error('Parser', FORMAT_INVALID, "Correct format is '<Integer>|<UiName>'",\r
+ EdkLogger.error('Parser', FORMAT_INVALID, "Correct format is '<Number>|<UiName>'",\r
ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1)\r
self._ValueList[0:len(TokenList)] = TokenList\r
\r
self._ValueList[0], self._ValueList[1] = PcdNameTockens[0], PcdNameTockens[1]\r
elif len(PcdNameTockens) == 3:\r
self._ValueList[0], self._ValueList[1] = ".".join((PcdNameTockens[0], PcdNameTockens[1])), PcdNameTockens[2]\r
+ elif len(PcdNameTockens) > 3:\r
+ self._ValueList[0], self._ValueList[1] = ".".join((PcdNameTockens[0], PcdNameTockens[1])), ".".join(PcdNameTockens[2:])\r
if len(TokenList) == 2:\r
self._ValueList[2] = TokenList[1]\r
if self._ValueList[0] == '' or self._ValueList[1] == '':\r
File=self.MetaFile, Line=self._LineIndex + 1)\r
self._ValueList[0] = TokenList[0]\r
self._ValueList[1] = TokenList[1]\r
+ if self._ValueList[0] not in self._GuidDict:\r
+ self._GuidDict[self._ValueList[0]] = self._ValueList[1]\r
\r
## PCD sections parser\r
#\r
if len(PcdNames) == 2:\r
self._CurrentStructurePcdName = ""\r
else:\r
- self._ValueList[1] = PcdNames[2]\r
+ self._ValueList[1] = TAB_SPLIT.join(PcdNames[2:])\r
self._ValueList[2] = PcdTockens[1]\r
if not self._CurrentStructurePcdName:\r
TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1)\r
ValueList[0] = ValueExpression(PcdValue, self._AllPcdDict)(True)\r
except WrnExpression, Value:\r
ValueList[0] = Value.result\r
+ except BadExpression, Value:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, Value, File=self.MetaFile, Line=self._LineIndex + 1)\r
\r
- if ValueList[0] == 'True':\r
- ValueList[0] = '1'\r
- if ValueList[0] == 'False':\r
- ValueList[0] = '0'\r
-\r
+ if ValueList[0]:\r
+ try:\r
+ ValueList[0] = ValueExpressionEx(ValueList[0], ValueList[1], self._GuidDict)(True)\r
+ except BadExpression, Value:\r
+ EdkLogger.error('Parser', FORMAT_INVALID, Value, ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex + 1)\r
# check format of default value against the datum type\r
IsValid, Cause = CheckPcdDatum(ValueList[1], ValueList[0])\r
if not IsValid:\r