1. Modify StrGather to support UEFI 2.1 specification
authorhche10x <hche10x@7335b38e-4728-0410-8992-fb3ffe349368>
Wed, 2 Jan 2008 08:08:18 +0000 (08:08 +0000)
committerhche10x <hche10x@7335b38e-4728-0410-8992-fb3ffe349368>
Wed, 2 Jan 2008 08:08:18 +0000 (08:08 +0000)
2. Adjust debug information format in ECC tool.

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

Source/Python/AutoGen/StrGather.py
Source/Python/AutoGen/UniClassObject.py
Source/Python/Ecc/Database.py
Source/Python/Ecc/Table.py

index af23b11..f9c9603 100644 (file)
 #This file is used to parse a strings file and create or add to a string database file.\r
 #\r
 \r
+##\r
+# Import Modules\r
+#\r
 import re\r
 import Common.EdkLogger as EdkLogger\r
 from Common.BuildToolError import *\r
 from UniClassObject import *\r
 \r
+##\r
+# Static definitions\r
+#\r
+EFI_HII_SIBT_END = '0x00'\r
+EFI_HII_SIBT_STRING_SCSU = '0x10'\r
+EFI_HII_SIBT_STRING_SCSU_FONT = '0x11'\r
+EFI_HII_SIBT_STRINGS_SCSU = '0x12'\r
+EFI_HII_SIBT_STRINGS_SCSU_FONT = '0x13'\r
+EFI_HII_SIBT_STRING_UCS2 = '0x14'\r
+EFI_HII_SIBT_STRING_UCS2_FONT = '0x15'\r
+EFI_HII_SIBT_STRINGS_UCS2 = '0x16'\r
+EFI_HII_SIBT_STRINGS_UCS2_FONT = '0x17'\r
+EFI_HII_SIBT_DUPLICATE = '0x20'\r
+EFI_HII_SIBT_SKIP2 = '0x21'\r
+EFI_HII_SIBT_SKIP1 = '0x22'\r
+EFI_HII_SIBT_EXT1 = '0x30'\r
+EFI_HII_SIBT_EXT2 = '0x31'\r
+EFI_HII_SIBT_EXT4 = '0x32'\r
+EFI_HII_SIBT_FONT = '0x40'\r
+\r
+EFI_HII_PACKAGE_STRINGS = '0x04'\r
+\r
+StringPackageType = EFI_HII_PACKAGE_STRINGS\r
+StringBlockType = EFI_HII_SIBT_STRING_UCS2\r
+StringSkipType = EFI_HII_SIBT_SKIP2\r
+\r
 HexHeader = '0x'\r
 \r
 COMMENT = '// '\r
@@ -30,25 +59,84 @@ STRING = 'string'
 TO = 'to'\r
 STRING_TOKEN = re.compile('STRING_TOKEN *\(([A-Z0-9_]+) *\)', re.MULTILINE | re.UNICODE)\r
 \r
-LENGTH_EFI_HII_STRING_PACK_HEADER = 22\r
-LENGTH_STRING_OFFSET = 4\r
+EFI_HII_ARRAY_SIZE_LENGTH = 4\r
+EFI_HII_PACKAGE_HEADER_LENGTH = 4\r
+EFI_HII_HDR_SIZE_LENGTH = 4\r
+EFI_HII_STRING_OFFSET_LENGTH = 4\r
+EFI_STRING_ID = 1\r
+EFI_STRING_ID_LENGTH = 2\r
+EFI_HII_LANGUAGE_WINDOW = 0\r
+EFI_HII_LANGUAGE_WINDOW_LENGTH = 2\r
+EFI_HII_LANGUAGE_WINDOW_NUMBER = 16\r
+EFI_HII_STRING_PACKAGE_HDR_LENGTH = EFI_HII_PACKAGE_HEADER_LENGTH + EFI_HII_HDR_SIZE_LENGTH + EFI_HII_STRING_OFFSET_LENGTH + EFI_HII_LANGUAGE_WINDOW_LENGTH * EFI_HII_LANGUAGE_WINDOW_NUMBER + EFI_STRING_ID_LENGTH\r
 \r
 H_C_FILE_HEADER = ['//', \\r
                    '//  DO NOT EDIT -- auto-generated file', \\r
                    '//', \\r
-                   '//  This file is generated by the string gather utility', \\r
+                   '//  This file is generated by the StrGather utility', \\r
                    '//']\r
 LANGUAGE_NAME_STRING_NAME = '$LANGUAGE_NAME'\r
 PRINTABLE_LANGUAGE_NAME_STRING_NAME = '$PRINTABLE_LANGUAGE_NAME'\r
 \r
