if length == 3 and LangName.isalpha():\r
TempLangName = LangConvTable.get(LangName.lower())\r
if TempLangName != None:\r
- return TempLangName\r
+ return TempLangName\r
return LangName\r
else:\r
EdkLogger.error("Unicode File Parser", FORMAT_INVALID, "Invalid ISO 639-2 language code : %s" % LangName, File)\r
self.Token = 2\r
self.LanguageDef = [] #[ [u'LanguageIdentifier', u'PrintableName'], ... ]\r
self.OrderedStringList = {} #{ u'LanguageIdentifier' : [StringDefClassObject] }\r
+ self.OrderedStringDict = {} #{ u'LanguageIdentifier' : {StringName:(IndexInList)} }\r
+ self.OrderedStringListByToken = {} #{ u'LanguageIdentifier' : {Token: StringDefClassObject} }\r
self.IsCompatibleMode = IsCompatibleMode\r
self.IncludePathList = IncludePathList\r
if len(self.FileList) > 0:\r
else:\r
OtherLang = FirstLangName\r
self.OrderedStringList[LangName].append (StringDefClassObject(Item.StringName, '', Item.Referenced, Item.Token, OtherLang))\r
-\r
+ self.OrderedStringDict[LangName][Item.StringName] = len(self.OrderedStringList[LangName]) - 1\r
return True\r
\r
#\r
# Get String name and value\r
#\r
def GetStringObject(self, Item):\r
- Name = ''\r
Language = ''\r
Value = ''\r
\r
#\r
# Use unique identifier\r
#\r
+ FindFlag = -1\r
+ LineCount = 0\r
for Line in FileIn:\r
+ Line = FileIn[LineCount]\r
+ LineCount += 1\r
Line = Line.strip()\r
#\r
# Ignore comment line and empty line\r
#\r
if Line == u'' or Line.startswith(u'//'):\r
continue\r
+ \r
+ #\r
+ # Process comment embeded in string define lines\r
+ #\r
+ FindFlag = Line.find(u'//')\r
+ if FindFlag != -1:\r
+ Line = Line.replace(Line[FindFlag:], u' ')\r
+ if FileIn[LineCount].strip().startswith('#language'):\r
+ Line = Line + FileIn[LineCount]\r
+ FileIn[LineCount-1] = Line\r
+ FileIn[LineCount] = os.linesep\r
+ LineCount -= 1\r
+ for Index in xrange (LineCount + 1, len (FileIn) - 1):\r
+ if (Index == len(FileIn) -1):\r
+ FileIn[Index] = os.linesep\r
+ else:\r
+ FileIn[Index] = FileIn[Index + 1]\r
+ continue\r
+ \r
Line = Line.replace(u'/langdef', u'#langdef')\r
Line = Line.replace(u'/string', u'#string')\r
Line = Line.replace(u'/language', u'#language')\r
\r
if Language not in self.OrderedStringList:\r
self.OrderedStringList[Language] = []\r
+ self.OrderedStringDict[Language] = {}\r
\r
IsAdded = True\r
- for Item in self.OrderedStringList[Language]:\r
- if Name == Item.StringName:\r
- IsAdded = False\r
- if Value != None:\r
- Item.UpdateValue(Value)\r
- Item.UseOtherLangDef = ''\r
- break\r
+ if Name in self.OrderedStringDict[Language]:\r
+ IsAdded = False\r
+ if Value != None:\r
+ ItemIndexInList = self.OrderedStringDict[Language][Name]\r
+ Item = self.OrderedStringList[Language][ItemIndexInList]\r
+ Item.UpdateValue(Value)\r
+ Item.UseOtherLangDef = '' \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
+ self.OrderedStringDict[Language][Name] = Token\r
for LangName in self.LanguageDef:\r
#\r
# New STRING token will be added into all language string lists.\r
else:\r
OtherLangDef = Language\r
self.OrderedStringList[LangName[0]].append(StringDefClassObject(Name, '', Referenced, Token, OtherLangDef))\r
+ self.OrderedStringDict[LangName[0]][Name] = len(self.OrderedStringList[LangName[0]]) - 1\r
else:\r
self.OrderedStringList[Language].insert(Index, StringDefClassObject(Name, Value, Referenced, Token, UseOtherLangDef))\r
+ self.OrderedStringDict[Language][Name] = Index\r
\r
#\r
# Set the string as referenced\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
+ if Name in self.OrderedStringDict[Lang]:\r
+ ItemIndexInList = self.OrderedStringDict[Lang][Name]\r
+ Item = self.OrderedStringList[Lang][ItemIndexInList]\r
+ Item.Referenced = True\r
+\r
#\r
# Search the string in language definition by Name\r
#\r
def FindStringValue(self, Name, Lang):\r
- for Item in self.OrderedStringList[Lang]:\r
- if Item.StringName == Name:\r
- return Item\r
+ if Name in self.OrderedStringDict[Lang]:\r
+ ItemIndexInList = self.OrderedStringDict[Lang][Name]\r
+ return self.OrderedStringList[Lang][ItemIndexInList]\r
\r
return None\r
\r
#\r
FirstLangName = self.LanguageDef[0][0]\r
\r
+ # Convert the OrderedStringList to be OrderedStringListByToken in order to faciliate future search by token\r
+ for LangNameItem in self.LanguageDef:\r
+ self.OrderedStringListByToken[LangNameItem[0]] = {}\r
+\r
#\r
# Use small token for all referred string stoken.\r
#\r
OtherLangItem = self.OrderedStringList[LangName][Index]\r
OtherLangItem.Referenced = True\r
OtherLangItem.Token = RefToken\r
+ self.OrderedStringListByToken[LangName][OtherLangItem.Token] = OtherLangItem\r
RefToken = RefToken + 1\r
\r
#\r
LangName = LangNameItem[0]\r
OtherLangItem = self.OrderedStringList[LangName][Index]\r
OtherLangItem.Token = RefToken + UnRefToken\r
+ self.OrderedStringListByToken[LangName][OtherLangItem.Token] = OtherLangItem\r
UnRefToken = UnRefToken + 1\r
\r
#\r
if __name__ == '__main__':\r
EdkLogger.Initialize()\r
EdkLogger.SetLevel(EdkLogger.DEBUG_0)\r
- a = UniFileClassObject(['C:\\Edk\\Strings.uni', 'C:\\Edk\\Strings2.uni'])\r
+ a = UniFileClassObject([PathClass("C:\\Edk\\Strings.uni"), PathClass("C:\\Edk\\Strings2.uni")])\r
a.ReToken()\r
a.ShowMe()\r