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