-def DecToHexStr(Dec, Digit):\r
+## Convert a dec number to a hex string\r
+#\r
+# Convert a dec number to a formatted hex string in length digit\r
+# The digit is set to default 8\r
+# The hex string starts with "0x"\r
+# DecToHexStr(1000) is '0x000003E8'\r
+# DecToHexStr(1000, 6) is '0x0003E8'\r
+#\r
+# @param Dec:    The number in dec format\r
+# @param Digit:  The needed digit of hex string\r
+#\r
+# @retval:       The formatted hex string  \r
+#\r
+def DecToHexStr(Dec, Digit = 8):\r
     return eval("'0x%0" + str(Digit) + "X' % int(Dec)")\r
 \r
-def DecToHexList(Dec):\r
-    Hex = "%08X" % int(Dec)\r
-    List = [HexHeader + Hex[6:8], HexHeader + Hex[4:6], HexHeader + Hex[2:4], HexHeader + Hex[0:2]]\r
+## Convert a dec number to a hex list\r
+#\r
+# Convert a dec number to a formatted hex list in size digit\r
+# The digit is set to default 8\r
+# DecToHexList(1000) is ['0xE8', '0x03', '0x00', '0x00']\r
+# DecToHexList(1000, 6) is ['0xE8', '0x03', '0x00']\r
+#\r
+# @param Dec:    The number in dec format\r
+# @param Digit:  The needed digit of hex list\r
+#\r
+# @retval:       A list for formatted hex string\r
+#\r
+def DecToHexList(Dec, Digit = 8):\r
+    Hex = eval("'%0" + str(Digit) + "X' % int(Dec)" )\r
+    List = []\r
+    for Bit in range(Digit - 2, -1, -2):\r
+        List.append(HexHeader + Hex[Bit:Bit + 2])\r
+    return List\r
+\r
+## Convert a acsii string to a hex list\r
+#\r
+# Convert a acsii string to a formatted hex list\r
+# AscToHexList('en-US') is ['0x65', '0x6E', '0x2D', '0x55', '0x53']\r
+#\r
+# @param Ascii:  The acsii string\r
+#\r
+# @retval:       A list for formatted hex string\r
+#\r
+def AscToHexList(Ascii):\r
+    List = []\r
+    for Item in Ascii:\r
+        List.append('0x%2X' % ord(Item))\r
+    \r
     return List\r
 \r
+## Create header of .h file\r
+#\r
+# Create a header of .h file\r
+#\r
+# @param BaseName: The basename of strings\r
+#\r
+# @retval Str:     A string for .h file header\r
+#\r
 def CreateHFileHeader(BaseName):\r
     Str = ''\r
     for Item in H_C_FILE_HEADER:\r
@@ -57,6 +145,15 @@ def CreateHFileHeader(BaseName):
     Str = WriteLine(Str, '#define _' + BaseName.upper() + '_STRINGS_DEFINE_H_')\r
     return Str\r
 \r
+## Create content of .h file\r
+#\r
+# Create content of .h file\r
+#\r
+# @param BaseName:       The basename of strings\r
+# @param UniObjectClass: A UniObjectClass instance \r
+#\r
+# @retval Str:           A string of .h file content \r
+#\r
 def CreateHFileContent(BaseName, UniObjectClass):\r
     Str = ''\r
     ValueStartPtr = 60\r
@@ -81,12 +178,26 @@ def CreateHFileContent(BaseName, UniObjectClass):
     Str = WriteLine(Str, 'extern unsigned char ' + BaseName + 'Strings[];')\r
     return Str\r
 \r
+## Create a complete .h file\r
+#\r
+# Create a complet .h file with file header and file content\r
+#\r
+# @param BaseName:       The basename of strings\r
+# @param UniObjectClass: A UniObjectClass instance \r
+#\r
+# @retval Str:           A string of complete .h file \r
+#\r
 def CreateHFile(BaseName, UniObjectClass):\r
-    #HFile = WriteLine('', CreateHFileHeader(BaseName))\r
     HFile = WriteLine('', CreateHFileContent(BaseName, UniObjectClass))\r
-    #HFile = WriteLine(HFile, '#endif')\r
+\r
     return HFile\r
 \r
+## Create header of .c file\r
+#\r
+# Create a header of .c file\r
+#\r
+# @retval Str:     A string for .c file header\r
+#\r
 def CreateCFileHeader():\r
     Str = ''\r
     for Item in H_C_FILE_HEADER:\r
@@ -94,67 +205,76 @@ def CreateCFileHeader():
 \r
     return Str\r
 \r
-def CreateArrayItem(Value, Width = 16):\r
+## Create a formatted string all items in an array\r
+#\r
+# Use ',' to join each item in an array, and break an new line when reaching the width (default is 16)\r
+#\r
+# @param Array:      The array need to be formatted\r
+# @param Width:      The line length, the default value is set to 16\r
+#\r
+# @retval ArrayItem: A string for all formatted array items\r
+#\r
+def CreateArrayItem(Array, Width = 16):\r
     MaxLength = Width\r
     Index = 0\r
     Line = '  '\r
     ArrayItem = ''\r
 \r
-    for Item in Value:\r
+    for Item in Array:\r
         if Index < MaxLength:\r
