1. Improve the performance of INF Parsing
authorhche10x <hche10x@7335b38e-4728-0410-8992-fb3ffe349368>
Thu, 28 Feb 2008 09:04:39 +0000 (09:04 +0000)
committerhche10x <hche10x@7335b38e-4728-0410-8992-fb3ffe349368>
Thu, 28 Feb 2008 09:04:39 +0000 (09:04 +0000)
2. Add FeatureFlag for Package/Guid/Ppi/Protocol of Inf
3. Clean code to remove unused lines
4. Optimize some functions

git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@1029 7335b38e-4728-0410-8992-fb3ffe349368

Source/Python/Common/DecClassObject.py
Source/Python/Common/DscClassObject.py
Source/Python/Common/InfClassObject.py
Source/Python/Common/Parsing.py
Source/Python/Common/String.py
Source/Python/Table/TableDec.py

index 76bedba..27e0d67 100644 (file)
@@ -57,56 +57,6 @@ class DecObject(object):
     def __init__(self):\r
         object.__init__()\r
 \r
-## DecDefines\r
-#\r
-# This class defined basic Defines used in Dec object\r
-# \r
-# @param DecObject:        Inherited from DecObject class\r
-#\r
-# @var DefinesDictionary:  To store value for DefinesDictionary \r
-#\r
-class DecDefines(DecObject):\r
-    def __init__(self):\r
-        self.DefinesDictionary = {\r
-            #\r
-            # Required Fields\r
-            #\r
-            TAB_DEC_DEFINES_DEC_SPECIFICATION           : [''],\r
-            TAB_DEC_DEFINES_PACKAGE_NAME                : [''],\r
-            TAB_DEC_DEFINES_PACKAGE_GUID                : [''],\r
-            TAB_DEC_DEFINES_PACKAGE_VERSION             : ['']\r
-        }\r
-\r
-## DecContents\r
-#\r
-# This class defined basic Contents used in Dec object\r
-# \r
-# @param DecObject:            Inherited from DecObject class\r
-#\r
-# @var Includes:               To store value for Includes\r
-# @var Guids:                  To store value for Guids\r
-# @var Protocols:              To store value for Protocols\r
-# @var Ppis:                   To store value for Ppis\r
-# @var LibraryClasses:         To store value for LibraryClasses\r
-# @var PcdsFixedAtBuild:       To store value for PcdsFixedAtBuild\r
-# @var PcdsPatchableInModule:  To store value for PcdsPatchableInModule\r
-# @var PcdsFeatureFlag:        To store value for PcdsFeatureFlag\r
-# @var PcdsDynamic:            To store value for PcdsDynamic\r
-# @var PcdsDynamicEx:          To store value for PcdsDynamicEx\r
-#\r
-class DecContents(DecObject):\r
-    def __init__(self):\r
-        self.Includes = []\r
-        self.Guids = []\r
-        self.Protocols = []\r
-        self.Ppis = []\r
-        self.LibraryClasses = []\r
-        self.PcdsFixedAtBuild = []\r
-        self.PcdsPatchableInModule = []\r
-        self.PcdsFeatureFlag = []\r
-        self.PcdsDynamic = []\r
-        self.PcdsDynamicEx = []\r
-\r
 ## Dec\r
 #\r
 # This class defined the structure used in Dec object\r
@@ -134,25 +84,20 @@ class DecContents(DecObject):
 class Dec(DecObject):\r
     def __init__(self, Filename = None, IsMergeAllArches = False, IsToPackage = False, WorkspaceDir = None, Database = None, SupArchList = DataType.ARCH_LIST):\r
         self.Identification = Identification()\r
-        self.Defines = DecDefines()\r
-        self.UserExtensions = ''\r
         self.Package = PackageClass()\r
+        self.UserExtensions = ''\r
         self.WorkspaceDir = WorkspaceDir\r
+        self.SupArchList = SupArchList\r
+        \r
         self.Cur = Database.Cur\r
         self.TblFile = Database.TblFile\r
         self.TblDec = TableDec(Database.Cur)\r
-        self.SupArchList = SupArchList\r
-        \r
-        self.Contents = {}\r
-#        for Arch in DataType.ARCH_LIST_FULL:\r
-#            self.Contents[Arch] = DecContents()\r
-        \r
+\r
         self.KeyList = [\r
             TAB_INCLUDES, TAB_GUIDS, TAB_PROTOCOLS, TAB_PPIS, TAB_LIBRARY_CLASSES, \\r
             TAB_PCDS_FIXED_AT_BUILD_NULL, TAB_PCDS_PATCHABLE_IN_MODULE_NULL, TAB_PCDS_FEATURE_FLAG_NULL, \\r
             TAB_PCDS_DYNAMIC_NULL, TAB_PCDS_DYNAMIC_EX_NULL, TAB_DEC_DEFINES\r
         ]\r
-    \r
         #\r
         # Upper all KEYs to ignore case sensitive when parsing\r
         #\r
@@ -171,44 +116,12 @@ class Dec(DecObject):
         if Filename != None:\r
             self.LoadDecFile(Filename)\r
         \r
-        #\r
-        # Merge contents of Dec from all arches if IsMergeAllArches is True\r
-        #\r
-        if IsMergeAllArches:\r
-            self.MergeAllArches()\r
-        \r
         #\r
         # Transfer to Package Object if IsToPackage is True\r
         #\r
         if IsToPackage:\r
             self.DecToPackage()\r
     \r
-    ## Parse Dec file\r
-    #\r
-    # Go through input lines one by one to find the value defined in Key section.\r
-    # Save them to KeyField\r
-    #\r
-    # @param Lines:     Lines need to be parsed\r
-    # @param Key:       The key value of the section to be located\r
-    # @param KeyField:  To save the found contents\r
-    #\r
-    def ParseDec(self, Lines, Key, KeyField):\r
-        newKey = SplitModuleType(Key)\r
-        if newKey[0].upper().find(DataType.TAB_LIBRARY_CLASSES.upper()) != -1:\r
-            GetLibraryClassesWithModuleType(Lines, Key, KeyField, TAB_COMMENT_SPLIT)\r
-        else:\r
-            GetMultipleValuesOfKeyFromLines(Lines, Key, KeyField, TAB_COMMENT_SPLIT)\r
-\r
-    ## Merge contents of Dec from all arches\r
-    #\r
-    # Find the contents defined in all arches and merge them to all\r
-    #   \r
-    def MergeAllArches(self):\r
-        for Key in self.KeyList:\r
-            for Arch in DataType.ARCH_LIST:\r
-                Command = "self.Contents[Arch]." + Key + ".extend(" + "self.Contents['" + DataType.TAB_ARCH_COMMON + "']." + Key + ")"\r
-                eval(Command)\r
-\r
     ## Load Dec file\r
     #\r
     # Load the file if it exists\r
@@ -270,7 +183,9 @@ class Dec(DecObject):
                 #\r
                 # Insert items data of previous section\r
                 #\r
-                self.InsertSectionItemsIntoDatabase(FileID, Filename, CurrentSection, SectionItemList, ArchList, ThirdList, IfDefList)\r
+                Model = Section[CurrentSection.upper()]\r
+                InsertSectionItemsIntoDatabase(self.TblDec, FileID, Filename, Model, CurrentSection, SectionItemList, ArchList, ThirdList, IfDefList, self.RecordSet)\r
+\r
                 #\r
                 # Parse the new section\r
                 #\r
@@ -313,70 +228,14 @@ class Dec(DecObject):
         #\r
         # Insert items data of last section\r
         #\r
-        self.InsertSectionItemsIntoDatabase(FileID, Filename, CurrentSection, SectionItemList, ArchList, ThirdList, IfDefList)\r
+        Model = Section[CurrentSection.upper()]\r
+        InsertSectionItemsIntoDatabase(self.TblDec, FileID, Filename, Model, CurrentSection, SectionItemList, ArchList, ThirdList, IfDefList, self.RecordSet)\r
         \r
         #\r
         # Replace all DEFINE macros with its actual values\r
         #\r
         ParseDefineMacro2(self.TblDec, self.RecordSet, GlobalData.gGlobalDefines)\r
 \r
-    ## Parse DEFINE statement\r
-    #\r
-    # Get DEFINE macros\r
-    #\r
-    # 1. Insert a record into TblDec\r
-    # Value1: Macro Name\r
-    # Value2: Macro Value\r
-    #\r
-    def ParseDefine(self, LineValue, StartLine, Table, FileID, Filename, SectionName, Model, Arch):\r
-        EdkLogger.debug(EdkLogger.DEBUG_2, "DEFINE statement '%s' found in section %s" % (LineValue, SectionName))\r
-        SectionModel = Section[SectionName.upper()]\r
-        Define = GetSplitValueList(CleanString(LineValue[LineValue.upper().find(DataType.TAB_DEFINE.upper() + ' ') + len(DataType.TAB_DEFINE + ' ') : ]), TAB_EQUAL_SPLIT, 1)\r
-        Table.Insert(Model, Define[0], Define[1], '', Arch, SectionModel, FileID, StartLine, -1, StartLine, -1, 0)\r
-    \r
-    ## First time to insert records to database\r
-    # \r
-    # Insert item data of a section to database\r
-    # @param FileID:           The ID of belonging file\r
-    # @param Filename:         The name of belonging file\r
-    # @param CurrentSection:   The name of currect section\r
-    # @param SectionItemList:  A list of items of the section\r
-    # @param ArchList:         A list of arches\r
-    # @param ThirdList:        A list of third parameters, ModuleType for LibraryClass and SkuId for Dynamic Pcds\r
-    # @param IfDefList:        A list of all conditional statements\r
-    #\r
-    def InsertSectionItemsIntoDatabase(self, FileID, Filename, CurrentSection, SectionItemList, ArchList, ThirdList, IfDefList):\r
-        #\r
-        # Insert each item data of a section\r
-        #\r
-        for Index in range(0, len(ArchList)):\r
-            Arch = ArchList[Index]\r
-            Third = ThirdList[Index]\r
-            if Arch == '':\r
-                Arch = TAB_ARCH_COMMON\r
-\r
-            Model = Section[CurrentSection.upper()]\r
-            Records = self.RecordSet[Model]\r
-            for SectionItem in SectionItemList:\r
-                BelongsToItem, EndLine, EndColumn = -1, -1, -1\r
-                LineValue, StartLine, EndLine = SectionItem[0], SectionItem[1], SectionItem[1]\r
-\r
-                EdkLogger.debug(4, "Parsing %s ..." %LineValue)\r
-                #\r
-                # And then parse DEFINE statement\r
-                #\r
-                if LineValue.upper().find(DataType.TAB_DEFINE.upper() + ' ') > -1:\r
-                    self.ParseDefine(LineValue, StartLine, self.TblDec, FileID, Filename, CurrentSection, MODEL_META_DATA_DEFINE, Arch)\r
-                    continue\r
-                \r
-                #\r
-                # At last parse other sections\r
-                #\r
-                ID = self.TblDec.Insert(Model, LineValue, '', '', Arch, -1, FileID, StartLine, -1, StartLine, -1, 0)\r
-                Records.append([LineValue, Arch, StartLine, ID, Third])\r
-            \r
-            self.RecordSet[Model] = Records\r
-\r
     ## Transfer to Package Object\r
     # \r
     # Transfer all contents of a Dec file to a standard Package Object\r
