]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/UPT/Parser/DecParser.py
This patch is going to:
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Parser / DecParser.py
index 060b9274f3c3e638b2bbfce453f8e06e80c2fcc8..25407f9a2d505b975bd8b99e51af92c41b258dd2 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to parse DEC file. It will consumed by DecParser\r
 #\r
-# Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, 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
@@ -60,6 +60,7 @@ from Library.String import ReplaceMacro
 from Library.String import GetSplitValueList\r
 from Library.String import gMACRO_PATTERN\r
 from Library.String import ConvertSpecialChar\r
+from Library.CommentParsing import ParsePcdErrorCode\r
 \r
 ##\r
 # _DecBase class for parsing\r
@@ -77,6 +78,9 @@ class _DecBase:
     def GetDataObject(self):\r
         return self.ItemObject\r
     \r
+    def GetLocalMacro(self):\r
+        return self._LocalMacro\r
+    \r
     ## BlockStart\r
     #\r
     # Called if a new section starts\r
@@ -184,7 +188,7 @@ class _DecBase:
             self._LocalMacro[TokenList[0]] = ''\r
         else:\r
             self._LocalMacro[TokenList[0]] = self._ReplaceMacro(TokenList[1])\r
-    \r
+\r
     ## _ParseItem\r
     #\r
     # Parse specified item, this function must be derived by subclass\r
@@ -395,6 +399,7 @@ class _DecDefine(_DecBase):
             DT.TAB_DEC_DEFINES_PACKAGE_NAME        :   self._SetPackageName,\r
             DT.TAB_DEC_DEFINES_PACKAGE_GUID        :   self._SetPackageGuid,\r
             DT.TAB_DEC_DEFINES_PACKAGE_VERSION     :   self._SetPackageVersion,\r
+            DT.TAB_DEC_DEFINES_PKG_UNI_FILE        :   self._SetPackageUni,\r
         }\r
     \r
     def BlockStart(self):\r
@@ -429,7 +434,7 @@ class _DecDefine(_DecBase):
         Line = self._RawData.CurrentLine\r
         TokenList = GetSplitValueList(Line, DT.TAB_EQUAL_SPLIT, 1)\r
         if TokenList[0] == DT.TAB_DEC_DEFINES_PKG_UNI_FILE:\r
-            pass\r
+            self.DefineValidation[TokenList[0]](TokenList[1])\r
         elif len(TokenList) < 2:\r
             self._LoggerError(ST.ERR_DECPARSE_DEFINE_FORMAT)\r
         elif TokenList[0] not in self.DefineValidation:\r
@@ -438,10 +443,9 @@ class _DecDefine(_DecBase):
             self.DefineValidation[TokenList[0]](TokenList[1])\r
         \r
         DefineItem = DecDefineItemObject()\r
-        if TokenList[0] != DT.TAB_DEC_DEFINES_PKG_UNI_FILE:\r
-            DefineItem.Key   = TokenList[0]\r
-            DefineItem.Value = TokenList[1]\r
-            self.ItemObject.AddItem(DefineItem, self._RawData.CurrentScope)\r
+        DefineItem.Key   = TokenList[0]\r
+        DefineItem.Value = TokenList[1]\r
+        self.ItemObject.AddItem(DefineItem, self._RawData.CurrentScope)\r
         return DefineItem\r
     \r
     def _SetDecSpecification(self, Token):\r
@@ -473,7 +477,12 @@ class _DecDefine(_DecBase):
         else:\r
             if not DT.TAB_SPLIT in Token:\r
                 Token = Token + '.0'\r
-            self.ItemObject._PkgVersion = Token\r
+            self.ItemObject.SetPackageVersion(Token)\r
+            \r
+    def _SetPackageUni(self, Token):\r
+        if self.ItemObject.GetPackageUniFile():\r
+            self._LoggerError(ST.ERR_DECPARSE_DEFINE_DEFINED % DT.TAB_DEC_DEFINES_PKG_UNI_FILE)\r
+        self.ItemObject.SetPackageUniFile(Token)\r
 \r
 ## _DecInclude\r
 #\r
@@ -727,7 +736,7 @@ class _DecUserExtension(_DecBase):
 class Dec(_DecBase, _DecComments):    \r
     def __init__(self, DecFile, Parse = True):        \r
         try:\r