-            Line = Line + Item + ', '\r
+            Line = Line + Item + ',  '\r
             Index = Index + 1\r
         else:\r
             ArrayItem = WriteLine(ArrayItem, Line)\r
-            Line = '  ' + Item +  ', '\r
+            Line = '  ' + Item +  ',  '\r
             Index = 1\r
     ArrayItem = Write(ArrayItem, Line.rstrip())\r
 \r
     return ArrayItem\r
 \r
-def CreateCFileStringDef(Name, Offset, Token, UseOtherLangDef = ''):\r
-    Comment = ''\r
-    if UseOtherLangDef != '':\r
-        Comment = ' - not defined for this language -- using secondary language ' + UniToStr(UseOtherLangDef) + ' definition'\r
-    Str = Write('', CreateArrayItem(DecToHexList(Offset)) + '  ' + COMMENT + 'offset to string ' + Name + ' (' + DecToHexStr(Token, 4) + ')' + Comment)\r
-\r
-    return Str\r
+## CreateCFileStringValue\r
+#\r
+# Create a line with string value\r
+#\r
+# @param Value:  Value of the string\r
+#\r
+# @retval Str:   A formatted string with string value\r
+#\r
 \r
-def CreateCFileStringValue(Name, Language, Value, Offset):\r
-    Str = WriteLine('  ', COMMENT + STRING + ' ' + Name + ' ' + OFFSET + ' ' + DecToHexStr(Offset, 8))\r
-    Str = WriteLine(Str, CreateArrayItem(Value))\r
+def CreateCFileStringValue(Value):\r
+    Value = [StringBlockType] + Value\r
+    Str = WriteLine('', CreateArrayItem(Value))\r
 \r
     return Str\r
 \r
+\r
+## Create content of .c file\r
+#\r
+# Create content of .c file\r
+#\r
+# @param BaseName:       The basename of strings\r
+# @param UniObjectClass: A UniObjectClass instance \r
+#\r
+# @retval Str:           A string of .c file content \r
+#\r
 def CreateCFileContent(BaseName, UniObjectClass):\r
+    #\r
+    # Init array length\r
+    #\r
+    TotalLength = EFI_HII_ARRAY_SIZE_LENGTH\r
     Str = ''\r
-\r
-    Str = WriteLine(Str, CHAR_ARRAY_DEFIN + ' ' + BaseName + COMMON_FILE_NAME + '[] = {\n' )\r
+    Offset = 0\r
+    \r
+    #\r
+    # Create lines for each language's strings\r
+    #\r
     for IndexI in range(len(UniObjectClass.LanguageDef)):\r
         Language = UniObjectClass.LanguageDef[IndexI][0]\r
         LangPrintName = UniObjectClass.LanguageDef[IndexI][1]\r
-        Length = 0\r
-        NameLength = 0\r
-        Count = 0\r
-        for Item in UniObjectClass.OrderedStringList[Language]:\r
-            if Item.Referenced:\r
-                Length = Length + Item.Length\r
-                Count = Count + 1\r
-\r
-        Str = WriteLine(Str, '//******************************************************************************')\r
-        Str = WriteLine(Str, COMMENT + 'Start of string definitions for ' + Language)\r
-\r
-        #\r
-        # EFI_HII_STRING_PACK_HEADER\r
-        #\r
-        Offset = LENGTH_EFI_HII_STRING_PACK_HEADER + LENGTH_STRING_OFFSET * Count\r
-        Length = Offset + Length\r
-        List = DecToHexList(Length) + DecToHexList(2)[0:2] + DecToHexList(Offset) + DecToHexList(Offset + len(UniToHexList(Language)) + 2) + DecToHexList(Count) + DecToHexList(0)\r
-        Str = WriteLine(Str, CreateArrayItem(List, 8))\r
-\r
-        Str = WriteLine(Str, '  // offset 0x16')\r
-        StrStringDef = ''\r
+        \r
         StrStringValue = ''\r
+        ArrayLength = 0\r
+        NumberOfUseOhterLangDef = 0\r
         for Item in UniObjectClass.OrderedStringList[Language]:\r
             Name = Item.StringName\r
             Value = Item.StringValueByteList\r
@@ -162,31 +282,102 @@ def CreateCFileContent(BaseName, UniObjectClass):
             Token = Item.Token\r
             Length = Item.Length\r
             UseOtherLangDef = Item.UseOtherLangDef\r
-\r
-            if Referenced:\r
-                StrStringDef = WriteLine(StrStringDef, CreateCFileStringDef(Name, Offset, Token, UseOtherLangDef))\r
-                StrStringValue = Write(StrStringValue, CreateCFileStringValue(Name, Language, Value, Offset))\r
-                Offset = Offset + Length\r
+            \r
+            if UseOtherLangDef != '' and Referenced:\r
+                NumberOfUseOhterLangDef = NumberOfUseOhterLangDef + 1\r
             else:\r