@@ -400,17 +259,17 @@ class Dec(DecObject):
         #\r
         # Generate Guids\r
         #\r
-        self.GenGuids(ContainerFile)\r
+        self.GenGuidProtocolPpis(DataType.TAB_GUIDS, ContainerFile)\r
 \r
         #\r
         # Generate Protocols\r
         #\r
-        self.GenProtocols(ContainerFile)\r
+        self.GenGuidProtocolPpis(DataType.TAB_PROTOCOLS, ContainerFile)\r
 \r
         #\r
         # Generate Ppis\r
         #\r
-        self.GenPpis(ContainerFile)\r
+        self.GenGuidProtocolPpis(DataType.TAB_PPIS, ContainerFile)\r
         \r
         #\r
         # Generate LibraryClasses\r
@@ -487,74 +346,6 @@ class Dec(DecObject):
             Include.SupArchList = Includes[Key]\r
             self.Package.Includes.append(Include)\r
     \r
-    ## GenGuids\r
-    #\r
-    # Gen Guids of Dec\r
-    # <CName>=<GuidValue>\r
-    #\r
-    # @param ContainerFile: The Dec file full path \r
-    #\r
-    def GenGuids(self, ContainerFile):\r
-        EdkLogger.debug(2, "Generate %s ..." % TAB_GUIDS)\r
-        Guids = {}\r
-        #\r
-        # Get all Guids\r
-        #\r
-        RecordSet = self.RecordSet[MODEL_EFI_GUID]\r
-        \r
-        #\r
-        # Go through each arch\r
-        #\r
-        for Arch in self.SupArchList:\r
-            for Record in RecordSet:\r
-                if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    List = GetSplitValueList(Record[0], DataType.TAB_EQUAL_SPLIT)\r
-                    if len(List) != 2:\r
-                        RaiseParserError(Record[0], 'Guids', ContainerFile, '<CName>=<GuidValue>', Record[2])\r
-                    else:\r
-                        MergeArches(Guids, (List[0], List[1]), Arch)\r
-                \r
-        for Key in Guids.keys():\r
-            Guid = GuidClass()\r
-            Guid.CName = Key[0]\r
-            Guid.Guid = Key[1]\r
-            Guid.SupArchList = Guids[Key]\r
-            self.Package.GuidDeclarations.append(Guid)\r
-\r
-    ## GenProtocols\r
-    #\r
-    # Gen Protocols of Dec\r
-    # <CName>=<GuidValue>\r
-    #\r
-    # @param ContainerFile: The Dec file full path \r
-    #\r
-    def GenProtocols(self, ContainerFile):\r
-        EdkLogger.debug(2, "Generate %s ..." % TAB_PROTOCOLS)\r
-        Protocols = {}\r
-        #\r
-        # Get all Guids\r
-        #\r
-        RecordSet = self.RecordSet[MODEL_EFI_PROTOCOL]\r
-        \r
-        #\r
-        # Go through each arch\r
-        #\r
-        for Arch in self.SupArchList:\r
-            for Record in RecordSet:\r
-                if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    List = GetSplitValueList(Record[0], DataType.TAB_EQUAL_SPLIT)\r
-                    if len(List) != 2:\r
-                        RaiseParserError(Record[0], 'Protocols', ContainerFile, '<CName>=<GuidValue>', Record[2])\r
-                    else:\r
-                        MergeArches(Protocols, (List[0], List[1]), Arch)\r
-                \r
-        for Key in Protocols.keys():\r
-            Protocol = ProtocolClass()\r
-            Protocol.CName = Key[0]\r
-            Protocol.Guid = Key[1]\r
-            Protocol.SupArchList = Protocols[Key]\r
-            self.Package.ProtocolDeclarations.append(Protocol)\r
-    \r
     ## GenPpis\r
     #\r
     # Gen Ppis of Dec\r
@@ -562,13 +353,13 @@ class Dec(DecObject):
     #\r
     # @param ContainerFile: The Dec file full path \r
     #\r
-    def GenPpis(self, ContainerFile):\r
-        EdkLogger.debug(2, "Generate %s ..." % TAB_PPIS)\r
-        Ppis = {}\r
+    def GenGuidProtocolPpis(self, Type, ContainerFile):\r
+        EdkLogger.debug(2, "Generate %s ..." % Type)\r
+        Lists = {}\r
         #\r
-        # Get all Guids\r
+        # Get all Items\r
         #\r
-        RecordSet = self.RecordSet[MODEL_EFI_PPI]\r
+        RecordSet = self.RecordSet[Section[Type.upper()]]\r
         \r
         #\r
         # Go through each arch\r
@@ -576,18 +367,23 @@ class Dec(DecObject):
         for Arch in self.SupArchList:\r
             for Record in RecordSet:\r
                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    List = GetSplitValueList(Record[0], DataType.TAB_EQUAL_SPLIT)\r
-                    if len(List) != 2:\r
-                        RaiseParserError(Record[0], 'Ppis', ContainerFile, '<CName>=<GuidValue>', Record[2])\r
-                    else:\r
-                        MergeArches(Ppis, (List[0], List[1]), Arch)\r
+                    MergeArches(Lists, GetGuidsProtocolsPpisOfDec(Record[0], Type, ContainerFile, Record[2]), Arch)\r
+        \r
+        ListMember = None\r
+        if Type == TAB_GUIDS:\r
+            ListMember = self.Package.GuidDeclarations\r
+        elif Type == TAB_PROTOCOLS:\r
+            ListMember = self.Package.ProtocolDeclarations\r
+        elif Type == TAB_PPIS:\r
+            ListMember = self.Package.PpiDeclarations\r
         \r
-        for Key in Ppis.keys():\r
-            Ppi = PpiClass()\r
-            Ppi.CName = Key[0]\r
-            Ppi.Guid = Key[1]\r
-            Ppi.SupArchList = Ppis[Key]\r
-            self.Package.PpiDeclarations.append(Ppi)\r
+        for Key in Lists.keys():\r
+            ListClass = GuidProtocolPpiCommonClass()\r
+            ListClass.CName = Key[0]\r
+            ListClass.Guid = Key[1]\r
+            ListClass.SupArchList = Lists[Key]\r
+            ListMember.append(ListClass)\r
+            \r
     \r
     ## GenLibraryClasses\r
     #\r
@@ -650,19 +446,19 @@ class Dec(DecObject):
         for Arch in self.SupArchList:\r
             for Record in RecordSet1:\r
                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    MergeArches(Pcds, self.GetPcdOfDec(Record[0], TAB_PCDS_FIXED_AT_BUILD, ContainerFile, Record[2]), Arch)\r
+                    MergeArches(Pcds, GetPcdOfDec(Record[0], TAB_PCDS_FIXED_AT_BUILD, ContainerFile, Record[2]), Arch)\r
             for Record in RecordSet2:\r
                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    MergeArches(Pcds, self.GetPcdOfDec(Record[0], TAB_PCDS_PATCHABLE_IN_MODULE, ContainerFile, Record[2]), Arch)\r
+                    MergeArches(Pcds, GetPcdOfDec(Record[0], TAB_PCDS_PATCHABLE_IN_MODULE, ContainerFile, Record[2]), Arch)\r
             for Record in RecordSet3:\r
                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    MergeArches(Pcds, self.GetPcdOfDec(Record[0], TAB_PCDS_FEATURE_FLAG, ContainerFile, Record[2]), Arch)\r
+                    MergeArches(Pcds, GetPcdOfDec(Record[0], TAB_PCDS_FEATURE_FLAG, ContainerFile, Record[2]), Arch)\r
             for Record in RecordSet4:\r
                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    MergeArches(Pcds, self.GetPcdOfDec(Record[0], TAB_PCDS_DYNAMIC_EX, ContainerFile, Record[2]), Arch)\r
+                    MergeArches(Pcds, GetPcdOfDec(Record[0], TAB_PCDS_DYNAMIC_EX, ContainerFile, Record[2]), Arch)\r
             for Record in RecordSet5:\r
                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    MergeArches(Pcds, self.GetPcdOfDec(Record[0], TAB_PCDS_DYNAMIC, ContainerFile, Record[2]), Arch)                    \r
+                    MergeArches(Pcds, GetPcdOfDec(Record[0], TAB_PCDS_DYNAMIC, ContainerFile, Record[2]), Arch)                    \r
 \r
         for Key in Pcds.keys():\r
             Pcd = PcdClass()\r
@@ -675,37 +471,6 @@ class Dec(DecObject):
             Pcd.SupArchList = Pcds[Key]\r
             self.Package.PcdDeclarations.append(Pcd)\r
     \r
-    ## Get Pcd Values of Dec\r
-    #\r
-    # Get Pcd of Dec as <TokenSpcCName>.<TokenCName>|<Value>|<DatumType>|<Token>\r
-    # @retval (TokenSpcCName, TokenCName, Value, DatumType, Token, ItemType) Formatted Pcd Item\r
-    #\r
-    def GetPcdOfDec(self, Item, Type, File, LineNo = -1):\r
-        Format = '<TokenSpaceGuidCName>.<PcdCName>|<Value>|<DatumType>|<Token>'\r
-        List = GetSplitValueList(Item)\r
-        if len(List) != 4:\r
-            RaiseParserError(Item, 'Pcds' + Type, File, Format, LineNo)\r
-        TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
-        if len(TokenInfo) != 2:\r
-            RaiseParserError(Item, 'Pcds' + Type, File, Format, LineNo)\r
-        \r
-        return (TokenInfo[0], TokenInfo[1], List[1], List[2], List[3], Type)\r
-    \r
-    ## Show detailed information of Dec\r
-    #\r
-    # Print all members and their values of Dec class\r
-    #\r
-    def ShowDec(self):\r
-        print TAB_SECTION_START + TAB_INF_DEFINES + TAB_SECTION_END\r
-        printDict(self.Defines.DefinesDictionary)\r
-\r
-        for key in self.KeyList:\r
-            for arch in DataType.ARCH_LIST_FULL:\r
-                Command = "printList(TAB_SECTION_START + '" + \\r
-                                    key + DataType.TAB_SPLIT + arch + \\r
-                                    "' + TAB_SECTION_END, self.Contents[arch]." + key + ')'\r
-                eval(Command)\r
-    \r
     ## Show detailed information of Package\r
     #\r
     # Print all members and their values of Package class\r
@@ -749,8 +514,8 @@ if __name__ == '__main__':
     EdkLogger.SetLevel(EdkLogger.DEBUG_0)\r
     \r
     W = os.getenv('WORKSPACE')\r
-    #F = os.path.join(W, 'Nt32Pkg/Nt32Pkg.dec')\r
-    F = os.path.join(W, 'MdeModulePkg\MdeModulePkg.dec')\r
+    F = os.path.join(W, 'Nt32Pkg/Nt32Pkg.dec')\r
+\r
     Db = Database.Database(DATABASE_PATH)\r
     Db.InitDatabase()\r
     \r
index 63dac2d..7c825ab 100755 (executable)
@@ -63,88 +63,6 @@ class DscObject(object):
     def __init__(self):\r
         object.__init__()\r
 \r