-            Content   = ConvertSpecialChar(open(DecFile, 'rb').readlines())\r
+            Content = ConvertSpecialChar(open(DecFile, 'rb').readlines())\r
         except BaseException:\r
             Logger.Error(TOOL_NAME, FILE_OPEN_FAILURE, File=DecFile,\r
                          ExtraData=ST.ERR_DECPARSE_FILEOPEN % DecFile)\r
@@ -736,7 +745,9 @@ class Dec(_DecBase, _DecComments):
         _DecComments.__init__(self)\r
         _DecBase.__init__(self, RawData)\r
         \r
-        self.BinaryHeadComment = []        \r
+        self.BinaryHeadComment = []\r
+        self.PcdErrorCommentDict = {}\r
+        \r
         self._Define    = _DecDefine(RawData)\r
         self._Include   = _DecInclude(RawData)\r
         self._Guid      = _DecGuid(RawData)\r
@@ -775,7 +786,7 @@ class Dec(_DecBase, _DecComments):
             if not SectionParser.CheckRequiredFields():\r
                 return False\r
         return True\r
-    \r
+\r
     ##\r
     # Parse DEC file\r
     #\r
@@ -784,9 +795,47 @@ class Dec(_DecBase, _DecComments):
         IsBinaryHeader = False\r
         FileHeaderLineIndex = -1\r
         BinaryHeaderLineIndex = -1\r
+        TokenSpaceGuidCName = ''\r
+        \r
+        #\r
+        # Parse PCD error comment section\r
+        #\r
         while not self._RawData.IsEndOfFile():\r
-            Line, Comment = CleanString(self._RawData.GetNextLine())\r
+            self._RawData.CurrentLine = self._RawData.GetNextLine()\r
+            if self._RawData.CurrentLine.startswith(DT.TAB_COMMENT_SPLIT) and \\r
+                DT.TAB_SECTION_START in self._RawData.CurrentLine and \\r
+                DT.TAB_SECTION_END in self._RawData.CurrentLine:\r
+                self._RawData.CurrentLine = self._RawData.CurrentLine.replace(DT.TAB_COMMENT_SPLIT, '').strip()\r
 \r
+                if self._RawData.CurrentLine[0] == DT.TAB_SECTION_START and \\r
+                    self._RawData.CurrentLine[-1] == DT.TAB_SECTION_END:\r
+                    RawSection = self._RawData.CurrentLine[1:-1].strip()\r
+                    if RawSection.upper().startswith(DT.TAB_PCD_ERROR.upper()+'.'):\r
+                        TokenSpaceGuidCName = RawSection.split(DT.TAB_PCD_ERROR+'.')[1].strip()\r
+                        continue\r
+\r
+            if TokenSpaceGuidCName and self._RawData.CurrentLine.startswith(DT.TAB_COMMENT_SPLIT):\r
+                self._RawData.CurrentLine = self._RawData.CurrentLine.replace(DT.TAB_COMMENT_SPLIT, '').strip()\r
+                if self._RawData.CurrentLine != '':\r
+                    if DT.TAB_VALUE_SPLIT not in self._RawData.CurrentLine:\r
+                        self._LoggerError(ST.ERR_DECPARSE_PCDERRORMSG_MISS_VALUE_SPLIT)   \r
+                          \r
+                    PcdErrorNumber, PcdErrorMsg = GetSplitValueList(self._RawData.CurrentLine, DT.TAB_VALUE_SPLIT, 1)\r
+                    PcdErrorNumber = ParsePcdErrorCode(PcdErrorNumber, self._RawData.Filename, self._RawData.LineIndex)\r
+                    if not PcdErrorMsg.strip():\r
+                        self._LoggerError(ST.ERR_DECPARSE_PCD_MISS_ERRORMSG)\r
+                        \r
+                    self.PcdErrorCommentDict[(TokenSpaceGuidCName, PcdErrorNumber)] = PcdErrorMsg.strip()\r
+            else:\r
+                TokenSpaceGuidCName = ''\r
+\r
+        self._RawData.LineIndex = 0\r
+        self._RawData.CurrentLine = ''\r
+        self._RawData.NextLine = ''\r
+\r
+        while not self._RawData.IsEndOfFile():\r
+            Line, Comment = CleanString(self._RawData.GetNextLine())\r
+            \r
             #\r
             # Header must be pure comment\r
             #\r
