#\r
# Copyright (c) 2014 Hewlett-Packard Development Company, L.P.<BR>\r
#\r
-# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2007 - 2015, 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
import Common.LongFilePathOs as os, codecs, re\r
import distutils.util\r
import Common.EdkLogger as EdkLogger\r
+import StringIO\r
from Common.BuildToolError import *\r
from Common.String import GetLineNo\r
from Common.Misc import PathClass\r
\r
EdkLogger.error("Unicode File Parser", FORMAT_INVALID, "Invalid RFC 4646 language code : %s" % LangName, File)\r
\r
+## Ucs2Codec\r
+#\r
+# This is only a partial codec implementation. It only supports\r
+# encoding, and is primarily used to check that all the characters are\r
+# valid for UCS-2.\r
+#\r
+class Ucs2Codec(codecs.Codec):\r
+ def __init__(self):\r
+ self.__utf16 = codecs.lookup('utf-16')\r
+\r
+ def encode(self, input, errors='strict'):\r
+ for Char in input:\r
+ CodePoint = ord(Char)\r
+ if CodePoint >= 0xd800 and CodePoint <= 0xdfff:\r
+ raise ValueError("Code Point is in range reserved for " +\r
+ "UTF-16 surrogate pairs")\r
+ elif CodePoint > 0xffff:\r
+ raise ValueError("Code Point too large to encode in UCS-2")\r
+ return self.__utf16.encode(input)\r
+\r
+TheUcs2Codec = Ucs2Codec()\r
+def Ucs2Search(name):\r
+ if name == 'ucs-2':\r
+ return codecs.CodecInfo(\r
+ name=name,\r
+ encode=TheUcs2Codec.encode,\r
+ decode=TheUcs2Codec.decode)\r
+ else:\r
+ return None\r
+codecs.register(Ucs2Search)\r
+\r
## StringDefClassObject\r
#\r
# A structure for language definition\r
Lang = distutils.util.split_quoted((Line.split(u"//")[0]))\r
if len(Lang) != 3:\r
try:\r
- FileIn = codecs.open(LongFilePath(File.Path), mode='rb', encoding='utf-16').read()\r
+ FileIn = self.OpenUniFile(LongFilePath(File.Path))\r
except UnicodeError, X:\r
EdkLogger.error("build", FILE_READ_FAILURE, "File read failure: %s" % str(X), ExtraData=File);\r
except:\r
self.OrderedStringDict[LangName][Item.StringName] = len(self.OrderedStringList[LangName]) - 1\r
return True\r
\r
+ def OpenUniFile(self, FileName):\r
+ #\r
+ # Read file\r
+ #\r
+ try:\r
+ UniFile = open(FileName, mode='rb')\r
+ FileIn = UniFile.read()\r
+ UniFile.close()\r
+ except:\r
+ EdkLogger.Error("build", FILE_OPEN_FAILURE, ExtraData=File)\r
+\r
+ #\r
+ # We currently only support UTF-16\r
+ #\r
+ Encoding = 'utf-16'\r
+\r
+ self.VerifyUcs2Data(FileIn, FileName, Encoding)\r
+\r
+ UniFile = StringIO.StringIO(FileIn)\r
+ Info = codecs.lookup(Encoding)\r
+ (Reader, Writer) = (Info.streamreader, Info.streamwriter)\r
+ return codecs.StreamReaderWriter(UniFile, Reader, Writer)\r
+\r
+ def VerifyUcs2Data(self, FileIn, FileName, Encoding):\r
+ Ucs2Info = codecs.lookup('ucs-2')\r
+ #\r
+ # Convert to unicode\r
+ #\r
+ try:\r
+ FileDecoded = codecs.decode(FileIn, Encoding)\r
+ Ucs2Info.encode(FileDecoded)\r
+ except:\r
+ UniFile = StringIO.StringIO(FileIn)\r
+ Info = codecs.lookup(Encoding)\r
+ (Reader, Writer) = (Info.streamreader, Info.streamwriter)\r
+ File = codecs.StreamReaderWriter(UniFile, Reader, Writer)\r
+ LineNumber = 0\r
+ ErrMsg = lambda Encoding, LineNumber: \\r
+ '%s contains invalid %s characters on line %d.' % \\r
+ (FileName, Encoding, LineNumber)\r
+ while True:\r
+ LineNumber = LineNumber + 1\r
+ try:\r
+ Line = File.readline()\r
+ if Line == '':\r
+ EdkLogger.error('Unicode File Parser', PARSER_ERROR,\r
+ ErrMsg(Encoding, LineNumber))\r
+ Ucs2Info.encode(Line)\r
+ except:\r
+ EdkLogger.error('Unicode File Parser', PARSER_ERROR,\r
+ ErrMsg('UCS-2', LineNumber))\r
+\r
#\r
# Get String name and value\r
#\r
if ((Line.count(u'"', 0, CommentPos) - Line.count(u'\\"', 0, CommentPos)) & 1) == 1:\r
CommentPos = Line.find (Comment, CommentPos + 1)\r
else:\r
- return Line[:CommentPos]\r
- return Line\r
+ return Line[:CommentPos].strip()\r
+ return Line.strip()\r
\r
\r
#\r
EdkLogger.error("Unicode File Parser", FILE_NOT_FOUND, ExtraData=File.Path)\r
\r
try:\r
- FileIn = codecs.open(LongFilePath(File.Path), mode='rb', encoding='utf-16')\r
+ FileIn = self.OpenUniFile(LongFilePath(File.Path))\r
except UnicodeError, X:\r
EdkLogger.error("build", FILE_READ_FAILURE, "File read failure: %s" % str(X), ExtraData=File.Path);\r
except:\r