-                StrStringDef = WriteLine(StrStringDef, '  ' + COMMENT + Name + ' ' + NOT_REFERENCED)\r
-\r
-        Str = WriteLine(Str, StrStringDef)\r
-        Str = WriteLine(Str, StrStringValue)\r
-    return Str\r
+                if NumberOfUseOhterLangDef > 0:\r
+                    StrStringValue = WriteLine(StrStringValue, CreateArrayItem([StringSkipType, DecToHexStr(NumberOfUseOhterLangDef, 2), EFI_HII_SIBT_END]))\r
+                    NumberOfUseOhterLangDef = 0\r
+                    ArrayLength = ArrayLength + 3\r
+                if Referenced and Item.Token > 0:\r
+                    StrStringValue = Write(StrStringValue, CreateCFileStringValue(Value))\r
+                    Offset = Offset + Length\r
+                    ArrayLength = ArrayLength + Item.Length + 1 # 1 is for the length of string type        \r
 \r
+        #\r
+        # EFI_HII_PACKAGE_HEADER\r
+        #\r
+        Str = WriteLine(Str, '// PACKAGE HEADER\n')\r
+        Offset = EFI_HII_STRING_PACKAGE_HDR_LENGTH + len(Language) + 1\r
+        ArrayLength = Offset + ArrayLength + 1\r
+        TotalLength = TotalLength + ArrayLength\r
+        \r
+        List = DecToHexList(ArrayLength, 6) + \\r
+               [StringPackageType] + \\r
+               DecToHexList(Offset) + \\r
+               DecToHexList(Offset) + \\r
+               DecToHexList(EFI_HII_LANGUAGE_WINDOW, EFI_HII_LANGUAGE_WINDOW_LENGTH * 2) * EFI_HII_LANGUAGE_WINDOW_NUMBER + \\r
+               DecToHexList(EFI_STRING_ID, 4) + \\r
+               AscToHexList(Language) + \\r
+               DecToHexList(0, 2)\r
+        Str = WriteLine(Str, CreateArrayItem(List, 16) + '\n')\r
+        \r
+        #\r
+        # PACKAGE DATA\r
+        #\r
+        Str = WriteLine(Str, '// PACKAGE DATA\n')\r
+        Str = Write(Str, StrStringValue)\r
+        \r
+        #\r
+        # Add an EFI_HII_SIBT_END at last\r
+        #\r
+        Str = WriteLine(Str, '  ' + EFI_HII_SIBT_END + ",")\r
+        \r
+    #\r
+    # Create line for string variable name\r
+    # "unsigned char $(BaseName)Strings[] = {"\r
+    #\r
+    AllStr = WriteLine('', CHAR_ARRAY_DEFIN + ' ' + BaseName + COMMON_FILE_NAME + '[] = {\n' )\r
+    \r
+    #\r
+    # Create whole array length\r
+    #\r
+    AllStr = WriteLine(AllStr, '// STRING ARRAY LENGTH\n')\r
+    AllStr = WriteLine(AllStr, CreateArrayItem(DecToHexList(TotalLength)))\r
+    \r
+    #\r
+    # Join package data\r
+    #\r
+    AllStr = Write(AllStr, Str)\r
+    \r
+    return AllStr\r
+\r
+## Create end of .c file\r
+#\r
+# Create end of .c file\r
+#\r
+# @retval Str:           A string of .h file end \r
+#\r
 def CreateCFileEnd():\r
-    Str = WriteLine('  ', '// strings terminator pack')\r
-    Str = WriteLine(Str, '  ' + '0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ')\r
-    Str = WriteLine(Str, '  ' + '0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ')\r
-    Str = Write(Str, '};')\r
+    Str = Write('', '};')\r
     return Str\r
 \r
+## Create a .c file\r
+#\r
+# Create a complete .c file\r
+#\r
+# @param BaseName:       The basename of strings\r
+# @param UniObjectClass: A UniObjectClass instance \r
+#\r
+# @retval CFile:         A string of complete .c file\r
+#\r
 def CreateCFile(BaseName, UniObjectClass):\r
-    #CFile = WriteLine('', CreateCFileHeader())\r
-    CFile = WriteLine('', CreateCFileContent(BaseName, UniObjectClass))\r
+    CFile = ''\r
+    #CFile = WriteLine(CFile, CreateCFileHeader())\r
+    CFile = WriteLine(CFile, CreateCFileContent(BaseName, UniObjectClass))\r
     CFile = WriteLine(CFile, CreateCFileEnd())\r
     return CFile\r
 \r
+## GetFileList\r
+#\r
+# Get a list for all files\r
+#\r
+# @param IncludeList:  A list of all path to be searched\r
+# @param SkipList:     A list of all types of file could be skipped \r
+#\r
+# @retval FileList:    A list of all files found\r
+#\r
 def GetFileList(IncludeList, SkipList):\r
     if IncludeList == None:\r
         EdkLogger.error("UnicodeStringGather", AUTOGEN_ERROR, "Include path for unicode file is not defined")\r