-## DscDefines\r
-#\r
-# This class defined basic Defines used in Dsc object\r
-# \r
-# @param DscDefines:       Inherited from DscDefines class\r
-#\r
-# @var DefinesDictionary:  To store value for DefinesDictionary \r
-#\r
-class DscDefines(DscObject):\r
-    def __init__(self):\r
-        self.DefinesDictionary = {\r
-            #\r
-            # Required Fields\r
-            #\r
-            TAB_DSC_DEFINES_PLATFORM_NAME                         : [''],\r
-            TAB_DSC_DEFINES_PLATFORM_GUID                         : [''],\r
-            TAB_DSC_DEFINES_PLATFORM_VERSION                      : [''],\r
-            TAB_DSC_DEFINES_DSC_SPECIFICATION                     : [''],\r
-            TAB_DSC_DEFINES_OUTPUT_DIRECTORY                      : [''],\r
-            TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES               : [''],\r
-            TAB_DSC_DEFINES_BUILD_TARGETS                         : [''],\r
-            TAB_DSC_DEFINES_SKUID_IDENTIFIER                      : [''],\r
-            TAB_DSC_DEFINES_FLASH_DEFINITION                      : [''],\r
-            TAB_DSC_DEFINES_BUILD_NUMBER                          : [''],\r
-            TAB_DSC_DEFINES_MAKEFILE_NAME                         : [''],\r
-            TAB_DSC_DEFINES_BS_BASE_ADDRESS                       : [''],\r
-            TAB_DSC_DEFINES_RT_BASE_ADDRESS                       : [''],\r
-            TAB_DSC_DEFINES_DEFINE                                : [''],\r
-            TAB_INF_DEFINES_MACRO                                 : {}\r
-        }\r
-\r
-## DscSkuId\r
-#\r
-# This class defined SkuId used in Dsc object\r
-# \r
-# @param DscObject:  Inherited from DscObject class\r
-#\r
-# @var SkuId:        To store value for SkuId, it is a set structure as\r
-#                    { [skuid : skuname], [skuid : skuname], ...}\r
-#\r
-class DscSkuId(DscObject):\r
-    def __init__(self):\r
-        self.SkuId = {}\r
-\r
-## DscContents\r
-#\r
-# This class defined basic Contents used in Dsc object\r
-# \r
-# @param DscObject:   Inherited from DscObject class\r
-#\r
-# @var SkuIds:                 To store value for SkuIds\r
-# @var Libraries:              To store value for Libraries\r
-# @var Components:             To store value for Components, it is a list structure as\r
-#                              [['component name', [lib1, lib2, lib3], [bo1, bo2, bo3]], ...]\r
-# @var LibraryClasses:         To store value for LibraryClasses\r
-# @var PcdsFixedAtBuild:       To store value for PcdsFixedAtBuild\r
-# @var PcdsPatchableInModule:  To store value for PcdsPatchableInModule\r
-# @var PcdsFeatureFlag:        To store value for PcdsFeatureFlag\r
-# @var PcdsDynamicDefault:     To store value for PcdsDynamicDefault\r
-# @var PcdsDynamicVpd:         To store value for PcdsDynamicVpd\r
-# @var PcdsDynamicHii:         To store value for PcdsDynamicHii\r
-# @var PcdsDynamicExDefault:   To store value for PcdsDynamicExDefault\r
-# @var PcdsDynamicExVpd:       To store value for PcdsDynamicExVpd\r
-# @var PcdsDynamicExHii:       To store value for PcdsDynamicExHii\r
-#\r
-class DscContents(DscObject):\r
-    def __init__(self):\r
-        self.SkuIds = []\r
-        self.Libraries = []\r
-        self.Components = []\r
-        self.LibraryClasses = []\r
-        self.PcdsFixedAtBuild = []\r
-        self.PcdsPatchableInModule = []\r
-        self.PcdsFeatureFlag = []\r
-        self.PcdsDynamicDefault = []\r
-        self.PcdsDynamicVpd = []\r
-        self.PcdsDynamicHii = []\r
-        self.PcdsDynamicExDefault = []\r
-        self.PcdsDynamicExVpd = []\r
-        self.PcdsDynamicExHii = []\r
-        self.BuildOptions = []\r
-\r
 ## Dsc\r
 #\r
 # This class defined the structure used in Dsc object\r
@@ -175,18 +93,14 @@ class Dsc(DscObject):
 \r
     def __init__(self, Filename = None, IsMergeAllArches = False, IsToPlatform = False, WorkspaceDir = None, Database = None):\r
         self.Identification = Identification()\r
-        self.Defines = DscDefines()\r
-        self.Contents = {}\r
-        self.UserExtensions = ''\r
         self.Platform = PlatformClass()\r
+        self.UserExtensions = ''\r
         self.WorkspaceDir = WorkspaceDir\r
+\r
         self.Cur = Database.Cur\r
         self.TblFile = Database.TblFile\r
         self.TblDsc = TableDsc(Database.Cur)\r
-        self._Macro = {}    # for inf file local replacement\r
 \r
