##\r
# Import Modules\r
#\r
+from __future__ import absolute_import\r
import Common.EdkLogger as EdkLogger\r
-import StringIO\r
from Common.BuildToolError import *\r
-from Common.String import GetLineNo\r
+from Common.StringUtils import GetLineNo\r
from Common.Misc import PathClass\r
from Common.LongFilePathSupport import LongFilePath\r
import re\r
import os\r
+from Common.GlobalData import gIdentifierPattern\r
+from .UniClassObject import StripComments\r
\r
IMAGE_TOKEN = re.compile('IMAGE_TOKEN *\(([A-Z0-9_]+) *\)', re.MULTILINE | re.UNICODE)\r
\r
\r
class IdfFileClassObject(object):\r
def __init__(self, FileList = []):\r
- self.FileList = FileList\r
self.ImageFilesDict = {}\r
self.ImageIDList = []\r
- if len(self.FileList) > 0:\r
- self.LoadIdfFiles(FileList)\r
+ for File in FileList:\r
+ if File is None:\r
+ EdkLogger.error("Image Definition File Parser", PARSER_ERROR, 'No Image definition file is given.')\r
+\r
+ try:\r
+ IdfFile = open(LongFilePath(File.Path), mode='r')\r
+ FileIn = IdfFile.read()\r
+ IdfFile.close()\r
+ except:\r
+ EdkLogger.error("build", FILE_OPEN_FAILURE, ExtraData=File)\r
+\r
+ ImageFileList = []\r
+ for Line in FileIn.splitlines():\r
+ Line = Line.strip()\r
+ Line = StripComments(Line)\r
+ if len(Line) == 0:\r
+ continue\r
\r
- def LoadIdfFiles(self, FileList):\r
- if len(FileList) > 0:\r
- for File in FileList:\r
- self.LoadIdfFile(File)\r
-\r
- def LoadIdfFile(self, File = None):\r
- if File == None:\r
- EdkLogger.error("Image Definition File Parser", PARSER_ERROR, 'No Image definition file is given.')\r
- self.File = File\r
-\r
- try:\r
- IdfFile = open(LongFilePath(File.Path), mode='r')\r
- FileIn = IdfFile.read()\r
- IdfFile.close()\r
- except:\r
- EdkLogger.error("build", FILE_OPEN_FAILURE, ExtraData=File)\r
-\r
- ImageFileList = []\r
- for Line in FileIn.splitlines():\r
- Line = Line.strip()\r
- Line = self.StripComments(Line)\r
- if len(Line) == 0:\r
- continue\r
-\r
- if Line.find('#image ') >= 0:\r
- LineDetails = Line.split()\r
LineNo = GetLineNo(FileIn, Line, False)\r
- Len = len(LineDetails)\r
- if Len != 3 and Len != 4:\r
- EdkLogger.error("Image Definition File Parser", PARSER_ERROR, 'The format is not match #image IMAGE_ID [TRANSPARENT] ImageFileName in Line %s of File %s.' % (LineNo, File.Path))\r
- if Len == 4 and LineDetails[2] != 'TRANSPARENT':\r
- EdkLogger.error("Image Definition File Parser", PARSER_ERROR, 'Please use the keyword "TRANSPARENT" to describe the transparency setting in Line %s of File %s.' % (LineNo, File.Path))\r
- MatchString = re.match('^[a-zA-Z][a-zA-Z0-9_]*$', LineDetails[1], re.UNICODE)\r
- if MatchString == None or MatchString.end(0) != len(LineDetails[1]):\r
- EdkLogger.error('Image Definition File Parser', FORMAT_INVALID, 'The Image token name %s defined in Idf file %s contains the invalid character.' % (LineDetails[1], File.Path))\r
- if LineDetails[1] not in self.ImageIDList:\r
- self.ImageIDList.append(LineDetails[1])\r
- else:\r
- EdkLogger.error("Image Definition File Parser", PARSER_ERROR, 'The %s in Line %s of File %s is already defined.' % (LineDetails[1], LineNo, File.Path))\r
- if Len == 4:\r
- ImageFile = ImageFileObject(LineDetails[Len-1], LineDetails[1], True)\r
- else:\r
- ImageFile = ImageFileObject(LineDetails[Len-1], LineDetails[1], False)\r
- ImageFileList.append(ImageFile)\r
- if ImageFileList:\r
- self.ImageFilesDict[File] = ImageFileList\r
-\r
- def StripComments(self, Line):\r
- Comment = '//'\r
- CommentPos = Line.find(Comment)\r
- while CommentPos >= 0:\r
- # if there are non matched quotes before the comment header\r
- # then we are in the middle of a string\r
- # but we need to ignore the escaped quotes and backslashes.\r
- if ((Line.count('"', 0, CommentPos) - Line.count('\\"', 0, CommentPos)) & 1) == 1:\r
- CommentPos = Line.find (Comment, CommentPos + 1)\r
- else:\r
- return Line[:CommentPos].strip()\r
- return Line.strip()\r
-\r
- def ImageDecoder(self, File):\r
- pass\r
+ if not Line.startswith('#image '):\r
+ EdkLogger.error("Image Definition File Parser", PARSER_ERROR, 'The %s in Line %s of File %s is invalid.' % (Line, LineNo, File.Path))\r
+\r
+ if Line.find('#image ') >= 0:\r
+ LineDetails = Line.split()\r
+ Len = len(LineDetails)\r
+ if Len != 3 and Len != 4:\r
+ EdkLogger.error("Image Definition File Parser", PARSER_ERROR, 'The format is not match #image IMAGE_ID [TRANSPARENT] ImageFileName in Line %s of File %s.' % (LineNo, File.Path))\r
+ if Len == 4 and LineDetails[2] != 'TRANSPARENT':\r
+ EdkLogger.error("Image Definition File Parser", PARSER_ERROR, 'Please use the keyword "TRANSPARENT" to describe the transparency setting in Line %s of File %s.' % (LineNo, File.Path))\r
+ MatchString = gIdentifierPattern.match(LineDetails[1])\r
+ if MatchString is None:\r
+ EdkLogger.error('Image Definition File Parser', FORMAT_INVALID, 'The Image token name %s defined in Idf file %s contains the invalid character.' % (LineDetails[1], File.Path))\r
+ if LineDetails[1] not in self.ImageIDList:\r
+ self.ImageIDList.append(LineDetails[1])\r
+ else:\r
+ EdkLogger.error("Image Definition File Parser", PARSER_ERROR, 'The %s in Line %s of File %s is already defined.' % (LineDetails[1], LineNo, File.Path))\r
+ if Len == 4:\r
+ ImageFile = ImageFileObject(LineDetails[Len-1], LineDetails[1], True)\r
+ else:\r
+ ImageFile = ImageFileObject(LineDetails[Len-1], LineDetails[1], False)\r
+ ImageFileList.append(ImageFile)\r
+ if ImageFileList:\r
+ self.ImageFilesDict[File] = ImageFileList\r
\r
def SearchImageID(ImageFileObject, FileList):\r
if FileList == []:\r