@@ -219,6 +410,16 @@ def GetFileList(IncludeList, SkipList):
 \r
     return FileList\r
 \r
+## SearchString\r
+#\r
+# Search whether all string defined in UniObjectClass are referenced\r
+# All string used should be set to Referenced\r
+#\r
+# @param UniObjectClass:  Input UniObjectClass\r
+# @param FileList:        Search path list\r
+#\r
+# @retval UniObjectClass: UniObjectClass after searched\r
+#\r
 def SearchString(UniObjectClass, FileList):\r
     if FileList == []:\r
         return UniObjectClass\r
@@ -236,6 +437,11 @@ def SearchString(UniObjectClass, FileList):
 \r
     return UniObjectClass\r
 \r
+## GetStringFiles\r
+#\r
+# This function is used for UEFI2.1 spec\r
+# \r
+#\r
 def GetStringFiles(UniFilList, IncludeList, SkipList, BaseName):\r
     Status = True\r
     ErrorMessage = ''\r
@@ -254,9 +460,15 @@ def GetStringFiles(UniFilList, IncludeList, SkipList, BaseName):
 \r
     return HFile, CFile\r
 \r
+#\r
+# Write an item\r
+#\r
 def Write(Target, Item):\r
     return Target + Item\r
 \r
+#\r
+# Write an item with a break line\r
+#\r
 def WriteLine(Target, Item):\r
     return Target + Item + '\n'\r
 \r
@@ -265,39 +477,15 @@ def WriteLine(Target, Item):
 if __name__ == '__main__':\r
     EdkLogger.info('start')\r
 \r
-#    UniFileList = [\r
-#        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg\SmbiosMiscDxe\SmbiosMiscStrings.uni',\r
-#        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg\SmbiosMiscDxe\MiscOemString.uni',\r
-#        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg\SmbiosMiscDxe\MiscSystemOptionString.uni',\r
-#        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg\SmbiosMiscDxe\MiscOnboardDevice.uni',\r
-#        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg\SmbiosMiscDxe\MiscSystemSlotOnboardDevices.uni',\r
-#        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg\SmbiosMiscDxe\MiscBiosVendor.uni',\r
-#        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg\SmbiosMiscDxe\MiscChassisManufacturer.uni',\r
-#        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg\SmbiosMiscDxe\MiscSystemSlotDesignation.uni',\r
-#        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg\SmbiosMiscDxe\MiscPortInternalConnectorDesignator.uni',\r
-#        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg\SmbiosMiscDxe\MiscSystemManufacturer.uni',\r
-#    ]\r
-#    IncludeList = [\r
-#        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg\SmbiosMiscDxe',\r
-#        r'E:\SRC\r9prime\verify\LakeportX64Dev\Build\LakeportX64Pkg\DEBUG_MYTOOLS\X64\LakeportX64Pkg\SmbiosMiscDxe\SmbiosMiscDxe\DEBUG',\r
-#        r'E:\SRC\r9prime\verify\LakeportX64Dev\MdePkg',\r
-#        r'E:\SRC\r9prime\verify\LakeportX64Dev\MdePkg\Include\x64',\r
-#        r'E:\SRC\r9prime\verify\LakeportX64Dev\MdePkg\Include',\r
-#        r'E:\SRC\r9prime\verify\LakeportX64Dev\IntelFrameworkPkg',\r
-#        r'E:\SRC\r9prime\verify\LakeportX64Dev\IntelFrameworkPkg\Include',\r
-#        r'E:\SRC\r9prime\verify\LakeportX64Dev\MdeModulePkg',\r
-#        r'E:\SRC\r9prime\verify\LakeportX64Dev\MdeModulePkg\Include',\r
-#        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg',\r
-#        r'E:\SRC\r9prime\verify\LakeportX64Dev\LakeportX64Pkg\Include',\r
-#    ]\r
-\r
     UniFileList = [\r
-        r'C:\SVN\EDKII\Nt32Pkg\PlatformBdsDxe\Generic\FrontPageStrings.uni',\r
-        r'C:\SVN\EDKII\Nt32Pkg\PlatformBdsDxe\Generic\Strings.uni',\r
-        r'C:\SVN\EDKII\Nt32Pkg\PlatformBdsDxe\Generic\DeviceMngr\DeviceManagerStrings.uni',\r
-        r'C:\SVN\EDKII\Nt32Pkg\PlatformBdsDxe\Generic\BootMngr\BootManagerStrings.uni',\r
-        r'C:\SVN\EDKII\Nt32Pkg\PlatformBdsDxe\Generic\FrontPageStrings.uni',\r
-        r'C:\SVN\EDKII\Nt32Pkg\PlatformBdsDxe\Generic\BootMaint\bmstring.uni'\r
+#        r'C:\SVN\EDKII\Nt32Pkg\PlatformBdsDxe\Generic\FrontPageStrings.uni',\r
+#        r'C:\SVN\EDKII\Nt32Pkg\PlatformBdsDxe\Generic\Strings.uni',\r
+#        r'C:\SVN\EDKII\Nt32Pkg\PlatformBdsDxe\Generic\DeviceMngr\DeviceManagerStrings.uni',\r
+#        r'C:\SVN\EDKII\Nt32Pkg\PlatformBdsDxe\Generic\BootMngr\BootManagerStrings.uni',\r
+#        r'C:\SVN\EDKII\Nt32Pkg\PlatformBdsDxe\Generic\FrontPageStrings.uni',\r
+#        r'C:\SVN\EDKII\Nt32Pkg\PlatformBdsDxe\Generic\BootMaint\bmstring.uni'\r
+         r'C:\\temp\\Edk\\Sample\\Universal\\UserInterface\\UefiSetupBrowser\\Dxe\\DriverSample\\InventoryStrings.uni',\r
+         r'C:\\temp\\Edk\\Sample\\Universal\\UserInterface\\UefiSetupBrowser\\Dxe\\DriverSample\\VfrStrings.uni'\r
     ]\r
 \r
     IncludeList = [\r
@@ -317,11 +505,14 @@ if __name__ == '__main__':
         r'C:\SVN\EDKII\IntelFrameworkModulePkg',\r
         r'C:\SVN\EDKII\IntelFrameworkModulePkg\Include',\r
         r'C:\SVN\EDKII\MdeModulePkg',\r
-        r'C:\SVN\EDKII\MdeModulePkg\Include'\r
+        r'C:\SVN\EDKII\MdeModulePkg\Include',\r
+        r'C:\\temp\\Edk\\Sample\\Universal\\UserInterface\\UefiSetupBrowser\\Dxe\\DriverSample'\r
     ]\r