-#        for Arch in DataType.ARCH_LIST_FULL:\r
-#            self.Contents[Arch] = DscContents()\r
 \r
         self.KeyList = [\r
             TAB_SKUIDS, TAB_LIBRARIES, TAB_LIBRARY_CLASSES, TAB_BUILD_OPTIONS, TAB_PCDS_FIXED_AT_BUILD_NULL, \\r
@@ -214,59 +128,17 @@ class Dsc(DscObject):
         if Filename != None:\r
             self.LoadDscFile(Filename)\r
 \r
-        #\r
-        # Merge contents of Dsc from all arches if IsMergeAllArches is True\r
-        #\r
-        if IsMergeAllArches:\r
-            self.MergeAllArches()\r
-\r
         #\r
         # Transfer to Platform Object if IsToPlatform is True\r
         #\r
         if IsToPlatform:\r
             self.DscToPlatform()\r
 \r
-    ## Parse Dsc file\r
-    #\r
-    # Go through input lines one by one to find the value defined in Key section.\r
-    # Save them to KeyField\r
-    #\r
-    # @param Lines:     Lines need to be parsed\r
-    # @param Key:       The key value of the section to be located\r
-    # @param KeyField:  To save the found contents\r
-    #\r
-    def ParseDsc(self, Lines, Key, KeyField):\r
-        newKey = SplitModuleType(Key)\r
-        if newKey[0].upper().find(TAB_LIBRARY_CLASSES.upper()) != -1:\r
-            GetLibraryClassesWithModuleType(Lines, Key, KeyField, TAB_COMMENT_SPLIT)\r
-        elif newKey[0].upper().find(TAB_COMPONENTS.upper()) != -1:\r
-            GetComponents(Lines, Key, KeyField, TAB_COMMENT_SPLIT)\r
-        elif newKey[0].upper().find(TAB_PCDS_DYNAMIC.upper()) != -1:\r
-            GetDynamics(Lines, Key, KeyField, TAB_COMMENT_SPLIT)\r
-        else:\r
-            GetMultipleValuesOfKeyFromLines(Lines, Key, KeyField, TAB_COMMENT_SPLIT)\r
-\r
-    ## Merge contents of Dsc from all arches\r
-    #\r
-    # Find the contents defined in all arches and merge them to all\r
-    #\r
-    def MergeAllArches(self):\r
-        for Key in self.KeyList:\r
-            for Arch in DataType.ARCH_LIST:\r
-                Command = "self.Contents[Arch]." + Key + ".extend(" + "self.Contents['" + DataType.TAB_ARCH_COMMON + "']." + Key + ")"\r
-                eval(Command)\r
-\r
     ## Transfer to Platform Object\r
     # \r
     # Transfer all contents of an Inf file to a standard Module Object\r
     #\r
     def DscToPlatform(self):\r
-        #\r
-        # Get Macro defined in GlobalDefines\r
-        #\r
-        self._Macro = self.Defines.DefinesDictionary[TAB_INF_DEFINES_MACRO]\r
-        self._Macro.update(GlobalData.gGlobalDefines)\r
-        \r
         #\r
         # Init global information for the file\r
         #\r
@@ -560,7 +432,7 @@ class Dsc(DscObject):
         for Key in LibraryClasses.keys():\r
             Library = PlatformLibraryClass()\r
             Library.Name = Key[0]\r
-            Library.FilePath = NormPath(Key[1], self._Macro)\r
+            Library.FilePath = NormPath(Key[1])\r
             Library.SupModuleList = GetSplitValueList(Key[2])\r
             Library.SupArchList = LibraryClasses[Key]\r
             self.Platform.LibraryClasses.LibraryList.append(Library)\r
@@ -910,8 +782,8 @@ class Dsc(DscObject):
         BuildOptions = Item[2]\r
         Pcds = Item[3]\r
         Component = PlatformModuleClass()\r
-        Component.FilePath = NormPath(InfFilename, self._Macro)\r
-        Component.ExecFilePath = NormPath(ExecFilename, self._Macro)\r
+        Component.FilePath = NormPath(InfFilename)\r
+        Component.ExecFilePath = NormPath(ExecFilename)\r
         CheckFileType(Component.FilePath, '.Inf', ContainerFile, 'component name', Item[0], LineNo)\r
         CheckFileExist(self.WorkspaceDir, Component.FilePath, ContainerFile, 'component', Item[0], LineNo)\r
         for Lib in LibraryClasses:\r
@@ -919,7 +791,7 @@ class Dsc(DscObject):
             if len(List) != 2:\r
                 RaiseParserError(Lib, 'LibraryClasses', ContainerFile, '<ClassName>|<InfFilename>')\r
             LibName = List[0]\r
-            LibFile = NormPath(List[1], self._Macro)\r
+            LibFile = NormPath(List[1])\r
             if LibName == "" or LibName == "NULL":\r
                 LibName = "NULL%d" % self._NullClassIndex\r
                 self._NullClassIndex += 1\r
index fef1f44..902d00b 100755 (executable)
@@ -79,6 +79,56 @@ gNmakeFlagName2ToolCode = {
     "LINK"      :   "DLINK",\r
 }\r
 \r
+class InfHeader(ModuleHeaderClass):\r
+    _Mapping_ = {\r
+        #\r
+        # Required Fields\r
+        #\r
+        TAB_INF_DEFINES_BASE_NAME                   : "Name",\r
+        TAB_INF_DEFINES_FILE_GUID                   : "Guid",\r
+        TAB_INF_DEFINES_MODULE_TYPE                 : "ModuleType",\r
+        TAB_INF_DEFINES_EFI_SPECIFICATION_VERSION   : "EfiSpecificationVersion",\r
+        TAB_INF_DEFINES_EDK_RELEASE_VERSION         : "EdkReleaseVersion",        \r
+        #\r
+        # Optional Fields\r
+        #\r
+        TAB_INF_DEFINES_INF_VERSION                 : "InfVersion",\r
+        TAB_INF_DEFINES_BINARY_MODULE               : "BinaryModule",\r
+        TAB_INF_DEFINES_COMPONENT_TYPE              : "ComponentType",\r
+        TAB_INF_DEFINES_MAKEFILE_NAME               : "MakefileName",\r
+        TAB_INF_DEFINES_BUILD_NUMBER                : "BuildNumber",\r
+        TAB_INF_DEFINES_BUILD_TYPE                  : "BuildType",\r
+        TAB_INF_DEFINES_FFS_EXT                     : "FfsExt",\r
+        TAB_INF_DEFINES_FV_EXT                      : "FvExt",\r
+        TAB_INF_DEFINES_SOURCE_FV                   : "SourceFv",\r
+        TAB_INF_DEFINES_VERSION_NUMBER              : "Version",\r
+        TAB_INF_DEFINES_VERSION_STRING              : "Version",\r
+        TAB_INF_DEFINES_VERSION                     : "Version",\r
+        TAB_INF_DEFINES_PCD_IS_DRIVER               : "PcdIsDriver",\r
+        TAB_INF_DEFINES_TIANO_R8_FLASHMAP_H         : "TianoR8FlashMap_h",\r
+        TAB_INF_DEFINES_SHADOW                      : "Shadow",\r
+#       TAB_INF_DEFINES_LIBRARY_CLASS               : "LibraryClass",\r
+#        TAB_INF_DEFINES_ENTRY_POINT                 : "ExternImages",\r
+#        TAB_INF_DEFINES_UNLOAD_IMAGE                : "ExternImages",\r
+#        TAB_INF_DEFINES_CONSTRUCTOR                 : ,\r
+#        TAB_INF_DEFINES_DESTRUCTOR                  : ,\r
+#        TAB_INF_DEFINES_DEFINE                      : "Define",\r
+#        TAB_INF_DEFINES_SPEC                        : "Specification",\r
+#        TAB_INF_DEFINES_CUSTOM_MAKEFILE             : "CustomMakefile",\r
+#        TAB_INF_DEFINES_MACRO                       : \r
+    }\r
+\r
+    def __init__(self):\r
+        ModuleHeaderClass.__init__(self)\r
+        #print self.__dict__\r
+    def __setitem__(self, key, value):\r
+        self.__dict__[self._Mapping_[key]] = value\r
+    def __getitem__(self, key):\r
+        return self.__dict__[self._Mapping_[key]]\r
+    ## "in" test support\r
+    def __contains__(self, key):\r
+        return key in self._Mapping_\r
+\r
 ## InfObject\r
 #\r
 # This class defined basic Inf object which is used by inheriting\r
@@ -89,107 +139,6 @@ class InfObject(object):
     def __init__(self):\r
         object.__init__()\r
 \r
-## InfDefines\r
-#\r
-# This class defined basic Defines used in Inf object\r
-# \r
-# @param InfObject:        Inherited from InfObject class\r
-#\r
-# @var DefinesDictionary:  To store value for DefinesDictionary \r
-#\r
-class InfDefines(InfObject):\r
-    def __init__(self):\r
-        self.DefinesDictionary = {\r
-            #\r
-            # Required Fields\r
-            #\r
-            TAB_INF_DEFINES_BASE_NAME                               : [''],\r
-            TAB_INF_DEFINES_FILE_GUID                               : [''],\r
-            TAB_INF_DEFINES_MODULE_TYPE                             : [''],\r
-            TAB_INF_DEFINES_EFI_SPECIFICATION_VERSION               : [''],\r
-            TAB_INF_DEFINES_EDK_RELEASE_VERSION                     : [''],\r
-            \r
-            #\r
-            # Optional Fields\r
-            #\r
-            TAB_INF_DEFINES_INF_VERSION                             : [''],\r
-            TAB_INF_DEFINES_BINARY_MODULE                           : [''],\r
-            TAB_INF_DEFINES_LIBRARY_CLASS                           : [''],\r
-            TAB_INF_DEFINES_COMPONENT_TYPE                          : [''],\r
-            TAB_INF_DEFINES_MAKEFILE_NAME                           : [''],\r
-            TAB_INF_DEFINES_BUILD_NUMBER                            : [''],\r
-            TAB_INF_DEFINES_BUILD_TYPE                              : [''],\r
-            TAB_INF_DEFINES_FFS_EXT                                 : [''],\r
-            TAB_INF_DEFINES_FV_EXT                                  : [''],\r
-            TAB_INF_DEFINES_SOURCE_FV                               : [''],\r
-            TAB_INF_DEFINES_VERSION_NUMBER                          : [''],\r
-            TAB_INF_DEFINES_VERSION_STRING                          : [''],\r
-            TAB_INF_DEFINES_VERSION                                 : [''],\r
-            TAB_INF_DEFINES_PCD_IS_DRIVER                           : [''],\r
-            TAB_INF_DEFINES_TIANO_R8_FLASHMAP_H                     : [''],\r
-            TAB_INF_DEFINES_ENTRY_POINT                             : [''],\r
-            TAB_INF_DEFINES_UNLOAD_IMAGE                            : [''],\r
-            TAB_INF_DEFINES_CONSTRUCTOR                             : [''],\r
-            TAB_INF_DEFINES_DESTRUCTOR                              : [''],\r
-            TAB_INF_DEFINES_DEFINE                                  : [''],\r
-            TAB_INF_DEFINES_SPEC                                    : [''],\r
-            TAB_INF_DEFINES_CUSTOM_MAKEFILE                         : [''],\r
-            TAB_INF_DEFINES_SHADOW                                  : [''],\r
-            TAB_INF_DEFINES_MACRO                                   : {}\r
-        }\r
-\r
-    def extend(self, InfDefinesObj):\r
-        for Item in InfDefinesObj.DefinesDictionary:\r
-            if Item == TAB_INF_DEFINES_MACRO:\r
-                self.DefinesDictionary[Item].update(InfDefinesObj.DefinesDictionary[Item])\r
-            else:\r
-                if InfDefinesObj.DefinesDictionary[Item][0] != '':\r
-                    if self.DefinesDictionary[Item][0] == '':\r
-                        self.DefinesDictionary[Item] = []\r
-                    self.DefinesDictionary[Item].extend(InfDefinesObj.DefinesDictionary[Item])\r
-\r
-## InfContents\r
-#\r
-# This class defined basic Contents used in Inf object\r
-# \r
-# @param InfObject:   Inherited from InfObject class\r
-#\r
-# @var Sources:       To store value for Sources\r
-# @var BuildOptions:  To store value for BuildOptions\r
-# @var Binaries:      To store value for Binaries\r
-# @var Includes:      To store value for Includes\r
-# @var Guids:         To store value for Guids\r
-# @var Protocols:     To store value for Protocols\r
-# @var Ppis:          To store value for Ppis\r
-# @var Libraries:     To store value for Libraries\r
-# @var Packages:      To store value for Packages\r
-# @var FixedPcd:      To store value for FixedPcd\r
-# @var PatchPcd:      To store value for PatchPcd\r
-# @var Pcd:           To store value for Pcd\r
-# @var PcdEx:         To store value for PcdEx\r
-# @var Depex:         To store value for Depex\r
-# @var Nmake:         To store value for Nmake\r
-#\r
-class InfContents(InfObject):\r
-    def __init__(self):\r
-        self.Sources = []\r
-        self.BuildOptions = []\r
-        self.Binaries = []\r
-        self.Includes = []\r
-        self.Guids = []\r
-        self.Protocols = []\r
-        self.Ppis = []\r
-        self.Libraries = []\r
-        self.LibraryClasses = []\r
-        self.Packages = []\r
-        self.FixedPcd = []\r
-        self.PatchPcd = []\r
-        self.FeaturePcd = []\r
-        self.Pcd = []\r
-        self.PcdEx = []\r
-        self.Depex = []\r
-        self.Nmake = []\r
-\r
 ## Inf\r
 #\r
 # This class defined the structure used in Inf object\r
@@ -207,30 +156,22 @@ class InfContents(InfObject):
 # @param WorkspaceDir:      Input value for current workspace directory, default is None\r
 #\r
 # @var Identification:      To store value for Identification, it is a structure as Identification\r
-# @var Defines:             To store value for Defines, it is a structure as InfDefines\r
 # @var UserExtensions:      To store value for UserExtensions\r
 # @var Module:              To store value for Module, it is a structure as ModuleClass\r
 # @var WorkspaceDir:        To store value for WorkspaceDir\r
-# @var Contents:            To store value for Contents, it is a structure as InfContents\r
 # @var KeyList:             To store value for KeyList, a list for all Keys used in Inf\r
 #\r
 class Inf(InfObject):\r
     def __init__(self, Filename = None, IsMergeAllArches = False, IsToModule = False, WorkspaceDir = None, Database = None, SupArchList = DataType.ARCH_LIST):\r
         self.Identification = Identification()\r
-        self.Defines = {} # InfDefines()\r
-        self.Contents = {}\r
-        self.UserExtensions = ''\r
         self.Module = ModuleClass()\r
+        self.UserExtensions = ''\r
         self.WorkspaceDir = WorkspaceDir\r
-        self._Macro = {}    # for inf file local replacement\r
+        self.SupArchList = SupArchList\r
+        \r
         self.Cur = Database.Cur\r
         self.TblFile = Database.TblFile\r
         self.TblInf = TableInf(Database.Cur)\r
-        self.SupArchList = SupArchList\r
-        \r
-        \r
-#        for Arch in DataType.ARCH_LIST_FULL:\r
-#            self.Contents[Arch] = InfContents()\r
 \r
         self.KeyList = [\r
             TAB_SOURCES, TAB_BUILD_OPTIONS, TAB_BINARIES, TAB_INCLUDES, TAB_GUIDS, \r
@@ -256,53 +197,12 @@ class Inf(InfObject):
         if Filename != None:\r
             self.LoadInfFile(Filename)\r
         \r
-        #\r
-        # Merge contents of Inf from all arches if IsMergeAllArches is True\r
-        #        \r
-        if IsMergeAllArches:\r
-            self.MergeAllArches()\r
-\r
         #\r
         # Transfer to Module Object if IsToModule is True\r
         #\r
         if IsToModule:\r
             self.InfToModule()\r
 \r
-    ## Merge contents of Inf from all arches\r
-    #\r
-    # Find the contents defined in all arches and merge them to all\r
-    #\r
-    def MergeAllArches(self):\r
-        if DataType.TAB_ARCH_COMMON in self.Defines:\r
-            for Arch in DataType.ARCH_LIST:\r
-                if Arch not in self.Defines:\r
-                    self.Defines[Arch] = InfDefines()\r
-                self.Defines[Arch].extend(self.Defines[DataType.TAB_ARCH_COMMON])\r
-                self._Macro.update(self.Defines[Arch].DefinesDictionary[TAB_INF_DEFINES_MACRO])\r
-        self._Macro.update(GlobalData.gGlobalDefines)\r
-\r
-        if DataType.TAB_ARCH_COMMON in self.Contents:\r
-            for Key in self.KeyList:\r
-                for Arch in DataType.ARCH_LIST:\r
-                    Command = "self.Contents[Arch]." + Key + ".extend(" + "self.Contents['" + DataType.TAB_ARCH_COMMON + "']." + Key + ")"\r
-                    eval(Command)     \r
-\r
-    ## Parse Inf file\r
-    #\r
-    # Go through input lines one by one to find the value defined in Key section.\r
-    # Save them to KeyField\r
-    #\r
-    # @param Lines:     Lines need to be parsed\r
-    # @param Key:       The key value of the section to be located\r
-    # @param KeyField:  To save the found contents\r
-    #\r
-    def ParseInf(self, Lines, Key, KeyField):\r
-        newKey = SplitModuleType(Key)\r
-        if newKey[0].upper().find(DataType.TAB_LIBRARY_CLASSES.upper()) != -1:\r
-            GetLibraryClassesWithModuleType(Lines, Key, KeyField, TAB_COMMENT_SPLIT)\r
-        else:\r
-            GetMultipleValuesOfKeyFromLines(Lines, Key, KeyField, TAB_COMMENT_SPLIT)\r
-\r
     ## Transfer to Module Object\r
     # \r
     # Transfer all contents of an Inf file to a standard Module Object\r
@@ -366,17 +266,17 @@ class Inf(InfObject):
         #\r
         # Generate Guids\r
         #\r
-        self.GenGuids(ContainerFile)\r
+        self.GenGuidProtocolPpis(DataType.TAB_GUIDS, ContainerFile)\r
 \r
         #\r
         # Generate Protocols\r
         #\r
-        self.GenProtocols(ContainerFile)\r
+        self.GenGuidProtocolPpis(DataType.TAB_PROTOCOLS, ContainerFile)\r
 \r
         #\r
         # Generate Ppis\r
         #\r
-        self.GenPpis(ContainerFile)\r
+        self.GenGuidProtocolPpis(DataType.TAB_PPIS, ContainerFile)\r
         \r
         #\r
         # Generate Depexes\r
@@ -387,38 +287,6 @@ class Inf(InfObject):
         # Generate Binaries\r
         #\r
         self.GenBinaries(ContainerFile)\r
-        \r
-    ## Get Pcd Values of Inf\r
-    #\r
-    # Get Pcd of Inf as <TokenSpaceGuidCName>.<PcdCName>[|<Value>]\r
-    #\r
-    # @param Item:  The string describes pcd\r
-    # @param Type:  The type of Pcd\r
-    # @param File:  The file which describes the pcd, used for error report\r
-    #\r
-    # @retval (TokenSpcCName, TokenCName, Value, ItemType) Formatted Pcd Item\r
-    #\r
-    def GetPcdOfInf(self, Item, Type, File, LineNo):\r
-        Format = '<TokenSpaceGuidCName>.<PcdCName>[|<Value>]'\r
-        InfType = ''\r
-        if Type == TAB_PCDS_FIXED_AT_BUILD:\r
-            InfType = TAB_INF_FIXED_PCD\r
-        elif Type == TAB_PCDS_PATCHABLE_IN_MODULE:\r
-            InfType = TAB_INF_PATCH_PCD\r
-        elif Type == TAB_PCDS_FEATURE_FLAG:\r
-            InfType = TAB_INF_FEATURE_PCD        \r
-        elif Type == TAB_PCDS_DYNAMIC_EX:\r
-            InfType = TAB_INF_PCD_EX        \r
-        elif Type == TAB_PCDS_DYNAMIC:\r
-            InfType = TAB_INF_PCD\r
-        List = GetSplitValueList(Item + DataType.TAB_VALUE_SPLIT)\r
-        if len(List) < 2 or len(List) > 3:\r
-            RaiseParserError(Item, InfType, File, Format, LineNo)\r
-        TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
-        if len(TokenInfo) != 2:\r
-            RaiseParserError(Item, InfType, File, Format, LineNo)\r
-\r
-        return (TokenInfo[0], TokenInfo[1], List[1], Type)\r
 \r
     ## Parse [Defines] section\r
     #\r
@@ -442,54 +310,6 @@ class Inf(InfObject):
         GetSingleValueOfKeyFromLines(Lines, self.Defines[Arch].DefinesDictionary, \r
                                      TAB_COMMENT_SPLIT, TAB_EQUAL_SPLIT, False, None)\r
 \r
-    ## First time to insert records to database\r
-    # \r
-    # Insert item data of a section to database\r
-    # @param FileID:           The ID of belonging file\r
-    # @param Filename:         The name of belonging file\r
-    # @param CurrentSection:   The name of currect section\r
-    # @param SectionItemList:  A list of items of the section\r
-    # @param ArchList:         A list of arches\r
-    # @param ThirdList:        A list of third parameters, ModuleType for LibraryClass and SkuId for Dynamic Pcds\r
-    # @param IfDefList:        A list of all conditional statements\r
-    #\r
-    def InsertSectionItemsIntoDatabase(self, FileID, Filename, CurrentSection, SectionItemList, ArchList, ThirdList, IfDefList):\r
-        #\r
-        # Insert each item data of a section\r
-        #\r
-        for Index in range(0, len(ArchList)):\r
-            Arch = ArchList[Index]\r
-            Third = ThirdList[Index]\r
-            if Arch == '':\r
-                Arch = TAB_ARCH_COMMON\r
-\r
-            Model = Section[CurrentSection.upper()]\r
-            Records = self.RecordSet[Model]\r
-            for SectionItem in SectionItemList:\r
-                BelongsToItem, EndLine, EndColumn = -1, -1, -1\r
-                LineValue, StartLine, EndLine = SectionItem[0], SectionItem[1], SectionItem[1]\r
-                \r
-                EdkLogger.debug(4, "Parsing %s ..." %LineValue)\r
-                #\r
-                # And then parse DEFINE statement\r
-                #\r
-                if LineValue.upper().find(DataType.TAB_DEFINE.upper() + ' ') > -1:\r
-                    self.ParseDefine(LineValue, StartLine, self.TblInf, FileID, Filename, CurrentSection, MODEL_META_DATA_DEFINE, Arch)\r
-                    continue\r
-                \r
-                #\r
-                # At last parse other sections\r
-                #\r
-                if CurrentSection == TAB_LIBRARY_CLASSES or CurrentSection == TAB_INF_DEFINES:\r
-                    ID = self.TblInf.Insert(Model, LineValue, Third, Third, '', '', Arch, -1, FileID, StartLine, -1, StartLine, -1, 0)\r
-                    Records.append([LineValue, Arch, StartLine, ID, Third])\r
-                    continue\r
-                else:\r
-                    ID = self.TblInf.Insert(Model, LineValue, '', '', '', '', Arch, -1, FileID, StartLine, -1, StartLine, -1, 0)\r
-                    Records.append([LineValue, Arch, StartLine, ID, Third])\r
-                    continue\r
-            self.RecordSet[Model] = Records\r
-    \r
     ## Load Inf file\r
     #\r
     # Load the file if it exists\r
@@ -521,20 +341,8 @@ class Inf(InfObject):
         #\r
         # Parse file content\r
         #\r
-        FileContent = open(Filename, 'r').read()\r
-        for Line in FileContent.splitlines():\r
+        for Line in open(Filename, 'r'):\r
             LineNo = LineNo + 1\r
-            #\r
-            # Reomve spaces in head and tail\r
-            #\r
-            Line = Line.strip()\r
-            \r
-            #\r
-            # Ignore comments\r
-            #\r
-            if Line.startswith(TAB_COMMENT_SPLIT):\r
-                continue\r
-            \r
             #\r
             # Remove comments at tail and remove spaces again\r
             #\r
@@ -548,10 +356,11 @@ class Inf(InfObject):
             # And then parse the content of the new section\r
             #\r
             if Line.startswith(TAB_SECTION_START) and Line.endswith(TAB_SECTION_END):\r
+                Model = Section[CurrentSection.upper()]\r
                 #\r
                 # Insert items data of previous section\r
                 #\r
-                self.InsertSectionItemsIntoDatabase(FileID, Filename, CurrentSection, SectionItemList, ArchList, ThirdList, IfDefList)\r
+                InsertSectionItemsIntoDatabase(self.TblInf, FileID, Filename, Model, CurrentSection, SectionItemList, ArchList, ThirdList, IfDefList, self.RecordSet)\r
                 #\r
                 # Parse the new section\r
                 #\r
@@ -594,28 +403,13 @@ class Inf(InfObject):
         #\r
         # Insert items data of last section\r
         #\r
-        self.InsertSectionItemsIntoDatabase(FileID, Filename, CurrentSection, SectionItemList, ArchList, ThirdList, IfDefList)\r
+        Model = Section[CurrentSection.upper()]\r
+        InsertSectionItemsIntoDatabase(self.TblInf, FileID, Filename, Model, CurrentSection, SectionItemList, ArchList, ThirdList, IfDefList, self.RecordSet)\r
         \r
         #\r
         # Replace all DEFINE macros with its actual values\r
         #\r
         ParseDefineMacro2(self.TblInf, self.RecordSet, GlobalData.gGlobalDefines)\r
-\r
-    ## Show detailed information of Inf\r
-    #\r
-    # Print all members and their values of Inf class\r
-    #\r
-    def ShowInf(self):\r
-        print TAB_SECTION_START + TAB_INF_DEFINES + TAB_SECTION_END\r
-        printDict(self.Defines.DefinesDictionary)\r
-\r
-        for key in self.KeyList:\r
-            for arch in DataType.ARCH_LIST_FULL:\r
-                Command = "printList(TAB_SECTION_START + '" + \\r
-                          key + DataType.TAB_SPLIT + arch + \\r
-                          "' + TAB_SECTION_END, self.Contents[arch]." + key + ')'\r
-                eval(Command)\r
-        print ""\r
     \r
     ## Show detailed information of Module\r
     #\r
@@ -669,7 +463,7 @@ class Inf(InfObject):
             print Item.LibraryClass, Item.RecommendedInstance, Item.FeatureFlag, Item.SupModuleList, Item.SupArchList, Item.Define\r
         print '\nPackageDependencies =', M.PackageDependencies\r
         for Item in M.PackageDependencies:\r
-            print Item.FilePath, Item.SupArchList, Item.Define\r
+            print Item.FilePath, Item.SupArchList, Item.FeatureFlag\r
         print '\nNmake =', M.Nmake\r
         for Item in M.Nmake:\r
             print Item.Name, Item.Value, Item.SupArchList\r
@@ -684,13 +478,13 @@ class Inf(InfObject):
             print UserExtension.UserID, UserExtension.Identifier,UserExtension.Content\r
         print '\nGuids =', M.Guids\r
         for Item in M.Guids:\r
-            print Item.CName, Item.SupArchList\r
+            print Item.CName, Item.SupArchList, Item.FeatureFlag\r
         print '\nProtocols =', M.Protocols\r
         for Item in M.Protocols:\r
-            print Item.CName, Item.SupArchList\r
+            print Item.CName, Item.SupArchList, Item.FeatureFlag\r
         print '\nPpis =', M.Ppis\r
         for Item in M.Ppis:\r
-            print Item.CName, Item.SupArchList\r
+            print Item.CName, Item.SupArchList, Item.FeatureFlag\r
         print '\nDepex =', M.Depex\r
         for Item in M.Depex:\r
             print Item.Depex, Item.SupArchList, Item.Define\r
@@ -722,62 +516,28 @@ class Inf(InfObject):
             self.TblInf.Exec(SqlCommand)\r
         \r
         for Arch in DataType.ARCH_LIST:\r
-            ModuleHeader = ModuleHeaderClass()\r
-            ModuleHeader.Name = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_BASE_NAME, Arch)[0]\r
-            ModuleHeader.Guid = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_FILE_GUID, Arch)[0]\r
-            ModuleHeader.Version = QueryDefinesItem(self.TblInf, TAB_DEC_DEFINES_PACKAGE_VERSION, Arch)[0]\r
+            ModuleHeader = InfHeader()\r
             ModuleHeader.FileName = self.Identification.FileName\r
             ModuleHeader.FullPath = self.Identification.FileFullPath\r
