]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/Common/FdfParserLite.py
BaseTools: Remove equality operator with None
[mirror_edk2.git] / BaseTools / Source / Python / Common / FdfParserLite.py
CommitLineData
30fdf114
LG
1## @file\r
2# parse FDF file\r
3#\r
2eb370ff 4# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
30fdf114 5#\r
40d841f6 6# This program and the accompanying materials\r
30fdf114
LG
7# are licensed and made available under the terms and conditions of the BSD License\r
8# which accompanies this distribution. The full text of the license may be found at\r
9# http://opensource.org/licenses/bsd-license.php\r
10#\r
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13#\r
14\r
15##\r
16# Import Modules\r
17#\r
18import re\r
1be2ed90 19import Common.LongFilePathOs as os\r
30fdf114
LG
20\r
21import CommonDataClass.FdfClass\r
1be2ed90 22from Common.LongFilePathSupport import OpenLongFilePath as open\r
05cc51ad 23from Common.MultipleWorkspace import MultipleWorkspace as mws\r
2eb370ff 24from Common.RangeExpression import RangeExpression\r
b1a9e404 25from Common.GlobalData import *\r
30fdf114
LG
26\r
27##define T_CHAR_SPACE ' '\r
28##define T_CHAR_NULL '\0'\r
29##define T_CHAR_CR '\r'\r
30##define T_CHAR_TAB '\t'\r
31##define T_CHAR_LF '\n'\r
32##define T_CHAR_SLASH '/'\r
33##define T_CHAR_BACKSLASH '\\'\r
34##define T_CHAR_DOUBLE_QUOTE '\"'\r
35##define T_CHAR_SINGLE_QUOTE '\''\r
36##define T_CHAR_STAR '*'\r
37##define T_CHAR_HASH '#'\r
38\r
39(T_CHAR_SPACE, T_CHAR_NULL, T_CHAR_CR, T_CHAR_TAB, T_CHAR_LF, T_CHAR_SLASH, \\r
40T_CHAR_BACKSLASH, T_CHAR_DOUBLE_QUOTE, T_CHAR_SINGLE_QUOTE, T_CHAR_STAR, T_CHAR_HASH) = \\r
41(' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#')\r
42\r
43SEPERATOR_TUPLE = ('=', '|', ',', '{', '}') \r
44\r
45IncludeFileList = []\r
46# Macro passed from command line, which has greatest priority and can NOT be overridden by those in FDF\r
47InputMacroDict = {}\r
48# All Macro values when parsing file, not replace existing Macro\r
49AllMacroList = []\r
50\r
4d603daa
CJ
51FileExtensionPattern = re.compile(r'([a-zA-Z][a-zA-Z0-9]*)')\r
52\r
30fdf114
LG
53def GetRealFileLine (File, Line):\r
54 \r
55 InsertedLines = 0\r
56 for Profile in IncludeFileList:\r
57 if Line >= Profile.InsertStartLineNumber and Line < Profile.InsertStartLineNumber + Profile.InsertAdjust + len(Profile.FileLinesList):\r
58 return (Profile.FileName, Line - Profile.InsertStartLineNumber + 1)\r
59 if Line >= Profile.InsertStartLineNumber + Profile.InsertAdjust + len(Profile.FileLinesList):\r
60 InsertedLines += Profile.InsertAdjust + len(Profile.FileLinesList)\r
61 \r
62 return (File, Line - InsertedLines)\r
63\r
64## The exception class that used to report error messages when parsing FDF\r
65#\r
66# Currently the "ToolName" is set to be "FDF Parser".\r
67#\r
68class Warning (Exception):\r
69 ## The constructor\r
70 #\r
71 # @param self The object pointer\r
72 # @param Str The message to record\r
73 # @param File The FDF name\r
74 # @param Line The Line number that error occurs\r
75 #\r
47fea6af
YZ
76 def __init__(self, Str, File=None, Line=None):\r
77\r
30fdf114
LG
78 FileLineTuple = GetRealFileLine(File, Line)\r
79 self.FileName = FileLineTuple[0]\r
80 self.LineNumber = FileLineTuple[1]\r
81 self.message = Str + str(self.LineNumber)\r
82 self.ToolName = 'FDF Parser'\r
83 \r
84## The MACRO class that used to record macro value data when parsing include file\r
85#\r
86#\r
87class MacroProfile :\r
88 ## The constructor\r
89 #\r
90 # @param self The object pointer\r
91 # @param FileName The file that to be parsed\r
92 #\r
93 def __init__(self, FileName, Line):\r
94 self.FileName = FileName \r
95 self.DefinedAtLine = Line\r
96 self.MacroName = None\r
97 self.MacroValue = None\r
98\r
99## The Include file content class that used to record file data when parsing include file\r
100#\r
101# May raise Exception when opening file.\r
102#\r
103class IncludeFileProfile :\r
104 ## The constructor\r
105 #\r
106 # @param self The object pointer\r
107 # @param FileName The file that to be parsed\r
108 #\r
109 def __init__(self, FileName):\r
110 self.FileName = FileName\r
111 self.FileLinesList = []\r
112 try:\r
113 fsock = open(FileName, "rb", 0)\r
114 try:\r
115 self.FileLinesList = fsock.readlines()\r
116 finally:\r
117 fsock.close()\r
118\r
119 except IOError:\r
120 raise Warning("Error when opening file %s" % FileName)\r
121 \r
122 self.InsertStartLineNumber = None\r
123 self.InsertAdjust = 0\r
124\r
125## The FDF content class that used to record file data when parsing FDF\r
126#\r
127# May raise Exception when opening file.\r
128#\r
129class FileProfile :\r
130 ## The constructor\r
131 #\r
132 # @param self The object pointer\r
133 # @param FileName The file that to be parsed\r
134 #\r
135 def __init__(self, FileName):\r
136 self.FileLinesList = []\r
137 try:\r
138 fsock = open(FileName, "rb", 0)\r
139 try:\r
140 self.FileLinesList = fsock.readlines()\r
141 finally:\r
142 fsock.close()\r
143\r
144 except IOError:\r
145 raise Warning("Error when opening file %s" % FileName)\r
146 \r
147 self.PcdDict = {}\r
148 self.InfList = []\r
149 \r
150 self.PcdFileLineDict = {}\r
151 self.InfFileLineList = []\r
152 \r
153 self.FdDict = {}\r
154 self.FvDict = {}\r
155 self.CapsuleList = []\r
156# self.VtfList = []\r
157# self.RuleDict = {}\r
158\r
159## The syntax parser for FDF\r
160#\r
161# PreprocessFile method should be called prior to ParseFile\r
162# CycleReferenceCheck method can detect cycles in FDF contents\r
163#\r
164# GetNext*** procedures mean these procedures will get next token first, then make judgement.\r
165# Get*** procedures mean these procedures will make judgement on current token only.\r
166# \r
167class FdfParser(object):\r
168 ## The constructor\r
169 #\r
170 # @param self The object pointer\r
171 # @param FileName The file that to be parsed\r
172 #\r
173 def __init__(self, FileName):\r
174 self.Profile = FileProfile(FileName)\r
175 self.FileName = FileName\r
176 self.CurrentLineNumber = 1\r
177 self.CurrentOffsetWithinLine = 0\r
178 self.CurrentFdName = None\r
179 self.CurrentFvName = None\r
180 self.__Token = ""\r
181 self.__SkippedChars = ""\r
182 \r
183 self.__WipeOffArea = []\r
184\r
185 ## __IsWhiteSpace() method\r
186 #\r
187 # Whether char at current FileBufferPos is whitespace\r
188 #\r
189 # @param self The object pointer\r
190 # @param Char The char to test\r
191 # @retval True The char is a kind of white space\r
192 # @retval False The char is NOT a kind of white space\r
193 #\r
194 def __IsWhiteSpace(self, Char):\r
195 if Char in (T_CHAR_NULL, T_CHAR_CR, T_CHAR_SPACE, T_CHAR_TAB, T_CHAR_LF):\r
196 return True\r
197 else:\r
198 return False\r
199\r
200 ## __SkipWhiteSpace() method\r
201 #\r
202 # Skip white spaces from current char, return number of chars skipped\r
203 #\r
204 # @param self The object pointer\r
205 # @retval Count The number of chars skipped\r
206 #\r
207 def __SkipWhiteSpace(self):\r
208 Count = 0\r
209 while not self.__EndOfFile():\r
210 Count += 1\r
211 if self.__CurrentChar() in (T_CHAR_NULL, T_CHAR_CR, T_CHAR_LF, T_CHAR_SPACE, T_CHAR_TAB):\r
212 self.__SkippedChars += str(self.__CurrentChar())\r
213 self.__GetOneChar()\r
214\r
215 else:\r
216 Count = Count - 1\r
217 return Count\r
218\r
219 ## __EndOfFile() method\r
220 #\r
221 # Judge current buffer pos is at file end\r
222 #\r
223 # @param self The object pointer\r
224 # @retval True Current File buffer position is at file end\r
225 # @retval False Current File buffer position is NOT at file end\r
226 #\r
227 def __EndOfFile(self):\r
228 NumberOfLines = len(self.Profile.FileLinesList)\r
229 SizeOfLastLine = len(self.Profile.FileLinesList[-1])\r
230 if self.CurrentLineNumber == NumberOfLines and self.CurrentOffsetWithinLine >= SizeOfLastLine - 1:\r
231 return True\r
232 elif self.CurrentLineNumber > NumberOfLines:\r
233 return True\r
234 else:\r
235 return False\r
236\r
237 ## __EndOfLine() method\r
238 #\r
239 # Judge current buffer pos is at line end\r
240 #\r
241 # @param self The object pointer\r
242 # @retval True Current File buffer position is at line end\r
243 # @retval False Current File buffer position is NOT at line end\r
244 #\r
245 def __EndOfLine(self):\r
246 if self.CurrentLineNumber > len(self.Profile.FileLinesList):\r
247 return True\r
248 SizeOfCurrentLine = len(self.Profile.FileLinesList[self.CurrentLineNumber - 1])\r
249 if self.CurrentOffsetWithinLine >= SizeOfCurrentLine:\r
250 return True\r
251 else:\r
252 return False\r
253 \r
254 ## Rewind() method\r
255 #\r
256 # Reset file data buffer to the initial state\r
257 #\r
258 # @param self The object pointer\r
259 #\r
260 def Rewind(self):\r
261 self.CurrentLineNumber = 1\r
262 self.CurrentOffsetWithinLine = 0\r
263 \r
264 ## __UndoOneChar() method\r
265 #\r
266 # Go back one char in the file buffer\r
267 #\r
268 # @param self The object pointer\r
269 # @retval True Successfully go back one char\r
270 # @retval False Not able to go back one char as file beginning reached\r
271 # \r
272 def __UndoOneChar(self):\r
273 \r
274 if self.CurrentLineNumber == 1 and self.CurrentOffsetWithinLine == 0:\r
275 return False\r
276 elif self.CurrentOffsetWithinLine == 0:\r
277 self.CurrentLineNumber -= 1\r
278 self.CurrentOffsetWithinLine = len(self.__CurrentLine()) - 1\r
279 else:\r
280 self.CurrentOffsetWithinLine -= 1\r
281 return True\r
282 \r
283 ## __GetOneChar() method\r
284 #\r
285 # Move forward one char in the file buffer\r
286 #\r
287 # @param self The object pointer\r
288 # \r
289 def __GetOneChar(self):\r
290 if self.CurrentOffsetWithinLine == len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) - 1:\r
291 self.CurrentLineNumber += 1\r
292 self.CurrentOffsetWithinLine = 0\r
293 else:\r
294 self.CurrentOffsetWithinLine += 1\r
295\r
296 ## __CurrentChar() method\r
297 #\r
298 # Get the char pointed to by the file buffer pointer\r
299 #\r
300 # @param self The object pointer\r
301 # @retval Char Current char\r
302 # \r
303 def __CurrentChar(self):\r
304 return self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine]\r
305 \r
306 ## __NextChar() method\r
307 #\r
308 # Get the one char pass the char pointed to by the file buffer pointer\r
309 #\r
310 # @param self The object pointer\r
311 # @retval Char Next char\r
312 #\r
313 def __NextChar(self):\r
314 if self.CurrentOffsetWithinLine == len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) - 1:\r
315 return self.Profile.FileLinesList[self.CurrentLineNumber][0]\r
316 else:\r
317 return self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine + 1]\r
318 \r
319 ## __SetCurrentCharValue() method\r
320 #\r
321 # Modify the value of current char\r
322 #\r
323 # @param self The object pointer\r
324 # @param Value The new value of current char\r
325 #\r
326 def __SetCurrentCharValue(self, Value):\r
327 self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine] = Value\r
328 \r
329 ## __CurrentLine() method\r
330 #\r
331 # Get the list that contains current line contents\r
332 #\r
333 # @param self The object pointer\r
334 # @retval List current line contents\r
335 #\r
336 def __CurrentLine(self):\r
337 return self.Profile.FileLinesList[self.CurrentLineNumber - 1]\r
338 \r
339 def __StringToList(self):\r
340 self.Profile.FileLinesList = [list(s) for s in self.Profile.FileLinesList]\r
341 self.Profile.FileLinesList[-1].append(' ')\r
342\r
343 def __ReplaceMacros(self, Str, File, Line):\r
344 MacroEnd = 0\r
345 while Str.find('$(', MacroEnd) >= 0:\r
346 MacroStart = Str.find('$(', MacroEnd)\r
347 if Str.find(')', MacroStart) > 0:\r
348 MacroEnd = Str.find(')', MacroStart)\r
349 Name = Str[MacroStart + 2 : MacroEnd]\r
350 Value = None\r
351 if Name in InputMacroDict:\r
352 Value = InputMacroDict[Name]\r
353 \r
354 else:\r
355 for Profile in AllMacroList:\r
356 if Profile.FileName == File and Profile.MacroName == Name and Profile.DefinedAtLine <= Line:\r
357 Value = Profile.MacroValue\r
358 \r
4231a819 359 if Value is not None:\r
30fdf114
LG
360 Str = Str.replace('$(' + Name + ')', Value)\r
361 MacroEnd = MacroStart + len(Value) \r
362 \r
363 else:\r
364 raise Warning("Macro not complete At Line ", self.FileName, self.CurrentLineNumber)\r
365 return Str\r
47fea6af
YZ
366\r
367 def __ReplaceFragment(self, StartPos, EndPos, Value=' '):\r
30fdf114
LG
368 if StartPos[0] == EndPos[0]:\r
369 Offset = StartPos[1]\r
370 while Offset <= EndPos[1]:\r
371 self.Profile.FileLinesList[StartPos[0]][Offset] = Value\r
372 Offset += 1\r
373 return\r
374 \r
375 Offset = StartPos[1]\r
376 while self.Profile.FileLinesList[StartPos[0]][Offset] not in ('\r', '\n'):\r
377 self.Profile.FileLinesList[StartPos[0]][Offset] = Value\r
378 Offset += 1\r
379 \r
380 Line = StartPos[0]\r
381 while Line < EndPos[0]:\r
382 Offset = 0\r
383 while self.Profile.FileLinesList[Line][Offset] not in ('\r', '\n'):\r
384 self.Profile.FileLinesList[Line][Offset] = Value\r
385 Offset += 1\r
386 Line += 1\r
387 \r
388 Offset = 0\r
389 while Offset <= EndPos[1]:\r
390 self.Profile.FileLinesList[EndPos[0]][Offset] = Value\r
391 Offset += 1\r
d5d56f1b
LG
392\r
393\r
394 def __GetMacroName(self):\r
395 if not self.__GetNextToken():\r
396 raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber)\r
397 MacroName = self.__Token\r
398 NotFlag = False\r
399 if MacroName.startswith('!'):\r
400 NotFlag = True\r
401 MacroName = MacroName[1:].strip()\r
402 \r
403 if not MacroName.startswith('$(') or not MacroName.endswith(')'):\r
404 raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName},\r
405 self.FileName, self.CurrentLineNumber)\r
406 MacroName = MacroName[2:-1]\r
407 return MacroName, NotFlag\r
30fdf114
LG
408 \r
409 ## PreprocessFile() method\r
410 #\r
411 # Preprocess file contents, replace comments with spaces.\r
412 # In the end, rewind the file buffer pointer to the beginning\r
413 # BUGBUG: No !include statement processing contained in this procedure\r
414 # !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]\r
415 #\r
416 # @param self The object pointer\r
417 # \r
418 def PreprocessFile(self):\r
419 \r
420 self.Rewind()\r
421 InComment = False\r
422 DoubleSlashComment = False\r
423 HashComment = False\r
424 # HashComment in quoted string " " is ignored.\r
425 InString = False \r
426 \r
427 while not self.__EndOfFile():\r
428 \r
429 if self.__CurrentChar() == T_CHAR_DOUBLE_QUOTE and not InComment:\r
430 InString = not InString\r
431 # meet new line, then no longer in a comment for // and '#'\r
432 if self.__CurrentChar() == T_CHAR_LF:\r
433 self.CurrentLineNumber += 1\r
434 self.CurrentOffsetWithinLine = 0\r
435 if InComment and DoubleSlashComment:\r
436 InComment = False\r
437 DoubleSlashComment = False\r
438 if InComment and HashComment:\r
439 InComment = False\r
440 HashComment = False\r
441 # check for */ comment end\r
442 elif InComment and not DoubleSlashComment and not HashComment and self.__CurrentChar() == T_CHAR_STAR and self.__NextChar() == T_CHAR_SLASH:\r
443 self.__SetCurrentCharValue(T_CHAR_SPACE)\r
444 self.__GetOneChar()\r
445 self.__SetCurrentCharValue(T_CHAR_SPACE)\r
446 self.__GetOneChar()\r
447 InComment = False\r
448 # set comments to spaces\r
449 elif InComment:\r
450 self.__SetCurrentCharValue(T_CHAR_SPACE)\r
451 self.__GetOneChar()\r
452 # check for // comment\r
453 elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_SLASH and not self.__EndOfLine():\r
454 InComment = True\r
455 DoubleSlashComment = True\r
456 # check for '#' comment\r
457 elif self.__CurrentChar() == T_CHAR_HASH and not self.__EndOfLine() and not InString:\r
458 InComment = True\r
459 HashComment = True\r
460 # check for /* comment start\r
461 elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_STAR:\r
462 self.__SetCurrentCharValue( T_CHAR_SPACE)\r
463 self.__GetOneChar()\r
464 self.__SetCurrentCharValue( T_CHAR_SPACE)\r
465 self.__GetOneChar()\r
466 InComment = True\r
467 else:\r
468 self.__GetOneChar()\r
469 \r
470 # restore from ListOfList to ListOfString\r
471 self.Profile.FileLinesList = ["".join(list) for list in self.Profile.FileLinesList]\r
472 self.Rewind()\r
473\r
474 ## PreprocessIncludeFile() method\r
475 #\r
476 # Preprocess file contents, replace !include statements with file contents.\r
477 # In the end, rewind the file buffer pointer to the beginning\r
478 #\r
479 # @param self The object pointer\r
480 # \r
481 def PreprocessIncludeFile(self):\r
482 \r
483 while self.__GetNextToken():\r
484 \r
485 if self.__Token == '!include':\r
486 IncludeLine = self.CurrentLineNumber\r
487 IncludeOffset = self.CurrentOffsetWithinLine - len('!include')\r
488 if not self.__GetNextToken():\r
489 raise Warning("expected include file name At Line ", self.FileName, self.CurrentLineNumber)\r
490 IncFileName = self.__Token\r
491 if not os.path.isabs(IncFileName):\r
492 if IncFileName.startswith('$(WORKSPACE)'):\r
05cc51ad
LY
493 Str = mws.handleWsMacro(IncFileName)\r
494 Str = Str.replace('$(WORKSPACE)', os.environ.get('WORKSPACE'))\r
30fdf114
LG
495 if os.path.exists(Str):\r
496 if not os.path.isabs(Str):\r
497 Str = os.path.abspath(Str)\r
498 IncFileName = Str\r
499 else:\r
500 # file is in the same dir with FDF file\r
501 FullFdf = self.FileName\r
502 if not os.path.isabs(self.FileName):\r
05cc51ad 503 FullFdf = mws.join(os.environ.get('WORKSPACE'), self.FileName)\r
30fdf114
LG
504 \r
505 IncFileName = os.path.join(os.path.dirname(FullFdf), IncFileName)\r
506 \r
507 if not os.path.exists(os.path.normpath(IncFileName)):\r
508 raise Warning("Include file not exists At Line ", self.FileName, self.CurrentLineNumber)\r
509 \r
510 IncFileProfile = IncludeFileProfile(os.path.normpath(IncFileName))\r
511 \r
512 CurrentLine = self.CurrentLineNumber\r
513 CurrentOffset = self.CurrentOffsetWithinLine\r
514 # list index of the insertion, note that line number is 'CurrentLine + 1'\r
515 InsertAtLine = CurrentLine\r
516 IncFileProfile.InsertStartLineNumber = InsertAtLine + 1\r
517 # deal with remaining portions after "!include filename", if exists.\r
518 if self.__GetNextToken():\r
519 if self.CurrentLineNumber == CurrentLine:\r
520 RemainingLine = self.__CurrentLine()[CurrentOffset:]\r
521 self.Profile.FileLinesList.insert(self.CurrentLineNumber, RemainingLine)\r
522 IncFileProfile.InsertAdjust += 1\r
523 self.CurrentLineNumber += 1\r
524 self.CurrentOffsetWithinLine = 0\r
525 \r
526 for Line in IncFileProfile.FileLinesList:\r
527 self.Profile.FileLinesList.insert(InsertAtLine, Line)\r
528 self.CurrentLineNumber += 1\r
529 InsertAtLine += 1 \r
530 \r
531 IncludeFileList.append(IncFileProfile)\r
532 \r
533 # comment out the processed include file statement\r
534 TempList = list(self.Profile.FileLinesList[IncludeLine - 1])\r
535 TempList.insert(IncludeOffset, '#')\r
536 self.Profile.FileLinesList[IncludeLine - 1] = ''.join(TempList)\r
537 \r
538 self.Rewind()\r
539\r
540 ## PreprocessIncludeFile() method\r
541 #\r
542 # Preprocess file contents, replace !include statements with file contents.\r
543 # In the end, rewind the file buffer pointer to the beginning\r
544 #\r
545 # @param self The object pointer\r
546 # \r
547 def PreprocessConditionalStatement(self):\r
548 # IfList is a stack of if branches with elements of list [Pos, CondSatisfied, BranchDetermined]\r
549 IfList = []\r
550 while self.__GetNextToken():\r
551 if self.__Token == 'DEFINE':\r
552 DefineLine = self.CurrentLineNumber - 1\r
553 DefineOffset = self.CurrentOffsetWithinLine - len('DEFINE')\r
554 if not self.__GetNextToken():\r
555 raise Warning("expected Macro name At Line ", self.FileName, self.CurrentLineNumber)\r
556 Macro = self.__Token\r
557 if not self.__IsToken( "="):\r
558 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
559 \r
560 if not self.__GetNextToken():\r
561 raise Warning("expected value At Line ", self.FileName, self.CurrentLineNumber)\r
562 \r
563 if self.__GetStringData():\r
564 pass\r
565 Value = self.__Token\r
566 if not Macro in InputMacroDict:\r
567 FileLineTuple = GetRealFileLine(self.FileName, DefineLine + 1)\r
568 MacProfile = MacroProfile(FileLineTuple[0], FileLineTuple[1])\r
569 MacProfile.MacroName = Macro\r
570 MacProfile.MacroValue = Value\r
571 AllMacroList.append(MacProfile)\r
572 self.__WipeOffArea.append(((DefineLine, DefineOffset), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
573 \r
574 elif self.__Token in ('!ifdef', '!ifndef', '!if'):\r
575 IfStartPos = (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len(self.__Token))\r
576 IfList.append([IfStartPos, None, None])\r
577 CondLabel = self.__Token\r
578 \r
d5d56f1b 579 MacroName, NotFlag = self.__GetMacroName() \r
30fdf114
LG
580 NotDefineFlag = False\r
581 if CondLabel == '!ifndef':\r
582 NotDefineFlag = True\r
583 if CondLabel == '!ifdef' or CondLabel == '!ifndef':\r
584 if NotFlag:\r
585 raise Warning("'NOT' operation not allowed for Macro name At Line ", self.FileName, self.CurrentLineNumber)\r
586 \r
587 if CondLabel == '!if':\r
588 \r
589 if not self.__GetNextOp():\r
590 raise Warning("expected !endif At Line ", self.FileName, self.CurrentLineNumber)\r
591 \r
592 if self.__Token in ('!=', '==', '>', '<', '>=', '<='):\r
593 Op = self.__Token\r
594 if not self.__GetNextToken():\r
595 raise Warning("expected value At Line ", self.FileName, self.CurrentLineNumber)\r
596 if self.__GetStringData():\r
597 pass\r
598 MacroValue = self.__Token\r
599 ConditionSatisfied = self.__EvaluateConditional(MacroName, IfList[-1][0][0] + 1, Op, MacroValue)\r
600 if NotFlag:\r
601 ConditionSatisfied = not ConditionSatisfied\r
602 BranchDetermined = ConditionSatisfied\r
603 else:\r
604 self.CurrentOffsetWithinLine -= len(self.__Token) \r
605 ConditionSatisfied = self.__EvaluateConditional(MacroName, IfList[-1][0][0] + 1, None, 'Bool')\r
606 if NotFlag:\r
607 ConditionSatisfied = not ConditionSatisfied\r
608 BranchDetermined = ConditionSatisfied\r
609 IfList[-1] = [IfList[-1][0], ConditionSatisfied, BranchDetermined]\r
610 if ConditionSatisfied:\r
611 self.__WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
612 \r
613 else:\r
614 ConditionSatisfied = self.__EvaluateConditional(MacroName, IfList[-1][0][0] + 1)\r
615 if NotDefineFlag:\r
616 ConditionSatisfied = not ConditionSatisfied\r
617 BranchDetermined = ConditionSatisfied\r
618 IfList[-1] = [IfList[-1][0], ConditionSatisfied, BranchDetermined]\r
619 if ConditionSatisfied:\r
620 self.__WipeOffArea.append((IfStartPos, (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
621 \r
622 elif self.__Token in ('!elseif', '!else'):\r
623 ElseStartPos = (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len(self.__Token))\r
624 if len(IfList) <= 0:\r
625 raise Warning("Missing !if statement At Line ", self.FileName, self.CurrentLineNumber)\r
626 if IfList[-1][1]:\r
627 IfList[-1] = [ElseStartPos, False, True]\r
628 self.__WipeOffArea.append((ElseStartPos, (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
629 else:\r
630 self.__WipeOffArea.append((IfList[-1][0], ElseStartPos))\r
631 IfList[-1] = [ElseStartPos, True, IfList[-1][2]]\r
632 if self.__Token == '!elseif':\r
d5d56f1b 633 MacroName, NotFlag = self.__GetMacroName() \r
30fdf114
LG
634 if not self.__GetNextOp():\r
635 raise Warning("expected !endif At Line ", self.FileName, self.CurrentLineNumber)\r
636 \r
637 if self.__Token in ('!=', '==', '>', '<', '>=', '<='):\r
638 Op = self.__Token\r
639 if not self.__GetNextToken():\r
640 raise Warning("expected value At Line ", self.FileName, self.CurrentLineNumber)\r
641 if self.__GetStringData():\r
642 pass\r
643 MacroValue = self.__Token\r
644 ConditionSatisfied = self.__EvaluateConditional(MacroName, IfList[-1][0][0] + 1, Op, MacroValue)\r
645 if NotFlag:\r
646 ConditionSatisfied = not ConditionSatisfied\r
647\r
648 else:\r
649 self.CurrentOffsetWithinLine -= len(self.__Token) \r
650 ConditionSatisfied = self.__EvaluateConditional(MacroName, IfList[-1][0][0] + 1, None, 'Bool')\r
651 if NotFlag:\r
652 ConditionSatisfied = not ConditionSatisfied\r
653\r
654 IfList[-1] = [IfList[-1][0], ConditionSatisfied, IfList[-1][2]]\r
655 \r
656 if IfList[-1][1]:\r
657 if IfList[-1][2]:\r
658 IfList[-1][1] = False\r
659 else:\r
660 IfList[-1][2] = True\r
661 self.__WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
662\r
663 \r
664 elif self.__Token == '!endif':\r
665 if IfList[-1][1]:\r
666 self.__WipeOffArea.append(((self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len('!endif')), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
667 else:\r
668 self.__WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
669 \r
670 IfList.pop()\r
671 \r
672 \r
673 if len(IfList) > 0:\r
674 raise Warning("Missing !endif At Line ", self.FileName, self.CurrentLineNumber)\r
675 self.Rewind()\r
676\r
677 def __EvaluateConditional(self, Name, Line, Op = None, Value = None):\r
678 \r
679 FileLineTuple = GetRealFileLine(self.FileName, Line)\r
680 if Name in InputMacroDict:\r
681 MacroValue = InputMacroDict[Name]\r
4231a819
CJ
682 if Op is None:\r
683 if Value == 'Bool' and MacroValue is None or MacroValue.upper() == 'FALSE':\r
30fdf114
LG
684 return False\r
685 return True\r
686 elif Op == '!=':\r
687 if Value != MacroValue:\r
688 return True\r
689 else:\r
690 return False\r
691 elif Op == '==':\r
692 if Value == MacroValue:\r
693 return True\r
694 else:\r
695 return False\r
696 else:\r
4231a819 697 if (self.__IsHex(Value) or Value.isdigit()) and (self.__IsHex(MacroValue) or (MacroValue is not None and MacroValue.isdigit())):\r
30fdf114
LG
698 InputVal = long(Value, 0)\r
699 MacroVal = long(MacroValue, 0)\r
700 if Op == '>':\r
701 if MacroVal > InputVal:\r
702 return True\r
703 else:\r
704 return False\r
705 elif Op == '>=':\r
706 if MacroVal >= InputVal:\r
707 return True\r
708 else:\r
709 return False\r
710 elif Op == '<':\r
711 if MacroVal < InputVal:\r
712 return True\r
713 else:\r
714 return False\r
715 elif Op == '<=':\r
716 if MacroVal <= InputVal:\r
717 return True\r
718 else:\r
719 return False\r
720 else:\r
721 return False\r
722 else:\r
723 raise Warning("Value %s is not a number At Line ", self.FileName, Line)\r
724 \r
725 for Profile in AllMacroList:\r
726 if Profile.FileName == FileLineTuple[0] and Profile.MacroName == Name and Profile.DefinedAtLine <= FileLineTuple[1]:\r
4231a819
CJ
727 if Op is None:\r
728 if Value == 'Bool' and Profile.MacroValue is None or Profile.MacroValue.upper() == 'FALSE':\r
30fdf114
LG
729 return False\r
730 return True\r
731 elif Op == '!=':\r
732 if Value != Profile.MacroValue:\r
733 return True\r
734 else:\r
735 return False\r
736 elif Op == '==':\r
737 if Value == Profile.MacroValue:\r
738 return True\r
739 else:\r
740 return False\r
741 else:\r
4231a819 742 if (self.__IsHex(Value) or Value.isdigit()) and (self.__IsHex(Profile.MacroValue) or (Profile.MacroValue is not None and Profile.MacroValue.isdigit())):\r
30fdf114
LG
743 InputVal = long(Value, 0)\r
744 MacroVal = long(Profile.MacroValue, 0)\r
745 if Op == '>':\r
746 if MacroVal > InputVal:\r
747 return True\r
748 else:\r
749 return False\r
750 elif Op == '>=':\r
751 if MacroVal >= InputVal:\r
752 return True\r
753 else:\r
754 return False\r
755 elif Op == '<':\r
756 if MacroVal < InputVal:\r
757 return True\r
758 else:\r
759 return False\r
760 elif Op == '<=':\r
761 if MacroVal <= InputVal:\r
762 return True\r
763 else:\r
764 return False\r
765 else:\r
766 return False\r
767 else:\r
768 raise Warning("Value %s is not a number At Line ", self.FileName, Line)\r
769 \r
770 return False\r
771\r
772 ## __IsToken() method\r
773 #\r
774 # Check whether input string is found from current char position along\r
775 # If found, the string value is put into self.__Token\r
776 #\r
777 # @param self The object pointer\r
778 # @param String The string to search\r
779 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive\r
780 # @retval True Successfully find string, file buffer pointer moved forward\r
781 # @retval False Not able to find string, file buffer pointer not changed\r
782 #\r
783 def __IsToken(self, String, IgnoreCase = False):\r
784 self.__SkipWhiteSpace()\r
785\r
786 # Only consider the same line, no multi-line token allowed\r
787 StartPos = self.CurrentOffsetWithinLine\r
788 index = -1\r
789 if IgnoreCase:\r
790 index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].upper().find(String.upper()) \r
791 else:\r
792 index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].find(String)\r
793 if index == 0:\r
794 self.CurrentOffsetWithinLine += len(String)\r
795 self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]\r
796 return True\r
797 return False\r
798\r
799 ## __IsKeyword() method\r
800 #\r
801 # Check whether input keyword is found from current char position along, whole word only!\r
802 # If found, the string value is put into self.__Token\r
803 #\r
804 # @param self The object pointer\r
805 # @param Keyword The string to search\r
806 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive\r
807 # @retval True Successfully find string, file buffer pointer moved forward\r
808 # @retval False Not able to find string, file buffer pointer not changed\r
809 #\r
810 def __IsKeyword(self, KeyWord, IgnoreCase = False):\r
811 self.__SkipWhiteSpace()\r
812\r
813 # Only consider the same line, no multi-line token allowed\r
814 StartPos = self.CurrentOffsetWithinLine\r
815 index = -1\r
816 if IgnoreCase:\r
817 index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].upper().find(KeyWord.upper()) \r
818 else:\r
819 index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].find(KeyWord)\r
820 if index == 0:\r
821 followingChar = self.__CurrentLine()[self.CurrentOffsetWithinLine + len(KeyWord)]\r
822 if not str(followingChar).isspace() and followingChar not in SEPERATOR_TUPLE:\r
823 return False\r
824 self.CurrentOffsetWithinLine += len(KeyWord)\r
825 self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]\r
826 return True\r
827 return False\r
828\r
829 ## __GetNextWord() method\r
830 #\r
831 # Get next C name from file lines\r
832 # If found, the string value is put into self.__Token\r
833 #\r
834 # @param self The object pointer\r
835 # @retval True Successfully find a C name string, file buffer pointer moved forward\r
836 # @retval False Not able to find a C name string, file buffer pointer not changed\r
837 #\r
838 def __GetNextWord(self):\r
839 self.__SkipWhiteSpace()\r
840 if self.__EndOfFile():\r
841 return False\r
842 \r
843 TempChar = self.__CurrentChar()\r
844 StartPos = self.CurrentOffsetWithinLine\r
845 if (TempChar >= 'a' and TempChar <= 'z') or (TempChar >= 'A' and TempChar <= 'Z') or TempChar == '_':\r
846 self.__GetOneChar()\r
847 while not self.__EndOfLine():\r
848 TempChar = self.__CurrentChar()\r
849 if (TempChar >= 'a' and TempChar <= 'z') or (TempChar >= 'A' and TempChar <= 'Z') \\r
850 or (TempChar >= '0' and TempChar <= '9') or TempChar == '_' or TempChar == '-':\r
851 self.__GetOneChar()\r
852 \r
853 else:\r
854 break\r
855\r
856 self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]\r
857 return True\r
858 \r
859 return False\r
860 \r
861 ## __GetNextToken() method\r
862 #\r
863 # Get next token unit before a seperator\r
864 # If found, the string value is put into self.__Token\r
865 #\r
866 # @param self The object pointer\r
867 # @retval True Successfully find a token unit, file buffer pointer moved forward\r
868 # @retval False Not able to find a token unit, file buffer pointer not changed\r
869 #\r
870 def __GetNextToken(self):\r
871 # Skip leading spaces, if exist.\r
872 self.__SkipWhiteSpace()\r
873 if self.__EndOfFile():\r
874 return False\r
875 # Record the token start position, the position of the first non-space char.\r
876 StartPos = self.CurrentOffsetWithinLine\r
877 StartLine = self.CurrentLineNumber\r
878 while not self.__EndOfLine():\r
879 TempChar = self.__CurrentChar()\r
880 # Try to find the end char that is not a space and not in seperator tuple.\r
881 # That is, when we got a space or any char in the tuple, we got the end of token.\r
882 if not str(TempChar).isspace() and TempChar not in SEPERATOR_TUPLE:\r
883 self.__GetOneChar()\r
884 # if we happen to meet a seperator as the first char, we must proceed to get it.\r
885 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.\r
886 elif StartPos == self.CurrentOffsetWithinLine and TempChar in SEPERATOR_TUPLE:\r
887 self.__GetOneChar()\r
888 break\r
889 else:\r
890 break\r
891# else:\r
892# return False\r
893\r
894 EndPos = self.CurrentOffsetWithinLine\r
895 if self.CurrentLineNumber != StartLine:\r
896 EndPos = len(self.Profile.FileLinesList[StartLine-1])\r
897 self.__Token = self.Profile.FileLinesList[StartLine-1][StartPos : EndPos]\r
898 if StartPos != self.CurrentOffsetWithinLine:\r
899 return True\r
900 else:\r
901 return False\r
902 \r
903 def __GetNextOp(self):\r
904 # Skip leading spaces, if exist.\r
905 self.__SkipWhiteSpace()\r
906 if self.__EndOfFile():\r
907 return False\r
908 # Record the token start position, the position of the first non-space char.\r
909 StartPos = self.CurrentOffsetWithinLine\r
910 while not self.__EndOfLine():\r
911 TempChar = self.__CurrentChar()\r
912 # Try to find the end char that is not a space\r
913 if not str(TempChar).isspace():\r
914 self.__GetOneChar()\r
915 else:\r
916 break\r
917 else:\r
918 return False\r
919 \r
920 if StartPos != self.CurrentOffsetWithinLine:\r
921 self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]\r
922 return True\r
923 else:\r
924 return False\r
925 ## __GetNextGuid() method\r
926 #\r
927 # Get next token unit before a seperator\r
928 # If found, the GUID string is put into self.__Token\r
929 #\r
930 # @param self The object pointer\r
931 # @retval True Successfully find a registry format GUID, file buffer pointer moved forward\r
932 # @retval False Not able to find a registry format GUID, file buffer pointer not changed\r
933 #\r
934 def __GetNextGuid(self):\r
935 \r
936 if not self.__GetNextToken():\r
937 return False\r
4231a819 938 if gGuidPattern.match(self.__Token) is not None:\r
30fdf114
LG
939 return True\r
940 else:\r
941 self.__UndoToken()\r
942 return False\r
943\r
944 ## __UndoToken() method\r
945 #\r
946 # Go back one token unit in file buffer\r
947 #\r
948 # @param self The object pointer\r
949 #\r
950 def __UndoToken(self):\r
951 self.__UndoOneChar()\r
952 while self.__CurrentChar().isspace():\r
953 if not self.__UndoOneChar():\r
954 self.__GetOneChar()\r
955 return\r
956 \r
957 \r
958 StartPos = self.CurrentOffsetWithinLine\r
959 CurrentLine = self.CurrentLineNumber\r
960 while CurrentLine == self.CurrentLineNumber:\r
961 \r
962 TempChar = self.__CurrentChar()\r
963 # Try to find the end char that is not a space and not in seperator tuple.\r
964 # That is, when we got a space or any char in the tuple, we got the end of token.\r
965 if not str(TempChar).isspace() and not TempChar in SEPERATOR_TUPLE:\r
966 if not self.__UndoOneChar():\r
967 break\r
968 # if we happen to meet a seperator as the first char, we must proceed to get it.\r
969 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.\r
970 elif StartPos == self.CurrentOffsetWithinLine and TempChar in SEPERATOR_TUPLE:\r
971 return\r
972 else:\r
973 break\r
974 \r
975 self.__GetOneChar()\r
976 \r
977 ## __HexDigit() method\r
978 #\r
979 # Whether char input is a Hex data bit\r
980 #\r
981 # @param self The object pointer\r
982 # @param TempChar The char to test\r
983 # @retval True The char is a Hex data bit\r
984 # @retval False The char is NOT a Hex data bit\r
985 #\r
986 def __HexDigit(self, TempChar):\r
987 if (TempChar >= 'a' and TempChar <= 'f') or (TempChar >= 'A' and TempChar <= 'F') \\r
988 or (TempChar >= '0' and TempChar <= '9'):\r
989 return True\r
990 else:\r
991 return False\r
992 \r
993 def __IsHex(self, HexStr):\r
994 if not HexStr.upper().startswith("0X"):\r
995 return False\r
996 if len(self.__Token) <= 2:\r
997 return False\r
998 charList = [c for c in HexStr[2 : ] if not self.__HexDigit( c)]\r
999 if len(charList) == 0:\r
1000 return True\r
1001 else:\r
1002 return False \r
1003 ## __GetNextHexNumber() method\r
1004 #\r
1005 # Get next HEX data before a seperator\r
1006 # If found, the HEX data is put into self.__Token\r
1007 #\r
1008 # @param self The object pointer\r
1009 # @retval True Successfully find a HEX data, file buffer pointer moved forward\r
1010 # @retval False Not able to find a HEX data, file buffer pointer not changed\r
1011 #\r
1012 def __GetNextHexNumber(self):\r
1013 if not self.__GetNextToken():\r
1014 return False\r
1015 if self.__IsHex(self.__Token):\r
1016 return True\r
1017 else:\r
1018 self.__UndoToken()\r
1019 return False\r
1020 \r
1021 ## __GetNextDecimalNumber() method\r
1022 #\r
1023 # Get next decimal data before a seperator\r
1024 # If found, the decimal data is put into self.__Token\r
1025 #\r
1026 # @param self The object pointer\r
1027 # @retval True Successfully find a decimal data, file buffer pointer moved forward\r
1028 # @retval False Not able to find a decimal data, file buffer pointer not changed\r
1029 #\r
1030 def __GetNextDecimalNumber(self):\r
1031 if not self.__GetNextToken():\r
1032 return False\r
1033 if self.__Token.isdigit():\r
1034 return True\r
1035 else:\r
1036 self.__UndoToken()\r
1037 return False\r
1038 \r
1039 ## __GetNextPcdName() method\r
1040 #\r
1041 # Get next PCD token space C name and PCD C name pair before a seperator\r
1042 # If found, the decimal data is put into self.__Token\r
1043 #\r
1044 # @param self The object pointer\r
1045 # @retval Tuple PCD C name and PCD token space C name pair \r
1046 #\r
1047 def __GetNextPcdName(self):\r
1048 if not self.__GetNextWord():\r
1049 raise Warning("expected PcdTokenSpaceCName.PcdCName At Line ", self.FileName, self.CurrentLineNumber)\r
1050 pcdTokenSpaceCName = self.__Token\r
1051 \r
1052 if not self.__IsToken( "."):\r
1053 raise Warning("expected PcdTokenSpaceCName.PcdCName At Line ", self.FileName, self.CurrentLineNumber)\r
1054 \r
1055 if not self.__GetNextWord():\r
1056 raise Warning("expected PcdTokenSpaceCName.PcdCName At Line ", self.FileName, self.CurrentLineNumber)\r
1057 pcdCName = self.__Token\r
1058 \r
1059 return (pcdCName, pcdTokenSpaceCName) \r
1060 \r
1061 ## __GetStringData() method\r
1062 #\r
1063 # Get string contents quoted in ""\r
1064 # If found, the decimal data is put into self.__Token\r
1065 #\r
1066 # @param self The object pointer\r
1067 # @retval True Successfully find a string data, file buffer pointer moved forward\r
1068 # @retval False Not able to find a string data, file buffer pointer not changed\r
1069 # \r
1070 def __GetStringData(self):\r
1071 if self.__Token.startswith("\"") or self.__Token.startswith("L\""):\r
1072 self.__UndoToken()\r
1073 self.__SkipToToken("\"")\r
1074 currentLineNumber = self.CurrentLineNumber\r
1075 \r
1076 if not self.__SkipToToken("\""):\r
1077 raise Warning("Missing Quote \" for String At Line ", self.FileName, self.CurrentLineNumber)\r
1078 if currentLineNumber != self.CurrentLineNumber:\r
1079 raise Warning("Missing Quote \" for String At Line ", self.FileName, self.CurrentLineNumber)\r
1080 self.__Token = self.__SkippedChars.rstrip('\"')\r
1081 return True\r
1082 \r
1083 elif self.__Token.startswith("\'") or self.__Token.startswith("L\'"):\r
1084 self.__UndoToken()\r
1085 self.__SkipToToken("\'")\r
1086 currentLineNumber = self.CurrentLineNumber\r
1087 \r
1088 if not self.__SkipToToken("\'"):\r
1089 raise Warning("Missing Quote \' for String At Line ", self.FileName, self.CurrentLineNumber)\r
1090 if currentLineNumber != self.CurrentLineNumber:\r
1091 raise Warning("Missing Quote \' for String At Line ", self.FileName, self.CurrentLineNumber)\r
1092 self.__Token = self.__SkippedChars.rstrip('\'')\r
1093 return True\r
1094 \r
1095 else:\r
1096 return False\r
1097 \r
1098 ## __SkipToToken() method\r
1099 #\r
1100 # Search forward in file buffer for the string\r
1101 # The skipped chars are put into self.__SkippedChars\r
1102 #\r
1103 # @param self The object pointer\r
1104 # @param String The string to search\r
1105 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive\r
1106 # @retval True Successfully find the string, file buffer pointer moved forward\r
1107 # @retval False Not able to find the string, file buffer pointer not changed\r
1108 #\r
1109 def __SkipToToken(self, String, IgnoreCase = False):\r
1110 StartPos = self.GetFileBufferPos()\r
1111 \r
1112 self.__SkippedChars = ""\r
1113 while not self.__EndOfFile():\r
1114 index = -1\r
1115 if IgnoreCase:\r
1116 index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].upper().find(String.upper()) \r
1117 else:\r
1118 index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].find(String)\r
1119 if index == 0:\r
1120 self.CurrentOffsetWithinLine += len(String)\r
1121 self.__SkippedChars += String\r
1122 return True\r
1123 self.__SkippedChars += str(self.__CurrentChar())\r
1124 self.__GetOneChar()\r
1125 \r
1126 self.SetFileBufferPos( StartPos)\r
1127 self.__SkippedChars = ""\r
1128 return False\r
1129\r
1130 ## GetFileBufferPos() method\r
1131 #\r
1132 # Return the tuple of current line and offset within the line\r
1133 #\r
1134 # @param self The object pointer\r
1135 # @retval Tuple Line number and offset pair \r
1136 #\r
1137 def GetFileBufferPos(self):\r
1138 return (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
1139 \r
1140 ## SetFileBufferPos() method\r
1141 #\r
1142 # Restore the file buffer position\r
1143 #\r
1144 # @param self The object pointer\r
1145 # @param Pos The new file buffer position\r
1146 #\r
1147 def SetFileBufferPos(self, Pos):\r
1148 (self.CurrentLineNumber, self.CurrentOffsetWithinLine) = Pos\r
1149 \r
1150 ## ParseFile() method\r
1151 #\r
1152 # Parse the file profile buffer to extract fd, fv ... information\r
1153 # Exception will be raised if syntax error found\r
1154 #\r
1155 # @param self The object pointer\r
1156 #\r
1157 def ParseFile(self):\r
1158\r
1159 try:\r
1160 self.__StringToList()\r
1161 self.PreprocessFile()\r
1162 self.PreprocessIncludeFile()\r
1163 self.__StringToList()\r
1164 self.PreprocessFile()\r
1165 self.PreprocessConditionalStatement()\r
1166 self.__StringToList()\r
1167 for Pos in self.__WipeOffArea:\r
1168 self.__ReplaceFragment(Pos[0], Pos[1])\r
1169 self.Profile.FileLinesList = ["".join(list) for list in self.Profile.FileLinesList]\r
1170 \r
1171 while self.__GetDefines():\r
1172 pass\r
1173 \r
1174 Index = 0\r
1175 while Index < len(self.Profile.FileLinesList):\r
1176 FileLineTuple = GetRealFileLine(self.FileName, Index + 1)\r
1177 self.Profile.FileLinesList[Index] = self.__ReplaceMacros(self.Profile.FileLinesList[Index], FileLineTuple[0], FileLineTuple[1])\r
1178 Index += 1\r
1179 \r
1180 while self.__GetFd():\r
1181 pass\r
1182\r
1183 while self.__GetFv():\r
1184 pass\r
1185\r
1186 while self.__GetCapsule():\r
1187 pass\r
1188\r
1189# while self.__GetVtf():\r
1190# pass\r
1191#\r
1192# while self.__GetRule():\r
1193# pass\r
1194 \r
1195\r
1196 except Warning, X:\r
1197 self.__UndoToken()\r
1198 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1199 X.message += '\nGot Token: \"%s\" from File %s\n' % (self.__Token, FileLineTuple[0]) + \\r
1200 'Previous Token: \"%s\" At line: %d, Offset Within Line: %d\n' \\r
1201 % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :].rstrip('\n').rstrip('\r'), FileLineTuple[1], self.CurrentOffsetWithinLine)\r
1202 raise\r
1203\r
1204 ## __GetDefines() method\r
1205 #\r
1206 # Get Defines section contents and store its data into AllMacrosList\r
1207 #\r
1208 # @param self The object pointer\r
1209 # @retval True Successfully find a Defines\r
1210 # @retval False Not able to find a Defines\r
1211 #\r
1212 def __GetDefines(self):\r
1213\r
1214 if not self.__GetNextToken():\r
1215 return False\r
1216\r
1217 S = self.__Token.upper()\r
1218 if S.startswith("[") and not S.startswith("[DEFINES"):\r
1219 if not S.startswith("[FD.") and not S.startswith("[FV.") and not S.startswith("[CAPSULE.") \\r
1220 and not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
1221 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [DEFINES], [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber)\r
1222 self.__UndoToken()\r
1223 return False\r
1224\r
1225 self.__UndoToken()\r
1226 if not self.__IsToken("[DEFINES", True):\r
1227 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1228 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
1229 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
1230 raise Warning("expected [DEFINES", self.FileName, self.CurrentLineNumber)\r
1231\r
1232 if not self.__IsToken( "]"):\r
1233 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
1234\r
1235 while self.__GetNextWord():\r
1236 Macro = self.__Token\r
1237 \r
1238 if not self.__IsToken("="):\r
1239 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1240 if not self.__GetNextToken() or self.__Token.startswith('['):\r
1241 raise Warning("expected MACRO value", self.FileName, self.CurrentLineNumber)\r
1242 Value = self.__Token\r
1243 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1244 MacProfile = MacroProfile(FileLineTuple[0], FileLineTuple[1])\r
1245 MacProfile.MacroName = Macro\r
1246 MacProfile.MacroValue = Value\r
1247 AllMacroList.append(MacProfile)\r
1248\r
1249 return False\r
1250\r
1251 ## __GetFd() method\r
1252 #\r
1253 # Get FD section contents and store its data into FD dictionary of self.Profile\r
1254 #\r
1255 # @param self The object pointer\r
1256 # @retval True Successfully find a FD\r
1257 # @retval False Not able to find a FD\r
1258 #\r
1259 def __GetFd(self):\r
1260\r
1261 if not self.__GetNextToken():\r
1262 return False\r
1263 \r
1264 S = self.__Token.upper()\r
1265 if S.startswith("[") and not S.startswith("[FD."):\r
1266 if not S.startswith("[FV.") and not S.startswith("[CAPSULE.") \\r
1267 and not S.startswith("[VTF.") and not S.startswith("[RULE."):\r
1268 raise Warning("Unknown section At Line ", self.FileName, self.CurrentLineNumber)\r
1269 self.__UndoToken()\r
1270 return False\r
1271 \r
1272 self.__UndoToken()\r
1273 if not self.__IsToken("[FD.", True):\r
1274 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1275 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
1276 % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
1277 raise Warning("expected [FD.] At Line ", self.FileName, self.CurrentLineNumber)\r
1278 \r
1279 FdName = self.__GetUiName()\r
1280 self.CurrentFdName = FdName.upper()\r
1281 \r
1282 if not self.__IsToken( "]"):\r
1283 raise Warning("expected ']' At Line ", self.FileName, self.CurrentLineNumber)\r
1284 \r
1285 FdObj = CommonDataClass.FdfClass.FDClassObject()\r
1286 FdObj.FdUiName = self.CurrentFdName\r
1287 self.Profile.FdDict[self.CurrentFdName] = FdObj\r
1288 Status = self.__GetCreateFile(FdObj)\r
1289 if not Status:\r
1290 raise Warning("FD name error At Line ", self.FileName, self.CurrentLineNumber)\r
1291 \r
1292 if not self.__GetTokenStatements(FdObj):\r
1293 return False\r
1294 \r
1295 self.__GetDefineStatements(FdObj)\r
1296\r
1297 self.__GetSetStatements(FdObj)\r
1298\r
1299 if not self.__GetRegionLayout(FdObj):\r
1300 raise Warning("expected region layout At Line ", self.FileName, self.CurrentLineNumber)\r
1301 \r
1302 while self.__GetRegionLayout(FdObj):\r
1303 pass\r
1304 return True\r
1305 \r
1306 ## __GetUiName() method\r
1307 #\r
1308 # Return the UI name of a section\r
1309 #\r
1310 # @param self The object pointer\r
1311 # @retval FdName UI name\r
1312 #\r
1313 def __GetUiName(self):\r
1314 FdName = ""\r
1315 if self.__GetNextWord():\r
1316 FdName = self.__Token\r
1317 \r
1318 return FdName\r
1319\r
1320 ## __GetCreateFile() method\r
1321 #\r
1322 # Return the output file name of object\r
1323 #\r
1324 # @param self The object pointer\r
1325 # @param Obj object whose data will be stored in file\r
1326 # @retval FdName UI name\r
1327 #\r
1328 def __GetCreateFile(self, Obj):\r
1329\r
1330 if self.__IsKeyword( "CREATE_FILE"):\r
1331 if not self.__IsToken( "="):\r
1332 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
1333 \r
1334 if not self.__GetNextToken():\r
1335 raise Warning("expected file name At Line ", self.FileName, self.CurrentLineNumber)\r
1336 \r
1337 FileName = self.__Token\r
1338 Obj.CreateFileName = FileName\r
1339\r
1340 return True\r
1341\r
1342 ## __GetTokenStatements() method\r
1343 #\r
1344 # Get token statements\r
1345 #\r
1346 # @param self The object pointer\r
1347 # @param Obj for whom token statement is got\r
1348 # @retval True Successfully find a token statement\r
1349 # @retval False Not able to find a token statement\r
1350 #\r
1351 def __GetTokenStatements(self, Obj):\r
1352 if not self.__IsKeyword( "BaseAddress"):\r
1353 raise Warning("BaseAddress missing At Line ", self.FileName, self.CurrentLineNumber)\r
1354 \r
1355 if not self.__IsToken( "="):\r
1356 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
1357 \r
1358 if not self.__GetNextHexNumber():\r
1359 raise Warning("expected Hex base address At Line ", self.FileName, self.CurrentLineNumber)\r
1360 \r
1361 Obj.BaseAddress = self.__Token\r
1362 \r
1363 if self.__IsToken( "|"):\r
1364 pcdPair = self.__GetNextPcdName()\r
1365 Obj.BaseAddressPcd = pcdPair\r
1366 self.Profile.PcdDict[pcdPair] = long(Obj.BaseAddress, 0)\r
1367 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1368 self.Profile.PcdFileLineDict[pcdPair] = FileLineTuple\r
1369 \r
1370 if not self.__IsKeyword( "Size"):\r
1371 raise Warning("Size missing At Line ", self.FileName, self.CurrentLineNumber)\r
1372 \r
1373 if not self.__IsToken( "="):\r
1374 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
1375 \r
1376 if not self.__GetNextHexNumber():\r
1377 raise Warning("expected Hex size At Line ", self.FileName, self.CurrentLineNumber)\r
1378 \r
1379 \r
1380 Obj.Size = long(self.__Token, 0)\r
1381\r
1382 if self.__IsToken( "|"):\r
1383 pcdPair = self.__GetNextPcdName()\r
1384 Obj.SizePcd = pcdPair\r
1385 self.Profile.PcdDict[pcdPair] = Obj.Size\r
1386 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1387 self.Profile.PcdFileLineDict[pcdPair] = FileLineTuple\r
1388 \r
1389 if not self.__IsKeyword( "ErasePolarity"):\r
1390 raise Warning("ErasePolarity missing At Line ", self.FileName, self.CurrentLineNumber)\r
1391 \r
1392 if not self.__IsToken( "="):\r
1393 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
1394 \r
1395 if not self.__GetNextToken():\r
1396 raise Warning("expected Erase Polarity At Line ", self.FileName, self.CurrentLineNumber)\r
1397 \r
1398 if self.__Token != "1" and self.__Token != "0":\r
1399 raise Warning("expected 1 or 0 Erase Polarity At Line ", self.FileName, self.CurrentLineNumber)\r
1400 \r
1401 Obj.ErasePolarity = self.__Token\r
1402\r
1403 Status = self.__GetBlockStatements(Obj)\r
1404 return Status\r
1405 \r
1406 ## __GetAddressStatements() method\r
1407 #\r
1408 # Get address statements\r
1409 #\r
1410 # @param self The object pointer\r
1411 # @param Obj for whom address statement is got\r
1412 # @retval True Successfully find\r
1413 # @retval False Not able to find\r
1414 #\r
1415 def __GetAddressStatements(self, Obj):\r
1416 \r
1417 if self.__IsKeyword("BsBaseAddress"):\r
1418 if not self.__IsToken( "="):\r
1419 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
1420 \r
1421 if not self.__GetNextDecimalNumber() and not self.__GetNextHexNumber():\r
1422 raise Warning("expected address At Line ", self.FileName, self.CurrentLineNumber)\r
1423 \r
1424 BsAddress = long(self.__Token, 0)\r
1425 Obj.BsBaseAddress = BsAddress\r
1426 \r
1427 if self.__IsKeyword("RtBaseAddress"):\r
1428 if not self.__IsToken( "="):\r
1429 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
1430 \r
1431 if not self.__GetNextDecimalNumber() and not self.__GetNextHexNumber():\r
1432 raise Warning("expected address At Line ", self.FileName, self.CurrentLineNumber)\r
1433 \r
1434 RtAddress = long(self.__Token, 0)\r
1435 Obj.RtBaseAddress = RtAddress\r
1436 \r
1437 ## __GetBlockStatements() method\r
1438 #\r
1439 # Get block statements\r
1440 #\r
1441 # @param self The object pointer\r
1442 # @param Obj for whom block statement is got\r
1443 # @retval True Successfully find\r
1444 # @retval False Not able to find\r
1445 #\r
1446 def __GetBlockStatements(self, Obj):\r
1447 \r
1448 if not self.__GetBlockStatement(Obj):\r
52302d4d
LG
1449 #set default block size is 1\r
1450 Obj.BlockSizeList.append((1, Obj.Size, None))\r
1451 return True\r
1452\r
30fdf114
LG
1453 while self.__GetBlockStatement(Obj):\r
1454 pass\r
52302d4d
LG
1455 \r
1456 for Item in Obj.BlockSizeList:\r
4231a819 1457 if Item[0] is None or Item[1] is None:\r
52302d4d
LG
1458 raise Warning("expected block statement for Fd Section", self.FileName, self.CurrentLineNumber)\r
1459\r
30fdf114
LG
1460 return True\r
1461 \r
1462 ## __GetBlockStatement() method\r
1463 #\r
1464 # Get block statement\r
1465 #\r
1466 # @param self The object pointer\r
1467 # @param Obj for whom block statement is got\r
1468 # @retval True Successfully find\r
1469 # @retval False Not able to find\r
1470 #\r
1471 def __GetBlockStatement(self, Obj):\r
1472 if not self.__IsKeyword( "BlockSize"):\r
1473 return False\r
1474 \r
1475 if not self.__IsToken( "="):\r
1476 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
1477 \r
1478 if not self.__GetNextHexNumber() and not self.__GetNextDecimalNumber():\r
1479 raise Warning("expected Hex block size At Line ", self.FileName, self.CurrentLineNumber)\r
1480\r
1481 BlockSize = long(self.__Token, 0)\r
1482 BlockSizePcd = None\r
1483 if self.__IsToken( "|"):\r
1484 PcdPair = self.__GetNextPcdName()\r
1485 BlockSizePcd = PcdPair\r
1486 self.Profile.PcdDict[PcdPair] = BlockSize\r
1487 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1488 self.Profile.PcdFileLineDict[pcdPair] = FileLineTuple\r
1489 \r
1490 BlockNumber = None\r
1491 if self.__IsKeyword( "NumBlocks"):\r
1492 if not self.__IsToken( "="):\r
1493 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
1494 \r
1495 if not self.__GetNextDecimalNumber() and not self.__GetNextHexNumber():\r
1496 raise Warning("expected block numbers At Line ", self.FileName, self.CurrentLineNumber)\r
1497 \r
1498 BlockNumber = long(self.__Token, 0)\r
1499 \r
1500 Obj.BlockSizeList.append((BlockSize, BlockNumber, BlockSizePcd))\r
1501 return True\r
1502\r
1503 ## __GetDefineStatements() method\r
1504 #\r
1505 # Get define statements\r
1506 #\r
1507 # @param self The object pointer\r
1508 # @param Obj for whom define statement is got\r
1509 # @retval True Successfully find\r
1510 # @retval False Not able to find\r
1511 #\r
1512 def __GetDefineStatements(self, Obj):\r
1513 while self.__GetDefineStatement( Obj):\r
1514 pass\r
1515 \r
1516 ## __GetDefineStatement() method\r
1517 #\r
1518 # Get define statement\r
1519 #\r
1520 # @param self The object pointer\r
1521 # @param Obj for whom define statement is got\r
1522 # @retval True Successfully find\r
1523 # @retval False Not able to find\r
1524 #\r
1525 def __GetDefineStatement(self, Obj):\r
1526 if self.__IsKeyword("DEFINE"):\r
1527 self.__GetNextToken()\r
1528 Macro = self.__Token\r
1529 if not self.__IsToken( "="):\r
1530 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
1531 \r
1532 if not self.__GetNextToken():\r
1533 raise Warning("expected value At Line ", self.FileName, self.CurrentLineNumber)\r
1534\r
1535 Value = self.__Token\r
1536 Macro = '$(' + Macro + ')'\r
1537 Obj.DefineVarDict[Macro] = Value\r
1538 return True\r
1539 \r
1540 return False\r
1541 \r
1542 ## __GetSetStatements() method\r
1543 #\r
1544 # Get set statements\r
1545 #\r
1546 # @param self The object pointer\r
1547 # @param Obj for whom set statement is got\r
1548 # @retval True Successfully find\r
1549 # @retval False Not able to find\r
1550 #\r
1551 def __GetSetStatements(self, Obj):\r
1552 while self.__GetSetStatement(Obj):\r
1553 pass\r
1554\r
1555 ## __GetSetStatement() method\r
1556 #\r
1557 # Get set statement\r
1558 #\r
1559 # @param self The object pointer\r
1560 # @param Obj for whom set statement is got\r
1561 # @retval True Successfully find\r
1562 # @retval False Not able to find\r
1563 #\r
1564 def __GetSetStatement(self, Obj):\r
1565 if self.__IsKeyword("SET"):\r
1566 PcdPair = self.__GetNextPcdName()\r
1567 \r
1568 if not self.__IsToken( "="):\r
1569 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
1570 \r
1571 if not self.__GetNextToken():\r
1572 raise Warning("expected value At Line ", self.FileName, self.CurrentLineNumber)\r
1573 \r
1574 Value = self.__Token\r
1575 if Value.startswith("{"):\r
1576 # deal with value with {}\r
1577 if not self.__SkipToToken( "}"):\r
1578 raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)\r
1579 Value += self.__SkippedChars\r
1580 \r
1581 Obj.SetVarDict[PcdPair] = Value\r
1582 self.Profile.PcdDict[PcdPair] = Value\r
1583 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1584 self.Profile.PcdFileLineDict[PcdPair] = FileLineTuple\r
1585 return True\r
1586\r
1587 return False\r
1588\r
1589 ## __GetRegionLayout() method\r
1590 #\r
1591 # Get region layout for FD\r
1592 #\r
1593 # @param self The object pointer\r
1594 # @param Fd for whom region is got\r
1595 # @retval True Successfully find\r
1596 # @retval False Not able to find\r
1597 #\r
1598 def __GetRegionLayout(self, Fd):\r
1599 if not self.__GetNextHexNumber():\r
1600 return False\r
1601 \r
1602 RegionObj = CommonDataClass.FdfClass.RegionClassObject()\r
1603 RegionObj.Offset = long(self.__Token, 0)\r
1604 Fd.RegionList.append(RegionObj)\r
1605 \r
1606 if not self.__IsToken( "|"):\r
1607 raise Warning("expected '|' At Line ", self.FileName, self.CurrentLineNumber)\r
1608 \r
1609 if not self.__GetNextHexNumber():\r
1610 raise Warning("expected Region Size At Line ", self.FileName, self.CurrentLineNumber)\r
1611 RegionObj.Size = long(self.__Token, 0)\r
1612 \r
1613 if not self.__GetNextWord():\r
1614 return True\r
1615 \r
fd171542 1616 if not self.__Token in ("SET", "FV", "FILE", "DATA", "CAPSULE"):\r
30fdf114
LG
1617 self.__UndoToken()\r
1618 RegionObj.PcdOffset = self.__GetNextPcdName()\r
1619 self.Profile.PcdDict[RegionObj.PcdOffset] = RegionObj.Offset + long(Fd.BaseAddress, 0)\r
1620 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1621 self.Profile.PcdFileLineDict[RegionObj.PcdOffset] = FileLineTuple\r
1622 if self.__IsToken( "|"):\r
1623 RegionObj.PcdSize = self.__GetNextPcdName()\r
1624 self.Profile.PcdDict[RegionObj.PcdSize] = RegionObj.Size\r
1625 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1626 self.Profile.PcdFileLineDict[RegionObj.PcdSize] = FileLineTuple\r
1627 \r
1628 if not self.__GetNextWord():\r
1629 return True\r
1630\r
1631 if self.__Token == "SET":\r
1632 self.__UndoToken()\r
1633 self.__GetSetStatements( RegionObj)\r
1634 if not self.__GetNextWord():\r
1635 return True\r
1636 \r
fd171542 1637 elif self.__Token == "FV":\r
30fdf114
LG
1638 self.__UndoToken()\r
1639 self.__GetRegionFvType( RegionObj)\r
1640\r
fd171542 1641 elif self.__Token == "CAPSULE":\r
1642 self.__UndoToken()\r
1643 self.__GetRegionCapType( RegionObj)\r
1644\r
30fdf114
LG
1645 elif self.__Token == "FILE":\r
1646 self.__UndoToken()\r
1647 self.__GetRegionFileType( RegionObj)\r
1648\r
1649 else:\r
1650 self.__UndoToken()\r
1651 self.__GetRegionDataType( RegionObj)\r
1652 \r
1653 return True\r
1654 \r
1655 ## __GetRegionFvType() method\r
1656 #\r
1657 # Get region fv data for region\r
1658 #\r
1659 # @param self The object pointer\r
1660 # @param RegionObj for whom region data is got\r
1661 #\r
1662 def __GetRegionFvType(self, RegionObj):\r
1663\r
1664 if not self.__IsKeyword( "FV"):\r
1665 raise Warning("expected Keyword 'FV' At Line ", self.FileName, self.CurrentLineNumber)\r
1666 \r
1667 if not self.__IsToken( "="):\r
1668 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
1669 \r
1670 if not self.__GetNextToken():\r
1671 raise Warning("expected FV name At Line ", self.FileName, self.CurrentLineNumber)\r
1672 \r
1673 RegionObj.RegionType = "FV"\r
1674 RegionObj.RegionDataList.append(self.__Token)\r
1675 \r
1676 while self.__IsKeyword( "FV"):\r
1677 \r
1678 if not self.__IsToken( "="):\r
1679 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
1680 \r
1681 if not self.__GetNextToken():\r
1682 raise Warning("expected FV name At Line ", self.FileName, self.CurrentLineNumber)\r
1683 \r
1684 RegionObj.RegionDataList.append(self.__Token)\r
fd171542 1685\r
1686 ## __GetRegionCapType() method\r
1687 #\r
1688 # Get region capsule data for region\r
1689 #\r
1690 # @param self The object pointer\r
1691 # @param RegionObj for whom region data is got\r
1692 #\r
1693 def __GetRegionCapType(self, RegionObj):\r
1694\r
1695 if not self.__IsKeyword("CAPSULE"):\r
1696 raise Warning("expected Keyword 'CAPSULE' at line", self.FileName, self.CurrentLineNumber)\r
1697\r
1698 if not self.__IsToken("="):\r
1699 raise Warning("expected '=' at line", self.FileName, self.CurrentLineNumber)\r
1700\r
1701 if not self.__GetNextToken():\r
1702 raise Warning("expected CAPSULE name at line", self.FileName, self.CurrentLineNumber)\r
1703\r
1704 RegionObj.RegionType = "CAPSULE"\r
1705 RegionObj.RegionDataList.append(self.__Token)\r
1706\r
1707 while self.__IsKeyword("CAPSULE"):\r
1708\r
1709 if not self.__IsToken("="):\r
1710 raise Warning("expected '=' at line", self.FileName, self.CurrentLineNumber)\r
1711\r
1712 if not self.__GetNextToken():\r
1713 raise Warning("expected CAPSULE name at line", self.FileName, self.CurrentLineNumber)\r
1714\r
1715 RegionObj.RegionDataList.append(self.__Token)\r
1716\r
30fdf114
LG
1717 ## __GetRegionFileType() method\r
1718 #\r
1719 # Get region file data for region\r
1720 #\r
1721 # @param self The object pointer\r
1722 # @param RegionObj for whom region data is got\r
1723 #\r
1724 def __GetRegionFileType(self, RegionObj):\r
1725\r
1726 if not self.__IsKeyword( "FILE"):\r
1727 raise Warning("expected Keyword 'FILE' At Line ", self.FileName, self.CurrentLineNumber)\r
1728\r
1729 if not self.__IsToken( "="):\r
1730 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
1731\r
1732 if not self.__GetNextToken():\r
1733 raise Warning("expected File name At Line ", self.FileName, self.CurrentLineNumber)\r
1734\r
1735 RegionObj.RegionType = "FILE"\r
1736 RegionObj.RegionDataList.append( self.__Token)\r
1737 \r
1738 while self.__IsKeyword( "FILE"):\r
1739 \r
1740 if not self.__IsToken( "="):\r
1741 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
1742 \r
1743 if not self.__GetNextToken():\r
1744 raise Warning("expected FILE name At Line ", self.FileName, self.CurrentLineNumber)\r
1745 \r
1746 RegionObj.RegionDataList.append(self.__Token)\r
1747\r
1748 ## __GetRegionDataType() method\r
1749 #\r
1750 # Get region array data for region\r
1751 #\r
1752 # @param self The object pointer\r
1753 # @param RegionObj for whom region data is got\r
1754 #\r
1755 def __GetRegionDataType(self, RegionObj):\r
1756 \r
1757 if not self.__IsKeyword( "DATA"):\r
1758 raise Warning("expected Region Data type At Line ", self.FileName, self.CurrentLineNumber)\r
1759\r
1760 if not self.__IsToken( "="):\r
1761 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
1762 \r
1763 if not self.__IsToken( "{"):\r
1764 raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)\r
1765 \r
1766 if not self.__GetNextHexNumber():\r
1767 raise Warning("expected Hex byte At Line ", self.FileName, self.CurrentLineNumber)\r
1768 \r
636f2be6
LG
1769 if len(self.__Token) > 18:\r
1770 raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
1771 \r
1772 DataString = self.__Token\r
1773 DataString += ","\r
1774 \r
1775 while self.__IsToken(","):\r
1776 if not self.__GetNextHexNumber():\r
1777 raise Warning("Invalid Hex number At Line ", self.FileName, self.CurrentLineNumber)\r
1778 if len(self.__Token) > 4:\r
1779 raise Warning("Hex byte(must be 2 digits) too long At Line ", self.FileName, self.CurrentLineNumber)\r
1780 DataString += self.__Token\r
1781 DataString += ","\r
1782 \r
1783 if not self.__IsToken( "}"):\r
1784 raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)\r
1785 \r
1786 DataString = DataString.rstrip(",")\r
1787 RegionObj.RegionType = "DATA"\r
1788 RegionObj.RegionDataList.append( DataString)\r
1789 \r
1790 while self.__IsKeyword( "DATA"):\r
1791\r
1792 if not self.__IsToken( "="):\r
1793 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
1794 \r
1795 if not self.__IsToken( "{"):\r
1796 raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)\r
1797 \r
1798 if not self.__GetNextHexNumber():\r
1799 raise Warning("expected Hex byte At Line ", self.FileName, self.CurrentLineNumber)\r
1800 \r
636f2be6
LG
1801 if len(self.__Token) > 18:\r
1802 raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
1803 \r
1804 DataString = self.__Token\r
1805 DataString += ","\r
1806 \r
1807 while self.__IsToken(","):\r
1808 self.__GetNextHexNumber()\r
1809 if len(self.__Token) > 4:\r
1810 raise Warning("Hex byte(must be 2 digits) too long At Line ", self.FileName, self.CurrentLineNumber)\r
1811 DataString += self.__Token\r
1812 DataString += ","\r
1813 \r
1814 if not self.__IsToken( "}"):\r
1815 raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)\r
1816 \r
1817 DataString = DataString.rstrip(",")\r
1818 RegionObj.RegionDataList.append( DataString)\r
1819 \r
1820 ## __GetFv() method\r
1821 #\r
1822 # Get FV section contents and store its data into FV dictionary of self.Profile\r
1823 #\r
1824 # @param self The object pointer\r
1825 # @retval True Successfully find a FV\r
1826 # @retval False Not able to find a FV\r
1827 # \r
1828 def __GetFv(self):\r
1829 if not self.__GetNextToken():\r
1830 return False\r
1831\r
1832 S = self.__Token.upper()\r
1833 if S.startswith("[") and not S.startswith("[FV."):\r
1834 if not S.startswith("[CAPSULE.") \\r
1835 and not S.startswith("[VTF.") and not S.startswith("[RULE."):\r
1836 raise Warning("Unknown section or section appear sequence error \n(The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.]) At Line ", self.FileName, self.CurrentLineNumber)\r
1837 self.__UndoToken()\r
1838 return False\r
1839\r
1840 self.__UndoToken()\r
1841 if not self.__IsToken("[FV.", True):\r
1842 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1843 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
1844 % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
1845 raise Warning("Unknown Keyword At Line ", self.FileName, self.CurrentLineNumber)\r
1846 \r
1847 FvName = self.__GetUiName()\r
1848 self.CurrentFvName = FvName.upper()\r
1849 \r
1850 if not self.__IsToken( "]"):\r
1851 raise Warning("expected ']' At Line ", self.FileName, self.CurrentLineNumber)\r
1852 \r
1853 FvObj = CommonDataClass.FdfClass.FvClassObject()\r
1854 FvObj.UiFvName = self.CurrentFvName\r
1855 self.Profile.FvDict[self.CurrentFvName] = FvObj\r
1856 \r
1857 Status = self.__GetCreateFile(FvObj)\r
1858 if not Status:\r
1859 raise Warning("FV name error At Line ", self.FileName, self.CurrentLineNumber)\r
1860\r
1861 self.__GetDefineStatements(FvObj)\r
1862\r
1863 self.__GetAddressStatements(FvObj)\r
1864 \r
1865 self.__GetBlockStatement(FvObj)\r
1866\r
1867 self.__GetSetStatements(FvObj)\r
1868\r
1869 self.__GetFvAlignment(FvObj)\r
1870\r
1871 self.__GetFvAttributes(FvObj)\r
1872 \r
1873 self.__GetFvNameGuid(FvObj)\r
1874\r
1875 self.__GetAprioriSection(FvObj, FvObj.DefineVarDict.copy())\r
1876 self.__GetAprioriSection(FvObj, FvObj.DefineVarDict.copy())\r
1877 \r
1878 while True:\r
1879 isInf = self.__GetInfStatement(FvObj, MacroDict = FvObj.DefineVarDict.copy())\r
1880 isFile = self.__GetFileStatement(FvObj, MacroDict = FvObj.DefineVarDict.copy())\r
1881 if not isInf and not isFile:\r
1882 break\r
1883 \r
1884 return True\r
1885\r
1886 ## __GetFvAlignment() method\r
1887 #\r
1888 # Get alignment for FV\r
1889 #\r
1890 # @param self The object pointer\r
1891 # @param Obj for whom alignment is got\r
1892 # @retval True Successfully find a alignment statement\r
1893 # @retval False Not able to find a alignment statement\r
1894 #\r
1895 def __GetFvAlignment(self, Obj):\r
1896 \r
1897 if not self.__IsKeyword( "FvAlignment"):\r
1898 return False\r
1899 \r
1900 if not self.__IsToken( "="):\r
1901 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
1902 \r
1903 if not self.__GetNextToken():\r
1904 raise Warning("expected alignment value At Line ", self.FileName, self.CurrentLineNumber)\r
1905 \r
1906 if self.__Token.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \\r
1907 "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \\r
1908 "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \\r
1909 "1G", "2G"):\r
1910 raise Warning("Unknown alignment value At Line ", self.FileName, self.CurrentLineNumber)\r
1911 Obj.FvAlignment = self.__Token\r
1912 return True\r
1913 \r
1914 ## __GetFvAttributes() method\r
1915 #\r
1916 # Get attributes for FV\r
1917 #\r
1918 # @param self The object pointer\r
1919 # @param Obj for whom attribute is got\r
1920 # @retval None\r
1921 #\r
1922 def __GetFvAttributes(self, FvObj):\r
1923 \r
1924 while self.__GetNextWord():\r
1925 name = self.__Token\r
1926 if name not in ("ERASE_POLARITY", "MEMORY_MAPPED", \\r
1927 "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \\r
1928 "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \\r
1929 "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \\r
1930 "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \\r
1931 "WRITE_POLICY_RELIABLE"):\r
1932 self.__UndoToken()\r
1933 return\r
1934\r
1935 if not self.__IsToken( "="):\r
1936 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
1937 \r
1938 if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):\r
1939 raise Warning("expected TRUE/FALSE (1/0) At Line ", self.FileName, self.CurrentLineNumber)\r
1940 \r
1941 FvObj.FvAttributeDict[name] = self.__Token\r
1942\r
1943 return\r
1944 \r
1945 ## __GetFvNameGuid() method\r
1946 #\r
1947 # Get FV GUID for FV\r
1948 #\r
1949 # @param self The object pointer\r
1950 # @param Obj for whom GUID is got\r
1951 # @retval None\r
1952 #\r
1953 def __GetFvNameGuid(self, FvObj):\r
1954\r
1955 if not self.__IsKeyword( "FvNameGuid"):\r
1956 return\r
1957\r
1958 if not self.__IsToken( "="):\r
1959 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1960\r
1961 if not self.__GetNextGuid():\r
1962 raise Warning("expected FV GUID value", self.FileName, self.CurrentLineNumber)\r
1963\r
1964 FvObj.FvNameGuid = self.__Token\r
1965\r
1966 return\r
1967\r
1968 ## __GetAprioriSection() method\r
1969 #\r
1970 # Get token statements\r
1971 #\r
1972 # @param self The object pointer\r
1973 # @param FvObj for whom apriori is got\r
1974 # @param MacroDict dictionary used to replace macro\r
1975 # @retval True Successfully find apriori statement\r
1976 # @retval False Not able to find apriori statement\r
1977 #\r
1978 def __GetAprioriSection(self, FvObj, MacroDict = {}):\r
1979 \r
1980 if not self.__IsKeyword( "APRIORI"):\r
1981 return False\r
1982 \r
1983 if not self.__IsKeyword("PEI") and not self.__IsKeyword("DXE"):\r
1984 raise Warning("expected Apriori file type At Line ", self.FileName, self.CurrentLineNumber)\r
1985 AprType = self.__Token\r
1986 \r
1987 if not self.__IsToken( "{"):\r
1988 raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)\r
1989 \r
1990 AprSectionObj = CommonDataClass.FdfClass.AprioriSectionClassObject()\r
1991 AprSectionObj.AprioriType = AprType\r
1992 \r
1993 self.__GetDefineStatements(AprSectionObj)\r
1994 MacroDict.update(AprSectionObj.DefineVarDict)\r
1995 \r
1996 while True:\r
1997 IsInf = self.__GetInfStatement( AprSectionObj, MacroDict = MacroDict)\r
1998 IsFile = self.__GetFileStatement( AprSectionObj)\r
1999 if not IsInf and not IsFile:\r
2000 break\r
2001 \r
2002 if not self.__IsToken( "}"):\r
2003 raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)\r
2004\r
2005 FvObj.AprioriSectionList.append(AprSectionObj)\r
2006 return True\r
2007\r
2008 ## __GetInfStatement() method\r
2009 #\r
2010 # Get INF statements\r
2011 #\r
2012 # @param self The object pointer\r
2013 # @param Obj for whom inf statement is got\r
2014 # @param MacroDict dictionary used to replace macro\r
2015 # @retval True Successfully find inf statement\r
2016 # @retval False Not able to find inf statement\r
2017 #\r
2018 def __GetInfStatement(self, Obj, ForCapsule = False, MacroDict = {}):\r
2019\r
2020 if not self.__IsKeyword( "INF"):\r
2021 return False\r
2022 \r
2023 ffsInf = CommonDataClass.FdfClass.FfsInfStatementClassObject()\r
2024 self.__GetInfOptions( ffsInf)\r
2025 \r
2026 if not self.__GetNextToken():\r
2027 raise Warning("expected INF file path At Line ", self.FileName, self.CurrentLineNumber)\r
2028 ffsInf.InfFileName = self.__Token\r
2029 \r
2030# if ffsInf.InfFileName.find('$') >= 0:\r
2031# ffsInf.InfFileName = GenFdsGlobalVariable.GenFdsGlobalVariable.MacroExtend(ffsInf.InfFileName, MacroDict)\r
2032 \r
2033 if not ffsInf.InfFileName in self.Profile.InfList:\r
2034 self.Profile.InfList.append(ffsInf.InfFileName)\r
2035 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
2036 self.Profile.InfFileLineList.append(FileLineTuple)\r
2037 \r
2038 if self.__IsToken('|'):\r
2039 if self.__IsKeyword('RELOCS_STRIPPED'):\r
2040 ffsInf.KeepReloc = False\r
2041 elif self.__IsKeyword('RELOCS_RETAINED'):\r
2042 ffsInf.KeepReloc = True\r
2043 else:\r
2044 raise Warning("Unknown reloc strip flag At Line ", self.FileName, self.CurrentLineNumber)\r
2045 \r
2046 if ForCapsule:\r
2047 capsuleFfs = CapsuleData.CapsuleFfs()\r
2048 capsuleFfs.Ffs = ffsInf\r
2049 Obj.CapsuleDataList.append(capsuleFfs)\r
2050 else:\r
2051 Obj.FfsList.append(ffsInf)\r
2052 return True\r
2053 \r
2054 ## __GetInfOptions() method\r
2055 #\r
2056 # Get options for INF\r
2057 #\r
2058 # @param self The object pointer\r
2059 # @param FfsInfObj for whom option is got\r
2060 #\r
2061 def __GetInfOptions(self, FfsInfObj):\r
2062 \r
2063 if self.__IsKeyword( "RuleOverride"):\r
2064 if not self.__IsToken( "="):\r
2065 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
2066 if not self.__GetNextToken():\r
2067 raise Warning("expected Rule name At Line ", self.FileName, self.CurrentLineNumber)\r
2068 FfsInfObj.Rule = self.__Token\r
2069 \r
2070 if self.__IsKeyword( "VERSION"):\r
2071 if not self.__IsToken( "="):\r
2072 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
2073 if not self.__GetNextToken():\r
2074 raise Warning("expected Version At Line ", self.FileName, self.CurrentLineNumber)\r
2075 \r
2076 if self.__GetStringData():\r
2077 FfsInfObj.Version = self.__Token\r
2078 \r
2079 if self.__IsKeyword( "UI"):\r
2080 if not self.__IsToken( "="):\r
2081 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
2082 if not self.__GetNextToken():\r
2083 raise Warning("expected UI name At Line ", self.FileName, self.CurrentLineNumber)\r
2084 \r
2085 if self.__GetStringData():\r
2086 FfsInfObj.Ui = self.__Token\r
2087\r
2088 if self.__IsKeyword( "USE"):\r
2089 if not self.__IsToken( "="):\r
2090 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2091 if not self.__GetNextToken():\r
2092 raise Warning("expected ARCH name", self.FileName, self.CurrentLineNumber)\r
2093 FfsInfObj.UseArch = self.__Token\r
2094\r
2095 \r
2096 if self.__GetNextToken():\r
2097 p = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')\r
2098 if p.match(self.__Token):\r
2099 FfsInfObj.KeyStringList.append(self.__Token)\r
2100 if not self.__IsToken(","):\r
2101 return\r
2102 else:\r
2103 self.__UndoToken()\r
2104 return\r
2105 \r
2106 while self.__GetNextToken():\r
2107 if not p.match(self.__Token):\r
2108 raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self.FileName, self.CurrentLineNumber)\r
2109 FfsInfObj.KeyStringList.append(self.__Token)\r
2110 \r
2111 if not self.__IsToken(","):\r
2112 break\r
2113 \r
2114 ## __GetFileStatement() method\r
2115 #\r
2116 # Get FILE statements\r
2117 #\r
2118 # @param self The object pointer\r
2119 # @param Obj for whom FILE statement is got\r
2120 # @param MacroDict dictionary used to replace macro\r
2121 # @retval True Successfully find FILE statement\r
2122 # @retval False Not able to find FILE statement\r
2123 #\r
2124 def __GetFileStatement(self, Obj, ForCapsule = False, MacroDict = {}):\r
2125\r
2126 if not self.__IsKeyword( "FILE"):\r
2127 return False\r
2128 \r
2129 FfsFileObj = CommonDataClass.FdfClass.FileStatementClassObject()\r
2130 \r
2131 if not self.__GetNextWord():\r
2132 raise Warning("expected FFS type At Line ", self.FileName, self.CurrentLineNumber)\r
2133 FfsFileObj.FvFileType = self.__Token\r
2134 \r
2135 if not self.__IsToken( "="):\r
2136 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
2137\r
2138 if not self.__GetNextGuid():\r
2139 if not self.__GetNextWord():\r
2140 raise Warning("expected File GUID", self.FileName, self.CurrentLineNumber)\r
2141 if self.__Token == 'PCD':\r
2142 if not self.__IsToken( "("):\r
2143 raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
2144 PcdPair = self.__GetNextPcdName()\r
2145 if not self.__IsToken( ")"):\r
2146 raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
2147 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
2148 \r
2149 FfsFileObj.NameGuid = self.__Token\r
2150 \r
2151 self.__GetFilePart( FfsFileObj, MacroDict.copy())\r
2152 \r
2153 if ForCapsule:\r
2154 capsuleFfs = CapsuleData.CapsuleFfs()\r
2155 capsuleFfs.Ffs = FfsFileObj\r
2156 Obj.CapsuleDataList.append(capsuleFfs)\r
2157 else:\r
2158 Obj.FfsList.append(FfsFileObj)\r
2159 \r
2160 return True\r
2161 \r
2162 ## __FileCouldHaveRelocFlag() method\r
2163 #\r
2164 # Check whether reloc strip flag can be set for a file type.\r
2165 #\r
2166 # @param self The object pointer\r
2167 # @param FileType The file type to check with\r
2168 # @retval True This type could have relocation strip flag\r
2169 # @retval False No way to have it\r
2170 #\r
2171 \r
2172 def __FileCouldHaveRelocFlag (self, FileType):\r
2173 if FileType in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'):\r
2174 return True\r
2175 else:\r
2176 return False\r
2177 \r
2178 ## __SectionCouldHaveRelocFlag() method\r
2179 #\r
2180 # Check whether reloc strip flag can be set for a section type.\r
2181 #\r
2182 # @param self The object pointer\r
2183 # @param SectionType The section type to check with\r
2184 # @retval True This type could have relocation strip flag\r
2185 # @retval False No way to have it\r
2186 #\r
2187 \r
2188 def __SectionCouldHaveRelocFlag (self, SectionType):\r
2189 if SectionType in ('TE', 'PE32'):\r
2190 return True\r
2191 else:\r
2192 return False\r
2193 \r
2194 ## __GetFilePart() method\r
2195 #\r
2196 # Get components for FILE statement\r
2197 #\r
2198 # @param self The object pointer\r
2199 # @param FfsFileObj for whom component is got\r
2200 # @param MacroDict dictionary used to replace macro\r
2201 #\r
2202 def __GetFilePart(self, FfsFileObj, MacroDict = {}):\r
2203 \r
2204 self.__GetFileOpts( FfsFileObj)\r
2205 \r
2206 if not self.__IsToken("{"):\r
2207# if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
2208# if self.__FileCouldHaveRelocFlag(FfsFileObj.FvFileType):\r
2209# if self.__Token == 'RELOCS_STRIPPED':\r
2210# FfsFileObj.KeepReloc = False\r
2211# else:\r
2212# FfsFileObj.KeepReloc = True\r
2213# else:\r
2214# raise Warning("File type %s could not have reloc strip flag At Line %d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
2215# \r
2216# if not self.__IsToken("{"):\r
2217 raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)\r
2218 \r
2219 if not self.__GetNextToken():\r
2220 raise Warning("expected File name or section data At Line ", self.FileName, self.CurrentLineNumber)\r
2221 \r
2222 if self.__Token == "FV":\r
2223 if not self.__IsToken( "="):\r
2224 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
2225 if not self.__GetNextToken():\r
2226 raise Warning("expected FV name At Line ", self.FileName, self.CurrentLineNumber)\r
2227 FfsFileObj.FvName = self.__Token\r
2228 \r
2229 elif self.__Token == "FD":\r
2230 if not self.__IsToken( "="):\r
2231 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
2232 if not self.__GetNextToken():\r
2233 raise Warning("expected FD name At Line ", self.FileName, self.CurrentLineNumber)\r
2234 FfsFileObj.FdName = self.__Token\r
2235 \r
2236 elif self.__Token in ("DEFINE", "APRIORI", "SECTION"):\r
2237 self.__UndoToken()\r
2238 self.__GetSectionData( FfsFileObj, MacroDict)\r
2239 else:\r
2240 FfsFileObj.FileName = self.__Token\r
2241 \r
2242 if not self.__IsToken( "}"):\r
2243 raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)\r
2244 \r
2245 ## __GetFileOpts() method\r
2246 #\r
2247 # Get options for FILE statement\r
2248 #\r
2249 # @param self The object pointer\r
2250 # @param FfsFileObj for whom options is got\r
2251 #\r
2252 def __GetFileOpts(self, FfsFileObj):\r
2253 \r
2254 if self.__GetNextToken():\r
2255 Pattern = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')\r
2256 if Pattern.match(self.__Token):\r
2257 FfsFileObj.KeyStringList.append(self.__Token)\r
2258 if self.__IsToken(","):\r
2259 while self.__GetNextToken():\r
2260 if not Pattern.match(self.__Token):\r
2261 raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self.FileName, self.CurrentLineNumber)\r
2262 FfsFileObj.KeyStringList.append(self.__Token)\r
2263\r
2264 if not self.__IsToken(","):\r
2265 break\r
2266 \r
2267 else:\r
2268 self.__UndoToken()\r
2269\r
2270 if self.__IsKeyword( "FIXED", True):\r
2271 FfsFileObj.Fixed = True\r
2272 \r
2273 if self.__IsKeyword( "CHECKSUM", True):\r
2274 FfsFileObj.CheckSum = True\r
2275 \r
2276 if self.__GetAlignment():\r
2277 FfsFileObj.Alignment = self.__Token\r
2278 \r
2279 \r
2280 \r
2281 ## __GetAlignment() method\r
2282 #\r
2283 # Return the alignment value\r
2284 #\r
2285 # @param self The object pointer\r
2286 # @retval True Successfully find alignment\r
2287 # @retval False Not able to find alignment\r
2288 #\r
2289 def __GetAlignment(self):\r
2290 if self.__IsKeyword( "Align", True):\r
2291 if not self.__IsToken( "="):\r
2292 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
2293 \r
2294 if not self.__GetNextToken():\r
2295 raise Warning("expected alignment value At Line ", self.FileName, self.CurrentLineNumber)\r
2296 return True\r
2297 \r
2298 return False\r
2299 \r
2300 ## __GetFilePart() method\r
2301 #\r
2302 # Get section data for FILE statement\r
2303 #\r
2304 # @param self The object pointer\r
2305 # @param FfsFileObj for whom section is got\r
2306 # @param MacroDict dictionary used to replace macro\r
2307 #\r
2308 def __GetSectionData(self, FfsFileObj, MacroDict = {}):\r
2309 Dict = {}\r
2310 Dict.update(MacroDict)\r
2311 \r
2312 self.__GetDefineStatements(FfsFileObj)\r
2313 \r
2314 Dict.update(FfsFileObj.DefineVarDict)\r
2315 self.__GetAprioriSection(FfsFileObj, Dict.copy())\r
2316 self.__GetAprioriSection(FfsFileObj, Dict.copy())\r
2317 \r
2318 while True:\r
2319 IsLeafSection = self.__GetLeafSection(FfsFileObj, Dict)\r
2320 IsEncapSection = self.__GetEncapsulationSec(FfsFileObj)\r
2321 if not IsLeafSection and not IsEncapSection:\r
2322 break\r
2323 \r
2324 ## __GetLeafSection() method\r
2325 #\r
2326 # Get leaf section for Obj\r
2327 #\r
2328 # @param self The object pointer\r
2329 # @param Obj for whom leaf section is got\r
2330 # @param MacroDict dictionary used to replace macro\r
2331 # @retval True Successfully find section statement\r
2332 # @retval False Not able to find section statement\r
2333 #\r
2334 def __GetLeafSection(self, Obj, MacroDict = {}):\r
2335 \r
2336 OldPos = self.GetFileBufferPos()\r
2337 \r
2338 if not self.__IsKeyword( "SECTION"):\r
2339 if len(Obj.SectionList) == 0:\r
2340 raise Warning("expected SECTION At Line ", self.FileName, self.CurrentLineNumber)\r
2341 else:\r
2342 return False\r
2343 \r
2344 AlignValue = None\r
2345 if self.__GetAlignment():\r
e921f58d
YZ
2346 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
2347 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
52302d4d 2348 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2349 AlignValue = self.__Token\r
2350 \r
2351 BuildNum = None\r
2352 if self.__IsKeyword( "BUILD_NUM"):\r
2353 if not self.__IsToken( "="):\r
2354 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
2355 \r
2356 if not self.__GetNextToken():\r
2357 raise Warning("expected Build number value At Line ", self.FileName, self.CurrentLineNumber)\r
2358 \r
2359 BuildNum = self.__Token\r
2360 \r
2361 if self.__IsKeyword( "VERSION"):\r
52302d4d
LG
2362 if AlignValue == 'Auto':\r
2363 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2364 if not self.__IsToken( "="):\r
2365 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
2366 if not self.__GetNextToken():\r
2367 raise Warning("expected version At Line ", self.FileName, self.CurrentLineNumber)\r
2368 VerSectionObj = CommonDataClass.FdfClass.VerSectionClassObject()\r
2369 VerSectionObj.Alignment = AlignValue\r
2370 VerSectionObj.BuildNum = BuildNum\r
2371 if self.__GetStringData():\r
2372 VerSectionObj.StringData = self.__Token\r
2373 else:\r
2374 VerSectionObj.FileName = self.__Token\r
2375 Obj.SectionList.append(VerSectionObj)\r
2376\r
2377 elif self.__IsKeyword( "UI"):\r
52302d4d
LG
2378 if AlignValue == 'Auto':\r
2379 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2380 if not self.__IsToken( "="):\r
2381 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
2382 if not self.__GetNextToken():\r
2383 raise Warning("expected UI At Line ", self.FileName, self.CurrentLineNumber)\r
2384 UiSectionObj = CommonDataClass.FdfClass.UiSectionClassObject()\r
2385 UiSectionObj.Alignment = AlignValue\r
2386 if self.__GetStringData():\r
2387 UiSectionObj.StringData = self.__Token\r
2388 else:\r
2389 UiSectionObj.FileName = self.__Token\r
2390 Obj.SectionList.append(UiSectionObj)\r
2391 \r
2392 elif self.__IsKeyword( "FV_IMAGE"):\r
52302d4d
LG
2393 if AlignValue == 'Auto':\r
2394 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2395 if not self.__IsToken( "="):\r
2396 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
2397 if not self.__GetNextWord():\r
2398 raise Warning("expected FV name At Line ", self.FileName, self.CurrentLineNumber)\r
2399 \r
2400 FvName = self.__Token.upper()\r
2401 FvObj = None\r
2402\r
2403 if self.__IsToken( "{"):\r
2404 FvObj = Fv.FV()\r
2405 FvObj.UiFvName = FvName\r
2406 self.__GetDefineStatements(FvObj)\r
2407 MacroDict.update(FvObj.DefineVarDict)\r
2408 self.__GetBlockStatement(FvObj)\r
2409 self.__GetSetStatements(FvObj)\r
2410 self.__GetFvAlignment(FvObj)\r
2411 self.__GetFvAttributes(FvObj)\r
2412 self.__GetAprioriSection(FvObj, MacroDict.copy())\r
2413 self.__GetAprioriSection(FvObj, MacroDict.copy())\r
2414 \r
2415 while True:\r
2416 IsInf = self.__GetInfStatement(FvObj, MacroDict.copy())\r
2417 IsFile = self.__GetFileStatement(FvObj, MacroDict.copy())\r
2418 if not IsInf and not IsFile:\r
2419 break\r
2420 \r
2421 if not self.__IsToken( "}"):\r
2422 raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)\r
2423 \r
2424 FvImageSectionObj = CommonDataClass.FdfClass.FvImageSectionClassObject()\r
2425 FvImageSectionObj.Alignment = AlignValue\r
4231a819 2426 if FvObj is not None:\r
30fdf114
LG
2427 FvImageSectionObj.Fv = FvObj\r
2428 FvImageSectionObj.FvName = None\r
2429 else:\r
2430 FvImageSectionObj.FvName = FvName\r
2431 \r
2432 Obj.SectionList.append(FvImageSectionObj) \r
2433 \r
b303ea72 2434 elif self.__IsKeyword("PEI_DEPEX_EXP") or self.__IsKeyword("DXE_DEPEX_EXP") or self.__IsKeyword("SMM_DEPEX_EXP"):\r
52302d4d
LG
2435 if AlignValue == 'Auto':\r
2436 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2437 DepexSectionObj = CommonDataClass.FdfClass.DepexSectionClassObject()\r
2438 DepexSectionObj.Alignment = AlignValue\r
2439 DepexSectionObj.DepexType = self.__Token\r
2440 \r
2441 if not self.__IsToken( "="):\r
2442 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
2443 if not self.__IsToken( "{"):\r
2444 raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)\r
2445 if not self.__SkipToToken( "}"):\r
2446 raise Warning("expected Depex expression ending '}' At Line ", self.FileName, self.CurrentLineNumber)\r
2447 \r
2448 DepexSectionObj.Expression = self.__SkippedChars.rstrip('}')\r
2449 Obj.SectionList.append(DepexSectionObj)\r
2450 \r
2451 else:\r
2452 \r
2453 if not self.__GetNextWord():\r
2454 raise Warning("expected section type At Line ", self.FileName, self.CurrentLineNumber)\r
2455 \r
2456 # Encapsulation section appear, UndoToken and return\r
2457 if self.__Token == "COMPRESS" or self.__Token == "GUIDED":\r
2458 self.SetFileBufferPos(OldPos)\r
2459 return False\r
2460 \r
2461 if self.__Token not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
2462 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):\r
2463 raise Warning("Unknown section type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
52302d4d
LG
2464 if AlignValue == 'Auto'and (not self.__Token == 'PE32') and (not self.__Token == 'TE'):\r
2465 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2466 # DataSection\r
2467 DataSectionObj = CommonDataClass.FdfClass.DataSectionClassObject()\r
2468 DataSectionObj.Alignment = AlignValue\r
2469 DataSectionObj.SecType = self.__Token\r
2470 \r
2471 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
2472 if self.__FileCouldHaveRelocFlag(Obj.FvFileType) and self.__SectionCouldHaveRelocFlag(DataSectionObj.SecType):\r
2473 if self.__Token == 'RELOCS_STRIPPED':\r
2474 DataSectionObj.KeepReloc = False\r
2475 else:\r
2476 DataSectionObj.KeepReloc = True\r
2477 else:\r
2478 raise Warning("File type %s, section type %s, could not have reloc strip flag At Line %d" % (Obj.FvFileType, DataSectionObj.SecType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
2479 \r
2480 if self.__IsToken("="):\r
2481 if not self.__GetNextToken():\r
2482 raise Warning("expected section file path At Line ", self.FileName, self.CurrentLineNumber)\r
2483 DataSectionObj.SectFileName = self.__Token\r
2484 else:\r
2485 if not self.__GetCglSection(DataSectionObj):\r
2486 return False\r
2487 \r
2488 Obj.SectionList.append(DataSectionObj)\r
2489 \r
2490 return True\r
2491 \r
2492 ## __GetCglSection() method\r
2493 #\r
2494 # Get compressed or GUIDed section for Obj\r
2495 #\r
2496 # @param self The object pointer\r
2497 # @param Obj for whom leaf section is got\r
2498 # @param AlignValue alignment value for complex section\r
2499 # @retval True Successfully find section statement\r
2500 # @retval False Not able to find section statement\r
2501 #\r
2502 def __GetCglSection(self, Obj, AlignValue = None):\r
2503 \r
2504 if self.__IsKeyword( "COMPRESS"):\r
2505 type = "PI_STD"\r
2506 if self.__IsKeyword("PI_STD") or self.__IsKeyword("PI_NONE"):\r
2507 type = self.__Token\r
2508 \r
2509 if not self.__IsToken("{"):\r
2510 raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)\r
2511\r
2512 CompressSectionObj = CommonDataClass.FdfClass.CompressSectionClassObject()\r
2513 CompressSectionObj.Alignment = AlignValue\r
2514 CompressSectionObj.CompType = type\r
2515 # Recursive sections...\r
2516 while True:\r
2517 IsLeafSection = self.__GetLeafSection(CompressSectionObj)\r
2518 IsEncapSection = self.__GetEncapsulationSec(CompressSectionObj)\r
2519 if not IsLeafSection and not IsEncapSection:\r
2520 break\r
2521 \r
2522 \r
2523 if not self.__IsToken( "}"):\r
2524 raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)\r
2525 Obj.SectionList.append(CompressSectionObj)\r
2526 \r
2527# else:\r
2528# raise Warning("Compress type not known At Line ") \r
2529 \r
2530 return True\r
2531 \r
2532 elif self.__IsKeyword( "GUIDED"):\r
2533 GuidValue = None\r
2534 if self.__GetNextGuid():\r
2535 GuidValue = self.__Token\r
2536\r
2537 AttribDict = self.__GetGuidAttrib()\r
2538 if not self.__IsToken("{"):\r
2539 raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)\r
2540 GuidSectionObj = CommonDataClass.FdfClass.GuidSectionClassObject()\r
2541 GuidSectionObj.Alignment = AlignValue\r
2542 GuidSectionObj.NameGuid = GuidValue\r
2543 GuidSectionObj.SectionType = "GUIDED"\r
2544 GuidSectionObj.ProcessRequired = AttribDict["PROCESSING_REQUIRED"]\r
2545 GuidSectionObj.AuthStatusValid = AttribDict["AUTH_STATUS_VALID"]\r
2546 # Recursive sections...\r
2547 while True:\r
2548 IsLeafSection = self.__GetLeafSection(GuidSectionObj)\r
2549 IsEncapSection = self.__GetEncapsulationSec(GuidSectionObj)\r
2550 if not IsLeafSection and not IsEncapSection:\r
2551 break\r
2552 \r
2553 if not self.__IsToken( "}"):\r
2554 raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)\r
2555 Obj.SectionList.append(GuidSectionObj)\r
2556 \r
2557 return True\r
2558 \r
2559 return False\r
2560\r
2561 ## __GetGuidAttri() method\r
2562 #\r
2563 # Get attributes for GUID section\r
2564 #\r
2565 # @param self The object pointer\r
2566 # @retval AttribDict Dictionary of key-value pair of section attributes\r
2567 #\r
2568 def __GetGuidAttrib(self):\r
2569 \r
2570 AttribDict = {}\r
2571 AttribDict["PROCESSING_REQUIRED"] = False\r
2572 AttribDict["AUTH_STATUS_VALID"] = False\r
2573 if self.__IsKeyword("PROCESSING_REQUIRED") or self.__IsKeyword("AUTH_STATUS_VALID"):\r
2574 AttribKey = self.__Token\r
2575\r
2576 if not self.__IsToken("="):\r
2577 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
2578 \r
2579 if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):\r
2580 raise Warning("expected TRUE/FALSE (1/0) At Line ", self.FileName, self.CurrentLineNumber)\r
2581 AttribDict[AttribKey] = self.__Token\r
2582 \r
2583 if self.__IsKeyword("PROCESSING_REQUIRED") or self.__IsKeyword("AUTH_STATUS_VALID"):\r
2584 AttribKey = self.__Token\r
2585\r
2586 if not self.__IsToken("="):\r
2587 raise Warning("expected '=' At Line ")\r
2588\r
2589 if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):\r
2590 raise Warning("expected TRUE/FALSE (1/0) At Line ", self.FileName, self.CurrentLineNumber)\r
2591 AttribDict[AttribKey] = self.__Token\r
2592 \r
2593 return AttribDict\r
2594 \r
2595 ## __GetEncapsulationSec() method\r
2596 #\r
2597 # Get encapsulation section for FILE\r
2598 #\r
2599 # @param self The object pointer\r
2600 # @param FfsFile for whom section is got\r
2601 # @retval True Successfully find section statement\r
2602 # @retval False Not able to find section statement\r
2603 #\r
2604 def __GetEncapsulationSec(self, FfsFileObj): \r
2605 \r
2606 OldPos = self.GetFileBufferPos()\r
2607 if not self.__IsKeyword( "SECTION"):\r
2608 if len(FfsFileObj.SectionList) == 0:\r
2609 raise Warning("expected SECTION At Line ", self.FileName, self.CurrentLineNumber)\r
2610 else:\r
2611 return False\r
2612 \r
2613 AlignValue = None\r
2614 if self.__GetAlignment():\r
e921f58d
YZ
2615 if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
2616 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
52302d4d 2617 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2618 AlignValue = self.__Token\r
2619 \r
2620 if not self.__GetCglSection(FfsFileObj, AlignValue):\r
2621 self.SetFileBufferPos(OldPos)\r
2622 return False\r
2623 else:\r
2624 return True\r
2625\r
2626 ## __GetCapsule() method\r
2627 #\r
2628 # Get capsule section contents and store its data into capsule list of self.Profile\r
2629 #\r
2630 # @param self The object pointer\r
2631 # @retval True Successfully find a capsule\r
2632 # @retval False Not able to find a capsule\r
2633 #\r
2634 def __GetCapsule(self):\r
2635 \r
2636 if not self.__GetNextToken():\r
2637 return False\r
2638\r
2639 S = self.__Token.upper()\r
2640 if S.startswith("[") and not S.startswith("[CAPSULE."):\r
2641 if not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
2642 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber)\r
2643 self.__UndoToken()\r
2644 return False\r
2645\r
2646 self.__UndoToken()\r
2647 if not self.__IsToken("[CAPSULE.", True):\r
2648 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
2649 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
2650 % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
2651 raise Warning("expected [Capsule.] At Line ", self.FileName, self.CurrentLineNumber) \r
2652 \r
2653 CapsuleObj = CommonDataClass.FdfClass.CapsuleClassObject()\r
2654\r
2655 CapsuleName = self.__GetUiName()\r
2656 if not CapsuleName:\r
2657 raise Warning("expected capsule name At line ", self.FileName, self.CurrentLineNumber)\r
2658 \r
2659 CapsuleObj.UiCapsuleName = CapsuleName.upper()\r
2660 \r
2661 if not self.__IsToken( "]"):\r
2662 raise Warning("expected ']' At Line ", self.FileName, self.CurrentLineNumber)\r
2663 \r
2664 if self.__IsKeyword("CREATE_FILE"):\r
2665 if not self.__IsToken( "="):\r
2666 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
2667 \r
2668 if not self.__GetNextToken():\r
2669 raise Warning("expected file name At Line ", self.FileName, self.CurrentLineNumber)\r
2670 \r
2671 CapsuleObj.CreateFile = self.__Token\r
2672 \r
2673 self.__GetCapsuleStatements(CapsuleObj)\r
2674 self.Profile.CapsuleList.append(CapsuleObj)\r
2675 return True \r
2676 \r
2677 ## __GetCapsuleStatements() method\r
2678 #\r
2679 # Get statements for capsule\r
2680 #\r
2681 # @param self The object pointer\r
2682 # @param Obj for whom statements are got\r
2683 #\r
2684 def __GetCapsuleStatements(self, Obj):\r
2685 self.__GetCapsuleTokens(Obj)\r
2686 self.__GetDefineStatements(Obj)\r
2687 self.__GetSetStatements(Obj)\r
2688 \r
2689 self.__GetCapsuleData(Obj)\r
2690 \r
2691 ## __GetCapsuleStatements() method\r
2692 #\r
2693 # Get token statements for capsule\r
2694 #\r
2695 # @param self The object pointer\r
2696 # @param Obj for whom token statements are got\r
2697 #\r
2698 def __GetCapsuleTokens(self, Obj):\r
2699 \r
2700 if not self.__IsKeyword("CAPSULE_GUID"):\r
2701 raise Warning("expected 'CAPSULE_GUID' At Line ", self.FileName, self.CurrentLineNumber)\r
2702 \r
2703 while self.__CurrentLine().find("=") != -1:\r
2704 NameValue = self.__CurrentLine().split("=")\r
2705 Obj.TokensDict[NameValue[0].strip()] = NameValue[1].strip()\r
2706 self.CurrentLineNumber += 1\r
2707 self.CurrentOffsetWithinLine = 0\r
2708 \r
2709 ## __GetCapsuleData() method\r
2710 #\r
2711 # Get capsule data for capsule\r
2712 #\r
2713 # @param self The object pointer\r
2714 # @param Obj for whom capsule data are got\r
2715 #\r
2716 def __GetCapsuleData(self, Obj):\r
2717 \r
2718 while True:\r
2719 IsInf = self.__GetInfStatement(Obj, True)\r
2720 IsFile = self.__GetFileStatement(Obj, True)\r
2721 IsFv = self.__GetFvStatement(Obj)\r
2722 if not IsInf and not IsFile and not IsFv:\r
2723 break\r
2724 \r
2725 ## __GetFvStatement() method\r
2726 #\r
2727 # Get FV for capsule\r
2728 #\r
2729 # @param self The object pointer\r
2730 # @param CapsuleObj for whom FV is got\r
2731 # @retval True Successfully find a FV statement\r
2732 # @retval False Not able to find a FV statement\r
2733 #\r
2734 def __GetFvStatement(self, CapsuleObj):\r
2735 \r
2736 if not self.__IsKeyword("FV"):\r
2737 return False\r
2738 \r
2739 if not self.__IsToken("="):\r
2740 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
2741 \r
2742 if not self.__GetNextToken():\r
2743 raise Warning("expected FV name At Line ", self.FileName, self.CurrentLineNumber)\r
2744 \r
2745# CapsuleFv = CapsuleData.CapsuleFv()\r
2746# CapsuleFv.FvName = self.__Token\r
2747# CapsuleObj.CapsuleDataList.append(CapsuleFv)\r
2748 return True\r
2749 \r
2750 ## __GetRule() method\r
2751 #\r
2752 # Get Rule section contents and store its data into rule list of self.Profile\r
2753 #\r
2754 # @param self The object pointer\r
2755 # @retval True Successfully find a Rule\r
2756 # @retval False Not able to find a Rule\r
2757 #\r
2758 def __GetRule(self):\r
2759 \r
2760 if not self.__GetNextToken():\r
2761 return False\r
2762\r
2763 S = self.__Token.upper()\r
2764 if S.startswith("[") and not S.startswith("[RULE."):\r
2765 if not S.startswith("[OPTIONROM."):\r
2766 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber)\r
2767 self.__UndoToken()\r
2768 return False\r
2769 self.__UndoToken()\r
2770 if not self.__IsToken("[Rule.", True):\r
2771 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
2772 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
2773 % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
2774 raise Warning("expected [Rule.] At Line ", self.FileName, self.CurrentLineNumber)\r
2775\r
2776 if not self.__SkipToToken("."):\r
2777 raise Warning("expected '.' At Line ", self.FileName, self.CurrentLineNumber)\r
2778 \r
2779 Arch = self.__SkippedChars.rstrip(".")\r
4afd3d04 2780 if Arch.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "AARCH64", "COMMON"):\r
fd171542 2781 raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2782 \r
2783 ModuleType = self.__GetModuleType()\r
2784 \r
2785 TemplateName = ""\r
2786 if self.__IsToken("."):\r
2787 if not self.__GetNextWord():\r
2788 raise Warning("expected template name At Line ", self.FileName, self.CurrentLineNumber)\r
2789 TemplateName = self.__Token\r
2790 \r
2791 if not self.__IsToken( "]"):\r
2792 raise Warning("expected ']' At Line ", self.FileName, self.CurrentLineNumber)\r
2793 \r
2794 RuleObj = self.__GetRuleFileStatements()\r
2795 RuleObj.Arch = Arch.upper()\r
2796 RuleObj.ModuleType = ModuleType\r
2797 RuleObj.TemplateName = TemplateName\r
2798 if TemplateName == '' :\r
2799 self.Profile.RuleDict['RULE' + \\r
2800 '.' + \\r
2801 Arch.upper() + \\r
2802 '.' + \\r
2803 ModuleType.upper() ] = RuleObj\r
2804 else :\r
2805 self.Profile.RuleDict['RULE' + \\r
2806 '.' + \\r
2807 Arch.upper() + \\r
2808 '.' + \\r
2809 ModuleType.upper() + \\r
2810 '.' + \\r
2811 TemplateName.upper() ] = RuleObj\r
2812# self.Profile.RuleList.append(rule)\r
2813 return True\r
2814 \r
2815 ## __GetModuleType() method\r
2816 #\r
2817 # Return the module type\r
2818 #\r
2819 # @param self The object pointer\r
2820 # @retval string module type\r
2821 #\r
2822 def __GetModuleType(self):\r
2823 \r
2824 if not self.__GetNextWord():\r
2825 raise Warning("expected Module type At Line ", self.FileName, self.CurrentLineNumber)\r
2826 if self.__Token.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \\r
2827 "DXE_DRIVER", "DXE_SAL_DRIVER", \\r
2828 "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \\r
2829 "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \\r
2830 "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \\r
15fb5ba8 2831 "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE", "MM_STANDALONE", "MM_CORE_STANDALONE"):\r
30fdf114
LG
2832 raise Warning("Unknown Module type At line ", self.FileName, self.CurrentLineNumber)\r
2833 return self.__Token\r
2834 \r
2835 ## __GetFileExtension() method\r
2836 #\r
2837 # Return the file extension\r
2838 #\r
2839 # @param self The object pointer\r
2840 # @retval string file name extension\r
2841 #\r
2842 def __GetFileExtension(self):\r
2843 if not self.__IsToken("."):\r
2844 raise Warning("expected '.' At Line ", self.FileName, self.CurrentLineNumber)\r
2845 \r
2846 Ext = ""\r
2847 if self.__GetNextToken():\r
4d603daa 2848 if FileExtensionPattern.match(self.__Token):\r
30fdf114
LG
2849 Ext = self.__Token \r
2850 return '.' + Ext \r
2851 else:\r
2852 raise Warning("Unknown file extension At Line ", self.FileName, self.CurrentLineNumber)\r
2853 \r
2854 else:\r
2855 raise Warning("expected file extension At Line ", self.FileName, self.CurrentLineNumber)\r
2856 \r
2857 ## __GetRuleFileStatement() method\r
2858 #\r
2859 # Get rule contents\r
2860 #\r
2861 # @param self The object pointer\r
2862 # @retval Rule Rule object\r
2863 #\r
2864 def __GetRuleFileStatements(self):\r
2865 \r
2866 if not self.__IsKeyword("FILE"):\r
2867 raise Warning("expected FILE At Line ", self.FileName, self.CurrentLineNumber)\r
2868 \r
2869 if not self.__GetNextWord():\r
fd171542 2870 raise Warning("expected FFS type At Line ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2871 \r
2872 Type = self.__Token.strip().upper()\r
2873 if Type not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\\r
15fb5ba8 2874 "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE", "MM_STANDALONE"):\r
30fdf114
LG
2875 raise Warning("Unknown FV type At line ", self.FileName, self.CurrentLineNumber)\r
2876\r
2877 if not self.__IsToken("="):\r
2878 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
2879 \r
2880 if not self.__IsKeyword("$(NAMED_GUID)"):\r
2881 if not self.__GetNextWord():\r
2882 raise Warning("expected $(NAMED_GUID)", self.FileName, self.CurrentLineNumber)\r
2883 if self.__Token == 'PCD':\r
2884 if not self.__IsToken( "("):\r
2885 raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
2886 PcdPair = self.__GetNextPcdName()\r
2887 if not self.__IsToken( ")"):\r
2888 raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
2889 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
2890 \r
2891 NameGuid = self.__Token\r
2892\r
2893 KeepReloc = None\r
2894 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
2895 if self.__FileCouldHaveRelocFlag(Type):\r
2896 if self.__Token == 'RELOCS_STRIPPED':\r
2897 KeepReloc = False\r
2898 else:\r
2899 KeepReloc = True\r
2900 else:\r
2901 raise Warning("File type %s could not have reloc strip flag At Line %d" % (Type, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
2902 \r
2903 KeyStringList = []\r
2904 if self.__GetNextToken():\r
2905 Pattern = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')\r
2906 if Pattern.match(self.__Token):\r
2907 KeyStringList.append(self.__Token)\r
2908 if self.__IsToken(","):\r
2909 while self.__GetNextToken():\r
2910 if not Pattern.match(self.__Token):\r
2911 raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self.FileName, self.CurrentLineNumber)\r
2912 KeyStringList.append(self.__Token)\r
2913\r
2914 if not self.__IsToken(","):\r
2915 break\r
2916 \r
2917 else:\r
2918 self.__UndoToken()\r
2919\r
2920 \r
2921 Fixed = False\r
2922 if self.__IsKeyword("Fixed", True):\r
2923 Fixed = True\r
2924 \r
2925 CheckSum = False\r
2926 if self.__IsKeyword("CheckSum", True):\r
2927 CheckSum = True\r
2928 \r
2929 AlignValue = ""\r
2930 if self.__GetAlignment():\r
e921f58d
YZ
2931 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
2932 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
30fdf114
LG
2933 raise Warning("Incorrect alignment At Line ", self.FileName, self.CurrentLineNumber)\r
2934 AlignValue = self.__Token\r
2935\r
2936 if self.__IsToken("{"):\r
2937 # Complex file rule expected\r
2938 Rule = RuleComplexFile.RuleComplexFile()\r
2939 Rule.FvFileType = Type\r
2940 Rule.NameGuid = NameGuid\r
2941 Rule.Alignment = AlignValue\r
2942 Rule.CheckSum = CheckSum\r
2943 Rule.Fixed = Fixed\r
2944 Rule.KeyStringList = KeyStringList\r
4231a819 2945 if KeepReloc is not None:\r
30fdf114
LG
2946 Rule.KeepReloc = KeepReloc\r
2947 \r
2948 while True:\r
2949 IsEncapsulate = self.__GetRuleEncapsulationSection(Rule)\r
2950 IsLeaf = self.__GetEfiSection(Rule)\r
2951 if not IsEncapsulate and not IsLeaf:\r
2952 break\r
2953 \r
2954 if not self.__IsToken("}"):\r
2955 raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)\r
2956 \r
2957 return Rule\r
2958 \r
2959 elif self.__IsToken("|"):\r
2960 # Ext rule expected\r
2961 Ext = self.__GetFileExtension()\r
2962 \r
2963 Rule = RuleSimpleFile.RuleSimpleFile()\r
2964\r
2965 Rule.FvFileType = Type\r
2966 Rule.NameGuid = NameGuid\r
2967 Rule.Alignment = AlignValue\r
2968 Rule.CheckSum = CheckSum\r
2969 Rule.Fixed = Fixed\r
2970 Rule.FileExtension = Ext\r
2971 Rule.KeyStringList = KeyStringList\r
4231a819 2972 if KeepReloc is not None:\r
30fdf114
LG
2973 Rule.KeepReloc = KeepReloc\r
2974 \r
2975 return Rule\r
2976 \r
2977 else:\r
2978 # Simple file rule expected\r
2979 if not self.__GetNextWord():\r
2980 raise Warning("expected leaf section type At Line ", self.FileName, self.CurrentLineNumber)\r
2981\r
2982 SectionName = self.__Token\r
2983 \r
2984 if SectionName not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
2985 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):\r
2986 raise Warning("Unknown leaf section name '%s'" % SectionName, self.FileName, self.CurrentLineNumber)\r
2987\r
2988\r
2989 if self.__IsKeyword("Fixed", True):\r
2990 Fixed = True \r
2991 \r
2992 if self.__IsKeyword("CheckSum", True):\r
2993 CheckSum = True\r
2994 \r
2995 if self.__GetAlignment():\r
e921f58d
YZ
2996 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
2997 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
30fdf114 2998 raise Warning("Incorrect alignment At Line ", self.FileName, self.CurrentLineNumber)\r
52302d4d
LG
2999 if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):\r
3000 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
3001 AlignValue = self.__Token\r
3002 \r
3003 if not self.__GetNextToken():\r
3004 raise Warning("expected File name At Line ", self.FileName, self.CurrentLineNumber)\r
3005 \r
3006 Rule = RuleSimpleFile.RuleSimpleFile()\r
3007 Rule.SectionType = SectionName\r
3008 Rule.FvFileType = Type\r
3009 Rule.NameGuid = NameGuid\r
3010 Rule.Alignment = AlignValue\r
3011 Rule.CheckSum = CheckSum\r
3012 Rule.Fixed = Fixed\r
3013 Rule.FileName = self.__Token\r
3014 Rule.KeyStringList = KeyStringList\r
4231a819 3015 if KeepReloc is not None:\r
30fdf114
LG
3016 Rule.KeepReloc = KeepReloc\r
3017 return Rule\r
3018 \r
3019 ## __GetEfiSection() method\r
3020 #\r
3021 # Get section list for Rule\r
3022 #\r
3023 # @param self The object pointer\r
3024 # @param Obj for whom section is got\r
3025 # @retval True Successfully find section statement\r
3026 # @retval False Not able to find section statement\r
3027 #\r
3028 def __GetEfiSection(self, Obj):\r
3029 \r
3030 OldPos = self.GetFileBufferPos()\r
3031 if not self.__GetNextWord():\r
3032 return False\r
3033 SectionName = self.__Token\r
3034 \r
3035 if SectionName not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3036 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
3037 self.__UndoToken()\r
3038 return False\r
3039 \r
3040 if SectionName == "FV_IMAGE":\r
3041 FvImageSectionObj = FvImageSection.FvImageSection()\r
3042 if self.__IsKeyword("FV_IMAGE"):\r
3043 pass\r
3044 if self.__IsToken( "{"):\r
3045 FvObj = Fv.FV()\r
3046 self.__GetDefineStatements(FvObj)\r
3047 self.__GetBlockStatement(FvObj)\r
3048 self.__GetSetStatements(FvObj)\r
3049 self.__GetFvAlignment(FvObj)\r
3050 self.__GetFvAttributes(FvObj)\r
3051 self.__GetAprioriSection(FvObj)\r
3052 self.__GetAprioriSection(FvObj)\r
3053 \r
3054 while True:\r
3055 IsInf = self.__GetInfStatement(FvObj)\r
3056 IsFile = self.__GetFileStatement(FvObj)\r
3057 if not IsInf and not IsFile:\r
3058 break\r
3059 \r
3060 if not self.__IsToken( "}"):\r
3061 raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)\r
3062 FvImageSectionObj.Fv = FvObj\r
3063 FvImageSectionObj.FvName = None\r
3064 \r
3065 else:\r
3066 if not self.__IsKeyword("FV"):\r
3067 raise Warning("expected 'FV' At Line ", self.FileName, self.CurrentLineNumber)\r
3068 FvImageSectionObj.FvFileType = self.__Token\r
3069 \r
3070 if self.__GetAlignment():\r
e921f58d
YZ
3071 if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
3072 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
30fdf114
LG
3073 raise Warning("Incorrect alignment At Line ", self.FileName, self.CurrentLineNumber)\r
3074 FvImageSectionObj.Alignment = self.__Token\r
3075 \r
30fdf114
LG
3076 if self.__IsToken('|'):\r
3077 FvImageSectionObj.FvFileExtension = self.__GetFileExtension()\r
3078 elif self.__GetNextToken():\r
3079 if self.__Token not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3080 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
3081 FvImageSectionObj.FvFileName = self.__Token\r
3082 else:\r
3083 self.__UndoToken()\r
3084 else:\r
3085 raise Warning("expected FV file name At Line ", self.FileName, self.CurrentLineNumber)\r
3086 \r
3087 Obj.SectionList.append(FvImageSectionObj)\r
3088 return True\r
3089 \r
3090 EfiSectionObj = EfiSection.EfiSection()\r
3091 EfiSectionObj.SectionType = SectionName\r
3092 \r
3093 if not self.__GetNextToken():\r
3094 raise Warning("expected file type At Line ", self.FileName, self.CurrentLineNumber)\r
3095 \r
3096 if self.__Token == "STRING":\r
3097 if not self.__RuleSectionCouldHaveString(EfiSectionObj.SectionType):\r
3098 raise Warning("%s section could NOT have string data At Line %d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3099 \r
3100 if not self.__IsToken('='):\r
3101 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
3102 \r
3103 if not self.__GetNextToken():\r
3104 raise Warning("expected Quoted String At Line ", self.FileName, self.CurrentLineNumber)\r
3105 \r
3106 if self.__GetStringData():\r
3107 EfiSectionObj.StringData = self.__Token\r
3108 \r
3109 if self.__IsKeyword("BUILD_NUM"):\r
3110 if not self.__RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType):\r
3111 raise Warning("%s section could NOT have BUILD_NUM At Line %d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3112 \r
3113 if not self.__IsToken("="):\r
3114 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
3115 if not self.__GetNextToken():\r
3116 raise Warning("expected Build number At Line ", self.FileName, self.CurrentLineNumber)\r
3117 EfiSectionObj.BuildNum = self.__Token\r
3118 \r
3119 else:\r
3120 EfiSectionObj.FileType = self.__Token\r
3121 self.__CheckRuleSectionFileType(EfiSectionObj.SectionType, EfiSectionObj.FileType)\r
3122 \r
3123 if self.__IsKeyword("Optional"):\r
3124 if not self.__RuleSectionCouldBeOptional(EfiSectionObj.SectionType):\r
3125 raise Warning("%s section could NOT be optional At Line %d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3126 EfiSectionObj.Optional = True\r
3127 \r
3128 if self.__IsKeyword("BUILD_NUM"):\r
3129 if not self.__RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType):\r
3130 raise Warning("%s section could NOT have BUILD_NUM At Line %d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3131 \r
3132 if not self.__IsToken("="):\r
3133 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
3134 if not self.__GetNextToken():\r
3135 raise Warning("expected Build number At Line ", self.FileName, self.CurrentLineNumber)\r
3136 EfiSectionObj.BuildNum = self.__Token\r
3137 \r
3138 if self.__GetAlignment():\r
e921f58d
YZ
3139 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
3140 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
52302d4d
LG
3141 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3142 if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):\r
3143 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
3144 EfiSectionObj.Alignment = self.__Token\r
3145 \r
3146 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
3147 if self.__SectionCouldHaveRelocFlag(EfiSectionObj.SectionType):\r
3148 if self.__Token == 'RELOCS_STRIPPED':\r
3149 EfiSectionObj.KeepReloc = False\r
3150 else:\r
3151 EfiSectionObj.KeepReloc = True\r
4231a819 3152 if Obj.KeepReloc is not None and Obj.KeepReloc != EfiSectionObj.KeepReloc:\r
30fdf114
LG
3153 raise Warning("Section type %s has reloc strip flag conflict with Rule At Line %d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3154 else:\r
3155 raise Warning("Section type %s could not have reloc strip flag At Line %d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3156 \r
3157 \r
3158 if self.__IsToken('|'):\r
3159 EfiSectionObj.FileExtension = self.__GetFileExtension()\r
3160 elif self.__GetNextToken():\r
3161 if self.__Token not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3162 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
3163 \r
3164 if self.__Token.startswith('PCD'):\r
3165 self.__UndoToken()\r
3166 self.__GetNextWord()\r
3167 \r
3168 if self.__Token == 'PCD':\r
3169 if not self.__IsToken( "("):\r
3170 raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
3171 PcdPair = self.__GetNextPcdName()\r
3172 if not self.__IsToken( ")"):\r
3173 raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
3174 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
3175 \r
3176 EfiSectionObj.FileName = self.__Token \r
3177 \r
3178 else:\r
3179 self.__UndoToken()\r
3180 else:\r
3181 raise Warning("expected section file name At Line ", self.FileName, self.CurrentLineNumber)\r
3182 \r
3183 Obj.SectionList.append(EfiSectionObj)\r
3184 return True\r
3185 \r
3186 ## __RuleSectionCouldBeOptional() method\r
3187 #\r
3188 # Get whether a section could be optional\r
3189 #\r
3190 # @param self The object pointer\r
3191 # @param SectionType The section type to check\r
3192 # @retval True section could be optional\r
3193 # @retval False section never optional\r
3194 #\r
3195 def __RuleSectionCouldBeOptional(self, SectionType):\r
3196 if SectionType in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):\r
3197 return True\r
3198 else:\r
3199 return False\r
3200 \r
3201 ## __RuleSectionCouldHaveBuildNum() method\r
3202 #\r
3203 # Get whether a section could have build number information\r
3204 #\r
3205 # @param self The object pointer\r
3206 # @param SectionType The section type to check\r
3207 # @retval True section could have build number information\r
3208 # @retval False section never have build number information\r
3209 #\r
3210 def __RuleSectionCouldHaveBuildNum(self, SectionType):\r
3211 if SectionType in ("VERSION"):\r
3212 return True\r
3213 else:\r
3214 return False\r
3215 \r
3216 ## __RuleSectionCouldHaveString() method\r
3217 #\r
3218 # Get whether a section could have string\r
3219 #\r
3220 # @param self The object pointer\r
3221 # @param SectionType The section type to check\r
3222 # @retval True section could have string\r
3223 # @retval False section never have string\r
3224 #\r
3225 def __RuleSectionCouldHaveString(self, SectionType):\r
3226 if SectionType in ("UI", "VERSION"):\r
3227 return True\r
3228 else:\r
3229 return False\r
3230 \r
3231 ## __CheckRuleSectionFileType() method\r
3232 #\r
3233 # Get whether a section matches a file type\r
3234 #\r
3235 # @param self The object pointer\r
3236 # @param SectionType The section type to check\r
3237 # @param FileType The file type to check\r
3238 #\r
3239 def __CheckRuleSectionFileType(self, SectionType, FileType):\r
3240 if SectionType == "COMPAT16":\r
3241 if FileType not in ("COMPAT16", "SEC_COMPAT16"):\r
3242 raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)\r
3243 elif SectionType == "PE32":\r
3244 if FileType not in ("PE32", "SEC_PE32"):\r
3245 raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)\r
3246 elif SectionType == "PIC":\r
3247 if FileType not in ("PIC", "PIC"):\r
3248 raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)\r
3249 elif SectionType == "TE":\r
3250 if FileType not in ("TE", "SEC_TE"):\r
3251 raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)\r
3252 elif SectionType == "RAW":\r
3253 if FileType not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):\r
3254 raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)\r
b303ea72
LG
3255 elif SectionType == "DXE_DEPEX" or SectionType == "SMM_DEPEX":\r
3256 if FileType not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):\r
30fdf114
LG
3257 raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)\r
3258 elif SectionType == "UI":\r
3259 if FileType not in ("UI", "SEC_UI"):\r
3260 raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)\r
3261 elif SectionType == "VERSION":\r
3262 if FileType not in ("VERSION", "SEC_VERSION"):\r
3263 raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)\r
3264 elif SectionType == "PEI_DEPEX":\r
3265 if FileType not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):\r
3266 raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)\r
3267 elif SectionType == "GUID":\r
3268 if FileType not in ("PE32", "SEC_GUID"):\r
3269 raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber) \r
3270 \r
3271 ## __GetRuleEncapsulationSection() method\r
3272 #\r
3273 # Get encapsulation section for Rule\r
3274 #\r
3275 # @param self The object pointer\r
3276 # @param Rule for whom section is got\r
3277 # @retval True Successfully find section statement\r
3278 # @retval False Not able to find section statement\r
3279 #\r
3280 def __GetRuleEncapsulationSection(self, Rule):\r
3281\r
3282 if self.__IsKeyword( "COMPRESS"):\r
3283 Type = "PI_STD"\r
3284 if self.__IsKeyword("PI_STD") or self.__IsKeyword("PI_NONE"):\r
3285 Type = self.__Token\r
3286 \r
3287 if not self.__IsToken("{"):\r
3288 raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)\r
3289\r
3290 CompressSectionObj = CompressSection.CompressSection()\r
3291 \r
3292 CompressSectionObj.CompType = Type\r
3293 # Recursive sections...\r
3294 while True:\r
3295 IsEncapsulate = self.__GetRuleEncapsulationSection(CompressSectionObj)\r
3296 IsLeaf = self.__GetEfiSection(CompressSectionObj)\r
3297 if not IsEncapsulate and not IsLeaf:\r
3298 break\r
3299 \r
3300 if not self.__IsToken( "}"):\r
3301 raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)\r
3302 Rule.SectionList.append(CompressSectionObj)\r
3303 \r
3304 return True\r
3305\r
3306 elif self.__IsKeyword( "GUIDED"):\r
3307 GuidValue = None\r
3308 if self.__GetNextGuid():\r
3309 GuidValue = self.__Token\r
3310 \r
3311 if self.__IsKeyword( "$(NAMED_GUID)"):\r
3312 GuidValue = self.__Token\r
3313 \r
3314 AttribDict = self.__GetGuidAttrib()\r
3315 \r
3316 if not self.__IsToken("{"):\r
3317 raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)\r
3318 GuidSectionObj = GuidSection.GuidSection()\r
3319 GuidSectionObj.NameGuid = GuidValue\r
3320 GuidSectionObj.SectionType = "GUIDED"\r
3321 GuidSectionObj.ProcessRequired = AttribDict["PROCESSING_REQUIRED"]\r
3322 GuidSectionObj.AuthStatusValid = AttribDict["AUTH_STATUS_VALID"]\r
3323 \r
3324 # Efi sections...\r
3325 while True:\r
3326 IsEncapsulate = self.__GetRuleEncapsulationSection(GuidSectionObj)\r
3327 IsLeaf = self.__GetEfiSection(GuidSectionObj)\r
3328 if not IsEncapsulate and not IsLeaf:\r
3329 break\r
3330 \r
3331 if not self.__IsToken( "}"):\r
3332 raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)\r
3333 Rule.SectionList.append(GuidSectionObj)\r
3334\r
3335 return True\r
3336\r
3337 return False\r
3338 \r
3339 ## __GetVtf() method\r
3340 #\r
3341 # Get VTF section contents and store its data into VTF list of self.Profile\r
3342 #\r
3343 # @param self The object pointer\r
3344 # @retval True Successfully find a VTF\r
3345 # @retval False Not able to find a VTF\r
3346 #\r
3347 def __GetVtf(self):\r
3348 \r
3349 if not self.__GetNextToken():\r
3350 return False\r
3351\r
3352 S = self.__Token.upper()\r
3353 if S.startswith("[") and not S.startswith("[VTF."):\r
3354 if not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
3355 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber)\r
3356 self.__UndoToken()\r
3357 return False\r
3358\r
3359 self.__UndoToken()\r
3360 if not self.__IsToken("[VTF.", True):\r
3361 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
3362 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
3363 % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
3364 raise Warning("expected [VTF.] At Line ", self.FileName, self.CurrentLineNumber)\r
3365\r
3366 if not self.__SkipToToken("."):\r
3367 raise Warning("expected '.' At Line ", self.FileName, self.CurrentLineNumber)\r
3368\r
3369 Arch = self.__SkippedChars.rstrip(".").upper()\r
4afd3d04 3370 if Arch not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):\r
30fdf114
LG
3371 raise Warning("Unknown Arch At line ", self.FileName, self.CurrentLineNumber)\r
3372\r
3373 if not self.__GetNextWord():\r
3374 raise Warning("expected VTF name At Line ", self.FileName, self.CurrentLineNumber)\r
3375 Name = self.__Token.upper()\r
3376\r
3377 VtfObj = Vtf.Vtf()\r
3378 VtfObj.UiName = Name\r
3379 VtfObj.KeyArch = Arch\r
3380 \r
3381 if self.__IsToken(","):\r
3382 if not self.__GetNextWord():\r
3383 raise Warning("expected Arch list At Line ", self.FileName, self.CurrentLineNumber)\r
4afd3d04 3384 if self.__Token.upper() not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):\r
30fdf114
LG
3385 raise Warning("Unknown Arch At line ", self.FileName, self.CurrentLineNumber)\r
3386 VtfObj.ArchList = self.__Token.upper()\r
3387\r
3388 if not self.__IsToken( "]"):\r
3389 raise Warning("expected ']' At Line ", self.FileName, self.CurrentLineNumber)\r
3390 \r
3391 if self.__IsKeyword("IA32_RST_BIN"):\r
3392 if not self.__IsToken("="):\r
3393 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
3394\r
3395 if not self.__GetNextToken():\r
3396 raise Warning("expected Reset file At Line ", self.FileName, self.CurrentLineNumber)\r
3397\r
3398 VtfObj.ResetBin = self.__Token\r
3399 \r
3400 while self.__GetComponentStatement(VtfObj):\r
3401 pass\r
3402 \r
3403 self.Profile.VtfList.append(VtfObj)\r
3404 return True\r
3405 \r
3406 ## __GetComponentStatement() method\r
3407 #\r
3408 # Get components in VTF\r
3409 #\r
3410 # @param self The object pointer\r
3411 # @param VtfObj for whom component is got\r
3412 # @retval True Successfully find a component\r
3413 # @retval False Not able to find a component\r
3414 #\r
3415 def __GetComponentStatement(self, VtfObj):\r
3416 \r
3417 if not self.__IsKeyword("COMP_NAME"):\r
3418 return False\r
3419 \r
3420 if not self.__IsToken("="):\r
3421 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
3422\r
3423 if not self.__GetNextWord():\r
3424 raise Warning("expected Component Name At Line ", self.FileName, self.CurrentLineNumber)\r
3425\r
3426 CompStatementObj = ComponentStatement.ComponentStatement()\r
3427 CompStatementObj.CompName = self.__Token\r
3428 \r
3429 if not self.__IsKeyword("COMP_LOC"):\r
3430 raise Warning("expected COMP_LOC At Line ", self.FileName, self.CurrentLineNumber)\r
3431\r
3432 if not self.__IsToken("="):\r
3433 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
3434\r
3435 CompStatementObj.CompLoc = ""\r
3436 if self.__GetNextWord():\r
3437 CompStatementObj.CompLoc = self.__Token\r
3438 if self.__IsToken('|'):\r
3439 if not self.__GetNextWord():\r
3440 raise Warning("Expected Region Name At Line ", self.FileName, self.CurrentLineNumber)\r
3441 \r
3442 if self.__Token not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support\r
3443 raise Warning("Unknown location type At line ", self.FileName, self.CurrentLineNumber)\r
3444 \r
3445 CompStatementObj.FilePos = self.__Token\r
3446 else:\r
3447 self.CurrentLineNumber += 1\r
3448 self.CurrentOffsetWithinLine = 0\r
3449 \r
3450 if not self.__IsKeyword("COMP_TYPE"):\r
3451 raise Warning("expected COMP_TYPE At Line ", self.FileName, self.CurrentLineNumber)\r
3452\r
3453 if not self.__IsToken("="):\r
3454 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
3455\r
3456 if not self.__GetNextToken():\r
3457 raise Warning("expected Component type At Line ", self.FileName, self.CurrentLineNumber)\r
3458 if self.__Token not in ("FIT", "PAL_B", "PAL_A", "OEM"):\r
3459 if not self.__Token.startswith("0x") or len(self.__Token) < 3 or len(self.__Token) > 4 or \\r
3460 not self.__HexDigit(self.__Token[2]) or not self.__HexDigit(self.__Token[-1]):\r
3461 raise Warning("Unknown location type At line ", self.FileName, self.CurrentLineNumber)\r
3462 CompStatementObj.CompType = self.__Token\r
3463 \r
3464 if not self.__IsKeyword("COMP_VER"):\r
3465 raise Warning("expected COMP_VER At Line ", self.FileName, self.CurrentLineNumber)\r
3466\r
3467 if not self.__IsToken("="):\r
3468 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
3469\r
3470 if not self.__GetNextToken():\r
3471 raise Warning("expected Component version At Line ", self.FileName, self.CurrentLineNumber)\r
3472\r
3473 Pattern = re.compile('-$|[0-9]{0,1}[0-9]{1}\.[0-9]{0,1}[0-9]{1}')\r
4231a819 3474 if Pattern.match(self.__Token) is None:\r
30fdf114
LG
3475 raise Warning("Unknown version format At line ", self.FileName, self.CurrentLineNumber)\r
3476 CompStatementObj.CompVer = self.__Token\r
3477 \r
3478 if not self.__IsKeyword("COMP_CS"):\r
3479 raise Warning("expected COMP_CS At Line ", self.FileName, self.CurrentLineNumber)\r
3480\r
3481 if not self.__IsToken("="):\r
3482 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
3483\r
3484 if not self.__GetNextToken():\r
3485 raise Warning("expected Component CS At Line ", self.FileName, self.CurrentLineNumber)\r
3486 if self.__Token not in ("1", "0"):\r
3487 raise Warning("Unknown Component CS At line ", self.FileName, self.CurrentLineNumber)\r
3488 CompStatementObj.CompCs = self.__Token\r
3489 \r
3490 \r
3491 if not self.__IsKeyword("COMP_BIN"):\r
3492 raise Warning("expected COMP_BIN At Line ", self.FileName, self.CurrentLineNumber)\r
3493\r
3494 if not self.__IsToken("="):\r
3495 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
3496\r
3497 if not self.__GetNextToken():\r
3498 raise Warning("expected Component file At Line ", self.FileName, self.CurrentLineNumber)\r
3499\r
3500 CompStatementObj.CompBin = self.__Token\r
3501 \r
3502 if not self.__IsKeyword("COMP_SYM"):\r
3503 raise Warning("expected COMP_SYM At Line ", self.FileName, self.CurrentLineNumber)\r
3504\r
3505 if not self.__IsToken("="):\r
3506 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
3507\r
3508 if not self.__GetNextToken():\r
3509 raise Warning("expected Component symbol file At Line ", self.FileName, self.CurrentLineNumber)\r
3510\r
3511 CompStatementObj.CompSym = self.__Token\r
3512 \r
3513 if not self.__IsKeyword("COMP_SIZE"):\r
3514 raise Warning("expected COMP_SIZE At Line ", self.FileName, self.CurrentLineNumber)\r
3515\r
3516 if not self.__IsToken("="):\r
3517 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
3518\r
3519 if self.__IsToken("-"):\r
3520 CompStatementObj.CompSize = self.__Token\r
3521 elif self.__GetNextDecimalNumber():\r
3522 CompStatementObj.CompSize = self.__Token\r
3523 elif self.__GetNextHexNumber():\r
3524 CompStatementObj.CompSize = self.__Token\r
3525 else:\r
3526 raise Warning("Unknown size At line ", self.FileName, self.CurrentLineNumber)\r
3527 \r
3528 VtfObj.ComponentStatementList.append(CompStatementObj)\r
3529 return True\r
3530 \r
3531 ## __GetFvInFd() method\r
3532 #\r
3533 # Get FV list contained in FD\r
3534 #\r
3535 # @param self The object pointer\r
3536 # @param FdName FD name\r
3537 # @retval FvList list of FV in FD\r
3538 #\r
3539 def __GetFvInFd (self, FdName):\r
3540 \r
3541 FvList = []\r
3542 if FdName.upper() in self.Profile.FdDict.keys():\r
3543 FdObj = self.Profile.FdDict[FdName.upper()]\r
3544 for elementRegion in FdObj.RegionList:\r
3545 if elementRegion.RegionType == 'FV':\r
3546 for elementRegionData in elementRegion.RegionDataList:\r
4231a819 3547 if elementRegionData is not None and elementRegionData.upper() not in FvList:\r
30fdf114
LG
3548 FvList.append(elementRegionData.upper())\r
3549 return FvList\r
3550 \r
3551 ## __GetReferencedFdFvTuple() method\r
3552 #\r
3553 # Get FD and FV list referenced by a FFS file\r
3554 #\r
3555 # @param self The object pointer\r
3556 # @param FfsFile contains sections to be searched\r
3557 # @param RefFdList referenced FD by section\r
3558 # @param RefFvList referenced FV by section\r
3559 #\r
3560 def __GetReferencedFdFvTuple(self, FvObj, RefFdList = [], RefFvList = []):\r
3561 \r
3562 for FfsObj in FvObj.FfsList:\r
3563 if isinstance(FfsObj, FfsFileStatement.FileStatement):\r
4231a819 3564 if FfsObj.FvName is not None and FfsObj.FvName.upper() not in RefFvList:\r
30fdf114 3565 RefFvList.append(FfsObj.FvName.upper())\r
4231a819 3566 elif FfsObj.FdName is not None and FfsObj.FdName.upper() not in RefFdList:\r
30fdf114
LG
3567 RefFdList.append(FfsObj.FdName.upper())\r
3568 else:\r
3569 self.__GetReferencedFdFvTupleFromSection(FfsObj, RefFdList, RefFvList) \r
3570 \r
3571 ## __GetReferencedFdFvTupleFromSection() method\r
3572 #\r
3573 # Get FD and FV list referenced by a FFS section\r
3574 #\r
3575 # @param self The object pointer\r
3576 # @param FfsFile contains sections to be searched\r
3577 # @param FdList referenced FD by section\r
3578 # @param FvList referenced FV by section\r
3579 #\r
3580 def __GetReferencedFdFvTupleFromSection(self, FfsFile, FdList = [], FvList = []):\r
3581 \r
3582 SectionStack = []\r
3583 SectionStack.extend(FfsFile.SectionList)\r
3584 while SectionStack != []:\r
3585 SectionObj = SectionStack.pop()\r
3586 if isinstance(SectionObj, FvImageSection.FvImageSection):\r
4231a819 3587 if SectionObj.FvName is not None and SectionObj.FvName.upper() not in FvList:\r
30fdf114 3588 FvList.append(SectionObj.FvName.upper())\r
4231a819 3589 if SectionObj.Fv is not None and SectionObj.Fv.UiFvName is not None and SectionObj.Fv.UiFvName.upper() not in FvList:\r
30fdf114
LG
3590 FvList.append(SectionObj.Fv.UiFvName.upper())\r
3591 self.__GetReferencedFdFvTuple(SectionObj.Fv, FdList, FvList)\r
3592 \r
3593 if isinstance(SectionObj, CompressSection.CompressSection) or isinstance(SectionObj, GuidSection.GuidSection):\r
3594 SectionStack.extend(SectionObj.SectionList)\r
3595 \r
3596 ## CycleReferenceCheck() method\r
3597 #\r
3598 # Check whether cycle reference exists in FDF\r
3599 #\r
3600 # @param self The object pointer\r
3601 # @retval True cycle reference exists\r
3602 # @retval False Not exists cycle reference\r
3603 #\r
3604 def CycleReferenceCheck(self):\r
3605 \r
3606 CycleRefExists = False\r
3607 \r
3608 try:\r
3609 for FvName in self.Profile.FvDict.keys():\r
3610 LogStr = "Cycle Reference Checking for FV: %s\n" % FvName\r
3611 RefFvStack = []\r
3612 RefFvStack.append(FvName)\r
3613 FdAnalyzedList = []\r
3614 \r
3615 while RefFvStack != []:\r
3616 FvNameFromStack = RefFvStack.pop()\r
3617 if FvNameFromStack.upper() in self.Profile.FvDict.keys():\r
3618 FvObj = self.Profile.FvDict[FvNameFromStack.upper()]\r
3619 else:\r
3620 continue\r
3621 \r
3622 RefFdList = []\r
3623 RefFvList = []\r
3624 self.__GetReferencedFdFvTuple(FvObj, RefFdList, RefFvList)\r
3625 \r
3626 for RefFdName in RefFdList:\r
3627 if RefFdName in FdAnalyzedList:\r
3628 continue\r
3629 \r
3630 LogStr += "FD %s is referenced by FV %s\n" % (RefFdName, FvNameFromStack) \r
3631 FvInFdList = self.__GetFvInFd(RefFdName)\r
3632 if FvInFdList != []:\r
3633 LogStr += "FD %s contains FV: " % RefFdName\r
3634 for FvObj in FvInFdList:\r
3635 LogStr += FvObj\r
3636 LogStr += ' \n'\r
3637 if FvObj not in RefFvStack:\r
3638 RefFvStack.append(FvObj)\r
3639 \r
3640 if FvName in RefFvStack:\r
3641 CycleRefExists = True\r
3642 raise Warning(LogStr)\r
3643 FdAnalyzedList.append(RefFdName)\r
3644 \r
3645 for RefFvName in RefFvList:\r
3646 LogStr += "FV %s is referenced by FV %s\n" % (RefFvName, FvNameFromStack)\r
3647 if RefFvName not in RefFvStack:\r
3648 RefFvStack.append(RefFvName)\r
3649 \r
3650 if FvName in RefFvStack:\r
3651 CycleRefExists = True\r
3652 raise Warning(LogStr)\r
3653 \r
3654 except Warning:\r
3655 print LogStr\r
3656 \r
3657 finally:\r
3658 return CycleRefExists\r
3659 \r
3660if __name__ == "__main__":\r
b36d134f
LG
3661 import sys\r
3662 try:\r
3663 test_file = sys.argv[1]\r
3664 except IndexError, v:\r
3665 print "Usage: %s filename" % sys.argv[0]\r
3666 sys.exit(1)\r
3667\r
3668 parser = FdfParser(test_file)\r
30fdf114
LG
3669 try:\r
3670 parser.ParseFile()\r
3671 parser.CycleReferenceCheck()\r
3672 except Warning, X:\r
3673 print X.message\r
3674 else:\r
3675 print "Success!"\r
3676\r