+    \r
+    \r
 \r
     SkipList = ['.inf', '.uni']\r
-    BaseName = 'SetupBrowser'\r
+    BaseName = 'DriverSample'\r
     (h, c) = GetStringFiles(UniFileList, IncludeList, SkipList, BaseName)\r
     hfile = open('unistring.h', 'w')\r
     cfile = open('unistring.c', 'w')\r
index d4a06aa..16d22e7 100644 (file)
 #This file is used to collect all defined strings in multiple uni files\r
 #\r
 \r
+##\r
+# Import Modules\r
+#\r
 import os, codecs, re\r
-import Common.EdkLogger\r
+import Common.EdkLogger as EdkLogger\r
 from Common.BuildToolError import *\r
 \r
+##\r
+# Static definitions\r
+#\r
 UNICODE_WIDE_CHAR = u'\\wide'\r
 UNICODE_NARROW_CHAR = u'\\narrow'\r
 UNICODE_NON_BREAKING_CHAR = u'\\nbr'\r
@@ -32,9 +38,27 @@ BACK_SPLASH = u'\\'
 \r
 gIncludePattern = re.compile("^#include +[\"<]+([^\"< >]+)[>\"]+$", re.MULTILINE | re.UNICODE)\r
 \r
+## Convert a python unicode string to a normal string\r
+#\r
+# Convert a python unicode string to a normal string\r
+# UniToStr(u'I am a string') is 'I am a string'\r
+#\r
+# @param Uni:  The python unicode string\r
+#\r
+# @retval:     The formatted normal string \r
+#\r
 def UniToStr(Uni):\r
     return repr(Uni)[2:-1]\r
 \r
+## Convert a unicode string to a Hex list\r
+#\r
+# Convert a unicode string to a Hex list\r
+# UniToHexList('ABC') is ['0x41', '0x00', '0x42', '0x00', '0x43', '0x00']\r
+#\r
+# @param Uni:    The python unicode string\r
+#\r
+# @retval List:  The formatted hex list \r
+#\r
 def UniToHexList(Uni):\r
     List = []\r
     for Item in Uni:\r
@@ -43,6 +67,28 @@ def UniToHexList(Uni):
         List.append('0x' + Temp[0:2])\r
     return List\r
 \r
+## ConvertISO639ToRFC3066\r
+#\r
+# Convert a ISO639 language name to RFC3066\r
+#\r
+# @param LangName:   LangName in ISO639\r
+#\r
+# @retval LangName:  LangName in RFC3066\r
+#\r
+def ConvertISO639ToRFC3066(LangName):\r
+    if LangName == 'eng':\r
+        LangName = 'en-US'\r
+    if LangName == 'fra':\r
+        LangName = 'fr-FR'\r
+    if LangName == 'spa':\r
+        LangName = 'es-ES'\r
+        \r
+    return LangName\r
+\r
+## StringDefClassObject\r
+#\r
+# A structure for language definition\r
+#\r
 class StringDefClassObject(object):\r
     def __init__(self, Name = None, Value = None, Referenced = False, Token = None, UseOtherLangDef = ''):\r
         self.StringName = ''\r