-            ModuleHeader.InfVersion = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_INF_VERSION, Arch)[0]\r
-            \r
-            ModuleHeader.EfiSpecificationVersion = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_EFI_SPECIFICATION_VERSION, Arch)[0]\r
-            ModuleHeader.EdkReleaseVersion = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_EDK_RELEASE_VERSION, Arch)[0]\r
-            \r
-            ModuleHeader.ModuleType = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_MODULE_TYPE, Arch)[0]\r
-            ModuleHeader.BinaryModule = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_BINARY_MODULE, Arch)[0]\r
-            ModuleHeader.ComponentType = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_COMPONENT_TYPE, Arch)[0]\r
-            ModuleHeader.MakefileName = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_MAKEFILE_NAME, Arch)[0]\r
-            ModuleHeader.BuildNumber = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_BUILD_NUMBER, Arch)[0]\r
-            ModuleHeader.BuildType = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_BUILD_TYPE, Arch)[0]\r
-            ModuleHeader.FfsExt = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_FFS_EXT, Arch)[0]\r
-            ModuleHeader.SourceFv = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_SOURCE_FV, Arch)[0]\r
-            ModuleHeader.PcdIsDriver = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_PCD_IS_DRIVER, Arch)[0]\r
-            ModuleHeader.TianoR8FlashMap_h = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_TIANO_R8_FLASHMAP_H, Arch)[0]\r
-            ModuleHeader.Shadow = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_SHADOW, Arch)[0]\r
-        \r
-            #\r
-            # Get version of INF\r
-            #\r
-            if ModuleHeader.InfVersion != "":\r
-                # R9 inf\r
-                VersionNumber = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_VERSION_NUMBER, Arch)[0]\r
-                VersionString = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_VERSION_STRING, Arch)[0]\r
-                if len(VersionNumber) > 0 and len(VersionString) == 0:\r
-                    EdkLogger.warn(2000, 'VERSION_NUMBER depricated; INF file %s should be modified to use VERSION_STRING instead.' % self.Identification.FileFullPath)\r
-                    ModuleHeader.Version = VersionNumber\r
-                if len(VersionString) > 0:\r
-                    if len(VersionNumber) > 0:\r
-                        EdkLogger.warn(2001, 'INF file %s defines both VERSION_NUMBER and VERSION_STRING, using VERSION_STRING' % self.Identification.FileFullPath)\r
-                    ModuleHeader.Version = VersionString\r
-            else:\r
-                # R8 inf\r
-                ModuleHeader.InfVersion = "0x00010000"\r
-                VersionNumber = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_VERSION, Arch)[0]\r
-                VersionString = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_VERSION_STRING, Arch)[0]\r
-                if VersionString == '' and VersionNumber != '':\r
-                    VersionString = VersionNumber\r
-                if ModuleHeader.ComponentType in gComponentType2ModuleType:\r
-                    ModuleHeader.ModuleType = gComponentType2ModuleType[ModuleHeader[Arch].ComponentType]\r
-                elif ModuleHeader.ComponentType != '':\r
-                    EdkLogger.error("Parser", PARSER_ERROR, "Unsupported R8 component type [%s]" % ModuleHeader[Arch].ComponentType,\r
-                                    ExtraData=ContainerFile)\r
-            #\r
-            # LibraryClass of Defines\r
-            #\r
-            RecordSet = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_LIBRARY_CLASS, Arch)\r
-            if RecordSet[0] != '':\r
-                for Item in RecordSet:\r
-                    List = GetSplitValueList(Item, DataType.TAB_VALUE_SPLIT, 1)\r
+            DefineList = QueryDefinesItem2(self.TblInf, Arch)\r
+\r
+            NotProcessedDefineList = []\r
+            for D in DefineList:\r
+                if D[0] in ModuleHeader:\r
+                    ModuleHeader[D[0]] = GetSplitValueList(D[1])[0]\r
+                else:\r
+                    NotProcessedDefineList.append(D)\r
+\r
+            if ModuleHeader.ComponentType == "LIBRARY":\r
+                Lib = LibraryClassClass()\r
+                Lib.LibraryClass = ModuleHeader.Name\r
+                Lib.SupModuleList = DataType.SUP_MODULE_LIST\r
+                ModuleHeader.LibraryClass.append(Lib)\r
+\r
+            # we need to make some key defines resolved first\r
+            for D in NotProcessedDefineList:\r
+                if D[0] == TAB_INF_DEFINES_LIBRARY_CLASS:\r
+                    List = GetSplitValueList(D[1], DataType.TAB_VALUE_SPLIT, 1)\r
                     Lib = LibraryClassClass()\r
                     Lib.LibraryClass = CleanString(List[0])\r
                     if len(List) == 1:\r
