-# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
+## @file\r
+# This file is used to parse a strings file and create or add to a string database \r
+# file.\r
+#\r
+# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>\r
# This program and the accompanying materials\r
# are licensed and made available under the terms and conditions of the BSD License\r
# which accompanies this distribution. The full text of the license may be found at\r
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
\r
-#\r
-#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
from Common.BuildToolError import *\r
from UniClassObject import *\r
from StringIO import StringIO\r
-from struct import pack\r
+from struct import pack, unpack\r
+from Common.LongFilePathSupport import OpenLongFilePath as open\r
\r
##\r
# Static definitions\r
STRING = 'string'\r
TO = 'to'\r
STRING_TOKEN = re.compile('STRING_TOKEN *\(([A-Z0-9_]+) *\)', re.MULTILINE | re.UNICODE)\r
-COMPATIBLE_STRING_TOKEN = re.compile('STRING_TOKEN *\(([A-Za-z0-9_]+) *\)', re.MULTILINE | re.UNICODE)\r
+COMPATIBLE_STRING_TOKEN = re.compile('STRING_TOKEN *\(([A-Z0-9_]+) *\)', re.MULTILINE | re.UNICODE)\r
\r
EFI_HII_ARRAY_SIZE_LENGTH = 4\r
EFI_HII_PACKAGE_HEADER_LENGTH = 4\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
+ 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
def AscToHexList(Ascii):\r
List = []\r
for Item in Ascii:\r
- List.append('0x%2X' % ord(Item))\r
+ List.append('0x%02X' % ord(Item))\r
\r
return List\r
\r
Str = WriteLine(Str, Line)\r
Line = COMMENT_DEFINE_STR + ' ' + PRINTABLE_LANGUAGE_NAME_STRING_NAME + ' ' * (ValueStartPtr - len(DEFINE_STR + PRINTABLE_LANGUAGE_NAME_STRING_NAME)) + DecToHexStr(1, 4) + COMMENT_NOT_REFERENCED\r
Str = WriteLine(Str, Line)\r
+ UnusedStr = ''\r
\r
- #Group the referred STRING token together. \r
+ #Group the referred/Unused STRING token together. \r
for Index in range(2, len(UniObjectClass.OrderedStringList[UniObjectClass.LanguageDef[0][0]])):\r
StringItem = UniObjectClass.OrderedStringList[UniObjectClass.LanguageDef[0][0]][Index]\r
Name = StringItem.StringName\r
else:\r
Line = DEFINE_STR + ' ' + Name + ' ' * (ValueStartPtr - len(DEFINE_STR + Name)) + DecToHexStr(Token, 4)\r
Str = WriteLine(Str, Line)\r
-\r
- #Group the unused STRING token together.\r
- for Index in range(2, len(UniObjectClass.OrderedStringList[UniObjectClass.LanguageDef[0][0]])):\r
- StringItem = UniObjectClass.OrderedStringList[UniObjectClass.LanguageDef[0][0]][Index]\r
- Name = StringItem.StringName\r
- Token = StringItem.Token\r
- Referenced = StringItem.Referenced\r
- if Name != None:\r
- Line = ''\r
- if Referenced == False:\r
+ else:\r
if (ValueStartPtr - len(DEFINE_STR + Name)) <= 0:\r
Line = COMMENT_DEFINE_STR + ' ' + Name + ' ' + DecToHexStr(Token, 4) + COMMENT_NOT_REFERENCED\r
else:\r
Line = COMMENT_DEFINE_STR + ' ' + Name + ' ' * (ValueStartPtr - len(DEFINE_STR + Name)) + DecToHexStr(Token, 4) + COMMENT_NOT_REFERENCED\r
- Str = WriteLine(Str, Line)\r
+ UnusedStr = WriteLine(UnusedStr, Line)\r
+\r
+ Str = ''.join([Str, UnusedStr])\r
\r
Str = WriteLine(Str, '')\r
if IsCompatibleMode or UniGenCFlag:\r
#\r
def CreateBinBuffer(BinBuffer, Array):\r
for Item in Array:\r
- BinBuffer.write(pack("B", int(Item,16)))\r
+ BinBuffer.write(pack("B", int(Item, 16)))\r
\r
## Create a formatted string all items in an array\r
#\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
\r
if PrimaryTag == UniLanguagePrimaryTag:\r
if UniLanguage not in UniLanguageListFiltered:\r
- UniLanguageListFiltered += [UniLanguage] \r
+ UniLanguageListFiltered += [UniLanguage]\r
break\r
else:\r
# Here is rule 3 for "get best language"\r
\r
UniLanguageList = []\r
for IndexI in range(len(UniObjectClass.LanguageDef)):\r
- UniLanguageList += [UniObjectClass.LanguageDef[IndexI][0]] \r
+ UniLanguageList += [UniObjectClass.LanguageDef[IndexI][0]]\r
\r
UniLanguageListFiltered = GetFilteredLanguage(UniLanguageList, LanguageFilterList)\r
\r
#\r
for IndexI in range(len(UniObjectClass.LanguageDef)):\r
Language = UniObjectClass.LanguageDef[IndexI][0]\r
- LangPrintName = UniObjectClass.LanguageDef[IndexI][1]\r
if Language not in UniLanguageListFiltered:\r
continue\r
\r
NumberOfUseOtherLangDef = 0\r
Index = 0\r
for IndexJ in range(1, len(UniObjectClass.OrderedStringList[UniObjectClass.LanguageDef[IndexI][0]])):\r
- Item = UniObjectClass.FindByToken(IndexJ, Language)\r
+ Item = UniObjectClass.OrderedStringListByToken[Language][IndexJ]\r
+\r
Name = Item.StringName\r
Value = Item.StringValueByteList\r
Referenced = Item.Referenced\r
Token = Item.Token\r
- Length = Item.Length\r
UseOtherLangDef = Item.UseOtherLangDef\r
\r
if UseOtherLangDef != '' and Referenced:\r
if UniBinBuffer:\r
CreateBinBuffer (UniBinBuffer, List)\r
UniBinBuffer.write (StringBuffer.getvalue())\r
- UniBinBuffer.write (pack("B", int(EFI_HII_SIBT_END,16)))\r
+ UniBinBuffer.write (pack("B", int(EFI_HII_SIBT_END, 16)))\r
StringBuffer.close()\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
+ AllStr = WriteLine('', CHAR_ARRAY_DEFIN + ' ' + BaseName + COMMON_FILE_NAME + '[] = {\n')\r
\r
if IsCompatibleMode:\r
#\r
# This function is used for UEFI2.1 spec\r
#\r
#\r
-def GetStringFiles(UniFilList, SourceFileList, IncludeList, IncludePathList, SkipList, BaseName, IsCompatibleMode = False, ShellMode = False, UniGenCFlag = True, UniGenBinBuffer = None, FilterInfo = [True, []]):\r
- Status = True\r
- ErrorMessage = ''\r
-\r
+def GetStringFiles(UniFilList, SourceFileList, IncludeList, IncludePathList, SkipList, BaseName, IsCompatibleMode = False, ShellMode = False, UniGenCFlag = True, UniGenBinBuffer = None, FilterInfo = [True, []]): \r
if len(UniFilList) > 0:\r
if ShellMode:\r
#\r
# Write an item\r
#\r
def Write(Target, Item):\r
- return Target + Item\r
+ return ''.join([Target, Item])\r
\r
#\r
# Write an item with a break line\r
#\r
def WriteLine(Target, Item):\r
- return Target + Item + '\n'\r
+ return ''.join([Target, Item, '\n'])\r
\r
# This acts like the main() function for the script, unless it is 'import'ed into another\r
# script.\r