-# Copyright (c) 2007 - 2010, Intel Corporation\r
-# All rights reserved. This program and the accompanying materials\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
# http://opensource.org/licenses/bsd-license.php\r
# Import Modules\r
#\r
import os, codecs, re\r
+import distutils.util\r
import Common.EdkLogger as EdkLogger\r
from Common.BuildToolError import *\r
from Common.String import GetLineNo\r
else:\r
EdkLogger.error("Unicode File Parser", FORMAT_INVALID, "Invalid ISO 639-2 language code : %s" % LangName, File)\r
\r
+ if (LangName[0] == 'X' or LangName[0] == 'x') and LangName[1] == '-':\r
+ return LangName\r
if length == 2:\r
if LangName.isalpha():\r
return LangName\r
repr(self.StringValue) + ' ' + \\r
repr(self.UseOtherLangDef)\r
\r
+ def UpdateValue(self, Value = None):\r
+ if Value != None:\r
+ self.StringValue = Value + u'\x00' # Add a NULL at string tail\r
+ self.StringValueByteList = UniToHexList(self.StringValue)\r
+ self.Length = len(self.StringValueByteList)\r
+\r
## UniFileClassObject\r
#\r
# A structure for .uni file definition\r
#\r
class UniFileClassObject(object):\r
- def __init__(self, FileList = [], IsCompatibleMode = False):\r
+ def __init__(self, FileList = [], IsCompatibleMode = False, IncludePathList = []):\r
self.FileList = FileList\r
self.Token = 2\r
self.LanguageDef = [] #[ [u'LanguageIdentifier', u'PrintableName'], ... ]\r
self.OrderedStringList = {} #{ u'LanguageIdentifier' : [StringDefClassObject] }\r
self.IsCompatibleMode = IsCompatibleMode\r
-\r
+ self.IncludePathList = IncludePathList\r
if len(self.FileList) > 0:\r
self.LoadUniFiles(FileList)\r
\r
# Get Language definition\r
#\r
def GetLangDef(self, File, Line):\r
- Lang = Line.split(u"//")[0].split()\r
+ Lang = distutils.util.split_quoted((Line.split(u"//")[0]))\r
if len(Lang) != 3:\r
try:\r
- FileIn = codecs.open(File, mode='rb', encoding='utf-16').read()\r
+ FileIn = codecs.open(File.Path, mode='rb', encoding='utf-16').read()\r
except UnicodeError, X:\r
EdkLogger.error("build", FILE_READ_FAILURE, "File read failure: %s" % str(X), ExtraData=File);\r
except:\r
EdkLogger.error("build", FILE_OPEN_FAILURE, ExtraData=File);\r
LineNo = GetLineNo(FileIn, Line, False)\r
EdkLogger.error("Unicode File Parser", PARSER_ERROR, "Wrong language definition",\r
- ExtraData="""%s\n\t*Correct format is like '#langdef eng "English"'""" % Line, File = File, Line = LineNo)\r
+ ExtraData="""%s\n\t*Correct format is like '#langdef en-US "English"'""" % Line, File = File, Line = LineNo)\r
else:\r
LangName = GetLanguageCode(Lang[1], self.IsCompatibleMode, self.File)\r
- LangPrintName = Lang[2][1:-1]\r
+ LangPrintName = Lang[2]\r
\r
IsLangInDef = False\r
for Item in self.LanguageDef:\r
self.AddStringToList(u'$LANGUAGE_NAME', LangName, LangName, 0, True, Index=0)\r
self.AddStringToList(u'$PRINTABLE_LANGUAGE_NAME', LangName, LangPrintName, 1, True, Index=1)\r
\r
+ if not IsLangInDef:\r
+ #\r
+ # The found STRING tokens will be added into new language string list\r
+ # so that the unique STRING identifier is reserved for all languages in the package list. \r
+ #\r
+ FirstLangName = self.LanguageDef[0][0]\r
+ if LangName != FirstLangName:\r
+ for Index in range (2, len (self.OrderedStringList[FirstLangName])):\r
+ Item = self.OrderedStringList[FirstLangName][Index]\r
+ if Item.UseOtherLangDef != '':\r
+ OtherLang = Item.UseOtherLangDef\r
+ else:\r
+ OtherLang = FirstLangName\r
+ self.OrderedStringList[LangName].append (StringDefClassObject(Item.StringName, '', Item.Referenced, Item.Token, OtherLang))\r
+\r
return True\r
\r
#\r
if not os.path.exists(File.Path) or not os.path.isfile(File.Path):\r
EdkLogger.error("Unicode File Parser", FILE_NOT_FOUND, ExtraData=File.Path)\r
\r
- Dir = File.Dir\r
try:\r
FileIn = codecs.open(File.Path, mode='rb', encoding='utf-16').readlines()\r
except UnicodeError, X:\r
\r
IncList = gIncludePattern.findall(Line)\r
if len(IncList) == 1:\r
- Lines.extend(self.PreProcess(PathClass(str(IncList[0]), Dir)))\r
+ for Dir in [File.Dir] + self.IncludePathList:\r
+ IncFile = PathClass(str(IncList[0]), Dir)\r
+ if os.path.isfile(IncFile.Path):\r
+ Lines.extend(self.PreProcess(IncFile))\r
+ break\r
+ else:\r
+ EdkLogger.error("Unicode File Parser", FILE_NOT_FOUND, Message="Cannot find include file", ExtraData=str(IncList[0]))\r
continue\r
\r
Lines.append(Line)\r
if Language not in self.OrderedStringList:\r
self.OrderedStringList[Language] = []\r
\r
- IsAdded = False\r
+ IsAdded = True\r
for Item in self.OrderedStringList[Language]:\r
if Name == Item.StringName:\r
- IsAdded = True\r
+ IsAdded = False\r
+ if Value != None:\r
+ Item.UpdateValue(Value)\r
+ Item.UseOtherLangDef = ''\r
break\r
- if not IsAdded:\r
+\r
+ if IsAdded:\r
Token = len(self.OrderedStringList[Language])\r
if Index == -1:\r
self.OrderedStringList[Language].append(StringDefClassObject(Name, Value, Referenced, Token, UseOtherLangDef))\r
+ for LangName in self.LanguageDef:\r
+ #\r
+ # New STRING token will be added into all language string lists.\r
+ # so that the unique STRING identifier is reserved for all languages in the package list. \r
+ #\r
+ if LangName[0] != Language:\r
+ if UseOtherLangDef != '':\r
+ OtherLangDef = UseOtherLangDef\r
+ else:\r
+ OtherLangDef = Language\r
+ self.OrderedStringList[LangName[0]].append(StringDefClassObject(Name, '', Referenced, Token, OtherLangDef))\r
else:\r
self.OrderedStringList[Language].insert(Index, StringDefClassObject(Name, Value, Referenced, Token, UseOtherLangDef))\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
+ # String stoken are added in the same order in all language string lists.\r
+ # So, only update the status of string stoken in first language string list.\r
+ #\r
+ Lang = self.LanguageDef[0][0]\r
+ for Item in self.OrderedStringList[Lang]:\r
+ if Name == Item.StringName:\r
+ Item.Referenced = True\r
+ break\r
#\r
# Search the string in language definition by Name\r
#\r
#\r
def ReToken(self):\r
#\r
- # Search each string to find if it is defined for each language\r
- # Use secondary language value to replace if missing in any one language\r
- #\r
- for IndexI in range(0, len(self.LanguageDef)):\r
- LangKey = self.LanguageDef[IndexI][0]\r
- for Item in self.OrderedStringList[LangKey]:\r
- Name = Item.StringName\r
- Value = Item.StringValue[0:-1]\r
- Referenced = Item.Referenced\r
- Index = self.OrderedStringList[LangKey].index(Item)\r
- for IndexJ in range(0, len(self.LanguageDef)):\r
- LangFind = self.LanguageDef[IndexJ][0]\r
- if self.FindStringValue(Name, LangFind) == None:\r
- EdkLogger.debug(EdkLogger.DEBUG_5, Name)\r
- Token = len(self.OrderedStringList[LangFind])\r
- self.AddStringToList(Name, LangFind, Value, Token, Referenced, LangKey, Index)\r
- #\r
- # Retoken\r
+ # Retoken all language strings according to the status of string stoken in the first language string.\r
#\r
- # First re-token the first language\r
- LangName = self.LanguageDef[0][0]\r
- ReferencedStringList = []\r
- NotReferencedStringList = []\r
- Token = 0\r
+ FirstLangName = self.LanguageDef[0][0]\r
\r
#\r
- # Order UNI token by their String Name\r
+ # Use small token for all referred string stoken.\r
#\r
- StringNameList = []\r
- for Item in self.OrderedStringList[LangName]:\r
- StringNameList.append (Item.StringName)\r
- StringNameList.sort()\r
-\r
- for Name in StringNameList:\r
- Item = self.FindStringValue (Name, LangName)\r
- if Item.Referenced == True:\r
- Item.Token = Token\r
- ReferencedStringList.append(Item)\r
- Token = Token + 1\r
- else:\r
- NotReferencedStringList.append(Item)\r
- self.OrderedStringList[LangName] = ReferencedStringList\r
- for Index in range(len(NotReferencedStringList)):\r
- NotReferencedStringList[Index].Token = Token + Index\r
- self.OrderedStringList[LangName].append(NotReferencedStringList[Index])\r
+ RefToken = 0\r
+ for Index in range (0, len (self.OrderedStringList[FirstLangName])):\r
+ FirstLangItem = self.OrderedStringList[FirstLangName][Index]\r
+ if FirstLangItem.Referenced == True:\r
+ for LangNameItem in self.LanguageDef:\r
+ LangName = LangNameItem[0]\r
+ OtherLangItem = self.OrderedStringList[LangName][Index]\r
+ OtherLangItem.Referenced = True\r
+ OtherLangItem.Token = RefToken\r
+ RefToken = RefToken + 1\r
\r
#\r
- # Adjust the orders of other languages\r
+ # Use big token for all unreferred string stoken.\r
#\r
- for IndexOfLanguage in range(1, len(self.LanguageDef)):\r
- for OrderedString in self.OrderedStringList[LangName]:\r
- for UnOrderedString in self.OrderedStringList[self.LanguageDef[IndexOfLanguage][0]]:\r
- if OrderedString.StringName == UnOrderedString.StringName:\r
- UnOrderedString.Token = OrderedString.Token\r
- break\r
+ UnRefToken = 0\r
+ for Index in range (0, len (self.OrderedStringList[FirstLangName])):\r
+ FirstLangItem = self.OrderedStringList[FirstLangName][Index]\r
+ if FirstLangItem.Referenced == False:\r
+ for LangNameItem in self.LanguageDef:\r
+ LangName = LangNameItem[0]\r
+ OtherLangItem = self.OrderedStringList[LangName][Index]\r
+ OtherLangItem.Token = RefToken + UnRefToken\r
+ UnRefToken = UnRefToken + 1\r
\r
#\r
# Show the instance itself\r