@@ -785,77 +545,38 @@ class Inf(InfObject):
                     elif len(List) == 2:\r
                         Lib.SupModuleList = GetSplitValueList(CleanString(List[1]), ' ')\r
                     ModuleHeader.LibraryClass.append(Lib)\r
-            elif ModuleHeader.ComponentType == "LIBRARY":\r
-                Lib = LibraryClassClass()\r
-                Lib.LibraryClass = ModuleHeader.Name\r
-                Lib.SupModuleList = DataType.SUP_MODULE_LIST\r
-                ModuleHeader.LibraryClass.append(Lib)\r
-            \r
-            #\r
-            # Custom makefile of Defines\r
-            #\r
-            RecordSet = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_CUSTOM_MAKEFILE, Arch)\r
-            if RecordSet[0] != '':\r
-                for Item in RecordSet:\r
-                    List = Item.split(DataType.TAB_VALUE_SPLIT)\r
+                elif D[0] == TAB_INF_DEFINES_CUSTOM_MAKEFILE:\r
+                    List = D[1].split(DataType.TAB_VALUE_SPLIT)\r
                     if len(List) == 2:\r
                         ModuleHeader.CustomMakefile[CleanString(List[0])] = CleanString(List[1])\r
                     else:\r
-                        RaiseParserError(Item, 'CUSTOM_MAKEFILE of Defines', File, 'CUSTOM_MAKEFILE=<Family>|<Filename>')\r
-            \r
-            #\r
-            # EntryPoint and UnloadImage of Defines\r
-            #\r
-            RecordSet = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_ENTRY_POINT, Arch)\r
-            if RecordSet[0] != '':\r
-                for Item in RecordSet:\r
+                        RaiseParserError(Item, 'CUSTOM_MAKEFILE of Defines', File, 'CUSTOM_MAKEFILE=<Family>|<Filename>', D[2])\r
+                elif D[0] == TAB_INF_DEFINES_ENTRY_POINT:\r
                     Image = ModuleExternImageClass()\r
-                    Image.ModuleEntryPoint = CleanString(Item)\r
+                    Image.ModuleEntryPoint = CleanString(D[1])\r
                     self.Module.ExternImages.append(Image)\r
-            RecordSet = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_UNLOAD_IMAGE, Arch)\r
-            if RecordSet[0] != '':\r
-                for Item in RecordSet:\r
+                elif D[0] == TAB_INF_DEFINES_UNLOAD_IMAGE:\r
                     Image = ModuleExternImageClass()\r
-                    Image.ModuleUnloadImage = CleanString(Item)\r
+                    Image.ModuleUnloadImage = CleanString(D[1])\r
                     self.Module.ExternImages.append(Image)\r
-            \r
-            #\r
-            # Constructor and Destructor of Defines\r
-            #\r
-            RecordSet = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_CONSTRUCTOR, Arch)\r
-            if RecordSet[0] != '':\r
-                for Item in RecordSet:\r
+                elif D[0] == TAB_INF_DEFINES_CONSTRUCTOR:\r
                     LibraryClass = ModuleExternLibraryClass()\r
-                    LibraryClass.Constructor = CleanString(Item)\r
+                    LibraryClass.Constructor = CleanString(D[1])\r
                     self.Module.ExternLibraries.append(LibraryClass)\r
-            RecordSet = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_DESTRUCTOR, Arch)\r
-            if RecordSet[0] != '':\r
-                for Item in RecordSet:\r
+                elif D[0] == TAB_INF_DEFINES_DESTRUCTOR:\r
                     LibraryClass = ModuleExternLibraryClass()\r
-                    LibraryClass.Destructor = CleanString(Item)\r
+                    LibraryClass.Destructor = CleanString(D[1])\r
                     self.Module.ExternLibraries.append(LibraryClass)\r
-            \r
-            #\r
-            # Define of Defines\r
-            #\r
-            RecordSet = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_DEFINE, Arch)\r
-            if RecordSet[0] != '':\r
-                for Item in RecordSet:\r
-                    List = Item.split(DataType.TAB_EQUAL_SPLIT)\r
+                elif D[0] == TAB_INF_DEFINES_DEFINE:\r
+                    List = D[1].split(DataType.TAB_EQUAL_SPLIT)\r
                     if len(List) != 2:\r
-                        RaiseParserError(Item, 'DEFINE of Defines', File, 'DEFINE <Word> = <Word>')\r
+                        RaiseParserError(Item, 'DEFINE of Defines', File, 'DEFINE <Word> = <Word>', D[2])\r
                     else:\r
                         ModuleHeader.Define[CleanString(List[0])] = CleanString(List[1])\r
-            \r
-            #\r
-            # Spec\r
-            #\r
-            RecordSet = QueryDefinesItem(self.TblInf, TAB_INF_DEFINES_SPEC, Arch)\r
-            if RecordSet[0] != '':\r
-                for Item in RecordSet:\r
-                    List = Item.split(DataType.TAB_EQUAL_SPLIT)\r
+                elif D[0] == TAB_INF_DEFINES_SPEC:\r
+                    List = D[1].split(DataType.TAB_EQUAL_SPLIT)\r
                     if len(List) != 2:\r
-                        RaiseParserError(Item, 'SPEC of Defines', File, 'SPEC <Word> = <Version>')\r
+                        RaiseParserError(Item, 'SPEC of Defines', File, 'SPEC <Word> = <Version>', D[2])\r
                     else:\r
                         ModuleHeader.Specification[CleanString(List[0])] = CleanString(List[1])\r
             \r
@@ -1017,14 +738,13 @@ class Inf(InfObject):
         for Arch in self.SupArchList:\r
             for Record in RecordSet:\r
                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    CheckFileType(Record[0], '.Dec', ContainerFile, 'package', Record[0], Record[2])\r
-                    CheckFileExist(self.WorkspaceDir, Record[0], ContainerFile, 'Packages', Record[0], Record[2])\r
-                    MergeArches(Packages, Record[0], Arch)\r
+                    MergeArches(Packages, GetPackage(Record[0], ContainerFile, self.WorkspaceDir, Record[2]), Arch)\r
                     \r
         for Key in Packages.keys():\r
             Package = ModulePackageDependencyClass()\r
-            Package.FilePath = NormPath(Key)\r
+            Package.FilePath = NormPath(Key[0])\r
             Package.SupArchList = Packages[Key]\r
+            Package.FeatureFlag = Key[1]\r
             self.Module.PackageDependencies.append(Package)\r
 \r
     ## GenNmakes\r