@@ -70,6 +116,10 @@ class StringDefClassObject(object):
                repr(self.Referenced) + ' ' + \\r
                repr(self.StringValue)\r
 \r
+## UniFileClassObject\r
+#\r
+# A structure for .uni file definition\r
+#\r
 class UniFileClassObject(object):\r
     def __init__(self, FileList = []):\r
         self.FileList = FileList\r
@@ -80,16 +130,25 @@ class UniFileClassObject(object):
         if len(self.FileList) > 0:\r
             self.LoadUniFiles(FileList)\r
 \r
+    #\r
+    # Get Language definition\r
+    #\r
     def GetLangDef(self, Line):\r
         Lang = Line.split()\r
         if len(Lang) != 3:\r
             EdkLogger.error("Unicode File Parser", PARSER_ERROR, "Wrong language definition",\r
                             ExtraData="""%s\n\t*Correct format is '#langdef eng "English"'""" % Line)\r
         else:\r
-            LangName = Lang[1]\r
+            LangName = ConvertISO639ToRFC3066(Lang[1])\r
             LangPrintName = Lang[2][1:-1]\r
-\r
-        if [LangName, LangPrintName] not in self.LanguageDef:\r
+        \r
+        IsLangInDef = False\r
+        for Item in self.LanguageDef:\r
+            if Item[0] == LangName:\r
+                IsLangInDef = True\r
+                break;\r
+        \r
+        if not IsLangInDef:\r
             self.LanguageDef.append([LangName, LangPrintName])\r
 \r
         #\r
@@ -100,6 +159,9 @@ class UniFileClassObject(object):
 \r
         return True\r
 \r
+    #\r
+    # Get String name and value\r
+    #\r
     def GetStringObject(self, Item):\r
         Name = ''\r
         Language = ''\r
@@ -114,11 +176,17 @@ class UniFileClassObject(object):
                 Language = LanguageList[IndexI].split()[0]\r
                 Value = LanguageList[IndexI][LanguageList[IndexI].find(u'\"') + len(u'\"') : LanguageList[IndexI].rfind(u'\"')].replace(u'\r\n', u'')\r
                 self.AddStringToList(Name, Language, Value)\r
-\r
+    \r
+    #\r
+    # Get include file list and load them\r
+    #\r
     def GetIncludeFile(self, Item, Dir):\r
         FileName = Item[Item.find(u'#include ') + len(u'#include ') :Item.find(u' ', len(u'#include '))][1:-1]\r
         self.LoadUniFile(FileName)\r
 \r
+    #\r
+    # Pre-process before parse .uni file\r
+    #\r
     def PreProcess(self, File):\r
         if not os.path.exists(File) or not os.path.isfile(File):\r
             EdkLogger.error("Unicode File Parser", FILE_NOT_FOUND, ExtraData=File)\r
@@ -164,6 +232,9 @@ class UniFileClassObject(object):
 \r
         return Lines\r
 \r
+    #\r
+    # Load a .uni file\r
+    #\r
     def LoadUniFile(self, File = None):\r
         if File == None:\r
             EdkLogger.error("Unicode File Parser", PARSER_ERROR, 'No unicode file is given')\r
@@ -243,12 +314,19 @@ class UniFileClassObject(object):
                         StringItem = StringItem[ : StringItem.rfind(u'\"')] + Lines[IndexJ][Lines[IndexJ].find(u'\"') + len(u'\"') : ]\r
                 self.GetStringObject(StringItem)\r
 \r
+    #\r
+    # Load multiple .uni files\r
+    #\r
     def LoadUniFiles(self, FileList = []):\r
         if len(FileList) > 0:\r
             for File in FileList:\r
                 self.LoadUniFile(File)\r
 \r
+    #\r
+    # Add a string to list\r
+    #\r
     def AddStringToList(self, Name, Language, Value, Token = None, Referenced = False, UseOtherLangDef = '', Index = -1):\r
+        Language = ConvertISO639ToRFC3066(Language)\r
         if Language not in self.OrderedStringList:\r
             self.OrderedStringList[Language] = []\r
 \r
@@ -263,14 +341,19 @@ class UniFileClassObject(object):
                 self.OrderedStringList[Language].append(StringDefClassObject(Name, Value, Referenced, Token, UseOtherLangDef))\r
             else:\r
                 self.OrderedStringList[Language].insert(Index, StringDefClassObject(Name, Value, Referenced, Token, UseOtherLangDef))\r
-\r
+                \r
+    #\r
+    # Set the string as referenced\r
+    #\r
     def SetStringReferenced(self, Name):\r
         for Lang in self.OrderedStringList:\r
             for Item in self.OrderedStringList[Lang]:\r
                 if Name == Item.StringName:\r
                     Item.Referenced = True\r
                     break\r
-\r
+    #\r
+    # Search the string in language definition\r
+    #\r
     def FindStringValue(self, Name, Lang):\r
         for Item in self.OrderedStringList[Lang]:\r
             if Item.StringName == Name:\r
