]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Common/Misc.py
BaseTools: remove unused import thread
[mirror_edk2.git] / BaseTools / Source / Python / Common / Misc.py
index 1461d00669c20e54542f954d1bd336fe19a0a495..fd948c727a4f9b7a09360529f38533d3243f8654 100644 (file)
 ##\r
 # Import Modules\r
 #\r
+from __future__ import absolute_import\r
 import Common.LongFilePathOs as os\r
 import sys\r
 import string\r
-import thread\r
 import threading\r
 import time\r
 import re\r
@@ -30,10 +30,10 @@ from UserList import UserList
 \r
 from Common import EdkLogger as EdkLogger\r
 from Common import GlobalData as GlobalData\r
-from DataType import *\r
-from BuildToolError import *\r
+from .DataType import *\r
+from .BuildToolError import *\r
 from CommonDataClass.DataClass import *\r
-from Parsing import GetSplitValueList\r
+from .Parsing import GetSplitValueList\r
 from Common.LongFilePathSupport import OpenLongFilePath as open\r
 from Common.MultipleWorkspace import MultipleWorkspace as mws\r
 import uuid\r
@@ -42,18 +42,32 @@ import subprocess
 ## Regular expression used to find out place holders in string template\r
 gPlaceholderPattern = re.compile("\$\{([^$()\s]+)\}", re.MULTILINE | re.UNICODE)\r
 \r
+## regular expressions for map file processing\r
+startPatternGeneral = re.compile("^Start[' ']+Length[' ']+Name[' ']+Class")\r
+addressPatternGeneral = re.compile("^Address[' ']+Publics by Value[' ']+Rva\+Base")\r
+valuePatternGcc = re.compile('^([\w_\.]+) +([\da-fA-Fx]+) +([\da-fA-Fx]+)$')\r
+pcdPatternGcc = re.compile('^([\da-fA-Fx]+) +([\da-fA-Fx]+)')\r
+secReGeneral = re.compile('^([\da-fA-F]+):([\da-fA-F]+) +([\da-fA-F]+)[Hh]? +([.\w\$]+) +(\w+)', re.UNICODE)\r
+\r
 ## Dictionary used to store file time stamp for quick re-access\r
 gFileTimeStampCache = {}    # {file path : file time stamp}\r
 \r
 ## Dictionary used to store dependencies of files\r
 gDependencyDatabase = {}    # arch : {file path : [dependent files list]}\r
 \r
+#\r
+# If a module is built more than once with different PCDs or library classes\r
+# a temporary INF file with same content is created, the temporary file is removed\r
+# when build exits.\r
+#\r
+_TempInfs = []\r
+\r
 def GetVariableOffset(mapfilepath, efifilepath, varnames):\r
-    """ Parse map file to get variable offset in current EFI file \r
+    """ Parse map file to get variable offset in current EFI file\r
     @param mapfilepath    Map file absolution path\r
     @param efifilepath:   EFI binary file full path\r
     @param varnames       iteratable container whose elements are variable names to be searched\r
