-# Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2007 - 2010, 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
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
+\r
+ #Group the referred 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
Line = DEFINE_STR + ' ' + Name + ' ' + DecToHexStr(Token, 4)\r
else:\r
Line = DEFINE_STR + ' ' + Name + ' ' * (ValueStartPtr - len(DEFINE_STR + Name)) + DecToHexStr(Token, 4)\r
- else:\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
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
+ Str = WriteLine(Str, Line)\r
\r
Str = WriteLine(Str, '')\r
if IsCompatibleMode or UniGenCFlag:\r
\r
return Str\r
\r
+## GetFilteredLanguage\r
+#\r
+# apply get best language rules to the UNI language code list\r
+#\r
+# @param UniLanguageList: language code definition list in *.UNI file\r
+# @param LanguageFilterList: language code filter list of RFC4646 format in DSC file\r
+#\r
+# @retval UniLanguageListFiltered: the filtered language code\r
+#\r
+def GetFilteredLanguage(UniLanguageList, LanguageFilterList):\r
+ UniLanguageListFiltered = []\r
+ # if filter list is empty, then consider there is no filter\r
+ if LanguageFilterList == []:\r
+ UniLanguageListFiltered = UniLanguageList\r
+ return UniLanguageListFiltered\r
+ for Language in LanguageFilterList:\r
+ # first check for exact match\r
+ if Language in UniLanguageList:\r
+ if Language not in UniLanguageListFiltered:\r
+ UniLanguageListFiltered += [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
+ if len(PrimaryTag) == 3:\r
+ PrimaryTag = LangConvTable.get(PrimaryTag)\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
+ if len(UniLanguagePrimaryTag) == 3:\r
+ UniLanguagePrimaryTag = LangConvTable.get(UniLanguagePrimaryTag)\r
+\r
+ if PrimaryTag == UniLanguagePrimaryTag:\r
+ if UniLanguage not in UniLanguageListFiltered:\r
+ UniLanguageListFiltered += [UniLanguage] \r
+ break\r
+ else:\r
+ # Here is rule 3 for "get best language"\r
+ # If tag is not listed in the Unicode file, the default ("en") tag should be used for that language\r
+ # for better processing, find the one that best suit for it.\r
+ DefaultTag = 'en'\r
+ if DefaultTag not in UniLanguageListFiltered:\r
+ # check whether language code with primary code equivalent with DefaultTag already in the list, if so, use that\r
+ for UniLanguage in UniLanguageList:\r
+ if UniLanguage.startswith('en-') or UniLanguage.startswith('eng-'):\r
+ if UniLanguage not in UniLanguageListFiltered:\r
+ UniLanguageListFiltered += [UniLanguage]\r
+ break\r
+ else:\r
+ UniLanguageListFiltered += [DefaultTag]\r
+ return UniLanguageListFiltered\r
+\r
\r
## Create content of .c file\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
#\r
# @retval Str: A string of .c file content\r
#\r
-def CreateCFileContent(BaseName, UniObjectClass, IsCompatibleMode, UniBinBuffer=None):\r
+def CreateCFileContent(BaseName, UniObjectClass, IsCompatibleMode, UniBinBuffer, FilterInfo):\r
#\r
# Init array length\r
#\r
Str = ''\r
Offset = 0\r
\r
+ EDK2Module = FilterInfo[0]\r
+ if EDK2Module:\r
+ LanguageFilterList = FilterInfo[1]\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
+ 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
# 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
-\r
+ if Language not in UniLanguageListFiltered:\r
+ continue\r
+ \r
StringBuffer = StringIO()\r
StrStringValue = ''\r
ArrayLength = 0\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
#\r
-# @retval CFile: A string of complete .c file\r
+# @retval CFile: A string of complete .c file\r
#\r
-def CreateCFile(BaseName, UniObjectClass, IsCompatibleMode):\r
+def CreateCFile(BaseName, UniObjectClass, IsCompatibleMode, FilterInfo):\r
CFile = ''\r
#CFile = WriteLine(CFile, CreateCFileHeader())\r
- CFile = WriteLine(CFile, CreateCFileContent(BaseName, UniObjectClass, IsCompatibleMode))\r
+ CFile = WriteLine(CFile, CreateCFileContent(BaseName, UniObjectClass, IsCompatibleMode, None, FilterInfo))\r
CFile = WriteLine(CFile, CreateCFileEnd())\r
return CFile\r
\r
# This function is used for UEFI2.1 spec\r
#\r
#\r
-def GetStringFiles(UniFilList, SourceFileList, IncludeList, SkipList, BaseName, IsCompatibleMode = False, ShellMode = False, UniGenCFlag = True, UniGenBinBuffer = None):\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
#\r
# support ISO 639-2 codes in .UNI files of EDK Shell\r
#\r
- Uni = UniFileClassObject(UniFilList, True)\r
+ Uni = UniFileClassObject(sorted (UniFilList), True, IncludePathList)\r
else:\r
- Uni = UniFileClassObject(UniFilList, IsCompatibleMode)\r
+ Uni = UniFileClassObject(sorted (UniFilList), IsCompatibleMode, IncludePathList)\r
else:\r
EdkLogger.error("UnicodeStringGather", AUTOGEN_ERROR, 'No unicode files given')\r
\r
FileList = GetFileList(SourceFileList, IncludeList, SkipList)\r
\r
- Uni = SearchString(Uni, FileList, IsCompatibleMode)\r
+ Uni = SearchString(Uni, sorted (FileList), IsCompatibleMode)\r
\r
HFile = CreateHFile(BaseName, Uni, IsCompatibleMode, UniGenCFlag)\r
CFile = None\r
if IsCompatibleMode or UniGenCFlag:\r
- CFile = CreateCFile(BaseName, Uni, IsCompatibleMode)\r
+ CFile = CreateCFile(BaseName, Uni, IsCompatibleMode, FilterInfo)\r
if UniGenBinBuffer:\r
- CreateCFileContent(BaseName, Uni, IsCompatibleMode, UniGenBinBuffer)\r
+ CreateCFileContent(BaseName, Uni, IsCompatibleMode, UniGenBinBuffer, FilterInfo)\r
\r
return HFile, CFile\r
\r