@@ -840,9 +889,10 @@ class Dec(_DecBase, _DecComments):
             self._LoggerError(ST.ERR_BINARY_HEADER_ORDER)\r
             \r
         if FileHeaderLineIndex == -1:\r
+#            self._LoggerError(ST.ERR_NO_SOURCE_HEADER)\r
             Logger.Error(TOOL_NAME, FORMAT_INVALID, \r
                          ST.ERR_NO_SOURCE_HEADER,\r
-                         File=self._RawData.Filename)        \r
+                         File=self._RawData.Filename)\r
         return\r
     \r
     def _StopCurrentParsing(self, Line):\r
@@ -852,19 +902,15 @@ class Dec(_DecBase, _DecComments):
         self._SectionHeaderParser()\r
         if len(self._RawData.CurrentScope) == 0:\r
             self._LoggerError(ST.ERR_DECPARSE_SECTION_EMPTY)\r
-\r
         SectionObj = self._SectionParser[self._RawData.CurrentScope[0][0]]\r
-\r
         SectionObj.BlockStart()\r
         SectionObj.Parse()\r
-        \r
         return SectionObj.GetDataObject()\r
 \r
     def _UserExtentionSectionParser(self):\r
         self._RawData.CurrentScope = []\r
         ArchList = set()\r
         Section = self._RawData.CurrentLine[1:-1]\r
-        \r
         Par = ParserHelper(Section, self._RawData.Filename)\r
         while not Par.End():\r
             #\r
@@ -874,8 +920,8 @@ class Dec(_DecBase, _DecComments):
             if Token.upper() != DT.TAB_USER_EXTENSIONS.upper():\r
                 self._LoggerError(ST.ERR_DECPARSE_SECTION_UE)\r
             UserExtension = Token.upper()\r
-\r
-            Par.AssertChar(DT.TAB_SPLIT, ST.ERR_DECPARSE_SECTION_UE, self._RawData.LineIndex)\r
+            Par.AssertChar(DT.TAB_SPLIT, ST.ERR_DECPARSE_SECTION_UE, self._RawData.LineIndex)     \r
+            \r
             #\r
             # UserID\r
             #\r
@@ -883,7 +929,6 @@ class Dec(_DecBase, _DecComments):
             if not IsValidUserId(Token):\r
                 self._LoggerError(ST.ERR_DECPARSE_SECTION_UE_USERID)\r
             UserId = Token\r
-            \r
             Par.AssertChar(DT.TAB_SPLIT, ST.ERR_DECPARSE_SECTION_UE, self._RawData.LineIndex)\r
             #\r
             # IdString\r
@@ -892,7 +937,6 @@ class Dec(_DecBase, _DecComments):
             if not IsValidIdString(Token):\r
                 self._LoggerError(ST.ERR_DECPARSE_SECTION_UE_IDSTRING)\r
             IdString = Token\r
-            \r
             Arch = 'COMMON'\r
             if Par.Expect(DT.TAB_SPLIT):\r
                 Token = Par.GetToken()\r
@@ -900,20 +944,16 @@ class Dec(_DecBase, _DecComments):
                 if not IsValidArch(Arch):\r
                     self._LoggerError(ST.ERR_DECPARSE_ARCH)\r
             ArchList.add(Arch)\r
-            \r
             if [UserExtension, UserId, IdString, Arch] not in \\r
                 self._RawData.CurrentScope:\r
                 self._RawData.CurrentScope.append(\r
                     [UserExtension, UserId, IdString, Arch]\r
                 )\r
-            \r
             if not Par.Expect(DT.TAB_COMMA_SPLIT):\r
                 break\r
             elif Par.End():\r
                 self._LoggerError(ST.ERR_DECPARSE_SECTION_COMMA)\r
-        \r
         Par.AssertEnd(ST.ERR_DECPARSE_SECTION_UE, self._RawData.LineIndex)\r
-        \r
         if 'COMMON' in ArchList and len(ArchList) > 1:\r
             self._LoggerError(ST.ERR_DECPARSE_SECTION_COMMON)\r
  \r