-    \r
+\r
     @return List whos elements are tuple with variable name and raw offset\r
     """\r
     lines = []\r
@@ -63,7 +77,7 @@ def GetVariableOffset(mapfilepath, efifilepath, varnames):
         f.close()\r
     except:\r
         return None\r
-    \r
+\r
     if len(lines) == 0: return None\r
     firstline = lines[0].strip()\r
     if (firstline.startswith("Archive member included ") and\r
@@ -76,7 +90,7 @@ def GetVariableOffset(mapfilepath, efifilepath, varnames):
 def _parseForXcode(lines, efifilepath, varnames):\r
     status = 0\r
     ret = []\r
-    for index, line in enumerate(lines):\r
+    for line in lines:\r
         line = line.strip()\r
         if status == 0 and line == "# Symbols:":\r
             status = 1\r
@@ -84,8 +98,9 @@ def _parseForXcode(lines, efifilepath, varnames):
         if status == 1 and len(line) != 0:\r
             for varname in varnames:\r
                 if varname in line:\r
+                    # cannot pregenerate this RegEx since it uses varname from varnames.\r
                     m = re.match('^([\da-fA-FxX]+)([\s\S]*)([_]*%s)$' % varname, line)\r
-                    if m != None:\r
+                    if m is not None:\r
                         ret.append((varname, m.group(1)))\r
     return ret\r
 \r
@@ -109,28 +124,28 @@ def _parseForGCC(lines, efifilepath, varnames):
 \r
         # status handler\r
         if status == 3:\r
-            m = re.match('^([\w_\.]+) +([\da-fA-Fx]+) +([\da-fA-Fx]+)$', line)\r
-            if m != None:\r
+            m = valuePatternGcc.match(line)\r
+            if m is not None:\r
                 sections.append(m.groups(0))\r
             for varname in varnames:\r
                 Str = ''\r
                 m = re.match("^.data.(%s)" % varname, line)\r
-                if m != None:\r
+                if m is not None:\r
                     m = re.match(".data.(%s)$" % varname, line)\r
-                    if m != None:\r
+                    if m is not None:\r
                         Str = lines[index + 1]\r
                     else:\r
                         Str = line[len(".data.%s" % varname):]\r
                     if Str:\r
-                        m = re.match('^([\da-fA-Fx]+) +([\da-fA-Fx]+)', Str.strip())\r
-                        if m != None:\r
-                            varoffset.append((varname, int(m.groups(0)[0], 16) , int(sections[-1][1], 16), sections[-1][0]))\r
+                        m = pcdPatternGcc.match(Str.strip())\r
+                        if m is not None:\r
+                            varoffset.append((varname, int(m.groups(0)[0], 16), int(sections[-1][1], 16), sections[-1][0]))\r
 \r
     if not varoffset:\r
         return []\r
     # get section information from efi file\r
     efisecs = PeImageClass(efifilepath).SectionHeaderList\r
-    if efisecs == None or len(efisecs) == 0:\r
+    if efisecs is None or len(efisecs) == 0:\r
         return []\r
     #redirection\r
     redirection = 0\r
@@ -150,35 +165,35 @@ def _parseGeneral(lines, efifilepath, varnames):
     status = 0    #0 - beginning of file; 1 - PE section definition; 2 - symbol table\r
     secs  = []    # key = section name\r
     varoffset = []\r
-    secRe = re.compile('^([\da-fA-F]+):([\da-fA-F]+) +([\da-fA-F]+)[Hh]? +([.\w\$]+) +(\w+)', re.UNICODE)\r
     symRe = re.compile('^([\da-fA-F]+):([\da-fA-F]+) +([\.:\\\\\w\?@\$]+) +([\da-fA-F]+)', re.UNICODE)\r
 \r
     for line in lines:\r
         line = line.strip()\r
-        if re.match("^Start[' ']+Length[' ']+Name[' ']+Class", line):\r
+        if startPatternGeneral.match(line):\r
             status = 1\r
             continue\r
-        if re.match("^Address[' ']+Publics by Value[' ']+Rva\+Base", line):\r
+        if addressPatternGeneral.match(line):\r
             status = 2\r
             continue\r
-        if re.match("^entry point at", line):\r
+        if line.startswith("entry point at"):\r
             status = 3\r
-            continue        \r
+            continue\r
         if status == 1 and len(line) != 0:\r
-            m =  secRe.match(line)\r
-            assert m != None, "Fail to parse the section in map file , line is %s" % line\r
+            m =  secReGeneral.match(line)\r
+            assert m is not None, "Fail to parse the section in map file , line is %s" % line\r
             sec_no, sec_start, sec_length, sec_name, sec_class = m.groups(0)\r
             secs.append([int(sec_no, 16), int(sec_start, 16), int(sec_length, 16), sec_name, sec_class])\r
         if status == 2 and len(line) != 0:\r
             for varname in varnames:\r
                 m = symRe.match(line)\r
-                assert m != None, "Fail to parse the symbol in map file, line is %s" % line\r
+                assert m is not None, "Fail to parse the symbol in map file, line is %s" % line\r
                 sec_no, sym_offset, sym_name, vir_addr = m.groups(0)\r
                 sec_no     = int(sec_no,     16)\r
                 sym_offset = int(sym_offset, 16)\r
                 vir_addr   = int(vir_addr,   16)\r
+                # cannot pregenerate this RegEx since it uses varname from varnames.\r
                 m2 = re.match('^[_]*(%s)' % varname, sym_name)\r
-                if m2 != None:\r
+                if m2 is not None:\r
                     # fond a binary pcd entry in map file\r
                     for sec in secs:\r
                         if sec[0] == sec_no and (sym_offset >= sec[1] and sym_offset < sec[1] + sec[2]):\r
@@ -188,7 +203,7 @@ def _parseGeneral(lines, efifilepath, varnames):
 \r
     # get section information from efi file\r
     efisecs = PeImageClass(efifilepath).SectionHeaderList\r
-    if efisecs == None or len(efisecs) == 0:\r
+    if efisecs is None or len(efisecs) == 0:\r
         return []\r
 \r
     ret = []\r
@@ -242,7 +257,7 @@ def ProcessDuplicatedInf(Path, BaseName, Workspace):
     #\r
     # A temporary INF is copied to database path which must have write permission\r
     # The temporary will be removed at the end of build\r
-    # In case of name conflict, the file name is \r
+    # In case of name conflict, the file name is\r
     # FILE_GUIDBaseName (0D1B936F-68F3-4589-AFCC-FB8B7AEBC836module.inf)\r
     #\r
     TempFullPath = os.path.join(DbDir,\r
@@ -253,7 +268,7 @@ def ProcessDuplicatedInf(Path, BaseName, Workspace):
     #\r
     # To build same module more than once, the module path with FILE_GUID overridden has\r
     # the file name FILE_GUIDmodule.inf, but the relative path (self.MetaFile.File) is the real path\r
-    # in DSC which is used as relative path by C files and other files in INF. \r
+    # in DSC which is used as relative path by C files and other files in INF.\r
     # A trick was used: all module paths are PathClass instances, after the initialization\r
     # of PathClass, the PathClass.Path is overridden by the temporary INF path.\r
     #\r
@@ -272,47 +287,21 @@ def ProcessDuplicatedInf(Path, BaseName, Workspace):
     # If file exists, compare contents\r
     #\r
     if os.path.exists(TempFullPath):\r
-        with open(str(Path), 'rb') as f1: Src = f1.read()\r
-        with open(TempFullPath, 'rb') as f2: Dst = f2.read()\r
-        if Src == Dst:\r
-            return RtPath\r
-    GlobalData.gTempInfs.append(TempFullPath)\r
+        with open(str(Path), 'rb') as f1, open(TempFullPath, 'rb') as f2:\r
+            if f1.read() == f2.read():\r
+                return RtPath\r
+    _TempInfs.append(TempFullPath)\r
     shutil.copy2(str(Path), TempFullPath)\r
     return RtPath\r
 \r
-## Remove temporary created INFs whose paths were saved in gTempInfs\r
+## Remove temporary created INFs whose paths were saved in _TempInfs\r
 #\r
 def ClearDuplicatedInf():\r
-    for File in GlobalData.gTempInfs:\r
+    while _TempInfs:\r
+        File = _TempInfs.pop()\r
         if os.path.exists(File):\r
             os.remove(File)\r
 \r
-## callback routine for processing variable option\r
-#\r
-# This function can be used to process variable number of option values. The\r
-# typical usage of it is specify architecure list on command line.\r
-# (e.g. <tool> -a IA32 X64 IPF)\r
-#\r
-# @param  Option        Standard callback function parameter\r
-# @param  OptionString  Standard callback function parameter\r
-# @param  Value         Standard callback function parameter\r
-# @param  Parser        Standard callback function parameter\r
-#\r
-# @retval\r
-#\r
-def ProcessVariableArgument(Option, OptionString, Value, Parser):\r
-    assert Value is None\r
-    Value = []\r
-    RawArgs = Parser.rargs\r
-    while RawArgs:\r
-        Arg = RawArgs[0]\r
-        if (Arg[:2] == "--" and len(Arg) > 2) or \\r
-           (Arg[:1] == "-" and len(Arg) > 1 and Arg[1] != "-"):\r
-            break\r
-        Value.append(Arg)\r
-        del RawArgs[0]\r
-    setattr(Parser.values, Option.dest, Value)\r
-\r
 ## Convert GUID string in xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx style to C structure style\r
 #\r
 #   @param      Guid    The GUID string\r
@@ -423,7 +412,7 @@ def GuidStructureStringToGuidValueName(GuidValue):
 #   @param      Directory   The directory name\r
 #\r
 def CreateDirectory(Directory):\r
-    if Directory == None or Directory.strip() == "":\r
+    if Directory is None or Directory.strip() == "":\r
         return True\r
     try:\r
         if not os.access(Directory, os.F_OK):\r
@@ -437,7 +426,7 @@ def CreateDirectory(Directory):
 #   @param      Directory   The directory name\r
 #\r
 def RemoveDirectory(Directory, Recursively=False):\r
-    if Directory == None or Directory.strip() == "" or not os.path.exists(Directory):\r
+    if Directory is None or Directory.strip() == "" or not os.path.exists(Directory):\r
         return\r
     if Recursively:\r
         CurrentDirectory = os.getcwd()\r
@@ -450,32 +439,6 @@ def RemoveDirectory(Directory, Recursively=False):
         os.chdir(CurrentDirectory)\r
     os.rmdir(Directory)\r
 \r
-## Check if given file is changed or not\r
-#\r
-#  This method is used to check if a file is changed or not between two build\r
-#  actions. It makes use a cache to store files timestamp.\r
-#\r
-#   @param      File    The path of file\r
-#\r
-#   @retval     True    If the given file is changed, doesn't exist, or can't be\r
-#                       found in timestamp cache\r
-#   @retval     False   If the given file is changed\r
-#\r
-def IsChanged(File):\r
-    if not os.path.exists(File):\r
-        return True\r
-\r
-    FileState = os.stat(File)\r
-    TimeStamp = FileState[-2]\r
-\r
-    if File in gFileTimeStampCache and TimeStamp == gFileTimeStampCache[File]:\r
-        FileChanged = False\r
-    else:\r
-        FileChanged = True\r
-        gFileTimeStampCache[File] = TimeStamp\r
-\r
-    return FileChanged\r
-\r
 ## Store content in file\r
 #\r
 #  This method is used to save file only when its content is changed. This is\r
@@ -511,7 +474,7 @@ def SaveFileOnChange(File, Content, IsBinaryFile=True):
     try:\r
         if GlobalData.gIsWindows:\r
             try:\r
-                from PyUtility import SaveFileToDisk\r
+                from .PyUtility import SaveFileToDisk\r
                 if not SaveFileToDisk(File, Content):\r
                     EdkLogger.error(None, FILE_CREATE_FAILURE, ExtraData=File)\r
             except:\r
@@ -522,7 +485,7 @@ def SaveFileOnChange(File, Content, IsBinaryFile=True):
             Fd = open(File, "wb")\r
             Fd.write(Content)\r
             Fd.close()\r
-    except IOError, X:\r
+    except IOError as X:\r
         EdkLogger.error(None, FILE_CREATE_FAILURE, ExtraData='IOError %s' % X)\r
 \r
     return True\r
@@ -540,7 +503,7 @@ def DataDump(Data, File):
     except:\r
         EdkLogger.error("", FILE_OPEN_FAILURE, ExtraData=File, RaiseError=False)\r
     finally:\r
-        if Fd != None:\r
+        if Fd is not None:\r
             Fd.close()\r
 \r
 ## Restore a Python object from a file\r
@@ -556,11 +519,11 @@ def DataRestore(File):
     try:\r
         Fd = open(File, 'rb')\r
         Data = cPickle.load(Fd)\r
-    except Exception, e:\r
+    except Exception as e:\r
         EdkLogger.verbose("Failed to load [%s]\n\t%s" % (File, str(e)))\r
         Data = None\r
     finally:\r
-        if Fd != None:\r
+        if Fd is not None:\r
             Fd.close()\r
     return Data\r
 \r
@@ -635,47 +598,6 @@ class DirCache:
             return os.path.join(self._Root, self._UPPER_CACHE_[UpperPath])\r
         return None\r
 \r
-## Get all files of a directory\r
-#\r
-# @param Root:       Root dir\r
-# @param SkipList :  The files need be skipped\r
-#\r
-# @retval  A list of all files\r
-#\r
-def GetFiles(Root, SkipList=None, FullPath=True):\r
-    OriPath = Root\r
-    FileList = []\r
-    for Root, Dirs, Files in os.walk(Root):\r
-        if SkipList:\r
-            for Item in SkipList:\r
-                if Item in Dirs:\r
-                    Dirs.remove(Item)\r
-\r
-        for File in Files:\r
-            File = os.path.normpath(os.path.join(Root, File))\r
-            if not FullPath:\r
-                File = File[len(OriPath) + 1:]\r
-            FileList.append(File)\r
-\r
-    return FileList\r
-\r
-## Check if gvien file exists or not\r
-#\r
-#   @param      File    File name or path to be checked\r
-#   @param      Dir     The directory the file is relative to\r
-#\r
-#   @retval     True    if file exists\r
-#   @retval     False   if file doesn't exists\r
-#\r
-def ValidFile(File, Ext=None):\r
-    if Ext != None:\r
-        Dummy, FileExt = os.path.splitext(File)\r
-        if FileExt.lower() != Ext.lower():\r
-            return False\r
-    if not os.path.exists(File):\r
-        return False\r
-    return True\r
-\r
 def RealPath(File, Dir='', OverrideDir=''):\r
     NewFile = os.path.normpath(os.path.join(Dir, File))\r
     NewFile = GlobalData.gAllFiles[NewFile]\r
@@ -710,115 +632,6 @@ def RealPath2(File, Dir='', OverrideDir=''):
 \r
     return None, None\r
 \r
-## Check if gvien file exists or not\r
-#\r
-#\r
-def ValidFile2(AllFiles, File, Ext=None, Workspace='', EfiSource='', EdkSource='', Dir='.', OverrideDir=''):\r
-    NewFile = File\r
-    if Ext != None:\r
-        Dummy, FileExt = os.path.splitext(File)\r
-        if FileExt.lower() != Ext.lower():\r
-            return False, File\r
-\r
-    # Replace the Edk macros\r
-    if OverrideDir != '' and OverrideDir != None:\r
-        if OverrideDir.find('$(EFI_SOURCE)') > -1:\r
-            OverrideDir = OverrideDir.replace('$(EFI_SOURCE)', EfiSource)\r
-        if OverrideDir.find('$(EDK_SOURCE)') > -1:\r
-            OverrideDir = OverrideDir.replace('$(EDK_SOURCE)', EdkSource)\r
-\r
-    # Replace the default dir to current dir\r
-    if Dir == '.':\r
-        Dir = os.getcwd()\r
-        Dir = Dir[len(Workspace) + 1:]\r
-\r
-    # First check if File has Edk definition itself\r
-    if File.find('$(EFI_SOURCE)') > -1 or File.find('$(EDK_SOURCE)') > -1:\r
-        NewFile = File.replace('$(EFI_SOURCE)', EfiSource)\r
-        NewFile = NewFile.replace('$(EDK_SOURCE)', EdkSource)\r
-        NewFile = AllFiles[os.path.normpath(NewFile)]\r
-        if NewFile != None:\r
-            return True, NewFile\r
-\r
-    # Second check the path with override value\r
-    if OverrideDir != '' and OverrideDir != None:\r
-        NewFile = AllFiles[os.path.normpath(os.path.join(OverrideDir, File))]\r
-        if NewFile != None:\r
-            return True, NewFile\r
-\r
-    # Last check the path with normal definitions\r
-    File = os.path.join(Dir, File)\r
-    NewFile = AllFiles[os.path.normpath(File)]\r
-    if NewFile != None:\r
-        return True, NewFile\r
-\r
-    return False, File\r
-\r
-## Check if gvien file exists or not\r
-#\r
-#\r
-def ValidFile3(AllFiles, File, Workspace='', EfiSource='', EdkSource='', Dir='.', OverrideDir=''):\r
-    # Replace the Edk macros\r
-    if OverrideDir != '' and OverrideDir != None:\r
-        if OverrideDir.find('$(EFI_SOURCE)') > -1:\r
-            OverrideDir = OverrideDir.replace('$(EFI_SOURCE)', EfiSource)\r
-        if OverrideDir.find('$(EDK_SOURCE)') > -1:\r
-            OverrideDir = OverrideDir.replace('$(EDK_SOURCE)', EdkSource)\r
-\r
-    # Replace the default dir to current dir\r
-    # Dir is current module dir related to workspace\r
-    if Dir == '.':\r
-        Dir = os.getcwd()\r
-        Dir = Dir[len(Workspace) + 1:]\r
-\r
-    NewFile = File\r
-    RelaPath = AllFiles[os.path.normpath(Dir)]\r
-    NewRelaPath = RelaPath\r
-\r
-    while(True):\r
-        # First check if File has Edk definition itself\r
-        if File.find('$(EFI_SOURCE)') > -1 or File.find('$(EDK_SOURCE)') > -1:\r
-            File = File.replace('$(EFI_SOURCE)', EfiSource)\r
-            File = File.replace('$(EDK_SOURCE)', EdkSource)\r
-            NewFile = AllFiles[os.path.normpath(File)]\r
-            if NewFile != None:\r
-                NewRelaPath = os.path.dirname(NewFile)\r
-                File = os.path.basename(NewFile)\r
-                #NewRelaPath = NewFile[:len(NewFile) - len(File.replace("..\\", '').replace("../", '')) - 1]\r
-                break\r
-\r
-        # Second check the path with override value\r
-        if OverrideDir != '' and OverrideDir != None:\r
-            NewFile = AllFiles[os.path.normpath(os.path.join(OverrideDir, File))]\r
-            if NewFile != None:\r
-                #NewRelaPath = os.path.dirname(NewFile)\r
-                NewRelaPath = NewFile[:len(NewFile) - len(File.replace("..\\", '').replace("../", '')) - 1]\r
-                break\r
-\r
-        # Last check the path with normal definitions\r
-        NewFile = AllFiles[os.path.normpath(os.path.join(Dir, File))]\r
-        if NewFile != None:\r
-            break\r
-\r
-        # No file found\r
-        break\r
-\r
-    return NewRelaPath, RelaPath, File\r
-\r
-\r
-def GetRelPath(Path1, Path2):\r
-    FileName = os.path.basename(Path2)\r
-    L1 = os.path.normpath(Path1).split(os.path.normpath('/'))\r
-    L2 = os.path.normpath(Path2).split(os.path.normpath('/'))\r
-    for Index in range(0, len(L1)):\r
-        if L1[Index] != L2[Index]:\r
-            FileName = '../' * (len(L1) - Index)\r
-            for Index2 in range(Index, len(L2)):\r
-                FileName = os.path.join(FileName, L2[Index2])\r
-            break\r
-    return os.path.normpath(FileName)\r
-\r
-\r
 ## Get GUID value from given packages\r
 #\r
 #   @param      CName           The CName of the GUID\r
@@ -833,7 +646,7 @@ def GuidValue(CName, PackageList, Inffile = None):
         GuidKeys = P.Guids.keys()\r
         if Inffile and P._PrivateGuids:\r
             if not Inffile.startswith(P.MetaFile.Dir):\r
-                GuidKeys = (dict.fromkeys(x for x in P.Guids if x not in P._PrivateGuids)).keys()\r
+                GuidKeys = [x for x in P.Guids if x not in P._PrivateGuids]\r
         if CName in GuidKeys:\r
             return P.Guids[CName]\r
     return None\r
@@ -852,7 +665,7 @@ def ProtocolValue(CName, PackageList, Inffile = None):
         ProtocolKeys = P.Protocols.keys()\r
         if Inffile and P._PrivateProtocols:\r
             if not Inffile.startswith(P.MetaFile.Dir):\r
-                ProtocolKeys = (dict.fromkeys(x for x in P.Protocols if x not in P._PrivateProtocols)).keys()\r
+                ProtocolKeys = [x for x in P.Protocols if x not in P._PrivateProtocols]\r
         if CName in ProtocolKeys:\r
             return P.Protocols[CName]\r
     return None\r
@@ -871,7 +684,7 @@ def PpiValue(CName, PackageList, Inffile = None):
         PpiKeys = P.Ppis.keys()\r
         if Inffile and P._PrivatePpis:\r
             if not Inffile.startswith(P.MetaFile.Dir):\r
-                PpiKeys = (dict.fromkeys(x for x in P.Ppis if x not in P._PrivatePpis)).keys()\r
+                PpiKeys = [x for x in P.Ppis if x not in P._PrivatePpis]\r
         if CName in PpiKeys:\r
             return P.Ppis[CName]\r
     return None\r
@@ -1027,7 +840,7 @@ class TemplateString(object):
     def Append(self, AppendString, Dictionary=None):\r
         if Dictionary:\r
             SectionList = self._Parse(AppendString)\r
-            self.String += "".join([S.Instantiate(Dictionary) for S in SectionList])\r
+            self.String += "".join(S.Instantiate(Dictionary) for S in SectionList)\r
         else:\r
             self.String += AppendString\r
 \r
@@ -1038,7 +851,7 @@ class TemplateString(object):
     #   @retval     str             The string replaced with placeholder values\r
     #\r
     def Replace(self, Dictionary=None):\r
-        return "".join([S.Instantiate(Dictionary) for S in self._TemplateSectionList])\r
+        return "".join(S.Instantiate(Dictionary) for S in self._TemplateSectionList)\r
 \r
 ## Progress indicator class\r
 #\r
@@ -1062,7 +875,7 @@ class Progressor:
         self.CodaMessage = CloseMessage\r
         self.ProgressChar = ProgressChar\r
         self.Interval = Interval\r
-        if Progressor._StopFlag == None:\r
+        if Progressor._StopFlag is None:\r
             Progressor._StopFlag = threading.Event()\r
 \r
     ## Start to print progress charater\r
@@ -1070,10 +883,10 @@ class Progressor:
     #   @param      OpenMessage     The string printed before progress charaters\r
     #\r
     def Start(self, OpenMessage=None):\r
-        if OpenMessage != None:\r
+        if OpenMessage is not None:\r
             self.PromptMessage = OpenMessage\r
         Progressor._StopFlag.clear()\r
-        if Progressor._ProgressThread == None:\r
+        if Progressor._ProgressThread is None:\r
             Progressor._ProgressThread = threading.Thread(target=self._ProgressThreadEntry)\r
             Progressor._ProgressThread.setDaemon(False)\r
             Progressor._ProgressThread.start()\r
@@ -1084,7 +897,7 @@ class Progressor:
     #\r
     def Stop(self, CloseMessage=None):\r
         OriginalCodaMessage = self.CodaMessage\r
-        if CloseMessage != None:\r
+        if CloseMessage is not None:\r
             self.CodaMessage = CloseMessage\r
         self.Abort()\r
         self.CodaMessage = OriginalCodaMessage\r
@@ -1107,9 +920,9 @@ class Progressor:
     ## Abort the progress display\r
     @staticmethod\r
     def Abort():\r
-        if Progressor._StopFlag != None:\r
+        if Progressor._StopFlag is not None:\r
             Progressor._StopFlag.set()\r
-        if Progressor._ProgressThread != None:\r
+        if Progressor._ProgressThread is not None:\r
             Progressor._ProgressThread.join()\r
             Progressor._ProgressThread = None\r
 \r
@@ -1228,7 +1041,7 @@ class sdict(IterableUserDict):
         return key, value\r
 \r
     def update(self, dict=None, **kwargs):\r
-        if dict != None:\r
+        if dict is not None:\r
             for k, v in dict.items():\r
                 self[k] = v\r
         if len(kwargs):\r
@@ -1301,7 +1114,7 @@ class tdict:
             if self._Level_ > 1:\r
                 RestKeys = [self._Wildcard for i in range(0, self._Level_ - 1)]\r
 \r
-        if FirstKey == None or str(FirstKey).upper() in self._ValidWildcardList:\r
+        if FirstKey is None or str(FirstKey).upper() in self._ValidWildcardList:\r
             FirstKey = self._Wildcard\r
 \r
         if self._Single_:\r
@@ -1316,24 +1129,24 @@ class tdict:
             if FirstKey == self._Wildcard:\r
                 if FirstKey in self.data:\r
                     Value = self.data[FirstKey][RestKeys]\r
-                if Value == None:\r
+                if Value is None:\r
                     for Key in self.data:\r
                         Value = self.data[Key][RestKeys]\r
-                        if Value != None: break\r
+                        if Value is not None: break\r
             else:\r
                 if FirstKey in self.data:\r
                     Value = self.data[FirstKey][RestKeys]\r
-                if Value == None and self._Wildcard in self.data:\r
+                if Value is None and self._Wildcard in self.data:\r
                     #print "Value=None"\r
                     Value = self.data[self._Wildcard][RestKeys]\r
         else:\r
             if FirstKey == self._Wildcard:\r
                 if FirstKey in self.data:\r
                     Value = self.data[FirstKey]\r
-                if Value == None:\r
+                if Value is None:\r
                     for Key in self.data:\r
                         Value = self.data[Key]\r
-                        if Value != None: break\r
+                        if Value is not None: break\r
             else:\r
                 if FirstKey in self.data:\r
                     Value = self.data[FirstKey]\r
@@ -1411,53 +1224,44 @@ class tdict:
                 keys |= self.data[Key].GetKeys(KeyIndex - 1)\r
             return keys\r
 \r
-## Boolean chain list\r
-#\r
-class Blist(UserList):\r
-    def __init__(self, initlist=None):\r
-        UserList.__init__(self, initlist)\r
-    def __setitem__(self, i, item):\r
-        if item not in [True, False]:\r
-            if item == 0:\r
-                item = False\r
-            else:\r
-                item = True\r
-        self.data[i] = item\r
-    def _GetResult(self):\r
-        Value = True\r
-        for item in self.data:\r
-            Value &= item\r
-        return Value\r
-    Result = property(_GetResult)\r
-\r
-def ParseConsoleLog(Filename):\r
-    Opr = open(os.path.normpath(Filename), 'r')\r
-    Opw = open(os.path.normpath(Filename + '.New'), 'w+')\r
-    for Line in Opr.readlines():\r
-        if Line.find('.efi') > -1:\r
-            Line = Line[Line.rfind(' ') : Line.rfind('.efi')].strip()\r
-            Opw.write('%s\n' % Line)\r
-\r
-    Opr.close()\r
-    Opw.close()\r
+def IsFieldValueAnArray (Value):\r
+    Value = Value.strip()\r
+    if Value.startswith(TAB_GUID) and Value.endswith(')'):\r
+        return True\r
+    if Value.startswith('L"') and Value.endswith('"')  and len(list(Value[2:-1])) > 1:\r
+        return True\r
+    if Value[0] == '"' and Value[-1] == '"' and len(list(Value[1:-1])) > 1:\r
+        return True\r
+    if Value[0] == '{' and Value[-1] == '}':\r
+        return True\r
+    if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:\r
+        return True\r
+    if Value[0] == "'" and Value[-1] == "'" and len(list(Value[1:-1])) > 1:\r
+        return True\r
+    return False\r
 \r
 def AnalyzePcdExpression(Setting):\r
     Setting = Setting.strip()\r
-    # There might be escaped quote in a string: \", \\\"\r
-    Data = Setting.replace('\\\\', '//').replace('\\\"', '\\\'')\r
+    # There might be escaped quote in a string: \", \\\" , \', \\\'\r
+    Data = Setting\r
     # There might be '|' in string and in ( ... | ... ), replace it with '-'\r
     NewStr = ''\r
-    InStr = False\r
+    InSingleQuoteStr = False\r
+    InDoubleQuoteStr = False\r
     Pair = 0\r
-    for ch in Data:\r
-        if ch == '"':\r
-            InStr = not InStr\r
-        elif ch == '(' and not InStr:\r
+    for Index, ch in enumerate(Data):\r
+        if ch == '"' and not InSingleQuoteStr:\r
+            if Data[Index - 1] != '\\':\r
+                InDoubleQuoteStr = not InDoubleQuoteStr\r
+        elif ch == "'" and not InDoubleQuoteStr:\r
+            if Data[Index - 1] != '\\':\r
+                InSingleQuoteStr = not InSingleQuoteStr\r
+        elif ch == '(' and not (InSingleQuoteStr or InDoubleQuoteStr):\r
             Pair += 1\r
-        elif ch == ')' and not InStr:\r
+        elif ch == ')' and not (InSingleQuoteStr or InDoubleQuoteStr):\r
             Pair -= 1\r
 \r
-        if (Pair > 0 or InStr) and ch == TAB_VALUE_SPLIT:\r
+        if (Pair > 0 or InSingleQuoteStr or InDoubleQuoteStr) and ch == TAB_VALUE_SPLIT:\r
             NewStr += '-'\r
         else:\r
             NewStr += ch\r
@@ -1474,27 +1278,14 @@ def AnalyzePcdExpression(Setting):
     return FieldList\r
 \r
 def ParseDevPathValue (Value):\r
-    DevPathList = [ "Path","HardwarePath","Pci","PcCard","MemoryMapped","VenHw","Ctrl","BMC","AcpiPath","Acpi","PciRoot",\r
-                    "PcieRoot","Floppy","Keyboard","Serial","ParallelPort","AcpiEx","AcpiExp","AcpiAdr","Msg","Ata","Scsi",\r
-                    "Fibre","FibreEx","I1394","USB","I2O","Infiniband","VenMsg","VenPcAnsi","VenVt100","VenVt100Plus",\r
-                    "VenUtf8","UartFlowCtrl","SAS","SasEx","NVMe","UFS","SD","eMMC","DebugPort","MAC","IPv4","IPv6","Uart",\r
-                    "UsbClass","UsbAudio","UsbCDCControl","UsbHID","UsbImage","UsbPrinter","UsbMassStorage","UsbHub",\r
-                    "UsbCDCData","UsbSmartCard","UsbVideo","UsbDiagnostic","UsbWireless","UsbDeviceFirmwareUpdate",\r
-                    "UsbIrdaBridge","UsbTestAndMeasurement","UsbWwid","Unit","iSCSI","Vlan","Uri","Bluetooth","Wi-Fi",\r
-                    "MediaPath","HD","CDROM","VenMedia","Media","Fv","FvFile","Offset","RamDisk","VirtualDisk","VirtualCD",\r
-                    "PersistentVirtualDisk","PersistentVirtualCD","BbsPath","BBS","Sata" ]\r
     if '\\' in Value:\r
         Value.replace('\\', '/').replace(' ', '')\r
-    for Item in Value.split('/'):\r
-        Key = Item.strip().split('(')[0]\r
-        if Key not in DevPathList:\r
-            pass\r
 \r
     Cmd = 'DevicePath ' + '"' + Value + '"'\r
     try:\r
         p = subprocess.Popen(Cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)\r
         out, err = p.communicate()\r
-    except Exception, X:\r
+    except Exception as X:\r
         raise BadExpression("DevicePath: %s" % (str(X)) )\r
     finally:\r
         subprocess._cleanup()\r
@@ -1507,32 +1298,32 @@ def ParseDevPathValue (Value):
     return '{' + out + '}', Size\r
 \r
 def ParseFieldValue (Value):\r
-    if type(Value) == type(0):\r
+    if isinstance(Value, type(0)):\r
         return Value, (Value.bit_length() + 7) / 8\r
-    if type(Value) <> type(''):\r
+    if not isinstance(Value, type('')):\r
         raise BadExpression('Type %s is %s' %(Value, type(Value)))\r
     Value = Value.strip()\r
-    if Value.startswith('UINT8') and Value.endswith(')'):\r
+    if Value.startswith(TAB_UINT8) and Value.endswith(')'):\r
         Value, Size = ParseFieldValue(Value.split('(', 1)[1][:-1])\r
         if Size > 1:\r
             raise BadExpression('Value (%s) Size larger than %d' %(Value, Size))\r
         return Value, 1\r
-    if Value.startswith('UINT16') and Value.endswith(')'):\r
+    if Value.startswith(TAB_UINT16) and Value.endswith(')'):\r
         Value, Size = ParseFieldValue(Value.split('(', 1)[1][:-1])\r
         if Size > 2:\r
             raise BadExpression('Value (%s) Size larger than %d' %(Value, Size))\r
         return Value, 2\r
-    if Value.startswith('UINT32') and Value.endswith(')'):\r
+    if Value.startswith(TAB_UINT32) and Value.endswith(')'):\r
         Value, Size = ParseFieldValue(Value.split('(', 1)[1][:-1])\r
         if Size > 4:\r
             raise BadExpression('Value (%s) Size larger than %d' %(Value, Size))\r
         return Value, 4\r
-    if Value.startswith('UINT64') and Value.endswith(')'):\r
+    if Value.startswith(TAB_UINT64) and Value.endswith(')'):\r
         Value, Size = ParseFieldValue(Value.split('(', 1)[1][:-1])\r
         if Size > 8:\r
             raise BadExpression('Value (%s) Size larger than %d' % (Value, Size))\r
         return Value, 8\r
-    if Value.startswith('GUID') and Value.endswith(')'):\r
+    if Value.startswith(TAB_GUID) and Value.endswith(')'):\r
         Value = Value.split('(', 1)[1][:-1].strip()\r
         if Value[0] == '{' and Value[-1] == '}':\r
             TmpValue = GuidStructureStringToGuidString(Value)\r
@@ -1543,13 +1334,19 @@ def ParseFieldValue (Value):
             Value = Value[1:-1]\r
         try:\r
             Value = "'" + uuid.UUID(Value).get_bytes_le() + "'"\r
-        except ValueError, Message:\r
-            raise BadExpression('%s' % Message)\r
+        except ValueError as Message:\r
+            raise BadExpression(Message)\r
         Value, Size = ParseFieldValue(Value)\r
         return Value, 16\r
     if Value.startswith('L"') and Value.endswith('"'):\r
         # Unicode String\r
-        List = list(Value[2:-1])\r
+        # translate escape character\r
+        Value = Value[1:]\r
+        try:\r
+            Value = eval(Value)\r
+        except:\r
+            Value = Value[1:-1]\r
+        List = list(Value)\r
         List.reverse()\r
         Value = 0\r
         for Char in List:\r
@@ -1557,7 +1354,12 @@ def ParseFieldValue (Value):
         return Value, (len(List) + 1) * 2\r
     if Value.startswith('"') and Value.endswith('"'):\r
         # ASCII String\r
-        List = list(Value[1:-1])\r
+        # translate escape character\r
+        try:\r
+            Value = eval(Value)\r
+        except:\r
+            Value = Value[1:-1]\r
+        List = list(Value)\r
         List.reverse()\r
         Value = 0\r
         for Char in List:\r
@@ -1565,7 +1367,13 @@ def ParseFieldValue (Value):
         return Value, len(List) + 1\r
     if Value.startswith("L'") and Value.endswith("'"):\r
         # Unicode Character Constant\r
-        List = list(Value[2:-1])\r
+        # translate escape character\r
+        Value = Value[1:]\r
+        try:\r
+            Value = eval(Value)\r
+        except:\r
+            Value = Value[1:-1]\r
+        List = list(Value)\r
         if len(List) == 0:\r
             raise BadExpression('Length %s is %s' % (Value, len(List)))\r
         List.reverse()\r
@@ -1575,7 +1383,12 @@ def ParseFieldValue (Value):
         return Value, len(List) * 2\r
     if Value.startswith("'") and Value.endswith("'"):\r
         # Character constant\r
-        List = list(Value[1:-1])\r
+        # translate escape character\r
+        try:\r
+            Value = eval(Value)\r
+        except:\r
+            Value = Value[1:-1]\r
+        List = list(Value)\r
         if len(List) == 0:\r
             raise BadExpression('Length %s is %s' % (Value, len(List)))\r
         List.reverse()\r
@@ -1619,7 +1432,7 @@ def ParseFieldValue (Value):
 ## AnalyzeDscPcd\r
 #\r
 #  Analyze DSC PCD value, since there is no data type info in DSC\r
-#  This fuction is used to match functions (AnalyzePcdData, AnalyzeHiiPcdData, AnalyzeVpdPcdData) used for retrieving PCD value from database\r
+#  This fuction is used to match functions (AnalyzePcdData) used for retrieving PCD value from database\r
 #  1. Feature flag: TokenSpace.PcdCName|PcdValue\r
 #  2. Fix and Patch:TokenSpace.PcdCName|PcdValue[|MaxSize]\r
 #  3. Dynamic default:\r
@@ -1663,7 +1476,7 @@ def AnalyzeDscPcd(Setting, PcdType, DataType=''):
 #         Value, Size = ParseFieldValue(Value)\r
         if Size:\r
             try:\r
-                int(Size,16) if Size.upper().startswith("0X") else int(Size)\r
+                int(Size, 16) if Size.upper().startswith("0X") else int(Size)\r
             except:\r
                 IsValid = False\r
                 Size = -1\r
@@ -1677,14 +1490,6 @@ def AnalyzeDscPcd(Setting, PcdType, DataType=''):
             Type = DataType\r
         if len(FieldList) > 2:\r
             Size = FieldList[2]\r
-        else:\r
-            if Type == 'VOID*':\r
-                if Value.startswith("L"):\r
-                    Size = str((len(Value)- 3 + 1) * 2)\r
-                elif Value.startswith("{"):\r
-                    Size = str(len(Value.split(",")))\r
-                else:\r
-                    Size = str(len(Value) -2 + 1 )\r
         if DataType == "":\r
             IsValid = (len(FieldList) <= 1)\r
         else:\r
@@ -1692,7 +1497,7 @@ def AnalyzeDscPcd(Setting, PcdType, DataType=''):
 \r
         if Size:\r
             try:\r
-                int(Size,16) if Size.upper().startswith("0X") else int(Size)\r
+                int(Size, 16) if Size.upper().startswith("0X") else int(Size)\r
             except:\r
                 IsValid = False\r
                 Size = -1\r
@@ -1700,7 +1505,7 @@ def AnalyzeDscPcd(Setting, PcdType, DataType=''):
     elif PcdType in (MODEL_PCD_DYNAMIC_VPD, MODEL_PCD_DYNAMIC_EX_VPD):\r
         VpdOffset = FieldList[0]\r
         Value = Size = ''\r
-        if not DataType == 'VOID*':\r
+        if not DataType == TAB_VOID:\r
             if len(FieldList) > 1:\r
                 Value = FieldList[1]\r
         else:\r
@@ -1714,7 +1519,7 @@ def AnalyzeDscPcd(Setting, PcdType, DataType=''):
             IsValid = (len(FieldList) <= 3)\r
         if Size:\r
             try:\r
-                int(Size,16) if Size.upper().startswith("0X") else int(Size)\r
+                int(Size, 16) if Size.upper().startswith("0X") else int(Size)\r
             except:\r
                 IsValid = False\r
                 Size = -1\r
@@ -1740,81 +1545,35 @@ def AnalyzeDscPcd(Setting, PcdType, DataType=''):
 #  Used to avoid split issue while the value string contain "|" character\r
 #\r
 #  @param[in] Setting:  A String contain value/datum type/token number information;\r
-#  \r
-#  @retval   ValueList: A List contain value, datum type and toke number. \r
+#\r
+#  @retval   ValueList: A List contain value, datum type and toke number.\r
 #\r
 def AnalyzePcdData(Setting):\r
     ValueList = ['', '', '']\r
 \r
     ValueRe = re.compile(r'^\s*L?\".*\|.*\"')\r
     PtrValue = ValueRe.findall(Setting)\r
-    \r
+\r
     ValueUpdateFlag = False\r
-    \r
+\r
     if len(PtrValue) >= 1:\r
         Setting = re.sub(ValueRe, '', Setting)\r
         ValueUpdateFlag = True\r
 \r
     TokenList = Setting.split(TAB_VALUE_SPLIT)\r
     ValueList[0:len(TokenList)] = TokenList\r
-    \r
+\r
     if ValueUpdateFlag:\r
         ValueList[0] = PtrValue[0]\r
-        \r
-    return ValueList   \r
\r
-## AnalyzeHiiPcdData\r
-#\r
-#  Analyze the pcd Value, variable name, variable Guid and variable offset.\r
-#  Used to avoid split issue while the value string contain "|" character\r
-#\r
-#  @param[in] Setting:  A String contain VariableName, VariableGuid, VariableOffset, DefaultValue information;\r
-#  \r
-#  @retval   ValueList: A List contaian VariableName, VariableGuid, VariableOffset, DefaultValue. \r
-#\r
-def AnalyzeHiiPcdData(Setting):\r
-    ValueList = ['', '', '', '']\r
-\r
-    TokenList = GetSplitValueList(Setting)\r
-    ValueList[0:len(TokenList)] = TokenList\r
 \r
     return ValueList\r
 \r
-## AnalyzeVpdPcdData\r
-#\r
-#  Analyze the vpd pcd VpdOffset, MaxDatumSize and InitialValue.\r
-#  Used to avoid split issue while the value string contain "|" character\r
-#\r
-#  @param[in] Setting:  A String contain VpdOffset/MaxDatumSize/InitialValue information;\r
-#  \r
-#  @retval   ValueList: A List contain VpdOffset, MaxDatumSize and InitialValue. \r
-#\r
-def AnalyzeVpdPcdData(Setting):\r
-    ValueList = ['', '', '']\r
-\r
-    ValueRe = re.compile(r'\s*L?\".*\|.*\"\s*$')\r
-    PtrValue = ValueRe.findall(Setting)\r
-    \r
-    ValueUpdateFlag = False\r
-    \r
-    if len(PtrValue) >= 1:\r
-        Setting = re.sub(ValueRe, '', Setting)\r
-        ValueUpdateFlag = True\r
-\r
-    TokenList = Setting.split(TAB_VALUE_SPLIT)\r
-    ValueList[0:len(TokenList)] = TokenList\r
-    \r
-    if ValueUpdateFlag:\r
-        ValueList[2] = PtrValue[0]\r
-        \r
-    return ValueList     \r
-\r
 ## check format of PCD value against its the datum type\r
 #\r
 # For PCD value setting\r
 #\r
 def CheckPcdDatum(Type, Value):\r
-    if Type == "VOID*":\r
+    if Type == TAB_VOID:\r
         ValueRe = re.compile(r'\s*L?\".*\"\s*$')\r
         if not (((Value.startswith('L"') or Value.startswith('"')) and Value.endswith('"'))\r
                 or (Value.startswith('{') and Value.endswith('}')) or (Value.startswith("L'") or Value.startswith("'") and Value.endswith("'"))\r
@@ -1832,8 +1591,7 @@ def CheckPcdDatum(Type, Value):
             Printset.add(TAB_PRINTCHAR_BS)\r
             Printset.add(TAB_PRINTCHAR_NUL)\r
             if not set(Value).issubset(Printset):\r
-                PrintList = list(Printset)\r
-                PrintList.sort()\r
+                PrintList = sorted(Printset)\r
                 return False, "Invalid PCD string value of type [%s]; must be printable chars %s." % (Type, PrintList)\r
     elif Type == 'BOOLEAN':\r
         if Value not in ['TRUE', 'True', 'true', '0x1', '0x01', '1', 'FALSE', 'False', 'false', '0x0', '0x00', '0']:\r
@@ -1918,7 +1676,7 @@ def ConvertStringToByteArray(Value):
 \r
     Value = eval(Value)         # translate escape character\r
     NewValue = '{'\r
-    for Index in range(0,len(Value)):\r
+    for Index in range(0, len(Value)):\r
         if Unicode:\r
             NewValue = NewValue + str(ord(Value[Index]) % 0x10000) + ','\r
         else:\r
@@ -1995,7 +1753,7 @@ class PathClass(object):
     # @retval True  The two PathClass are the same\r
     #\r
     def __eq__(self, Other):\r
-        if type(Other) == type(self):\r
+        if isinstance(Other, type(self)):\r
             return self.Path == Other.Path\r
         else:\r
             return self.Path == str(Other)\r
@@ -2008,11 +1766,11 @@ class PathClass(object):
     # @retval -1    The first PathClass is less than the second PathClass\r
     # @retval 1     The first PathClass is Bigger than the second PathClass\r
     def __cmp__(self, Other):\r
-        if type(Other) == type(self):\r
+        if isinstance(Other, type(self)):\r
             OtherKey = Other.Path\r
         else:\r
             OtherKey = str(Other)\r
-            \r
+\r
         SelfKey = self.Path\r
         if SelfKey == OtherKey:\r
             return 0\r
@@ -2031,7 +1789,7 @@ class PathClass(object):
         return hash(self.Path)\r
 \r
     def _GetFileKey(self):\r
-        if self._Key == None:\r
+        if self._Key is None:\r
             self._Key = self.Path.upper()   # + self.ToolChainFamily + self.TagName + self.ToolCode + self.Target\r
         return self._Key\r
 \r
@@ -2150,7 +1908,7 @@ class PeImageClass():
     def _ByteListToStr(self, ByteList):\r
         String = ''\r
         for index in range(len(ByteList)):\r
-            if ByteList[index] == 0: \r
+            if ByteList[index] == 0:\r
                 break\r
             String += chr(ByteList[index])\r
         return String\r
@@ -2162,48 +1920,48 @@ class PeImageClass():
         return Value\r
 \r
 class DefaultStore():\r
-    def __init__(self,DefaultStores ):\r
+    def __init__(self, DefaultStores ):\r
 \r
         self.DefaultStores = DefaultStores\r
-    def DefaultStoreID(self,DefaultStoreName):\r
-        for key,value in self.DefaultStores.items():\r
+    def DefaultStoreID(self, DefaultStoreName):\r
+        for key, value in self.DefaultStores.items():\r
             if value == DefaultStoreName:\r
                 return key\r
         return None\r
     def GetDefaultDefault(self):\r
         if not self.DefaultStores or "0" in self.DefaultStores:\r
-            return "0",TAB_DEFAULT_STORES_DEFAULT\r
+            return "0", TAB_DEFAULT_STORES_DEFAULT\r
         else:\r
-            minvalue = min([int(value_str) for value_str in self.DefaultStores.keys()])\r
+            minvalue = min(int(value_str) for value_str in self.DefaultStores)\r
             return (str(minvalue), self.DefaultStores[str(minvalue)])\r
-    def GetMin(self,DefaultSIdList):\r
+    def GetMin(self, DefaultSIdList):\r
         if not DefaultSIdList:\r
-            return "STANDARD"\r
+            return TAB_DEFAULT_STORES_DEFAULT\r
         storeidset = {storeid for storeid, storename in self.DefaultStores.values() if storename in DefaultSIdList}\r
         if not storeidset:\r
             return ""\r
         minid = min(storeidset )\r
-        for sid,name in self.DefaultStores.values():\r
+        for sid, name in self.DefaultStores.values():\r
             if sid == minid:\r
                 return name\r
 class SkuClass():\r
-    \r
+\r
     DEFAULT = 0\r
     SINGLE = 1\r
     MULTIPLE =2\r
-    \r
+\r
     def __init__(self,SkuIdentifier='', SkuIds=None):\r
         if SkuIds is None:\r
             SkuIds = {}\r
 \r
         for SkuName in SkuIds:\r
             SkuId = SkuIds[SkuName][0]\r
-            skuid_num = int(SkuId,16) if SkuId.upper().startswith("0X") else int(SkuId)\r
+            skuid_num = int(SkuId, 16) if SkuId.upper().startswith("0X") else int(SkuId)\r
             if skuid_num > 0xFFFFFFFFFFFFFFFF:\r
                 EdkLogger.error("build", PARAMETER_INVALID,\r
                             ExtraData = "SKU-ID [%s] value %s exceeds the max value of UINT64"\r
                                       % (SkuName, SkuId))\r
-        \r
+\r
         self.AvailableSkuIds = sdict()\r
         self.SkuIdSet = []\r
         self.SkuIdNumberSet = []\r
@@ -2217,10 +1975,10 @@ class SkuClass():
             self.SkuIdSet = SkuIds.keys()\r
             self.SkuIdNumberSet = [num[0].strip() + 'U' for num in SkuIds.values()]\r
         else:\r
-            r = SkuIdentifier.split('|') \r
+            r = SkuIdentifier.split('|')\r
             self.SkuIdSet=[(r[k].strip()).upper() for k in range(len(r))]\r
             k = None\r
-            try: \r
+            try:\r
                 self.SkuIdNumberSet = [SkuIds[k][0].strip() + 'U' for k in self.SkuIdSet]\r
             except Exception:\r
                 EdkLogger.error("build", PARAMETER_INVALID,\r
@@ -2251,14 +2009,14 @@ class SkuClass():
             self.__SkuInherit = {}\r
             for item in self.SkuData.values():\r
                 self.__SkuInherit[item[1]]=item[2] if item[2] else "DEFAULT"\r
-        return self.__SkuInherit.get(skuname,"DEFAULT")\r
+        return self.__SkuInherit.get(skuname, "DEFAULT")\r
 \r
-    def GetSkuChain(self,sku):\r
+    def GetSkuChain(self, sku):\r
         if sku == "DEFAULT":\r
             return ["DEFAULT"]\r
         skulist = [sku]\r
         nextsku = sku\r
-        while 1:\r
+        while True:\r
             nextsku = self.GetNextSkuId(nextsku)\r
             skulist.append(nextsku)\r
             if nextsku == "DEFAULT":\r
@@ -2269,9 +2027,9 @@ class SkuClass():
         skuorderset = []\r
         for skuname in self.SkuIdSet:\r
             skuorderset.append(self.GetSkuChain(skuname))\r
-        \r
+\r
         skuorder = []\r
-        for index in range(max([len(item) for item in skuorderset])):\r
+        for index in range(max(len(item) for item in skuorderset)):\r
             for subset in skuorderset:\r
                 if index > len(subset)-1:\r
                     continue\r
@@ -2281,8 +2039,8 @@ class SkuClass():
 \r
         return skuorder\r
 \r
-    def __SkuUsageType(self): \r
-        \r
+    def __SkuUsageType(self):\r
+\r
         if self.__SkuIdentifier.upper() == "ALL":\r
             return SkuClass.MULTIPLE\r
 \r
@@ -2315,7 +2073,7 @@ class SkuClass():
         return ArrayStr\r
     def __GetAvailableSkuIds(self):\r
         return self.AvailableSkuIds\r
-    \r
+\r
     def __GetSystemSkuID(self):\r
         if self.__SkuUsageType() == SkuClass.SINGLE:\r
             if len(self.SkuIdSet) == 1:\r
@@ -2335,46 +2093,8 @@ class SkuClass():
 # Pack a registry format GUID\r
 #\r
 def PackRegistryFormatGuid(Guid):\r
-    Guid = Guid.split('-')\r
-    return pack('=LHHBBBBBBBB',\r
-                int(Guid[0], 16),\r
-                int(Guid[1], 16),\r
-                int(Guid[2], 16),\r
-                int(Guid[3][-4:-2], 16),\r
-                int(Guid[3][-2:], 16),\r
-                int(Guid[4][-12:-10], 16),\r
-                int(Guid[4][-10:-8], 16),\r
-                int(Guid[4][-8:-6], 16),\r
-                int(Guid[4][-6:-4], 16),\r
-                int(Guid[4][-4:-2], 16),\r
-                int(Guid[4][-2:], 16)\r
-                )\r
+    return PackGUID(Guid.split('-'))\r
 \r
-def BuildOptionPcdValueFormat(TokenSpaceGuidCName, TokenCName, PcdDatumType, Value):\r
-    if PcdDatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64,'BOOLEAN']:\r
-        if Value.startswith('L') or Value.startswith('"'):\r
-            if not Value[1]:\r
-                EdkLogger.error("build", FORMAT_INVALID, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", H"{...}"')\r
-            Value = Value\r
-        elif Value.startswith('H'):\r
-            if not Value[1]:\r
-                EdkLogger.error("build", FORMAT_INVALID, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", H"{...}"')\r
-            Value = Value[1:]\r
-        else:\r
-            if not Value[0]:\r
-                EdkLogger.error("build", FORMAT_INVALID, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", H"{...}"')\r
-            Value = '"' + Value + '"'\r
-\r
-    IsValid, Cause = CheckPcdDatum(PcdDatumType, Value)\r
-    if not IsValid:\r
-        EdkLogger.error("build", FORMAT_INVALID, Cause, ExtraData="%s.%s" % (TokenSpaceGuidCName, TokenCName))\r
-    if PcdDatumType == 'BOOLEAN':\r
-        Value = Value.upper()\r
-        if Value == 'TRUE' or Value == '1':\r
-            Value = '1'\r
-        elif Value == 'FALSE' or Value == '0':\r
-            Value = '0'\r
-    return  Value\r
 ##  Get the integer value from string like "14U" or integer like 2\r
 #\r
 #   @param      Input   The object that may be either a integer value or a string\r
@@ -2399,6 +2119,42 @@ def GetIntegerValue(Input):
     else:\r
         return int(String)\r
 \r
+#\r
+# Pack a GUID (registry format) list into a buffer and return it\r
+#\r
+def PackGUID(Guid):\r
+    return pack(PACK_PATTERN_GUID,\r
+                int(Guid[0], 16),\r
+                int(Guid[1], 16),\r
+                int(Guid[2], 16),\r
+                int(Guid[3][-4:-2], 16),\r
+                int(Guid[3][-2:], 16),\r
+                int(Guid[4][-12:-10], 16),\r
+                int(Guid[4][-10:-8], 16),\r
+                int(Guid[4][-8:-6], 16),\r
+                int(Guid[4][-6:-4], 16),\r
+                int(Guid[4][-4:-2], 16),\r
+                int(Guid[4][-2:], 16)\r
+                )\r
+\r
+#\r
+# Pack a GUID (byte) list into a buffer and return it\r
+#\r
+def PackByteFormatGUID(Guid):\r
+    return pack(PACK_PATTERN_GUID,\r
+                Guid[0],\r
+                Guid[1],\r
+                Guid[2],\r
+                Guid[3],\r
+                Guid[4],\r
+                Guid[5],\r
+                Guid[6],\r
+                Guid[7],\r
+                Guid[8],\r
+                Guid[9],\r
+                Guid[10],\r
+                )\r
+\r
 ##\r
 #\r
 # This acts like the main() function for the script, unless it is 'import'ed into another\r