## @file\r
-# This file is used to parse a strings file and create or add to a string database \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 - 2018, Intel Corporation. All rights reserved.<BR>\r
##\r
# Import Modules\r
#\r
+from __future__ import absolute_import\r
import re\r
import Common.EdkLogger as EdkLogger\r
from Common.BuildToolError import *\r
-from UniClassObject import *\r
-from StringIO import StringIO\r
+from .UniClassObject import *\r
+from io import BytesIO\r
from struct import pack, unpack\r
from Common.LongFilePathSupport import OpenLongFilePath as open\r
\r
# @retval: The formatted hex string\r
#\r
def DecToHexStr(Dec, Digit = 8):\r
- return '0x{0:0{1}X}'.format(Dec,Digit)\r
+ return '0x{0:0{1}X}'.format(Dec, Digit)\r
\r
## Convert a dec number to a hex list\r
#\r
# @retval: A list for formatted hex string\r
#\r
def DecToHexList(Dec, Digit = 8):\r
- Hex = '{0:0{1}X}'.format(Dec,Digit)\r
+ Hex = '{0:0{1}X}'.format(Dec, Digit)\r
return ["0x" + Hex[Bit:Bit + 2] for Bit in range(Digit - 2, -1, -2)]\r
\r
## Convert a acsii string to a hex list\r
# @retval: A list for formatted hex string\r
#\r
def AscToHexList(Ascii):\r
- return ['0x{0:02X}'.format(ord(Item)) for Item in Ascii]\r
+ try:\r
+ return ['0x{0:02X}'.format(Item) for Item in Ascii]\r
+ except:\r
+ return ['0x{0:02X}'.format(ord(Item)) for Item in Ascii]\r
\r
## Create content of .h file\r
#\r
# @retval Str: A string of .h file content\r
#\r
def CreateHFileContent(BaseName, UniObjectClass, IsCompatibleMode, UniGenCFlag):\r
- Str = ''\r
+ Str = []\r
ValueStartPtr = 60\r
Line = COMMENT_DEFINE_STR + ' ' + LANGUAGE_NAME_STRING_NAME + ' ' * (ValueStartPtr - len(DEFINE_STR + LANGUAGE_NAME_STRING_NAME)) + DecToHexStr(0, 4) + COMMENT_NOT_REFERENCED\r
Str = WriteLine(Str, Line)\r
Str = WriteLine(Str, Line)\r
UnusedStr = ''\r
\r
- #Group the referred/Unused 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
Token = StringItem.Token\r
Referenced = StringItem.Referenced\r
- if Name != None:\r
+ if Name is not None:\r
Line = ''\r
if Referenced == True:\r
if (ValueStartPtr - len(DEFINE_STR + Name)) <= 0:\r
Line = COMMENT_DEFINE_STR + ' ' + Name + ' ' * (ValueStartPtr - len(DEFINE_STR + Name)) + DecToHexStr(Token, 4) + COMMENT_NOT_REFERENCED\r
UnusedStr = WriteLine(UnusedStr, Line)\r
\r
- Str = ''.join([Str, UnusedStr])\r
+ Str.extend( UnusedStr)\r
\r
Str = WriteLine(Str, '')\r
if IsCompatibleMode or UniGenCFlag:\r
Str = WriteLine(Str, 'extern unsigned char ' + BaseName + 'Strings[];')\r
- return Str\r
+ return "".join(Str)\r
\r
## Create a complete .h file\r
#\r
def CreateHFile(BaseName, UniObjectClass, IsCompatibleMode, UniGenCFlag):\r
HFile = WriteLine('', CreateHFileContent(BaseName, UniObjectClass, IsCompatibleMode, UniGenCFlag))\r
\r
- return HFile\r
+ return "".join(HFile)\r
\r
## Create a buffer to store all items in an array\r
#\r
MaxLength = Width\r
Index = 0\r
Line = ' '\r
- ArrayItem = ''\r
+ ArrayItem = []\r
\r
for Item in Array:\r
if Index < MaxLength:\r
Index = 1\r
ArrayItem = Write(ArrayItem, Line.rstrip())\r
\r
- return ArrayItem\r
+ return "".join(ArrayItem)\r
\r
## CreateCFileStringValue\r
#\r
Value = [StringBlockType] + Value\r
Str = WriteLine('', CreateArrayItem(Value))\r
\r
- return Str\r
+ return "".join(Str)\r
\r
## GetFilteredLanguage\r
#\r
# first check for exact match\r
if Language in UniLanguageList:\r
if Language not in UniLanguageListFiltered:\r
- UniLanguageListFiltered += [Language]\r
+ UniLanguageListFiltered.append(Language)\r
# find the first one with the same/equivalent primary tag\r
else:\r
if Language.find('-') != -1:\r
PrimaryTag = Language[0:Language.find('-')].lower()\r
else:\r
PrimaryTag = Language\r
- \r
+\r
if len(PrimaryTag) == 3:\r
PrimaryTag = LangConvTable.get(PrimaryTag)\r
- \r
+\r
for UniLanguage in UniLanguageList:\r
if UniLanguage.find('-') != -1:\r
UniLanguagePrimaryTag = UniLanguage[0:UniLanguage.find('-')].lower()\r
else:\r
UniLanguagePrimaryTag = UniLanguage\r
- \r
+\r
if len(UniLanguagePrimaryTag) == 3:\r
UniLanguagePrimaryTag = LangConvTable.get(UniLanguagePrimaryTag)\r
\r
if PrimaryTag == UniLanguagePrimaryTag:\r
if UniLanguage not in UniLanguageListFiltered:\r
- UniLanguageListFiltered += [UniLanguage]\r
+ UniLanguageListFiltered.append(UniLanguage)\r
break\r
else:\r
# Here is rule 3 for "get best language"\r
for UniLanguage in UniLanguageList:\r
if UniLanguage.startswith('en-') or UniLanguage.startswith('eng-'):\r
if UniLanguage not in UniLanguageListFiltered:\r
- UniLanguageListFiltered += [UniLanguage]\r
+ UniLanguageListFiltered.append(UniLanguage)\r
break\r
else:\r
- UniLanguageListFiltered += [DefaultTag]\r
+ UniLanguageListFiltered.append(DefaultTag)\r
return UniLanguageListFiltered\r
\r
\r
# @param UniObjectClass A UniObjectClass instance\r
# @param IsCompatibleMode Compatible mode\r
# @param UniBinBuffer UniBinBuffer to contain UniBinary data.\r
-# @param FilterInfo Platform language filter information \r
+# @param FilterInfo Platform language filter information\r
#\r
# @retval Str: A string of .c file content\r
#\r
else:\r
# EDK module is using ISO639-2 format filter, convert to the RFC4646 format\r
LanguageFilterList = [LangConvTable.get(F.lower()) for F in FilterInfo[1]]\r
- \r
+\r
UniLanguageList = []\r
for IndexI in range(len(UniObjectClass.LanguageDef)):\r
UniLanguageList += [UniObjectClass.LanguageDef[IndexI][0]]\r
\r
UniLanguageListFiltered = GetFilteredLanguage(UniLanguageList, LanguageFilterList)\r
- \r
- \r
+\r
+\r
#\r
# Create lines for each language's strings\r
#\r
Language = UniObjectClass.LanguageDef[IndexI][0]\r
if Language not in UniLanguageListFiltered:\r
continue\r
- \r
- StringBuffer = StringIO()\r
+\r
+ StringBuffer = BytesIO()\r
StrStringValue = ''\r
ArrayLength = 0\r
NumberOfUseOtherLangDef = 0\r
# Add an EFI_HII_SIBT_END at last\r
#\r
Str = WriteLine(Str, ' ' + EFI_HII_SIBT_END + ",")\r
- \r
+\r
#\r
# Create binary UNI string\r
#\r
#\r
AllStr = Write(AllStr, Str)\r
\r
- return AllStr\r
+ return "".join(AllStr)\r
\r
## Create end of .c file\r
#\r
# @param BaseName: The basename of strings\r
# @param UniObjectClass A UniObjectClass instance\r
# @param IsCompatibleMode Compatible Mode\r
-# @param FilterInfo Platform language filter information \r
+# @param FilterInfo Platform language filter information\r
#\r
# @retval CFile: A string of complete .c file\r
#\r
CFile = ''\r
CFile = WriteLine(CFile, CreateCFileContent(BaseName, UniObjectClass, IsCompatibleMode, None, FilterInfo))\r
CFile = WriteLine(CFile, CreateCFileEnd())\r
- return CFile\r
+ return "".join(CFile)\r
\r
## GetFileList\r
#\r
# @retval FileList: A list of all files found\r
#\r
def GetFileList(SourceFileList, IncludeList, SkipList):\r
- if IncludeList == None:\r
+ if IncludeList is None:\r
EdkLogger.error("UnicodeStringGather", AUTOGEN_ERROR, "Include path for unicode file is not defined")\r
\r
FileList = []\r
- if SkipList == None:\r
+ if SkipList is None:\r
SkipList = []\r
\r
for File in SourceFileList:\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
+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
# support ISO 639-2 codes in .UNI files of EDK Shell\r
#\r
- Uni = UniFileClassObject(sorted (UniFilList), True, IncludePathList)\r
+ Uni = UniFileClassObject(sorted(UniFilList, key=lambda x: x.File), True, IncludePathList)\r
else:\r
- Uni = UniFileClassObject(sorted (UniFilList), IsCompatibleMode, IncludePathList)\r
+ Uni = UniFileClassObject(sorted(UniFilList, key=lambda x: x.File), IsCompatibleMode, IncludePathList)\r
else:\r
EdkLogger.error("UnicodeStringGather", AUTOGEN_ERROR, 'No unicode files given')\r
\r
# Write an item\r
#\r
def Write(Target, Item):\r
- return ''.join([Target, Item])\r
+ if isinstance(Target,str):\r
+ Target = [Target]\r
+ if not Target:\r
+ Target = []\r
+ if isinstance(Item,list):\r
+ Target.extend(Item)\r
+ else:\r
+ Target.append(Item)\r
+ return Target\r
\r
#\r
# Write an item with a break line\r
#\r
def WriteLine(Target, Item):\r
- return ''.join([Target, Item, '\n'])\r
+ if isinstance(Target,str):\r
+ Target = [Target]\r
+ if not Target:\r
+ Target = []\r
+ if isinstance(Item, list):\r
+ Target.extend(Item)\r
+ else:\r
+ Target.append(Item)\r
+ Target.append('\n')\r
+ return Target\r
\r
# This acts like the main() function for the script, unless it is 'import'ed into another\r
# script.\r