@@ -928,7 +968,6 @@ class Dec(_DecBase, _DecComments):
             self._LoggerError(ST.ERR_DECPARSE_SECTION_IDENTIFY)\r
         \r
         RawSection = self._RawData.CurrentLine[1:-1].strip().upper()\r
-        \r
         #\r
         # Check defines section which is only allowed to occur once and\r
         # no arch can be followed\r
@@ -936,13 +975,11 @@ class Dec(_DecBase, _DecComments):
         if RawSection.startswith(DT.TAB_DEC_DEFINES.upper()):\r
             if RawSection != DT.TAB_DEC_DEFINES.upper():\r
                 self._LoggerError(ST.ERR_DECPARSE_DEFINE_SECNAME)\r
-        \r
         #\r
         # Check user extension section\r
         #\r
         if RawSection.startswith(DT.TAB_USER_EXTENSIONS.upper()):\r
             return self._UserExtentionSectionParser()\r
-        \r
         self._RawData.CurrentScope = []\r
         SectionNames = []\r
         ArchList = set()\r
@@ -951,17 +988,14 @@ class Dec(_DecBase, _DecComments):
                 self._LoggerError(ST.ERR_DECPARSE_SECTION_SUBEMPTY % self._RawData.CurrentLine)\r
 \r
             ItemList = GetSplitValueList(Item, DT.TAB_SPLIT)\r
-\r
             #\r
             # different types of PCD are permissible in one section\r
             #\r
             SectionName = ItemList[0]\r
             if SectionName not in self._SectionParser:\r
                 self._LoggerError(ST.ERR_DECPARSE_SECTION_UNKNOW % SectionName)\r
-            \r
             if SectionName not in SectionNames:\r
                 SectionNames.append(SectionName)\r
-            \r
             #\r
             # In DEC specification, all section headers have at most two part:\r
             # SectionName.Arch except UserExtention\r
@@ -989,7 +1023,6 @@ class Dec(_DecBase, _DecComments):
         #\r
         if 'COMMON' in ArchList and len(ArchList) > 1:\r
             self._LoggerError(ST.ERR_DECPARSE_SECTION_COMMON)\r
-        \r
         if len(SectionNames) == 0:\r
             self._LoggerError(ST.ERR_DECPARSE_SECTION_SUBEMPTY % self._RawData.CurrentLine)\r
         if len(SectionNames) != 1:\r
@@ -997,41 +1030,31 @@ class Dec(_DecBase, _DecComments):
                 if not Sec.startswith(DT.TAB_PCDS.upper()):\r
                     self._LoggerError(ST.ERR_DECPARSE_SECTION_NAME % str(SectionNames))\r
     \r
+    def GetDefineSectionMacro(self):\r
+        return self._Define.GetLocalMacro()\r
     def GetDefineSectionObject(self):\r
         return self._Define.GetDataObject()\r
-    \r
     def GetIncludeSectionObject(self):\r
         return self._Include.GetDataObject()\r
-    \r
     def GetGuidSectionObject(self):\r
         return self._Guid.GetGuidObject()\r
-    \r
     def GetProtocolSectionObject(self):\r
         return self._Guid.GetProtocolObject()\r
-    \r
     def GetPpiSectionObject(self):\r
         return self._Guid.GetPpiObject()\r
-    \r
     def GetLibraryClassSectionObject(self):\r
         return self._LibClass.GetDataObject()\r
-    \r
     def GetPcdSectionObject(self):\r
         return self._Pcd.GetDataObject()\r
-    \r
     def GetUserExtensionSectionObject(self):\r
         return self._UserEx.GetDataObject()\r
-    \r
     def GetPackageSpecification(self):\r
-        return self._Define.GetDataObject().GetPackageSpecification()\r
-    \r
+        return self._Define.GetDataObject().GetPackageSpecification()   \r
     def GetPackageName(self):\r
-        return self._Define.GetDataObject().GetPackageName()\r
-    \r
+        return self._Define.GetDataObject().GetPackageName()   \r
     def GetPackageGuid(self):\r
-        return self._Define.GetDataObject().GetPackageGuid()\r
-    \r
+        return self._Define.GetDataObject().GetPackageGuid()    \r
     def GetPackageVersion(self):\r
         return self._Define.GetDataObject().GetPackageVersion()\r
-    \r
     def GetPackageUniFile(self):\r
         return self._Define.GetDataObject().GetPackageUniFile()\r