@@ -278,6 +361,9 @@ class UniFileClassObject(object):
 \r
         return None\r
 \r
+    #\r
+    # Re-order strings and re-generate tokens\r
+    #\r
     def ReToken(self):\r
         #\r
         # Search each string to find if it is defined for each language\r
@@ -316,6 +402,9 @@ class UniFileClassObject(object):
                 NotReferencedStringList[Index].Token = Token + Index\r
                 self.OrderedStringList[LangName].append(NotReferencedStringList[Index])\r
 \r
+    #\r
+    # Show the instance itself\r
+    #\r
     def ShowMe(self):\r
         print self.LanguageDef\r
         #print self.OrderedStringList\r
@@ -327,5 +416,5 @@ class UniFileClassObject(object):
 # This acts like the main() function for the script, unless it is 'import'ed into another\r
 # script.\r
 if __name__ == '__main__':\r
-    a = UniFileClassObject(['C:\\Tiano\\Edk\\Sample\\Universal\\UserInterface\\SetupBrowser\\Dxe\\DriverSample\\inventorystrings.uni', 'C:\\Tiano\\Edk\\Sample\\Universal\\UserInterface\\SetupBrowser\\Dxe\\DriverSample\\VfrStrings.uni'])\r
+    a = UniFileClassObject(['C:\\Edk\\DriverSample\\SetupBrowserStr.uni', 'C:\\Edk\\DriverSample\\VfrStrings.uni'])\r
     a.ShowMe()\r
index ae06b66..ce44fb4 100644 (file)
@@ -156,7 +156,7 @@ class Database(object):
         EdkLogger.verbose("Update 'BelongsToFunction' for Identifiers started ...")\r
         \r
         SqlCommand = """select ID, BelongsToFile, StartLine, EndLine, Model from Identifier"""\r
-        EdkLogger.debug(4, SqlCommand)\r
+        EdkLogger.debug(4, "SqlCommand: %s" %SqlCommand)\r
         self.Cur.execute(SqlCommand)\r
         Records = self.Cur.fetchall()\r
         for Record in Records:\r
@@ -166,29 +166,35 @@ class Database(object):
             EndLine = Record[3]\r
             Model = Record[4]\r
 \r
+            #\r
+            # Check whether an identifier belongs to a function\r
+            #\r
             EdkLogger.debug(4, "For common identifiers ... ")\r
             SqlCommand = """select ID from Function \r
                         where StartLine < %s and EndLine > %s\r
                         and BelongsToFile = %s""" % (StartLine, EndLine, BelongsToFile)\r
-            EdkLogger.debug(4, SqlCommand)\r
+            EdkLogger.debug(4, "SqlCommand: %s" %SqlCommand)\r
             self.Cur.execute(SqlCommand)\r
             IDs = self.Cur.fetchall()\r
             for ID in IDs:\r
                 SqlCommand = """Update Identifier set BelongsToFunction = %s where ID = %s""" % (ID[0], IdentifierID)\r
-                EdkLogger.debug(4, SqlCommand)\r
+                EdkLogger.debug(4, "SqlCommand: %s" %SqlCommand)\r
                 self.Cur.execute(SqlCommand)\r
             \r
+            #\r
+            # Check whether the identifier is a function header\r
+            #\r
             EdkLogger.debug(4, "For function headers ... ") \r
             if Model == DataClass.MODEL_IDENTIFIER_COMMENT:\r
                 SqlCommand = """select ID from Function \r
                         where StartLine = %s + 1\r
                         and BelongsToFile = %s""" % (EndLine, BelongsToFile)\r
-                EdkLogger.debug(4, SqlCommand)\r
+                EdkLogger.debug(4, "SqlCommand: %s" %SqlCommand)\r
                 self.Cur.execute(SqlCommand)\r
                 IDs = self.Cur.fetchall()\r
                 for ID in IDs:\r
                     SqlCommand = """Update Identifier set BelongsToFunction = %s, Model = %s where ID = %s""" % (ID[0], DataClass.MODEL_IDENTIFIER_FUNCTION_HEADER, IdentifierID)\r
-                    EdkLogger.debug(4, SqlCommand)\r
+                    EdkLogger.debug(4, "SqlCommand: %s" %SqlCommand)\r
                     self.Cur.execute(SqlCommand)\r
         \r
         EdkLogger.verbose("Update 'BelongsToFunction' for Identifiers ... DONE")\r
index a5812c8..c269d01 100644 (file)
@@ -58,7 +58,7 @@ class Table(object):
             EdkLogger.verbose(Rs)\r
         \r
         TotalCount = self.GetCount()\r
-        EdkLogger.verbose("***Total %s records in table %s***" % (TotalCount, self.Table) )\r
+        EdkLogger.verbose("*** Total %s records in table %s ***" % (TotalCount, self.Table) )\r
         EdkLogger.verbose("Query tabel %s DONE!" % self.Table)\r
 \r
     ## Drop a table\r