## @file\r
# This file is used to parse meta files\r
#\r
-# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2008 - 2020, Intel Corporation. All rights reserved.<BR>\r
# SPDX-License-Identifier: BSD-2-Clause-Patent\r
#\r
\r
import re\r
import time\r
import copy\r
-\r
+from hashlib import md5\r
import Common.EdkLogger as EdkLogger\r
import Common.GlobalData as GlobalData\r
import Ecc.EccGlobalData as EccGlobalData\r
self.TblFile = EccGlobalData.gDb.TblFile\r
self.FileID = -1\r
\r
+ self._CurrentStructurePcdName = ""\r
+ self._include_flag = False\r
+ self._package_flag = False\r
+\r
## Parser starter\r
def Start(self):\r
Content = ''\r
File=self.MetaFile, Line=self._LineIndex+1)\r
self._ValueList[0] = ''\r
\r
+ def ParsePcdName(self,namelist):\r
+ if "[" in namelist[1]:\r
+ pcdname = namelist[1][:namelist[1].index("[")]\r
+ arrayindex = namelist[1][namelist[1].index("["):]\r
+ namelist[1] = pcdname\r
+ if len(namelist) == 2:\r
+ namelist.append(arrayindex)\r
+ else:\r
+ namelist[2] = ".".join((arrayindex,namelist[2]))\r
+ return namelist\r
+\r
+ def StructPcdParser(self):\r
+ self._ValueList[0] = self._CurrentStructurePcdName\r
+\r
+ if "|" not in self._CurrentLine:\r
+ if "<HeaderFiles>" == self._CurrentLine:\r
+ self._include_flag = True\r
+ self._package_flag = False\r
+ self._ValueList = None\r
+ return\r
+ if "<Packages>" == self._CurrentLine:\r
+ self._package_flag = True\r
+ self._ValueList = None\r
+ self._include_flag = False\r
+ return\r
+\r
+ if self._include_flag:\r
+ self._ValueList[1] = "<HeaderFiles>_" + md5(self._CurrentLine.encode('utf-8')).hexdigest()\r
+ self._ValueList[2] = self._CurrentLine\r
+ if self._package_flag and "}" != self._CurrentLine:\r
+ self._ValueList[1] = "<Packages>_" + md5(self._CurrentLine.encode('utf-8')).hexdigest()\r
+ self._ValueList[2] = self._CurrentLine\r
+ if self._CurrentLine == "}":\r
+ self._package_flag = False\r
+ self._include_flag = False\r
+ self._ValueList = None\r
+ else:\r
+ PcdTockens = self._CurrentLine.split(TAB_VALUE_SPLIT)\r
+ PcdNames = self.ParsePcdName(PcdTockens[0].split(TAB_SPLIT))\r
+ if len(PcdNames) == 2:\r
+ if PcdNames[1].strip().endswith("]"):\r
+ PcdName = PcdNames[1][:PcdNames[1].index('[')]\r
+ Index = PcdNames[1][PcdNames[1].index('['):]\r
+ self._ValueList[0] = TAB_SPLIT.join((PcdNames[0], PcdName))\r
+ self._ValueList[1] = Index\r
+ self._ValueList[2] = PcdTockens[1]\r
+ else:\r
+ self._CurrentStructurePcdName = ""\r
+ else:\r
+ if self._CurrentStructurePcdName != TAB_SPLIT.join(PcdNames[:2]):\r
+ EdkLogger.error('Parser', FORMAT_INVALID, "Pcd Name does not match: %s and %s " % (\r
+ self._CurrentStructurePcdName, TAB_SPLIT.join(PcdNames[:2])),\r
+ File=self.MetaFile, Line=self._LineIndex + 1)\r
+ self._ValueList[1] = TAB_SPLIT.join(PcdNames[2:])\r
+ self._ValueList[2] = PcdTockens[1]\r
+\r
## PCD sections parser\r
#\r
# [PcdsFixedAtBuild]\r
#\r
@ParseMacro\r
def _PcdParser(self):\r
+ if self._CurrentStructurePcdName:\r
+ self.StructPcdParser()\r
+ return\r
TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1)\r
self._ValueList[0:1] = GetSplitValueList(TokenList[0], TAB_SPLIT)\r
# check PCD information\r
if not IsValid:\r
EdkLogger.error('Parser', FORMAT_INVALID, Cause, ExtraData=self._CurrentLine,\r
File=self.MetaFile, Line=self._LineIndex+1)\r
+ if Cause == "StructurePcd":\r
+ self._CurrentStructurePcdName = TAB_SPLIT.join(self._ValueList[0:2])\r
+ self._ValueList[0] = self._CurrentStructurePcdName\r
+ self._ValueList[1] = ValueList[1].strip()\r
\r
if EccGlobalData.gConfig.UniCheckPCDInfo == '1' or EccGlobalData.gConfig.UniCheckAll == '1' or EccGlobalData.gConfig.CheckAll == '1':\r
# check Description, Prompt information\r