@@ -1111,19 +831,19 @@ class Inf(InfObject):
                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
                     if self.Module.Header[Arch].LibraryClass != {}:\r
                         pass\r
-                    MergeArches(Pcds, self.GetPcdOfInf(Record[0], TAB_PCDS_FIXED_AT_BUILD, ContainerFile, Record[2]), Arch)\r
+                    MergeArches(Pcds, GetPcdOfInf(Record[0], TAB_PCDS_FIXED_AT_BUILD, ContainerFile, Record[2]), Arch)\r
             for Record in RecordSet2:\r
                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    MergeArches(Pcds, self.GetPcdOfInf(Record[0], TAB_PCDS_PATCHABLE_IN_MODULE, ContainerFile, Record[2]), Arch)\r
+                    MergeArches(Pcds, GetPcdOfInf(Record[0], TAB_PCDS_PATCHABLE_IN_MODULE, ContainerFile, Record[2]), Arch)\r
             for Record in RecordSet3:\r
                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    MergeArches(Pcds, self.GetPcdOfInf(Record[0], TAB_PCDS_FEATURE_FLAG, ContainerFile, Record[2]), Arch)\r
+                    MergeArches(Pcds, GetPcdOfInf(Record[0], TAB_PCDS_FEATURE_FLAG, ContainerFile, Record[2]), Arch)\r
             for Record in RecordSet4:\r
                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    MergeArches(Pcds, self.GetPcdOfInf(Record[0], TAB_PCDS_DYNAMIC_EX, ContainerFile, Record[2]), Arch)\r
+                    MergeArches(Pcds, GetPcdOfInf(Record[0], TAB_PCDS_DYNAMIC_EX, ContainerFile, Record[2]), Arch)\r
             for Record in RecordSet5:\r
                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    MergeArches(Pcds, self.GetPcdOfInf(Record[0], "", ContainerFile, Record[2]), Arch)\r
+                    MergeArches(Pcds, GetPcdOfInf(Record[0], "", ContainerFile, Record[2]), Arch)\r
 \r
         for Key in Pcds.keys():\r
             Pcd = PcdClass()\r
@@ -1184,93 +904,6 @@ class Inf(InfObject):
 #            self.Module.UserExtensions.append(UserExtension)\r
         pass\r
 \r
-    ## GenGuids\r
-    #\r
-    # Gen Guids of Inf\r
-    # <CName>=<GuidValue>\r
-    #\r
-    # @param ContainerFile: The Inf file full path \r
-    #\r
-    def GenGuids(self, ContainerFile):\r
-        EdkLogger.debug(2, "Generate %s ..." % TAB_GUIDS)\r
-        Guids = {}\r
-        #\r
-        # Get all Guids\r
-        #\r
-        RecordSet = self.RecordSet[MODEL_EFI_GUID]\r
-        \r
-        #\r
-        # Go through each arch\r
-        #\r
-        for Arch in self.SupArchList:\r
-            for Record in RecordSet:\r
-                if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    MergeArches(Guids, Record[0], Arch)\r
-        \r
-        for Key in Guids.keys():\r
-            Guid = GuidClass()\r
-            Guid.CName = Key\r
-            Guid.SupArchList = Guids[Key]\r
-            self.Module.Guids.append(Guid)\r
-\r
-    ## GenProtocols\r
-    #\r
-    # Gen Protocols of Inf\r
-    # <CName>\r
-    #\r
-    # @param ContainerFile: The Inf file full path \r
-    #\r
-    def GenProtocols(self, ContainerFile):\r
-        EdkLogger.debug(2, "Generate %s ..." % TAB_PROTOCOLS)\r
-        Protocols = {}\r
-        #\r
-        # Get all Guids\r
-        #\r
-        RecordSet = self.RecordSet[MODEL_EFI_PROTOCOL]\r
-        \r
-        #\r
-        # Go through each arch\r
-        #\r
-        for Arch in self.SupArchList:\r
-            for Record in RecordSet:\r
-                if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    MergeArches(Protocols, Record[0], Arch)\r
-                \r
-        for Key in Protocols.keys():\r
-            Protocol = ProtocolClass()\r
-            Protocol.CName = Key\r
-            Protocol.SupArchList = Protocols[Key]\r
-            self.Module.Protocols.append(Protocol)\r
-    \r
-    ## GenPpis\r
-    #\r
-    # Gen Ppis of Inf\r
-    # <CName>\r
-    #\r
-    # @param ContainerFile: The Inf file full path \r
-    #\r
-    def GenPpis(self, ContainerFile):\r
-        EdkLogger.debug(2, "Generate %s ..." % TAB_PPIS)\r
-        Ppis = {}\r
-        #\r
-        # Get all Guids\r
-        #\r
-        RecordSet = self.RecordSet[MODEL_EFI_PPI]\r
-        \r
-        #\r
-        # Go through each arch\r
-        #\r
-        for Arch in self.SupArchList:\r
-            for Record in RecordSet:\r
-                if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    MergeArches(Ppis, Record[0], Arch)\r
-\r
-        for Key in Ppis.keys():\r
-            Ppi = PpiClass()\r
-            Ppi.CName = Key\r
-            Ppi.SupArchList = Ppis[Key]\r
-            self.Module.Ppis.append(Ppi)\r
-\r
     ## GenDepexes\r
     #\r
     # Gen Depex of Inf\r
@@ -1328,20 +961,44 @@ class Inf(InfObject):
         for Key in Binaries.keys():\r
             Binary = ModuleBinaryFileClass(NormPath(Key[1]), Key[0], Key[2], Key[3], Binaries[Key])\r
             self.Module.Binaries.append(Binary)\r
-\r
-    ## Parse DEFINE statement\r
+        \r
+    ## GenGuids\r
     #\r
-    # Get DEFINE macros\r
+    # Gen Guids of Inf\r
+    # <CName>=<GuidValue>\r
     #\r
-    # 1. Insert a record into TblDec\r
-    # Value1: Macro Name\r
-    # Value2: Macro Value\r
+    # @param ContainerFile: The Inf file full path \r
     #\r
-    def ParseDefine(self, LineValue, StartLine, Table, FileID, Filename, SectionName, Model, Arch):\r
-        EdkLogger.debug(EdkLogger.DEBUG_2, "DEFINE statement '%s' found in section %s" % (LineValue, SectionName))\r
-        SectionModel = Section[SectionName.upper()]\r
-        Define = GetSplitValueList(CleanString(LineValue[LineValue.upper().find(DataType.TAB_DEFINE.upper() + ' ') + len(DataType.TAB_DEFINE + ' ') : ]), TAB_EQUAL_SPLIT, 1)\r
-        Table.Insert(Model, Define[0], Define[1], '', '', '', Arch, SectionModel, FileID, StartLine, -1, StartLine, -1, 0)\r
+    def GenGuidProtocolPpis(self, Type, ContainerFile):\r
+        EdkLogger.debug(2, "Generate %s ..." % Type)\r
+        Lists = {}\r
+        #\r
+        # Get all Items\r
+        #\r
+        RecordSet = self.RecordSet[Section[Type.upper()]]\r
+        \r
+        #\r
+        # Go through each arch\r
+        #\r
+        for Arch in self.SupArchList:\r
+            for Record in RecordSet:\r
+                if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
+                    MergeArches(Lists, GetGuidsProtocolsPpisOfInf(Record[0], Type, ContainerFile, Record[2]), Arch)\r
+        \r
+        ListMember = None\r
+        if Type == TAB_GUIDS:\r
+            ListMember = self.Module.Guids\r
+        elif Type == TAB_PROTOCOLS:\r
+            ListMember = self.Module.Protocols\r
+        elif Type == TAB_PPIS:\r
+            ListMember = self.Module.Ppis\r
+        \r
+        for Key in Lists.keys():\r
+            ListClass = GuidProtocolPpiCommonClass()\r
+            ListClass.CName = Key[0]\r
+            ListClass.SupArchList = Lists[Key]\r
+            ListClass.FeatureFlag = Key[1]\r
+            ListMember.append(ListClass)\r
 \r
 ##\r
 #\r
index c883046..f8a610a 100644 (file)
@@ -18,6 +18,70 @@ from String import *
 from CommonDataClass.DataClass import *\r
 from DataType import *\r
 \r
+## ParseContent\r
+#\r
+# Parse content of a DSC/INF/DEC file\r
+#\r
+def ParseContent(Lines, ):\r
+    for Line in Lines:\r
+        LineNo = LineNo + 1\r
+        #\r
+        # Remove comments at tail and remove spaces again\r
+        #\r
+        Line = CleanString(Line)\r
+        if Line == '':\r
+            continue\r
+        \r
+        #\r
+        # Find a new section tab\r
+        # First insert previous section items\r
+        # And then parse the content of the new section\r
+        #\r
+        if Line.startswith(TAB_SECTION_START) and Line.endswith(TAB_SECTION_END):\r
+            #\r
+            # Insert items data of previous section\r
+            #\r
+            self.InsertSectionItemsIntoDatabase(FileID, Filename, CurrentSection, SectionItemList, ArchList, ThirdList, IfDefList)\r
+            #\r
+            # Parse the new section\r
+            #\r
+            SectionItemList = []\r
+            ArchList = []\r
+            ThirdList = []\r
+            \r
+            LineList = GetSplitValueList(Line[len(TAB_SECTION_START):len(Line) - len(TAB_SECTION_END)], TAB_COMMA_SPLIT)\r
+            for Item in LineList:\r
+                ItemList = GetSplitValueList(Item, TAB_SPLIT)\r
+                CurrentSection = ItemList[0]\r
+                if CurrentSection.upper() not in self.KeyList:\r
+                    RaiseParserError(Line, CurrentSection, Filename, '', LineNo)\r
+                ItemList.append('')\r
+                ItemList.append('')\r
+                if len(ItemList) > 5:\r
+                    RaiseParserError(Line, CurrentSection, Filename, '', LineNo)\r
+                else:\r
+                    if ItemList[1] != '' and ItemList[1].upper() not in ARCH_LIST_FULL:\r
+                        EdkLogger.error("Parser", PARSER_ERROR, "Invalid Arch definition '%s' found" % ItemList[1], File=Filename, Line=LineNo)\r
+                    ArchList.append(ItemList[1].upper())\r
+                    ThirdList.append(ItemList[2])\r
+\r
+            continue\r
+        \r
+        #\r
+        # Not in any defined section\r
+        #\r
+        if CurrentSection == TAB_UNKNOWN:\r
+            ErrorMsg = "%s is not in any defined section" % Line\r
+            EdkLogger.error("Parser", PARSER_ERROR, ErrorMsg, File=Filename, Line=LineNo)\r
+\r
+        #\r
+        # Add a section item\r
+        #\r
+        SectionItemList.append([Line, LineNo])\r
+        # End of parse\r
+    #End of For\r
+\r
+\r
 ## ParseDefineMacro\r
 #\r
 # Search whole table to find all defined Macro and replaced them with the real values\r
@@ -138,6 +202,31 @@ def QueryDefinesItem(Table, Name, Arch):
                     RetVal.append(Item)\r
         return RetVal\r
 \r
+##QueryDefinesItem\r
+#\r
+# Search item of section [Defines] by name, return its values\r
+#\r
+# @param Table: The Table to be executed\r
+# @param Name:  The Name of item of section [Defines]\r
+# @param Arch:  The Arch of item of section [Defines]\r
+#\r
+# @retval RecordSet: A list of all matched records\r
+#\r
+def QueryDefinesItem2(Table, Arch):\r
+    SqlCommand = """select Value1, Value2, StartLine from %s\r
+                    where Model = %s\r
+                    and Arch = '%s'\r
+                    and Enabled > -1""" % (Table.Table, MODEL_META_DATA_HEADER, ConvertToSqlString2(Arch))\r
+    RecordSet = Table.Exec(SqlCommand)\r
+    if len(RecordSet) < 1:\r
+        SqlCommand = """select Value1, Value2, StartLine from %s\r
+                    where Model = %s\r
+                    and Arch = '%s'\r
+                    and Enabled > -1""" % (Table.Table, MODEL_META_DATA_HEADER, ConvertToSqlString2(TAB_ARCH_COMMON))\r
+        RecordSet = Table.Exec(SqlCommand)\r
+    \r
+    return RecordSet\r
+\r
 ##QueryDscItem\r
 #\r
 # Search all dsc item for a specific section\r
@@ -609,3 +698,166 @@ def GetBinary(Item, ContainerFile, FileRelativePath, LineNo = -1):
             CheckPcdTokenInfo(List[3], 'Binaries', ContainerFile, LineNo)\r
     \r
     return (List[0], List[1], List[2], List[3])\r
+\r
+## Get Guids/Protocols/Ppis\r
+#\r
+# Get Guids/Protocols/Ppis of Inf as <GuidCName>[|<PcdFeatureFlag>]\r
+#\r
+# @param Item:           String as <GuidCName>[|<PcdFeatureFlag>]\r
+# @param Type:           Type of parsing string \r
+# @param ContainerFile:  The file which describes the library class, used for error report\r
+#\r
+# @retval (List[0], List[1])\r
+#\r
+def GetGuidsProtocolsPpisOfInf(Item, Type, ContainerFile, LineNo = -1):\r
+    ItemNew = Item + TAB_VALUE_SPLIT\r
+    List = GetSplitValueList(ItemNew)\r
+    if List[1] != '':\r
+        CheckPcdTokenInfo(List[1], Type, ContainerFile, LineNo)\r
+    \r
+    return (List[0], List[1])\r
+\r
+## Get Guids/Protocols/Ppis\r
+#\r
+# Get Guids/Protocols/Ppis of Dec as <GuidCName>=<GuidValue>\r
+#\r
+# @param Item:           String as <GuidCName>=<GuidValue>\r
+# @param Type:           Type of parsing string \r
+# @param ContainerFile:  The file which describes the library class, used for error report\r
+#\r
+# @retval (List[0], List[1])\r
+#\r
+def GetGuidsProtocolsPpisOfDec(Item, Type, ContainerFile, LineNo = -1):\r
+    List = GetSplitValueList(Item, DataType.TAB_EQUAL_SPLIT)\r
+    if len(List) != 2:\r
+        RaiseParserError(Item, Type, ContainerFile, '<CName>=<GuidValue>', LineNo)\r
+    \r
+    return (List[0], List[1])\r
+\r
+## GetPackage\r
+#\r
+# Get Package of Inf as <PackagePath>[|<PcdFeatureFlag>]\r
+#\r
+# @param Item:           String as <PackagePath>[|<PcdFeatureFlag>]\r
+# @param Type:           Type of parsing string \r
+# @param ContainerFile:  The file which describes the library class, used for error report\r
+#\r
+# @retval (List[0], List[1])\r
+#\r
+def GetPackage(Item, ContainerFile, FileRelativePath, LineNo = -1):\r
+    ItemNew = Item + TAB_VALUE_SPLIT\r
+    List = GetSplitValueList(ItemNew)\r
+    CheckFileType(List[0], '.Dec', ContainerFile, 'package', List[0], LineNo)\r
+    CheckFileExist(FileRelativePath, List[0], ContainerFile, 'Packages', List[0], LineNo)\r
+    \r
+    if List[1] != '':\r
+        CheckPcdTokenInfo(List[1], 'Packages', ContainerFile, LineNo)\r
+    \r
+    return (List[0], List[1])\r
+\r
+## Get Pcd Values of Inf\r
+#\r
+# Get Pcd of Inf as <TokenSpaceGuidCName>.<PcdCName>[|<Value>]\r
+#\r
+# @param Item:  The string describes pcd\r
+# @param Type:  The type of Pcd\r
+# @param File:  The file which describes the pcd, used for error report\r
+#\r
+# @retval (TokenSpcCName, TokenCName, Value, ItemType) Formatted Pcd Item\r
+#\r
+def GetPcdOfInf(Item, Type, File, LineNo):\r
+    Format = '<TokenSpaceGuidCName>.<PcdCName>[|<Value>]'\r
+    InfType = ''\r
+    if Type == TAB_PCDS_FIXED_AT_BUILD:\r
+        InfType = TAB_INF_FIXED_PCD\r
+    elif Type == TAB_PCDS_PATCHABLE_IN_MODULE:\r
+        InfType = TAB_INF_PATCH_PCD\r
+    elif Type == TAB_PCDS_FEATURE_FLAG:\r
+        InfType = TAB_INF_FEATURE_PCD        \r
+    elif Type == TAB_PCDS_DYNAMIC_EX:\r
+        InfType = TAB_INF_PCD_EX        \r
+    elif Type == TAB_PCDS_DYNAMIC:\r
+        InfType = TAB_INF_PCD\r
+    List = GetSplitValueList(Item + DataType.TAB_VALUE_SPLIT)\r
+    if len(List) < 2 or len(List) > 3:\r
+        RaiseParserError(Item, InfType, File, Format, LineNo)\r
+    TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
+    if len(TokenInfo) != 2:\r
+        RaiseParserError(Item, InfType, File, Format, LineNo)\r
+\r
+    return (TokenInfo[0], TokenInfo[1], List[1], Type)\r
+\r
+    \r
+## Get Pcd Values of Dec\r
+#\r
+# Get Pcd of Dec as <TokenSpcCName>.<TokenCName>|<Value>|<DatumType>|<Token>\r
+# @retval (TokenSpcCName, TokenCName, Value, DatumType, Token, ItemType) Formatted Pcd Item\r
+#\r
+def GetPcdOfDec(Item, Type, File, LineNo = -1):\r
+    Format = '<TokenSpaceGuidCName>.<PcdCName>|<Value>|<DatumType>|<Token>'\r
+    List = GetSplitValueList(Item)\r
+    if len(List) != 4:\r
+        RaiseParserError(Item, 'Pcds' + Type, File, Format, LineNo)\r
+    TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
+    if len(TokenInfo) != 2:\r
+        RaiseParserError(Item, 'Pcds' + Type, File, Format, LineNo)\r
+    \r
+    return (TokenInfo[0], TokenInfo[1], List[1], List[2], List[3], Type)\r
+\r
+## Parse DEFINE statement\r
+#\r
+# Get DEFINE macros\r
+#\r
+# 1. Insert a record into TblDec\r
+# Value1: Macro Name\r
+# Value2: Macro Value\r
+#\r
+def ParseDefine(LineValue, StartLine, Table, FileID, Filename, SectionName, SectionModel, Arch):\r
+    EdkLogger.debug(EdkLogger.DEBUG_2, "DEFINE statement '%s' found in section %s" % (LineValue, SectionName))\r
+    Define = GetSplitValueList(CleanString(LineValue[LineValue.upper().find(DataType.TAB_DEFINE.upper() + ' ') + len(DataType.TAB_DEFINE + ' ') : ]), TAB_EQUAL_SPLIT, 1)\r
+    Table.Insert(MODEL_META_DATA_DEFINE, Define[0], Define[1], '', '', '', Arch, SectionModel, FileID, StartLine, -1, StartLine, -1, 0)\r
+\r
+## Insert records to database\r
+# \r
+# Insert item data of a section to database\r
+# @param Table:            The Table to be inserted \r
+# @param FileID:           The ID of belonging file\r
+# @param Filename:         The name of belonging file\r
+# @param CurrentSection:   The name of currect section\r
+# @param SectionItemList:  A list of items of the section\r
+# @param ArchList:         A list of arches\r
+# @param ThirdList:        A list of third parameters, ModuleType for LibraryClass and SkuId for Dynamic Pcds\r
+# @param IfDefList:        A list of all conditional statements\r
+# @param RecordSet:        A dict of all parsed records \r
+#\r
+def InsertSectionItemsIntoDatabase(Table, FileID, Filename, Model, CurrentSection, SectionItemList, ArchList, ThirdList, IfDefList, RecordSet):\r
+    #\r
+    # Insert each item data of a section\r
+    #\r
+    for Index in range(0, len(ArchList)):\r
+        Arch = ArchList[Index]\r
+        Third = ThirdList[Index]\r
+        if Arch == '':\r
+            Arch = TAB_ARCH_COMMON\r
+\r
+        Records = RecordSet[Model]\r
+        for SectionItem in SectionItemList:\r
+            BelongsToItem, EndLine, EndColumn = -1, -1, -1\r
+            LineValue, StartLine, EndLine = SectionItem[0], SectionItem[1], SectionItem[1]\r
+            \r
+            EdkLogger.debug(4, "Parsing %s ..." %LineValue)\r
+            #\r
+            # And then parse DEFINE statement\r
+            #\r
+            if LineValue.upper().find(DataType.TAB_DEFINE.upper() + ' ') > -1:\r
+                ParseDefine(LineValue, StartLine, Table, FileID, Filename, CurrentSection, Model, Arch)\r
+                continue\r
+            \r
+            #\r
+            # At last parse other sections\r
+            #\r
+            ID = Table.Insert(Model, LineValue, Third, Third, '', '', Arch, -1, FileID, StartLine, -1, StartLine, -1, 0)\r
+            Records.append([LineValue, Arch, StartLine, ID, Third])\r
+        \r
+        if RecordSet != {}:\r
+            RecordSet[Model] = Records\r
index 08a7220..4a95ff7 100644 (file)
@@ -254,7 +254,7 @@ def CleanString(Line, CommentCharacter = DataType.TAB_COMMENT_SPLIT):
     #\r
     # remove whitespace\r
     #\r
-    Line = Line.strip();\r
+    Line = Line.strip();\r
     #\r
     # remove comments\r
     #\r
index c3f56fd..f570fd1 100644 (file)
@@ -84,7 +84,7 @@ class TableDec(Table):
     # @param EndColumn:      EndColumn of a Dec item\r
     # @param Enabled:        If this item enabled\r
     #\r
-    def Insert(self, Model, Value1, Value2, Value3, Arch, BelongsToItem, BelongsToFile, StartLine, StartColumn, EndLine, EndColumn, Enabled):\r
+    def Insert(self, Model, Value1, Value2, Value3, Value4, Value5, Arch, BelongsToItem, BelongsToFile, StartLine, StartColumn, EndLine, EndColumn, Enabled):\r
         self.ID = self.ID + 1\r
         (Value1, Value2, Value3, Arch) = ConvertToSqlString((Value1, Value2, Value3, Arch))\r
         SqlCommand = """insert into %s values(%s, %s, '%s', '%s', '%s', '%s', %s, %s, %s, %s, %s, %s, %s)""" \\r