]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/Common/FdfParserLite.py
BaseTools: FdfParser & FdfParserLite refactor regular expression for GUIDs
[mirror_edk2.git] / BaseTools / Source / Python / Common / FdfParserLite.py
CommitLineData
30fdf114
LG
1## @file\r
2# parse FDF file\r
3#\r
2eb370ff 4# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
30fdf114 5#\r
40d841f6 6# This program and the accompanying materials\r
30fdf114
LG
7# are licensed and made available under the terms and conditions of the BSD License\r
8# which accompanies this distribution. The full text of the license may be found at\r
9# http://opensource.org/licenses/bsd-license.php\r
10#\r
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13#\r
14\r
15##\r
16# Import Modules\r
17#\r
18import re\r
1be2ed90 19import Common.LongFilePathOs as os\r
30fdf114
LG
20\r
21import CommonDataClass.FdfClass\r
1be2ed90 22from Common.LongFilePathSupport import OpenLongFilePath as open\r
05cc51ad 23from Common.MultipleWorkspace import MultipleWorkspace as mws\r
2eb370ff 24from Common.RangeExpression import RangeExpression\r
30fdf114
LG
25\r
26##define T_CHAR_SPACE ' '\r
27##define T_CHAR_NULL '\0'\r
28##define T_CHAR_CR '\r'\r
29##define T_CHAR_TAB '\t'\r
30##define T_CHAR_LF '\n'\r
31##define T_CHAR_SLASH '/'\r
32##define T_CHAR_BACKSLASH '\\'\r
33##define T_CHAR_DOUBLE_QUOTE '\"'\r
34##define T_CHAR_SINGLE_QUOTE '\''\r
35##define T_CHAR_STAR '*'\r
36##define T_CHAR_HASH '#'\r
37\r
38(T_CHAR_SPACE, T_CHAR_NULL, T_CHAR_CR, T_CHAR_TAB, T_CHAR_LF, T_CHAR_SLASH, \\r
39T_CHAR_BACKSLASH, T_CHAR_DOUBLE_QUOTE, T_CHAR_SINGLE_QUOTE, T_CHAR_STAR, T_CHAR_HASH) = \\r
40(' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#')\r
41\r
42SEPERATOR_TUPLE = ('=', '|', ',', '{', '}') \r
43\r
44IncludeFileList = []\r
45# Macro passed from command line, which has greatest priority and can NOT be overridden by those in FDF\r
46InputMacroDict = {}\r
47# All Macro values when parsing file, not replace existing Macro\r
48AllMacroList = []\r
49\r
50def GetRealFileLine (File, Line):\r
51 \r
52 InsertedLines = 0\r
53 for Profile in IncludeFileList:\r
54 if Line >= Profile.InsertStartLineNumber and Line < Profile.InsertStartLineNumber + Profile.InsertAdjust + len(Profile.FileLinesList):\r
55 return (Profile.FileName, Line - Profile.InsertStartLineNumber + 1)\r
56 if Line >= Profile.InsertStartLineNumber + Profile.InsertAdjust + len(Profile.FileLinesList):\r
57 InsertedLines += Profile.InsertAdjust + len(Profile.FileLinesList)\r
58 \r
59 return (File, Line - InsertedLines)\r
60\r
61## The exception class that used to report error messages when parsing FDF\r
62#\r
63# Currently the "ToolName" is set to be "FDF Parser".\r
64#\r
65class Warning (Exception):\r
66 ## The constructor\r
67 #\r
68 # @param self The object pointer\r
69 # @param Str The message to record\r
70 # @param File The FDF name\r
71 # @param Line The Line number that error occurs\r
72 #\r
47fea6af
YZ
73 def __init__(self, Str, File=None, Line=None):\r
74\r
30fdf114
LG
75 FileLineTuple = GetRealFileLine(File, Line)\r
76 self.FileName = FileLineTuple[0]\r
77 self.LineNumber = FileLineTuple[1]\r
78 self.message = Str + str(self.LineNumber)\r
79 self.ToolName = 'FDF Parser'\r
80 \r
81## The MACRO class that used to record macro value data when parsing include file\r
82#\r
83#\r
84class MacroProfile :\r
85 ## The constructor\r
86 #\r
87 # @param self The object pointer\r
88 # @param FileName The file that to be parsed\r
89 #\r
90 def __init__(self, FileName, Line):\r
91 self.FileName = FileName \r
92 self.DefinedAtLine = Line\r
93 self.MacroName = None\r
94 self.MacroValue = None\r
95\r
96## The Include file content class that used to record file data when parsing include file\r
97#\r
98# May raise Exception when opening file.\r
99#\r
100class IncludeFileProfile :\r
101 ## The constructor\r
102 #\r
103 # @param self The object pointer\r
104 # @param FileName The file that to be parsed\r
105 #\r
106 def __init__(self, FileName):\r
107 self.FileName = FileName\r
108 self.FileLinesList = []\r
109 try:\r
110 fsock = open(FileName, "rb", 0)\r
111 try:\r
112 self.FileLinesList = fsock.readlines()\r
113 finally:\r
114 fsock.close()\r
115\r
116 except IOError:\r
117 raise Warning("Error when opening file %s" % FileName)\r
118 \r
119 self.InsertStartLineNumber = None\r
120 self.InsertAdjust = 0\r
121\r
122## The FDF content class that used to record file data when parsing FDF\r
123#\r
124# May raise Exception when opening file.\r
125#\r
126class FileProfile :\r
127 ## The constructor\r
128 #\r
129 # @param self The object pointer\r
130 # @param FileName The file that to be parsed\r
131 #\r
132 def __init__(self, FileName):\r
133 self.FileLinesList = []\r
134 try:\r
135 fsock = open(FileName, "rb", 0)\r
136 try:\r
137 self.FileLinesList = fsock.readlines()\r
138 finally:\r
139 fsock.close()\r
140\r
141 except IOError:\r
142 raise Warning("Error when opening file %s" % FileName)\r
143 \r
144 self.PcdDict = {}\r
145 self.InfList = []\r
146 \r
147 self.PcdFileLineDict = {}\r
148 self.InfFileLineList = []\r
149 \r
150 self.FdDict = {}\r
151 self.FvDict = {}\r
152 self.CapsuleList = []\r
153# self.VtfList = []\r
154# self.RuleDict = {}\r
155\r
156## The syntax parser for FDF\r
157#\r
158# PreprocessFile method should be called prior to ParseFile\r
159# CycleReferenceCheck method can detect cycles in FDF contents\r
160#\r
161# GetNext*** procedures mean these procedures will get next token first, then make judgement.\r
162# Get*** procedures mean these procedures will make judgement on current token only.\r
163# \r
164class FdfParser(object):\r
165 ## The constructor\r
166 #\r
167 # @param self The object pointer\r
168 # @param FileName The file that to be parsed\r
169 #\r
170 def __init__(self, FileName):\r
171 self.Profile = FileProfile(FileName)\r
172 self.FileName = FileName\r
173 self.CurrentLineNumber = 1\r
174 self.CurrentOffsetWithinLine = 0\r
175 self.CurrentFdName = None\r
176 self.CurrentFvName = None\r
177 self.__Token = ""\r
178 self.__SkippedChars = ""\r
179 \r
180 self.__WipeOffArea = []\r
181\r
182 ## __IsWhiteSpace() method\r
183 #\r
184 # Whether char at current FileBufferPos is whitespace\r
185 #\r
186 # @param self The object pointer\r
187 # @param Char The char to test\r
188 # @retval True The char is a kind of white space\r
189 # @retval False The char is NOT a kind of white space\r
190 #\r
191 def __IsWhiteSpace(self, Char):\r
192 if Char in (T_CHAR_NULL, T_CHAR_CR, T_CHAR_SPACE, T_CHAR_TAB, T_CHAR_LF):\r
193 return True\r
194 else:\r
195 return False\r
196\r
197 ## __SkipWhiteSpace() method\r
198 #\r
199 # Skip white spaces from current char, return number of chars skipped\r
200 #\r
201 # @param self The object pointer\r
202 # @retval Count The number of chars skipped\r
203 #\r
204 def __SkipWhiteSpace(self):\r
205 Count = 0\r
206 while not self.__EndOfFile():\r
207 Count += 1\r
208 if self.__CurrentChar() in (T_CHAR_NULL, T_CHAR_CR, T_CHAR_LF, T_CHAR_SPACE, T_CHAR_TAB):\r
209 self.__SkippedChars += str(self.__CurrentChar())\r
210 self.__GetOneChar()\r
211\r
212 else:\r
213 Count = Count - 1\r
214 return Count\r
215\r
216 ## __EndOfFile() method\r
217 #\r
218 # Judge current buffer pos is at file end\r
219 #\r
220 # @param self The object pointer\r
221 # @retval True Current File buffer position is at file end\r
222 # @retval False Current File buffer position is NOT at file end\r
223 #\r
224 def __EndOfFile(self):\r
225 NumberOfLines = len(self.Profile.FileLinesList)\r
226 SizeOfLastLine = len(self.Profile.FileLinesList[-1])\r
227 if self.CurrentLineNumber == NumberOfLines and self.CurrentOffsetWithinLine >= SizeOfLastLine - 1:\r
228 return True\r
229 elif self.CurrentLineNumber > NumberOfLines:\r
230 return True\r
231 else:\r
232 return False\r
233\r
234 ## __EndOfLine() method\r
235 #\r
236 # Judge current buffer pos is at line end\r
237 #\r
238 # @param self The object pointer\r
239 # @retval True Current File buffer position is at line end\r
240 # @retval False Current File buffer position is NOT at line end\r
241 #\r
242 def __EndOfLine(self):\r
243 if self.CurrentLineNumber > len(self.Profile.FileLinesList):\r
244 return True\r
245 SizeOfCurrentLine = len(self.Profile.FileLinesList[self.CurrentLineNumber - 1])\r
246 if self.CurrentOffsetWithinLine >= SizeOfCurrentLine:\r
247 return True\r
248 else:\r
249 return False\r
250 \r
251 ## Rewind() method\r
252 #\r
253 # Reset file data buffer to the initial state\r
254 #\r
255 # @param self The object pointer\r
256 #\r
257 def Rewind(self):\r
258 self.CurrentLineNumber = 1\r
259 self.CurrentOffsetWithinLine = 0\r
260 \r
261 ## __UndoOneChar() method\r
262 #\r
263 # Go back one char in the file buffer\r
264 #\r
265 # @param self The object pointer\r
266 # @retval True Successfully go back one char\r
267 # @retval False Not able to go back one char as file beginning reached\r
268 # \r
269 def __UndoOneChar(self):\r
270 \r
271 if self.CurrentLineNumber == 1 and self.CurrentOffsetWithinLine == 0:\r
272 return False\r
273 elif self.CurrentOffsetWithinLine == 0:\r
274 self.CurrentLineNumber -= 1\r
275 self.CurrentOffsetWithinLine = len(self.__CurrentLine()) - 1\r
276 else:\r
277 self.CurrentOffsetWithinLine -= 1\r
278 return True\r
279 \r
280 ## __GetOneChar() method\r
281 #\r
282 # Move forward one char in the file buffer\r
283 #\r
284 # @param self The object pointer\r
285 # \r
286 def __GetOneChar(self):\r
287 if self.CurrentOffsetWithinLine == len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) - 1:\r
288 self.CurrentLineNumber += 1\r
289 self.CurrentOffsetWithinLine = 0\r
290 else:\r
291 self.CurrentOffsetWithinLine += 1\r
292\r
293 ## __CurrentChar() method\r
294 #\r
295 # Get the char pointed to by the file buffer pointer\r
296 #\r
297 # @param self The object pointer\r
298 # @retval Char Current char\r
299 # \r
300 def __CurrentChar(self):\r
301 return self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine]\r
302 \r
303 ## __NextChar() method\r
304 #\r
305 # Get the one char pass the char pointed to by the file buffer pointer\r
306 #\r
307 # @param self The object pointer\r
308 # @retval Char Next char\r
309 #\r
310 def __NextChar(self):\r
311 if self.CurrentOffsetWithinLine == len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) - 1:\r
312 return self.Profile.FileLinesList[self.CurrentLineNumber][0]\r
313 else:\r
314 return self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine + 1]\r
315 \r
316 ## __SetCurrentCharValue() method\r
317 #\r
318 # Modify the value of current char\r
319 #\r
320 # @param self The object pointer\r
321 # @param Value The new value of current char\r
322 #\r
323 def __SetCurrentCharValue(self, Value):\r
324 self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine] = Value\r
325 \r
326 ## __CurrentLine() method\r
327 #\r
328 # Get the list that contains current line contents\r
329 #\r
330 # @param self The object pointer\r
331 # @retval List current line contents\r
332 #\r
333 def __CurrentLine(self):\r
334 return self.Profile.FileLinesList[self.CurrentLineNumber - 1]\r
335 \r
336 def __StringToList(self):\r
337 self.Profile.FileLinesList = [list(s) for s in self.Profile.FileLinesList]\r
338 self.Profile.FileLinesList[-1].append(' ')\r
339\r
340 def __ReplaceMacros(self, Str, File, Line):\r
341 MacroEnd = 0\r
342 while Str.find('$(', MacroEnd) >= 0:\r
343 MacroStart = Str.find('$(', MacroEnd)\r
344 if Str.find(')', MacroStart) > 0:\r
345 MacroEnd = Str.find(')', MacroStart)\r
346 Name = Str[MacroStart + 2 : MacroEnd]\r
347 Value = None\r
348 if Name in InputMacroDict:\r
349 Value = InputMacroDict[Name]\r
350 \r
351 else:\r
352 for Profile in AllMacroList:\r
353 if Profile.FileName == File and Profile.MacroName == Name and Profile.DefinedAtLine <= Line:\r
354 Value = Profile.MacroValue\r
355 \r
356 if Value != None:\r
357 Str = Str.replace('$(' + Name + ')', Value)\r
358 MacroEnd = MacroStart + len(Value) \r
359 \r
360 else:\r
361 raise Warning("Macro not complete At Line ", self.FileName, self.CurrentLineNumber)\r
362 return Str\r
47fea6af
YZ
363\r
364 def __ReplaceFragment(self, StartPos, EndPos, Value=' '):\r
30fdf114
LG
365 if StartPos[0] == EndPos[0]:\r
366 Offset = StartPos[1]\r
367 while Offset <= EndPos[1]:\r
368 self.Profile.FileLinesList[StartPos[0]][Offset] = Value\r
369 Offset += 1\r
370 return\r
371 \r
372 Offset = StartPos[1]\r
373 while self.Profile.FileLinesList[StartPos[0]][Offset] not in ('\r', '\n'):\r
374 self.Profile.FileLinesList[StartPos[0]][Offset] = Value\r
375 Offset += 1\r
376 \r
377 Line = StartPos[0]\r
378 while Line < EndPos[0]:\r
379 Offset = 0\r
380 while self.Profile.FileLinesList[Line][Offset] not in ('\r', '\n'):\r
381 self.Profile.FileLinesList[Line][Offset] = Value\r
382 Offset += 1\r
383 Line += 1\r
384 \r
385 Offset = 0\r
386 while Offset <= EndPos[1]:\r
387 self.Profile.FileLinesList[EndPos[0]][Offset] = Value\r
388 Offset += 1\r
d5d56f1b
LG
389\r
390\r
391 def __GetMacroName(self):\r
392 if not self.__GetNextToken():\r
393 raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber)\r
394 MacroName = self.__Token\r
395 NotFlag = False\r
396 if MacroName.startswith('!'):\r
397 NotFlag = True\r
398 MacroName = MacroName[1:].strip()\r
399 \r
400 if not MacroName.startswith('$(') or not MacroName.endswith(')'):\r
401 raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName},\r
402 self.FileName, self.CurrentLineNumber)\r
403 MacroName = MacroName[2:-1]\r
404 return MacroName, NotFlag\r
30fdf114
LG
405 \r
406 ## PreprocessFile() method\r
407 #\r
408 # Preprocess file contents, replace comments with spaces.\r
409 # In the end, rewind the file buffer pointer to the beginning\r
410 # BUGBUG: No !include statement processing contained in this procedure\r
411 # !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]\r
412 #\r
413 # @param self The object pointer\r
414 # \r
415 def PreprocessFile(self):\r
416 \r
417 self.Rewind()\r
418 InComment = False\r
419 DoubleSlashComment = False\r
420 HashComment = False\r
421 # HashComment in quoted string " " is ignored.\r
422 InString = False \r
423 \r
424 while not self.__EndOfFile():\r
425 \r
426 if self.__CurrentChar() == T_CHAR_DOUBLE_QUOTE and not InComment:\r
427 InString = not InString\r
428 # meet new line, then no longer in a comment for // and '#'\r
429 if self.__CurrentChar() == T_CHAR_LF:\r
430 self.CurrentLineNumber += 1\r
431 self.CurrentOffsetWithinLine = 0\r
432 if InComment and DoubleSlashComment:\r
433 InComment = False\r
434 DoubleSlashComment = False\r
435 if InComment and HashComment:\r
436 InComment = False\r
437 HashComment = False\r
438 # check for */ comment end\r
439 elif InComment and not DoubleSlashComment and not HashComment and self.__CurrentChar() == T_CHAR_STAR and self.__NextChar() == T_CHAR_SLASH:\r
440 self.__SetCurrentCharValue(T_CHAR_SPACE)\r
441 self.__GetOneChar()\r
442 self.__SetCurrentCharValue(T_CHAR_SPACE)\r
443 self.__GetOneChar()\r
444 InComment = False\r
445 # set comments to spaces\r
446 elif InComment:\r
447 self.__SetCurrentCharValue(T_CHAR_SPACE)\r
448 self.__GetOneChar()\r
449 # check for // comment\r
450 elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_SLASH and not self.__EndOfLine():\r
451 InComment = True\r
452 DoubleSlashComment = True\r
453 # check for '#' comment\r
454 elif self.__CurrentChar() == T_CHAR_HASH and not self.__EndOfLine() and not InString:\r
455 InComment = True\r
456 HashComment = True\r
457 # check for /* comment start\r
458 elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_STAR:\r
459 self.__SetCurrentCharValue( T_CHAR_SPACE)\r
460 self.__GetOneChar()\r
461 self.__SetCurrentCharValue( T_CHAR_SPACE)\r
462 self.__GetOneChar()\r
463 InComment = True\r
464 else:\r
465 self.__GetOneChar()\r
466 \r
467 # restore from ListOfList to ListOfString\r
468 self.Profile.FileLinesList = ["".join(list) for list in self.Profile.FileLinesList]\r
469 self.Rewind()\r
470\r
471 ## PreprocessIncludeFile() method\r
472 #\r
473 # Preprocess file contents, replace !include statements with file contents.\r
474 # In the end, rewind the file buffer pointer to the beginning\r
475 #\r
476 # @param self The object pointer\r
477 # \r
478 def PreprocessIncludeFile(self):\r
479 \r
480 while self.__GetNextToken():\r
481 \r
482 if self.__Token == '!include':\r
483 IncludeLine = self.CurrentLineNumber\r
484 IncludeOffset = self.CurrentOffsetWithinLine - len('!include')\r
485 if not self.__GetNextToken():\r
486 raise Warning("expected include file name At Line ", self.FileName, self.CurrentLineNumber)\r
487 IncFileName = self.__Token\r
488 if not os.path.isabs(IncFileName):\r
489 if IncFileName.startswith('$(WORKSPACE)'):\r
05cc51ad
LY
490 Str = mws.handleWsMacro(IncFileName)\r
491 Str = Str.replace('$(WORKSPACE)', os.environ.get('WORKSPACE'))\r
30fdf114
LG
492 if os.path.exists(Str):\r
493 if not os.path.isabs(Str):\r
494 Str = os.path.abspath(Str)\r
495 IncFileName = Str\r
496 else:\r
497 # file is in the same dir with FDF file\r
498 FullFdf = self.FileName\r
499 if not os.path.isabs(self.FileName):\r
05cc51ad 500 FullFdf = mws.join(os.environ.get('WORKSPACE'), self.FileName)\r
30fdf114
LG
501 \r
502 IncFileName = os.path.join(os.path.dirname(FullFdf), IncFileName)\r
503 \r
504 if not os.path.exists(os.path.normpath(IncFileName)):\r
505 raise Warning("Include file not exists At Line ", self.FileName, self.CurrentLineNumber)\r
506 \r
507 IncFileProfile = IncludeFileProfile(os.path.normpath(IncFileName))\r
508 \r
509 CurrentLine = self.CurrentLineNumber\r
510 CurrentOffset = self.CurrentOffsetWithinLine\r
511 # list index of the insertion, note that line number is 'CurrentLine + 1'\r
512 InsertAtLine = CurrentLine\r
513 IncFileProfile.InsertStartLineNumber = InsertAtLine + 1\r
514 # deal with remaining portions after "!include filename", if exists.\r
515 if self.__GetNextToken():\r
516 if self.CurrentLineNumber == CurrentLine:\r
517 RemainingLine = self.__CurrentLine()[CurrentOffset:]\r
518 self.Profile.FileLinesList.insert(self.CurrentLineNumber, RemainingLine)\r
519 IncFileProfile.InsertAdjust += 1\r
520 self.CurrentLineNumber += 1\r
521 self.CurrentOffsetWithinLine = 0\r
522 \r
523 for Line in IncFileProfile.FileLinesList:\r
524 self.Profile.FileLinesList.insert(InsertAtLine, Line)\r
525 self.CurrentLineNumber += 1\r
526 InsertAtLine += 1 \r
527 \r
528 IncludeFileList.append(IncFileProfile)\r
529 \r
530 # comment out the processed include file statement\r
531 TempList = list(self.Profile.FileLinesList[IncludeLine - 1])\r
532 TempList.insert(IncludeOffset, '#')\r
533 self.Profile.FileLinesList[IncludeLine - 1] = ''.join(TempList)\r
534 \r
535 self.Rewind()\r
536\r
537 ## PreprocessIncludeFile() method\r
538 #\r
539 # Preprocess file contents, replace !include statements with file contents.\r
540 # In the end, rewind the file buffer pointer to the beginning\r
541 #\r
542 # @param self The object pointer\r
543 # \r
544 def PreprocessConditionalStatement(self):\r
545 # IfList is a stack of if branches with elements of list [Pos, CondSatisfied, BranchDetermined]\r
546 IfList = []\r
547 while self.__GetNextToken():\r
548 if self.__Token == 'DEFINE':\r
549 DefineLine = self.CurrentLineNumber - 1\r
550 DefineOffset = self.CurrentOffsetWithinLine - len('DEFINE')\r
551 if not self.__GetNextToken():\r
552 raise Warning("expected Macro name At Line ", self.FileName, self.CurrentLineNumber)\r
553 Macro = self.__Token\r
554 if not self.__IsToken( "="):\r
555 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
556 \r
557 if not self.__GetNextToken():\r
558 raise Warning("expected value At Line ", self.FileName, self.CurrentLineNumber)\r
559 \r
560 if self.__GetStringData():\r
561 pass\r
562 Value = self.__Token\r
563 if not Macro in InputMacroDict:\r
564 FileLineTuple = GetRealFileLine(self.FileName, DefineLine + 1)\r
565 MacProfile = MacroProfile(FileLineTuple[0], FileLineTuple[1])\r
566 MacProfile.MacroName = Macro\r
567 MacProfile.MacroValue = Value\r
568 AllMacroList.append(MacProfile)\r
569 self.__WipeOffArea.append(((DefineLine, DefineOffset), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
570 \r
571 elif self.__Token in ('!ifdef', '!ifndef', '!if'):\r
572 IfStartPos = (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len(self.__Token))\r
573 IfList.append([IfStartPos, None, None])\r
574 CondLabel = self.__Token\r
575 \r
d5d56f1b 576 MacroName, NotFlag = self.__GetMacroName() \r
30fdf114
LG
577 NotDefineFlag = False\r
578 if CondLabel == '!ifndef':\r
579 NotDefineFlag = True\r
580 if CondLabel == '!ifdef' or CondLabel == '!ifndef':\r
581 if NotFlag:\r
582 raise Warning("'NOT' operation not allowed for Macro name At Line ", self.FileName, self.CurrentLineNumber)\r
583 \r
584 if CondLabel == '!if':\r
585 \r
586 if not self.__GetNextOp():\r
587 raise Warning("expected !endif At Line ", self.FileName, self.CurrentLineNumber)\r
588 \r
589 if self.__Token in ('!=', '==', '>', '<', '>=', '<='):\r
590 Op = self.__Token\r
591 if not self.__GetNextToken():\r
592 raise Warning("expected value At Line ", self.FileName, self.CurrentLineNumber)\r
593 if self.__GetStringData():\r
594 pass\r
595 MacroValue = self.__Token\r
596 ConditionSatisfied = self.__EvaluateConditional(MacroName, IfList[-1][0][0] + 1, Op, MacroValue)\r
597 if NotFlag:\r
598 ConditionSatisfied = not ConditionSatisfied\r
599 BranchDetermined = ConditionSatisfied\r
600 else:\r
601 self.CurrentOffsetWithinLine -= len(self.__Token) \r
602 ConditionSatisfied = self.__EvaluateConditional(MacroName, IfList[-1][0][0] + 1, None, 'Bool')\r
603 if NotFlag:\r
604 ConditionSatisfied = not ConditionSatisfied\r
605 BranchDetermined = ConditionSatisfied\r
606 IfList[-1] = [IfList[-1][0], ConditionSatisfied, BranchDetermined]\r
607 if ConditionSatisfied:\r
608 self.__WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
609 \r
610 else:\r
611 ConditionSatisfied = self.__EvaluateConditional(MacroName, IfList[-1][0][0] + 1)\r
612 if NotDefineFlag:\r
613 ConditionSatisfied = not ConditionSatisfied\r
614 BranchDetermined = ConditionSatisfied\r
615 IfList[-1] = [IfList[-1][0], ConditionSatisfied, BranchDetermined]\r
616 if ConditionSatisfied:\r
617 self.__WipeOffArea.append((IfStartPos, (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
618 \r
619 elif self.__Token in ('!elseif', '!else'):\r
620 ElseStartPos = (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len(self.__Token))\r
621 if len(IfList) <= 0:\r
622 raise Warning("Missing !if statement At Line ", self.FileName, self.CurrentLineNumber)\r
623 if IfList[-1][1]:\r
624 IfList[-1] = [ElseStartPos, False, True]\r
625 self.__WipeOffArea.append((ElseStartPos, (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
626 else:\r
627 self.__WipeOffArea.append((IfList[-1][0], ElseStartPos))\r
628 IfList[-1] = [ElseStartPos, True, IfList[-1][2]]\r
629 if self.__Token == '!elseif':\r
d5d56f1b 630 MacroName, NotFlag = self.__GetMacroName() \r
30fdf114
LG
631 if not self.__GetNextOp():\r
632 raise Warning("expected !endif At Line ", self.FileName, self.CurrentLineNumber)\r
633 \r
634 if self.__Token in ('!=', '==', '>', '<', '>=', '<='):\r
635 Op = self.__Token\r
636 if not self.__GetNextToken():\r
637 raise Warning("expected value At Line ", self.FileName, self.CurrentLineNumber)\r
638 if self.__GetStringData():\r
639 pass\r
640 MacroValue = self.__Token\r
641 ConditionSatisfied = self.__EvaluateConditional(MacroName, IfList[-1][0][0] + 1, Op, MacroValue)\r
642 if NotFlag:\r
643 ConditionSatisfied = not ConditionSatisfied\r
644\r
645 else:\r
646 self.CurrentOffsetWithinLine -= len(self.__Token) \r
647 ConditionSatisfied = self.__EvaluateConditional(MacroName, IfList[-1][0][0] + 1, None, 'Bool')\r
648 if NotFlag:\r
649 ConditionSatisfied = not ConditionSatisfied\r
650\r
651 IfList[-1] = [IfList[-1][0], ConditionSatisfied, IfList[-1][2]]\r
652 \r
653 if IfList[-1][1]:\r
654 if IfList[-1][2]:\r
655 IfList[-1][1] = False\r
656 else:\r
657 IfList[-1][2] = True\r
658 self.__WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
659\r
660 \r
661 elif self.__Token == '!endif':\r
662 if IfList[-1][1]:\r
663 self.__WipeOffArea.append(((self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len('!endif')), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
664 else:\r
665 self.__WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
666 \r
667 IfList.pop()\r
668 \r
669 \r
670 if len(IfList) > 0:\r
671 raise Warning("Missing !endif At Line ", self.FileName, self.CurrentLineNumber)\r
672 self.Rewind()\r
673\r
674 def __EvaluateConditional(self, Name, Line, Op = None, Value = None):\r
675 \r
676 FileLineTuple = GetRealFileLine(self.FileName, Line)\r
677 if Name in InputMacroDict:\r
678 MacroValue = InputMacroDict[Name]\r
679 if Op == None:\r
680 if Value == 'Bool' and MacroValue == None or MacroValue.upper() == 'FALSE':\r
681 return False\r
682 return True\r
683 elif Op == '!=':\r
684 if Value != MacroValue:\r
685 return True\r
686 else:\r
687 return False\r
688 elif Op == '==':\r
689 if Value == MacroValue:\r
690 return True\r
691 else:\r
692 return False\r
693 else:\r
694 if (self.__IsHex(Value) or Value.isdigit()) and (self.__IsHex(MacroValue) or (MacroValue != None and MacroValue.isdigit())):\r
695 InputVal = long(Value, 0)\r
696 MacroVal = long(MacroValue, 0)\r
697 if Op == '>':\r
698 if MacroVal > InputVal:\r
699 return True\r
700 else:\r
701 return False\r
702 elif Op == '>=':\r
703 if MacroVal >= InputVal:\r
704 return True\r
705 else:\r
706 return False\r
707 elif Op == '<':\r
708 if MacroVal < InputVal:\r
709 return True\r
710 else:\r
711 return False\r
712 elif Op == '<=':\r
713 if MacroVal <= InputVal:\r
714 return True\r
715 else:\r
716 return False\r
717 else:\r
718 return False\r
719 else:\r
720 raise Warning("Value %s is not a number At Line ", self.FileName, Line)\r
721 \r
722 for Profile in AllMacroList:\r
723 if Profile.FileName == FileLineTuple[0] and Profile.MacroName == Name and Profile.DefinedAtLine <= FileLineTuple[1]:\r
724 if Op == None:\r
725 if Value == 'Bool' and Profile.MacroValue == None or Profile.MacroValue.upper() == 'FALSE':\r
726 return False\r
727 return True\r
728 elif Op == '!=':\r
729 if Value != Profile.MacroValue:\r
730 return True\r
731 else:\r
732 return False\r
733 elif Op == '==':\r
734 if Value == Profile.MacroValue:\r
735 return True\r
736 else:\r
737 return False\r
738 else:\r
739 if (self.__IsHex(Value) or Value.isdigit()) and (self.__IsHex(Profile.MacroValue) or (Profile.MacroValue != None and Profile.MacroValue.isdigit())):\r
740 InputVal = long(Value, 0)\r
741 MacroVal = long(Profile.MacroValue, 0)\r
742 if Op == '>':\r
743 if MacroVal > InputVal:\r
744 return True\r
745 else:\r
746 return False\r
747 elif Op == '>=':\r
748 if MacroVal >= InputVal:\r
749 return True\r
750 else:\r
751 return False\r
752 elif Op == '<':\r
753 if MacroVal < InputVal:\r
754 return True\r
755 else:\r
756 return False\r
757 elif Op == '<=':\r
758 if MacroVal <= InputVal:\r
759 return True\r
760 else:\r
761 return False\r
762 else:\r
763 return False\r
764 else:\r
765 raise Warning("Value %s is not a number At Line ", self.FileName, Line)\r
766 \r
767 return False\r
768\r
769 ## __IsToken() method\r
770 #\r
771 # Check whether input string is found from current char position along\r
772 # If found, the string value is put into self.__Token\r
773 #\r
774 # @param self The object pointer\r
775 # @param String The string to search\r
776 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive\r
777 # @retval True Successfully find string, file buffer pointer moved forward\r
778 # @retval False Not able to find string, file buffer pointer not changed\r
779 #\r
780 def __IsToken(self, String, IgnoreCase = False):\r
781 self.__SkipWhiteSpace()\r
782\r
783 # Only consider the same line, no multi-line token allowed\r
784 StartPos = self.CurrentOffsetWithinLine\r
785 index = -1\r
786 if IgnoreCase:\r
787 index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].upper().find(String.upper()) \r
788 else:\r
789 index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].find(String)\r
790 if index == 0:\r
791 self.CurrentOffsetWithinLine += len(String)\r
792 self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]\r
793 return True\r
794 return False\r
795\r
796 ## __IsKeyword() method\r
797 #\r
798 # Check whether input keyword is found from current char position along, whole word only!\r
799 # If found, the string value is put into self.__Token\r
800 #\r
801 # @param self The object pointer\r
802 # @param Keyword The string to search\r
803 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive\r
804 # @retval True Successfully find string, file buffer pointer moved forward\r
805 # @retval False Not able to find string, file buffer pointer not changed\r
806 #\r
807 def __IsKeyword(self, KeyWord, IgnoreCase = False):\r
808 self.__SkipWhiteSpace()\r
809\r
810 # Only consider the same line, no multi-line token allowed\r
811 StartPos = self.CurrentOffsetWithinLine\r
812 index = -1\r
813 if IgnoreCase:\r
814 index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].upper().find(KeyWord.upper()) \r
815 else:\r
816 index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].find(KeyWord)\r
817 if index == 0:\r
818 followingChar = self.__CurrentLine()[self.CurrentOffsetWithinLine + len(KeyWord)]\r
819 if not str(followingChar).isspace() and followingChar not in SEPERATOR_TUPLE:\r
820 return False\r
821 self.CurrentOffsetWithinLine += len(KeyWord)\r
822 self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]\r
823 return True\r
824 return False\r
825\r
826 ## __GetNextWord() method\r
827 #\r
828 # Get next C name from file lines\r
829 # If found, the string value is put into self.__Token\r
830 #\r
831 # @param self The object pointer\r
832 # @retval True Successfully find a C name string, file buffer pointer moved forward\r
833 # @retval False Not able to find a C name string, file buffer pointer not changed\r
834 #\r
835 def __GetNextWord(self):\r
836 self.__SkipWhiteSpace()\r
837 if self.__EndOfFile():\r
838 return False\r
839 \r
840 TempChar = self.__CurrentChar()\r
841 StartPos = self.CurrentOffsetWithinLine\r
842 if (TempChar >= 'a' and TempChar <= 'z') or (TempChar >= 'A' and TempChar <= 'Z') or TempChar == '_':\r
843 self.__GetOneChar()\r
844 while not self.__EndOfLine():\r
845 TempChar = self.__CurrentChar()\r
846 if (TempChar >= 'a' and TempChar <= 'z') or (TempChar >= 'A' and TempChar <= 'Z') \\r
847 or (TempChar >= '0' and TempChar <= '9') or TempChar == '_' or TempChar == '-':\r
848 self.__GetOneChar()\r
849 \r
850 else:\r
851 break\r
852\r
853 self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]\r
854 return True\r
855 \r
856 return False\r
857 \r
858 ## __GetNextToken() method\r
859 #\r
860 # Get next token unit before a seperator\r
861 # If found, the string value is put into self.__Token\r
862 #\r
863 # @param self The object pointer\r
864 # @retval True Successfully find a token unit, file buffer pointer moved forward\r
865 # @retval False Not able to find a token unit, file buffer pointer not changed\r
866 #\r
867 def __GetNextToken(self):\r
868 # Skip leading spaces, if exist.\r
869 self.__SkipWhiteSpace()\r
870 if self.__EndOfFile():\r
871 return False\r
872 # Record the token start position, the position of the first non-space char.\r
873 StartPos = self.CurrentOffsetWithinLine\r
874 StartLine = self.CurrentLineNumber\r
875 while not self.__EndOfLine():\r
876 TempChar = self.__CurrentChar()\r
877 # Try to find the end char that is not a space and not in seperator tuple.\r
878 # That is, when we got a space or any char in the tuple, we got the end of token.\r
879 if not str(TempChar).isspace() and TempChar not in SEPERATOR_TUPLE:\r
880 self.__GetOneChar()\r
881 # if we happen to meet a seperator as the first char, we must proceed to get it.\r
882 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.\r
883 elif StartPos == self.CurrentOffsetWithinLine and TempChar in SEPERATOR_TUPLE:\r
884 self.__GetOneChar()\r
885 break\r
886 else:\r
887 break\r
888# else:\r
889# return False\r
890\r
891 EndPos = self.CurrentOffsetWithinLine\r
892 if self.CurrentLineNumber != StartLine:\r
893 EndPos = len(self.Profile.FileLinesList[StartLine-1])\r
894 self.__Token = self.Profile.FileLinesList[StartLine-1][StartPos : EndPos]\r
895 if StartPos != self.CurrentOffsetWithinLine:\r
896 return True\r
897 else:\r
898 return False\r
899 \r
900 def __GetNextOp(self):\r
901 # Skip leading spaces, if exist.\r
902 self.__SkipWhiteSpace()\r
903 if self.__EndOfFile():\r
904 return False\r
905 # Record the token start position, the position of the first non-space char.\r
906 StartPos = self.CurrentOffsetWithinLine\r
907 while not self.__EndOfLine():\r
908 TempChar = self.__CurrentChar()\r
909 # Try to find the end char that is not a space\r
910 if not str(TempChar).isspace():\r
911 self.__GetOneChar()\r
912 else:\r
913 break\r
914 else:\r
915 return False\r
916 \r
917 if StartPos != self.CurrentOffsetWithinLine:\r
918 self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]\r
919 return True\r
920 else:\r
921 return False\r
922 ## __GetNextGuid() method\r
923 #\r
924 # Get next token unit before a seperator\r
925 # If found, the GUID string is put into self.__Token\r
926 #\r
927 # @param self The object pointer\r
928 # @retval True Successfully find a registry format GUID, file buffer pointer moved forward\r
929 # @retval False Not able to find a registry format GUID, file buffer pointer not changed\r
930 #\r
931 def __GetNextGuid(self):\r
932 \r
933 if not self.__GetNextToken():\r
934 return False\r
2eb370ff 935 if RangeExpression.RegGuidPattern.match(self.__Token) != None:\r
30fdf114
LG
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
e921f58d
YZ
2343 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
2344 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
52302d4d 2345 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2346 AlignValue = self.__Token\r
2347 \r
2348 BuildNum = None\r
2349 if self.__IsKeyword( "BUILD_NUM"):\r
2350 if not self.__IsToken( "="):\r
2351 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
2352 \r
2353 if not self.__GetNextToken():\r
2354 raise Warning("expected Build number value At Line ", self.FileName, self.CurrentLineNumber)\r
2355 \r
2356 BuildNum = self.__Token\r
2357 \r
2358 if self.__IsKeyword( "VERSION"):\r
52302d4d
LG
2359 if AlignValue == 'Auto':\r
2360 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2361 if not self.__IsToken( "="):\r
2362 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
2363 if not self.__GetNextToken():\r
2364 raise Warning("expected version At Line ", self.FileName, self.CurrentLineNumber)\r
2365 VerSectionObj = CommonDataClass.FdfClass.VerSectionClassObject()\r
2366 VerSectionObj.Alignment = AlignValue\r
2367 VerSectionObj.BuildNum = BuildNum\r
2368 if self.__GetStringData():\r
2369 VerSectionObj.StringData = self.__Token\r
2370 else:\r
2371 VerSectionObj.FileName = self.__Token\r
2372 Obj.SectionList.append(VerSectionObj)\r
2373\r
2374 elif self.__IsKeyword( "UI"):\r
52302d4d
LG
2375 if AlignValue == 'Auto':\r
2376 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2377 if not self.__IsToken( "="):\r
2378 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
2379 if not self.__GetNextToken():\r
2380 raise Warning("expected UI At Line ", self.FileName, self.CurrentLineNumber)\r
2381 UiSectionObj = CommonDataClass.FdfClass.UiSectionClassObject()\r
2382 UiSectionObj.Alignment = AlignValue\r
2383 if self.__GetStringData():\r
2384 UiSectionObj.StringData = self.__Token\r
2385 else:\r
2386 UiSectionObj.FileName = self.__Token\r
2387 Obj.SectionList.append(UiSectionObj)\r
2388 \r
2389 elif self.__IsKeyword( "FV_IMAGE"):\r
52302d4d
LG
2390 if AlignValue == 'Auto':\r
2391 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2392 if not self.__IsToken( "="):\r
2393 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
2394 if not self.__GetNextWord():\r
2395 raise Warning("expected FV name At Line ", self.FileName, self.CurrentLineNumber)\r
2396 \r
2397 FvName = self.__Token.upper()\r
2398 FvObj = None\r
2399\r
2400 if self.__IsToken( "{"):\r
2401 FvObj = Fv.FV()\r
2402 FvObj.UiFvName = FvName\r
2403 self.__GetDefineStatements(FvObj)\r
2404 MacroDict.update(FvObj.DefineVarDict)\r
2405 self.__GetBlockStatement(FvObj)\r
2406 self.__GetSetStatements(FvObj)\r
2407 self.__GetFvAlignment(FvObj)\r
2408 self.__GetFvAttributes(FvObj)\r
2409 self.__GetAprioriSection(FvObj, MacroDict.copy())\r
2410 self.__GetAprioriSection(FvObj, MacroDict.copy())\r
2411 \r
2412 while True:\r
2413 IsInf = self.__GetInfStatement(FvObj, MacroDict.copy())\r
2414 IsFile = self.__GetFileStatement(FvObj, MacroDict.copy())\r
2415 if not IsInf and not IsFile:\r
2416 break\r
2417 \r
2418 if not self.__IsToken( "}"):\r
2419 raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)\r
2420 \r
2421 FvImageSectionObj = CommonDataClass.FdfClass.FvImageSectionClassObject()\r
2422 FvImageSectionObj.Alignment = AlignValue\r
2423 if FvObj != None:\r
2424 FvImageSectionObj.Fv = FvObj\r
2425 FvImageSectionObj.FvName = None\r
2426 else:\r
2427 FvImageSectionObj.FvName = FvName\r
2428 \r
2429 Obj.SectionList.append(FvImageSectionObj) \r
2430 \r
b303ea72 2431 elif self.__IsKeyword("PEI_DEPEX_EXP") or self.__IsKeyword("DXE_DEPEX_EXP") or self.__IsKeyword("SMM_DEPEX_EXP"):\r
52302d4d
LG
2432 if AlignValue == 'Auto':\r
2433 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2434 DepexSectionObj = CommonDataClass.FdfClass.DepexSectionClassObject()\r
2435 DepexSectionObj.Alignment = AlignValue\r
2436 DepexSectionObj.DepexType = self.__Token\r
2437 \r
2438 if not self.__IsToken( "="):\r
2439 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
2440 if not self.__IsToken( "{"):\r
2441 raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)\r
2442 if not self.__SkipToToken( "}"):\r
2443 raise Warning("expected Depex expression ending '}' At Line ", self.FileName, self.CurrentLineNumber)\r
2444 \r
2445 DepexSectionObj.Expression = self.__SkippedChars.rstrip('}')\r
2446 Obj.SectionList.append(DepexSectionObj)\r
2447 \r
2448 else:\r
2449 \r
2450 if not self.__GetNextWord():\r
2451 raise Warning("expected section type At Line ", self.FileName, self.CurrentLineNumber)\r
2452 \r
2453 # Encapsulation section appear, UndoToken and return\r
2454 if self.__Token == "COMPRESS" or self.__Token == "GUIDED":\r
2455 self.SetFileBufferPos(OldPos)\r
2456 return False\r
2457 \r
2458 if self.__Token not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
2459 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):\r
2460 raise Warning("Unknown section type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
52302d4d
LG
2461 if AlignValue == 'Auto'and (not self.__Token == 'PE32') and (not self.__Token == 'TE'):\r
2462 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2463 # DataSection\r
2464 DataSectionObj = CommonDataClass.FdfClass.DataSectionClassObject()\r
2465 DataSectionObj.Alignment = AlignValue\r
2466 DataSectionObj.SecType = self.__Token\r
2467 \r
2468 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
2469 if self.__FileCouldHaveRelocFlag(Obj.FvFileType) and self.__SectionCouldHaveRelocFlag(DataSectionObj.SecType):\r
2470 if self.__Token == 'RELOCS_STRIPPED':\r
2471 DataSectionObj.KeepReloc = False\r
2472 else:\r
2473 DataSectionObj.KeepReloc = True\r
2474 else:\r
2475 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
2476 \r
2477 if self.__IsToken("="):\r
2478 if not self.__GetNextToken():\r
2479 raise Warning("expected section file path At Line ", self.FileName, self.CurrentLineNumber)\r
2480 DataSectionObj.SectFileName = self.__Token\r
2481 else:\r
2482 if not self.__GetCglSection(DataSectionObj):\r
2483 return False\r
2484 \r
2485 Obj.SectionList.append(DataSectionObj)\r
2486 \r
2487 return True\r
2488 \r
2489 ## __GetCglSection() method\r
2490 #\r
2491 # Get compressed or GUIDed section for Obj\r
2492 #\r
2493 # @param self The object pointer\r
2494 # @param Obj for whom leaf section is got\r
2495 # @param AlignValue alignment value for complex section\r
2496 # @retval True Successfully find section statement\r
2497 # @retval False Not able to find section statement\r
2498 #\r
2499 def __GetCglSection(self, Obj, AlignValue = None):\r
2500 \r
2501 if self.__IsKeyword( "COMPRESS"):\r
2502 type = "PI_STD"\r
2503 if self.__IsKeyword("PI_STD") or self.__IsKeyword("PI_NONE"):\r
2504 type = self.__Token\r
2505 \r
2506 if not self.__IsToken("{"):\r
2507 raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)\r
2508\r
2509 CompressSectionObj = CommonDataClass.FdfClass.CompressSectionClassObject()\r
2510 CompressSectionObj.Alignment = AlignValue\r
2511 CompressSectionObj.CompType = type\r
2512 # Recursive sections...\r
2513 while True:\r
2514 IsLeafSection = self.__GetLeafSection(CompressSectionObj)\r
2515 IsEncapSection = self.__GetEncapsulationSec(CompressSectionObj)\r
2516 if not IsLeafSection and not IsEncapSection:\r
2517 break\r
2518 \r
2519 \r
2520 if not self.__IsToken( "}"):\r
2521 raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)\r
2522 Obj.SectionList.append(CompressSectionObj)\r
2523 \r
2524# else:\r
2525# raise Warning("Compress type not known At Line ") \r
2526 \r
2527 return True\r
2528 \r
2529 elif self.__IsKeyword( "GUIDED"):\r
2530 GuidValue = None\r
2531 if self.__GetNextGuid():\r
2532 GuidValue = self.__Token\r
2533\r
2534 AttribDict = self.__GetGuidAttrib()\r
2535 if not self.__IsToken("{"):\r
2536 raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)\r
2537 GuidSectionObj = CommonDataClass.FdfClass.GuidSectionClassObject()\r
2538 GuidSectionObj.Alignment = AlignValue\r
2539 GuidSectionObj.NameGuid = GuidValue\r
2540 GuidSectionObj.SectionType = "GUIDED"\r
2541 GuidSectionObj.ProcessRequired = AttribDict["PROCESSING_REQUIRED"]\r
2542 GuidSectionObj.AuthStatusValid = AttribDict["AUTH_STATUS_VALID"]\r
2543 # Recursive sections...\r
2544 while True:\r
2545 IsLeafSection = self.__GetLeafSection(GuidSectionObj)\r
2546 IsEncapSection = self.__GetEncapsulationSec(GuidSectionObj)\r
2547 if not IsLeafSection and not IsEncapSection:\r
2548 break\r
2549 \r
2550 if not self.__IsToken( "}"):\r
2551 raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)\r
2552 Obj.SectionList.append(GuidSectionObj)\r
2553 \r
2554 return True\r
2555 \r
2556 return False\r
2557\r
2558 ## __GetGuidAttri() method\r
2559 #\r
2560 # Get attributes for GUID section\r
2561 #\r
2562 # @param self The object pointer\r
2563 # @retval AttribDict Dictionary of key-value pair of section attributes\r
2564 #\r
2565 def __GetGuidAttrib(self):\r
2566 \r
2567 AttribDict = {}\r
2568 AttribDict["PROCESSING_REQUIRED"] = False\r
2569 AttribDict["AUTH_STATUS_VALID"] = False\r
2570 if self.__IsKeyword("PROCESSING_REQUIRED") or self.__IsKeyword("AUTH_STATUS_VALID"):\r
2571 AttribKey = self.__Token\r
2572\r
2573 if not self.__IsToken("="):\r
2574 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
2575 \r
2576 if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):\r
2577 raise Warning("expected TRUE/FALSE (1/0) At Line ", self.FileName, self.CurrentLineNumber)\r
2578 AttribDict[AttribKey] = self.__Token\r
2579 \r
2580 if self.__IsKeyword("PROCESSING_REQUIRED") or self.__IsKeyword("AUTH_STATUS_VALID"):\r
2581 AttribKey = self.__Token\r
2582\r
2583 if not self.__IsToken("="):\r
2584 raise Warning("expected '=' At Line ")\r
2585\r
2586 if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):\r
2587 raise Warning("expected TRUE/FALSE (1/0) At Line ", self.FileName, self.CurrentLineNumber)\r
2588 AttribDict[AttribKey] = self.__Token\r
2589 \r
2590 return AttribDict\r
2591 \r
2592 ## __GetEncapsulationSec() method\r
2593 #\r
2594 # Get encapsulation section for FILE\r
2595 #\r
2596 # @param self The object pointer\r
2597 # @param FfsFile for whom section is got\r
2598 # @retval True Successfully find section statement\r
2599 # @retval False Not able to find section statement\r
2600 #\r
2601 def __GetEncapsulationSec(self, FfsFileObj): \r
2602 \r
2603 OldPos = self.GetFileBufferPos()\r
2604 if not self.__IsKeyword( "SECTION"):\r
2605 if len(FfsFileObj.SectionList) == 0:\r
2606 raise Warning("expected SECTION At Line ", self.FileName, self.CurrentLineNumber)\r
2607 else:\r
2608 return False\r
2609 \r
2610 AlignValue = None\r
2611 if self.__GetAlignment():\r
e921f58d
YZ
2612 if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
2613 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
52302d4d 2614 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2615 AlignValue = self.__Token\r
2616 \r
2617 if not self.__GetCglSection(FfsFileObj, AlignValue):\r
2618 self.SetFileBufferPos(OldPos)\r
2619 return False\r
2620 else:\r
2621 return True\r
2622\r
2623 ## __GetCapsule() method\r
2624 #\r
2625 # Get capsule section contents and store its data into capsule list of self.Profile\r
2626 #\r
2627 # @param self The object pointer\r
2628 # @retval True Successfully find a capsule\r
2629 # @retval False Not able to find a capsule\r
2630 #\r
2631 def __GetCapsule(self):\r
2632 \r
2633 if not self.__GetNextToken():\r
2634 return False\r
2635\r
2636 S = self.__Token.upper()\r
2637 if S.startswith("[") and not S.startswith("[CAPSULE."):\r
2638 if not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
2639 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
2640 self.__UndoToken()\r
2641 return False\r
2642\r
2643 self.__UndoToken()\r
2644 if not self.__IsToken("[CAPSULE.", True):\r
2645 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
2646 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
2647 % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
2648 raise Warning("expected [Capsule.] At Line ", self.FileName, self.CurrentLineNumber) \r
2649 \r
2650 CapsuleObj = CommonDataClass.FdfClass.CapsuleClassObject()\r
2651\r
2652 CapsuleName = self.__GetUiName()\r
2653 if not CapsuleName:\r
2654 raise Warning("expected capsule name At line ", self.FileName, self.CurrentLineNumber)\r
2655 \r
2656 CapsuleObj.UiCapsuleName = CapsuleName.upper()\r
2657 \r
2658 if not self.__IsToken( "]"):\r
2659 raise Warning("expected ']' At Line ", self.FileName, self.CurrentLineNumber)\r
2660 \r
2661 if self.__IsKeyword("CREATE_FILE"):\r
2662 if not self.__IsToken( "="):\r
2663 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
2664 \r
2665 if not self.__GetNextToken():\r
2666 raise Warning("expected file name At Line ", self.FileName, self.CurrentLineNumber)\r
2667 \r
2668 CapsuleObj.CreateFile = self.__Token\r
2669 \r
2670 self.__GetCapsuleStatements(CapsuleObj)\r
2671 self.Profile.CapsuleList.append(CapsuleObj)\r
2672 return True \r
2673 \r
2674 ## __GetCapsuleStatements() method\r
2675 #\r
2676 # Get statements for capsule\r
2677 #\r
2678 # @param self The object pointer\r
2679 # @param Obj for whom statements are got\r
2680 #\r
2681 def __GetCapsuleStatements(self, Obj):\r
2682 self.__GetCapsuleTokens(Obj)\r
2683 self.__GetDefineStatements(Obj)\r
2684 self.__GetSetStatements(Obj)\r
2685 \r
2686 self.__GetCapsuleData(Obj)\r
2687 \r
2688 ## __GetCapsuleStatements() method\r
2689 #\r
2690 # Get token statements for capsule\r
2691 #\r
2692 # @param self The object pointer\r
2693 # @param Obj for whom token statements are got\r
2694 #\r
2695 def __GetCapsuleTokens(self, Obj):\r
2696 \r
2697 if not self.__IsKeyword("CAPSULE_GUID"):\r
2698 raise Warning("expected 'CAPSULE_GUID' At Line ", self.FileName, self.CurrentLineNumber)\r
2699 \r
2700 while self.__CurrentLine().find("=") != -1:\r
2701 NameValue = self.__CurrentLine().split("=")\r
2702 Obj.TokensDict[NameValue[0].strip()] = NameValue[1].strip()\r
2703 self.CurrentLineNumber += 1\r
2704 self.CurrentOffsetWithinLine = 0\r
2705 \r
2706 ## __GetCapsuleData() method\r
2707 #\r
2708 # Get capsule data for capsule\r
2709 #\r
2710 # @param self The object pointer\r
2711 # @param Obj for whom capsule data are got\r
2712 #\r
2713 def __GetCapsuleData(self, Obj):\r
2714 \r
2715 while True:\r
2716 IsInf = self.__GetInfStatement(Obj, True)\r
2717 IsFile = self.__GetFileStatement(Obj, True)\r
2718 IsFv = self.__GetFvStatement(Obj)\r
2719 if not IsInf and not IsFile and not IsFv:\r
2720 break\r
2721 \r
2722 ## __GetFvStatement() method\r
2723 #\r
2724 # Get FV for capsule\r
2725 #\r
2726 # @param self The object pointer\r
2727 # @param CapsuleObj for whom FV is got\r
2728 # @retval True Successfully find a FV statement\r
2729 # @retval False Not able to find a FV statement\r
2730 #\r
2731 def __GetFvStatement(self, CapsuleObj):\r
2732 \r
2733 if not self.__IsKeyword("FV"):\r
2734 return False\r
2735 \r
2736 if not self.__IsToken("="):\r
2737 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
2738 \r
2739 if not self.__GetNextToken():\r
2740 raise Warning("expected FV name At Line ", self.FileName, self.CurrentLineNumber)\r
2741 \r
2742# CapsuleFv = CapsuleData.CapsuleFv()\r
2743# CapsuleFv.FvName = self.__Token\r
2744# CapsuleObj.CapsuleDataList.append(CapsuleFv)\r
2745 return True\r
2746 \r
2747 ## __GetRule() method\r
2748 #\r
2749 # Get Rule section contents and store its data into rule list of self.Profile\r
2750 #\r
2751 # @param self The object pointer\r
2752 # @retval True Successfully find a Rule\r
2753 # @retval False Not able to find a Rule\r
2754 #\r
2755 def __GetRule(self):\r
2756 \r
2757 if not self.__GetNextToken():\r
2758 return False\r
2759\r
2760 S = self.__Token.upper()\r
2761 if S.startswith("[") and not S.startswith("[RULE."):\r
2762 if not S.startswith("[OPTIONROM."):\r
2763 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
2764 self.__UndoToken()\r
2765 return False\r
2766 self.__UndoToken()\r
2767 if not self.__IsToken("[Rule.", True):\r
2768 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
2769 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
2770 % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
2771 raise Warning("expected [Rule.] At Line ", self.FileName, self.CurrentLineNumber)\r
2772\r
2773 if not self.__SkipToToken("."):\r
2774 raise Warning("expected '.' At Line ", self.FileName, self.CurrentLineNumber)\r
2775 \r
2776 Arch = self.__SkippedChars.rstrip(".")\r
4afd3d04 2777 if Arch.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "AARCH64", "COMMON"):\r
fd171542 2778 raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2779 \r
2780 ModuleType = self.__GetModuleType()\r
2781 \r
2782 TemplateName = ""\r
2783 if self.__IsToken("."):\r
2784 if not self.__GetNextWord():\r
2785 raise Warning("expected template name At Line ", self.FileName, self.CurrentLineNumber)\r
2786 TemplateName = self.__Token\r
2787 \r
2788 if not self.__IsToken( "]"):\r
2789 raise Warning("expected ']' At Line ", self.FileName, self.CurrentLineNumber)\r
2790 \r
2791 RuleObj = self.__GetRuleFileStatements()\r
2792 RuleObj.Arch = Arch.upper()\r
2793 RuleObj.ModuleType = ModuleType\r
2794 RuleObj.TemplateName = TemplateName\r
2795 if TemplateName == '' :\r
2796 self.Profile.RuleDict['RULE' + \\r
2797 '.' + \\r
2798 Arch.upper() + \\r
2799 '.' + \\r
2800 ModuleType.upper() ] = RuleObj\r
2801 else :\r
2802 self.Profile.RuleDict['RULE' + \\r
2803 '.' + \\r
2804 Arch.upper() + \\r
2805 '.' + \\r
2806 ModuleType.upper() + \\r
2807 '.' + \\r
2808 TemplateName.upper() ] = RuleObj\r
2809# self.Profile.RuleList.append(rule)\r
2810 return True\r
2811 \r
2812 ## __GetModuleType() method\r
2813 #\r
2814 # Return the module type\r
2815 #\r
2816 # @param self The object pointer\r
2817 # @retval string module type\r
2818 #\r
2819 def __GetModuleType(self):\r
2820 \r
2821 if not self.__GetNextWord():\r
2822 raise Warning("expected Module type At Line ", self.FileName, self.CurrentLineNumber)\r
2823 if self.__Token.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \\r
2824 "DXE_DRIVER", "DXE_SAL_DRIVER", \\r
2825 "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \\r
2826 "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \\r
2827 "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \\r
15fb5ba8 2828 "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE", "MM_STANDALONE", "MM_CORE_STANDALONE"):\r
30fdf114
LG
2829 raise Warning("Unknown Module type At line ", self.FileName, self.CurrentLineNumber)\r
2830 return self.__Token\r
2831 \r
2832 ## __GetFileExtension() method\r
2833 #\r
2834 # Return the file extension\r
2835 #\r
2836 # @param self The object pointer\r
2837 # @retval string file name extension\r
2838 #\r
2839 def __GetFileExtension(self):\r
2840 if not self.__IsToken("."):\r
2841 raise Warning("expected '.' At Line ", self.FileName, self.CurrentLineNumber)\r
2842 \r
2843 Ext = ""\r
2844 if self.__GetNextToken():\r
2845 Pattern = re.compile(r'([a-zA-Z][a-zA-Z0-9]*)')\r
2846 if Pattern.match(self.__Token):\r
2847 Ext = self.__Token \r
2848 return '.' + Ext \r
2849 else:\r
2850 raise Warning("Unknown file extension At Line ", self.FileName, self.CurrentLineNumber)\r
2851 \r
2852 else:\r
2853 raise Warning("expected file extension At Line ", self.FileName, self.CurrentLineNumber)\r
2854 \r
2855 ## __GetRuleFileStatement() method\r
2856 #\r
2857 # Get rule contents\r
2858 #\r
2859 # @param self The object pointer\r
2860 # @retval Rule Rule object\r
2861 #\r
2862 def __GetRuleFileStatements(self):\r
2863 \r
2864 if not self.__IsKeyword("FILE"):\r
2865 raise Warning("expected FILE At Line ", self.FileName, self.CurrentLineNumber)\r
2866 \r
2867 if not self.__GetNextWord():\r
fd171542 2868 raise Warning("expected FFS type At Line ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2869 \r
2870 Type = self.__Token.strip().upper()\r
2871 if Type not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\\r
15fb5ba8 2872 "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE", "MM_STANDALONE"):\r
30fdf114
LG
2873 raise Warning("Unknown FV type At line ", self.FileName, self.CurrentLineNumber)\r
2874\r
2875 if not self.__IsToken("="):\r
2876 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
2877 \r
2878 if not self.__IsKeyword("$(NAMED_GUID)"):\r
2879 if not self.__GetNextWord():\r
2880 raise Warning("expected $(NAMED_GUID)", self.FileName, self.CurrentLineNumber)\r
2881 if self.__Token == 'PCD':\r
2882 if not self.__IsToken( "("):\r
2883 raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
2884 PcdPair = self.__GetNextPcdName()\r
2885 if not self.__IsToken( ")"):\r
2886 raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
2887 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
2888 \r
2889 NameGuid = self.__Token\r
2890\r
2891 KeepReloc = None\r
2892 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
2893 if self.__FileCouldHaveRelocFlag(Type):\r
2894 if self.__Token == 'RELOCS_STRIPPED':\r
2895 KeepReloc = False\r
2896 else:\r
2897 KeepReloc = True\r
2898 else:\r
2899 raise Warning("File type %s could not have reloc strip flag At Line %d" % (Type, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
2900 \r
2901 KeyStringList = []\r
2902 if self.__GetNextToken():\r
2903 Pattern = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')\r
2904 if Pattern.match(self.__Token):\r
2905 KeyStringList.append(self.__Token)\r
2906 if self.__IsToken(","):\r
2907 while self.__GetNextToken():\r
2908 if not Pattern.match(self.__Token):\r
2909 raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self.FileName, self.CurrentLineNumber)\r
2910 KeyStringList.append(self.__Token)\r
2911\r
2912 if not self.__IsToken(","):\r
2913 break\r
2914 \r
2915 else:\r
2916 self.__UndoToken()\r
2917\r
2918 \r
2919 Fixed = False\r
2920 if self.__IsKeyword("Fixed", True):\r
2921 Fixed = True\r
2922 \r
2923 CheckSum = False\r
2924 if self.__IsKeyword("CheckSum", True):\r
2925 CheckSum = True\r
2926 \r
2927 AlignValue = ""\r
2928 if self.__GetAlignment():\r
e921f58d
YZ
2929 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
2930 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
30fdf114
LG
2931 raise Warning("Incorrect alignment At Line ", self.FileName, self.CurrentLineNumber)\r
2932 AlignValue = self.__Token\r
2933\r
2934 if self.__IsToken("{"):\r
2935 # Complex file rule expected\r
2936 Rule = RuleComplexFile.RuleComplexFile()\r
2937 Rule.FvFileType = Type\r
2938 Rule.NameGuid = NameGuid\r
2939 Rule.Alignment = AlignValue\r
2940 Rule.CheckSum = CheckSum\r
2941 Rule.Fixed = Fixed\r
2942 Rule.KeyStringList = KeyStringList\r
2943 if KeepReloc != None:\r
2944 Rule.KeepReloc = KeepReloc\r
2945 \r
2946 while True:\r
2947 IsEncapsulate = self.__GetRuleEncapsulationSection(Rule)\r
2948 IsLeaf = self.__GetEfiSection(Rule)\r
2949 if not IsEncapsulate and not IsLeaf:\r
2950 break\r
2951 \r
2952 if not self.__IsToken("}"):\r
2953 raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)\r
2954 \r
2955 return Rule\r
2956 \r
2957 elif self.__IsToken("|"):\r
2958 # Ext rule expected\r
2959 Ext = self.__GetFileExtension()\r
2960 \r
2961 Rule = RuleSimpleFile.RuleSimpleFile()\r
2962\r
2963 Rule.FvFileType = Type\r
2964 Rule.NameGuid = NameGuid\r
2965 Rule.Alignment = AlignValue\r
2966 Rule.CheckSum = CheckSum\r
2967 Rule.Fixed = Fixed\r
2968 Rule.FileExtension = Ext\r
2969 Rule.KeyStringList = KeyStringList\r
2970 if KeepReloc != None:\r
2971 Rule.KeepReloc = KeepReloc\r
2972 \r
2973 return Rule\r
2974 \r
2975 else:\r
2976 # Simple file rule expected\r
2977 if not self.__GetNextWord():\r
2978 raise Warning("expected leaf section type At Line ", self.FileName, self.CurrentLineNumber)\r
2979\r
2980 SectionName = self.__Token\r
2981 \r
2982 if SectionName not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
2983 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):\r
2984 raise Warning("Unknown leaf section name '%s'" % SectionName, self.FileName, self.CurrentLineNumber)\r
2985\r
2986\r
2987 if self.__IsKeyword("Fixed", True):\r
2988 Fixed = True \r
2989 \r
2990 if self.__IsKeyword("CheckSum", True):\r
2991 CheckSum = True\r
2992 \r
2993 if self.__GetAlignment():\r
e921f58d
YZ
2994 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
2995 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
30fdf114 2996 raise Warning("Incorrect alignment At Line ", self.FileName, self.CurrentLineNumber)\r
52302d4d
LG
2997 if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):\r
2998 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2999 AlignValue = self.__Token\r
3000 \r
3001 if not self.__GetNextToken():\r
3002 raise Warning("expected File name At Line ", self.FileName, self.CurrentLineNumber)\r
3003 \r
3004 Rule = RuleSimpleFile.RuleSimpleFile()\r
3005 Rule.SectionType = SectionName\r
3006 Rule.FvFileType = Type\r
3007 Rule.NameGuid = NameGuid\r
3008 Rule.Alignment = AlignValue\r
3009 Rule.CheckSum = CheckSum\r
3010 Rule.Fixed = Fixed\r
3011 Rule.FileName = self.__Token\r
3012 Rule.KeyStringList = KeyStringList\r
3013 if KeepReloc != None:\r
3014 Rule.KeepReloc = KeepReloc\r
3015 return Rule\r
3016 \r
3017 ## __GetEfiSection() method\r
3018 #\r
3019 # Get section list for Rule\r
3020 #\r
3021 # @param self The object pointer\r
3022 # @param Obj for whom section is got\r
3023 # @retval True Successfully find section statement\r
3024 # @retval False Not able to find section statement\r
3025 #\r
3026 def __GetEfiSection(self, Obj):\r
3027 \r
3028 OldPos = self.GetFileBufferPos()\r
3029 if not self.__GetNextWord():\r
3030 return False\r
3031 SectionName = self.__Token\r
3032 \r
3033 if SectionName not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3034 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
3035 self.__UndoToken()\r
3036 return False\r
3037 \r
3038 if SectionName == "FV_IMAGE":\r
3039 FvImageSectionObj = FvImageSection.FvImageSection()\r
3040 if self.__IsKeyword("FV_IMAGE"):\r
3041 pass\r
3042 if self.__IsToken( "{"):\r
3043 FvObj = Fv.FV()\r
3044 self.__GetDefineStatements(FvObj)\r
3045 self.__GetBlockStatement(FvObj)\r
3046 self.__GetSetStatements(FvObj)\r
3047 self.__GetFvAlignment(FvObj)\r
3048 self.__GetFvAttributes(FvObj)\r
3049 self.__GetAprioriSection(FvObj)\r
3050 self.__GetAprioriSection(FvObj)\r
3051 \r
3052 while True:\r
3053 IsInf = self.__GetInfStatement(FvObj)\r
3054 IsFile = self.__GetFileStatement(FvObj)\r
3055 if not IsInf and not IsFile:\r
3056 break\r
3057 \r
3058 if not self.__IsToken( "}"):\r
3059 raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)\r
3060 FvImageSectionObj.Fv = FvObj\r
3061 FvImageSectionObj.FvName = None\r
3062 \r
3063 else:\r
3064 if not self.__IsKeyword("FV"):\r
3065 raise Warning("expected 'FV' At Line ", self.FileName, self.CurrentLineNumber)\r
3066 FvImageSectionObj.FvFileType = self.__Token\r
3067 \r
3068 if self.__GetAlignment():\r
e921f58d
YZ
3069 if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
3070 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
30fdf114
LG
3071 raise Warning("Incorrect alignment At Line ", self.FileName, self.CurrentLineNumber)\r
3072 FvImageSectionObj.Alignment = self.__Token\r
3073 \r
30fdf114
LG
3074 if self.__IsToken('|'):\r
3075 FvImageSectionObj.FvFileExtension = self.__GetFileExtension()\r
3076 elif self.__GetNextToken():\r
3077 if self.__Token not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3078 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
3079 FvImageSectionObj.FvFileName = self.__Token\r
3080 else:\r
3081 self.__UndoToken()\r
3082 else:\r
3083 raise Warning("expected FV file name At Line ", self.FileName, self.CurrentLineNumber)\r
3084 \r
3085 Obj.SectionList.append(FvImageSectionObj)\r
3086 return True\r
3087 \r
3088 EfiSectionObj = EfiSection.EfiSection()\r
3089 EfiSectionObj.SectionType = SectionName\r
3090 \r
3091 if not self.__GetNextToken():\r
3092 raise Warning("expected file type At Line ", self.FileName, self.CurrentLineNumber)\r
3093 \r
3094 if self.__Token == "STRING":\r
3095 if not self.__RuleSectionCouldHaveString(EfiSectionObj.SectionType):\r
3096 raise Warning("%s section could NOT have string data At Line %d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3097 \r
3098 if not self.__IsToken('='):\r
3099 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
3100 \r
3101 if not self.__GetNextToken():\r
3102 raise Warning("expected Quoted String At Line ", self.FileName, self.CurrentLineNumber)\r
3103 \r
3104 if self.__GetStringData():\r
3105 EfiSectionObj.StringData = self.__Token\r
3106 \r
3107 if self.__IsKeyword("BUILD_NUM"):\r
3108 if not self.__RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType):\r
3109 raise Warning("%s section could NOT have BUILD_NUM At Line %d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3110 \r
3111 if not self.__IsToken("="):\r
3112 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
3113 if not self.__GetNextToken():\r
3114 raise Warning("expected Build number At Line ", self.FileName, self.CurrentLineNumber)\r
3115 EfiSectionObj.BuildNum = self.__Token\r
3116 \r
3117 else:\r
3118 EfiSectionObj.FileType = self.__Token\r
3119 self.__CheckRuleSectionFileType(EfiSectionObj.SectionType, EfiSectionObj.FileType)\r
3120 \r
3121 if self.__IsKeyword("Optional"):\r
3122 if not self.__RuleSectionCouldBeOptional(EfiSectionObj.SectionType):\r
3123 raise Warning("%s section could NOT be optional At Line %d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3124 EfiSectionObj.Optional = True\r
3125 \r
3126 if self.__IsKeyword("BUILD_NUM"):\r
3127 if not self.__RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType):\r
3128 raise Warning("%s section could NOT have BUILD_NUM At Line %d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3129 \r
3130 if not self.__IsToken("="):\r
3131 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
3132 if not self.__GetNextToken():\r
3133 raise Warning("expected Build number At Line ", self.FileName, self.CurrentLineNumber)\r
3134 EfiSectionObj.BuildNum = self.__Token\r
3135 \r
3136 if self.__GetAlignment():\r
e921f58d
YZ
3137 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
3138 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
52302d4d
LG
3139 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3140 if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):\r
3141 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
3142 EfiSectionObj.Alignment = self.__Token\r
3143 \r
3144 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
3145 if self.__SectionCouldHaveRelocFlag(EfiSectionObj.SectionType):\r
3146 if self.__Token == 'RELOCS_STRIPPED':\r
3147 EfiSectionObj.KeepReloc = False\r
3148 else:\r
3149 EfiSectionObj.KeepReloc = True\r
3150 if Obj.KeepReloc != None and Obj.KeepReloc != EfiSectionObj.KeepReloc:\r
3151 raise Warning("Section type %s has reloc strip flag conflict with Rule At Line %d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3152 else:\r
3153 raise Warning("Section type %s could not have reloc strip flag At Line %d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3154 \r
3155 \r
3156 if self.__IsToken('|'):\r
3157 EfiSectionObj.FileExtension = self.__GetFileExtension()\r
3158 elif self.__GetNextToken():\r
3159 if self.__Token not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3160 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
3161 \r
3162 if self.__Token.startswith('PCD'):\r
3163 self.__UndoToken()\r
3164 self.__GetNextWord()\r
3165 \r
3166 if self.__Token == 'PCD':\r
3167 if not self.__IsToken( "("):\r
3168 raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
3169 PcdPair = self.__GetNextPcdName()\r
3170 if not self.__IsToken( ")"):\r
3171 raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
3172 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
3173 \r
3174 EfiSectionObj.FileName = self.__Token \r
3175 \r
3176 else:\r
3177 self.__UndoToken()\r
3178 else:\r
3179 raise Warning("expected section file name At Line ", self.FileName, self.CurrentLineNumber)\r
3180 \r
3181 Obj.SectionList.append(EfiSectionObj)\r
3182 return True\r
3183 \r
3184 ## __RuleSectionCouldBeOptional() method\r
3185 #\r
3186 # Get whether a section could be optional\r
3187 #\r
3188 # @param self The object pointer\r
3189 # @param SectionType The section type to check\r
3190 # @retval True section could be optional\r
3191 # @retval False section never optional\r
3192 #\r
3193 def __RuleSectionCouldBeOptional(self, SectionType):\r
3194 if SectionType in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):\r
3195 return True\r
3196 else:\r
3197 return False\r
3198 \r
3199 ## __RuleSectionCouldHaveBuildNum() method\r
3200 #\r
3201 # Get whether a section could have build number information\r
3202 #\r
3203 # @param self The object pointer\r
3204 # @param SectionType The section type to check\r
3205 # @retval True section could have build number information\r
3206 # @retval False section never have build number information\r
3207 #\r
3208 def __RuleSectionCouldHaveBuildNum(self, SectionType):\r
3209 if SectionType in ("VERSION"):\r
3210 return True\r
3211 else:\r
3212 return False\r
3213 \r
3214 ## __RuleSectionCouldHaveString() method\r
3215 #\r
3216 # Get whether a section could have string\r
3217 #\r
3218 # @param self The object pointer\r
3219 # @param SectionType The section type to check\r
3220 # @retval True section could have string\r
3221 # @retval False section never have string\r
3222 #\r
3223 def __RuleSectionCouldHaveString(self, SectionType):\r
3224 if SectionType in ("UI", "VERSION"):\r
3225 return True\r
3226 else:\r
3227 return False\r
3228 \r
3229 ## __CheckRuleSectionFileType() method\r
3230 #\r
3231 # Get whether a section matches a file type\r
3232 #\r
3233 # @param self The object pointer\r
3234 # @param SectionType The section type to check\r
3235 # @param FileType The file type to check\r
3236 #\r
3237 def __CheckRuleSectionFileType(self, SectionType, FileType):\r
3238 if SectionType == "COMPAT16":\r
3239 if FileType not in ("COMPAT16", "SEC_COMPAT16"):\r
3240 raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)\r
3241 elif SectionType == "PE32":\r
3242 if FileType not in ("PE32", "SEC_PE32"):\r
3243 raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)\r
3244 elif SectionType == "PIC":\r
3245 if FileType not in ("PIC", "PIC"):\r
3246 raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)\r
3247 elif SectionType == "TE":\r
3248 if FileType not in ("TE", "SEC_TE"):\r
3249 raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)\r
3250 elif SectionType == "RAW":\r
3251 if FileType not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):\r
3252 raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)\r
b303ea72
LG
3253 elif SectionType == "DXE_DEPEX" or SectionType == "SMM_DEPEX":\r
3254 if FileType not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):\r
30fdf114
LG
3255 raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)\r
3256 elif SectionType == "UI":\r
3257 if FileType not in ("UI", "SEC_UI"):\r
3258 raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)\r
3259 elif SectionType == "VERSION":\r
3260 if FileType not in ("VERSION", "SEC_VERSION"):\r
3261 raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)\r
3262 elif SectionType == "PEI_DEPEX":\r
3263 if FileType not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):\r
3264 raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)\r
3265 elif SectionType == "GUID":\r
3266 if FileType not in ("PE32", "SEC_GUID"):\r
3267 raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber) \r
3268 \r
3269 ## __GetRuleEncapsulationSection() method\r
3270 #\r
3271 # Get encapsulation section for Rule\r
3272 #\r
3273 # @param self The object pointer\r
3274 # @param Rule for whom section is got\r
3275 # @retval True Successfully find section statement\r
3276 # @retval False Not able to find section statement\r
3277 #\r
3278 def __GetRuleEncapsulationSection(self, Rule):\r
3279\r
3280 if self.__IsKeyword( "COMPRESS"):\r
3281 Type = "PI_STD"\r
3282 if self.__IsKeyword("PI_STD") or self.__IsKeyword("PI_NONE"):\r
3283 Type = self.__Token\r
3284 \r
3285 if not self.__IsToken("{"):\r
3286 raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)\r
3287\r
3288 CompressSectionObj = CompressSection.CompressSection()\r
3289 \r
3290 CompressSectionObj.CompType = Type\r
3291 # Recursive sections...\r
3292 while True:\r
3293 IsEncapsulate = self.__GetRuleEncapsulationSection(CompressSectionObj)\r
3294 IsLeaf = self.__GetEfiSection(CompressSectionObj)\r
3295 if not IsEncapsulate and not IsLeaf:\r
3296 break\r
3297 \r
3298 if not self.__IsToken( "}"):\r
3299 raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)\r
3300 Rule.SectionList.append(CompressSectionObj)\r
3301 \r
3302 return True\r
3303\r
3304 elif self.__IsKeyword( "GUIDED"):\r
3305 GuidValue = None\r
3306 if self.__GetNextGuid():\r
3307 GuidValue = self.__Token\r
3308 \r
3309 if self.__IsKeyword( "$(NAMED_GUID)"):\r
3310 GuidValue = self.__Token\r
3311 \r
3312 AttribDict = self.__GetGuidAttrib()\r
3313 \r
3314 if not self.__IsToken("{"):\r
3315 raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)\r
3316 GuidSectionObj = GuidSection.GuidSection()\r
3317 GuidSectionObj.NameGuid = GuidValue\r
3318 GuidSectionObj.SectionType = "GUIDED"\r
3319 GuidSectionObj.ProcessRequired = AttribDict["PROCESSING_REQUIRED"]\r
3320 GuidSectionObj.AuthStatusValid = AttribDict["AUTH_STATUS_VALID"]\r
3321 \r
3322 # Efi sections...\r
3323 while True:\r
3324 IsEncapsulate = self.__GetRuleEncapsulationSection(GuidSectionObj)\r
3325 IsLeaf = self.__GetEfiSection(GuidSectionObj)\r
3326 if not IsEncapsulate and not IsLeaf:\r
3327 break\r
3328 \r
3329 if not self.__IsToken( "}"):\r
3330 raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)\r
3331 Rule.SectionList.append(GuidSectionObj)\r
3332\r
3333 return True\r
3334\r
3335 return False\r
3336 \r
3337 ## __GetVtf() method\r
3338 #\r
3339 # Get VTF section contents and store its data into VTF list of self.Profile\r
3340 #\r
3341 # @param self The object pointer\r
3342 # @retval True Successfully find a VTF\r
3343 # @retval False Not able to find a VTF\r
3344 #\r
3345 def __GetVtf(self):\r
3346 \r
3347 if not self.__GetNextToken():\r
3348 return False\r
3349\r
3350 S = self.__Token.upper()\r
3351 if S.startswith("[") and not S.startswith("[VTF."):\r
3352 if not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
3353 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
3354 self.__UndoToken()\r
3355 return False\r
3356\r
3357 self.__UndoToken()\r
3358 if not self.__IsToken("[VTF.", True):\r
3359 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
3360 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
3361 % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
3362 raise Warning("expected [VTF.] At Line ", self.FileName, self.CurrentLineNumber)\r
3363\r
3364 if not self.__SkipToToken("."):\r
3365 raise Warning("expected '.' At Line ", self.FileName, self.CurrentLineNumber)\r
3366\r
3367 Arch = self.__SkippedChars.rstrip(".").upper()\r
4afd3d04 3368 if Arch not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):\r
30fdf114
LG
3369 raise Warning("Unknown Arch At line ", self.FileName, self.CurrentLineNumber)\r
3370\r
3371 if not self.__GetNextWord():\r
3372 raise Warning("expected VTF name At Line ", self.FileName, self.CurrentLineNumber)\r
3373 Name = self.__Token.upper()\r
3374\r
3375 VtfObj = Vtf.Vtf()\r
3376 VtfObj.UiName = Name\r
3377 VtfObj.KeyArch = Arch\r
3378 \r
3379 if self.__IsToken(","):\r
3380 if not self.__GetNextWord():\r
3381 raise Warning("expected Arch list At Line ", self.FileName, self.CurrentLineNumber)\r
4afd3d04 3382 if self.__Token.upper() not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):\r
30fdf114
LG
3383 raise Warning("Unknown Arch At line ", self.FileName, self.CurrentLineNumber)\r
3384 VtfObj.ArchList = self.__Token.upper()\r
3385\r
3386 if not self.__IsToken( "]"):\r
3387 raise Warning("expected ']' At Line ", self.FileName, self.CurrentLineNumber)\r
3388 \r
3389 if self.__IsKeyword("IA32_RST_BIN"):\r
3390 if not self.__IsToken("="):\r
3391 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
3392\r
3393 if not self.__GetNextToken():\r
3394 raise Warning("expected Reset file At Line ", self.FileName, self.CurrentLineNumber)\r
3395\r
3396 VtfObj.ResetBin = self.__Token\r
3397 \r
3398 while self.__GetComponentStatement(VtfObj):\r
3399 pass\r
3400 \r
3401 self.Profile.VtfList.append(VtfObj)\r
3402 return True\r
3403 \r
3404 ## __GetComponentStatement() method\r
3405 #\r
3406 # Get components in VTF\r
3407 #\r
3408 # @param self The object pointer\r
3409 # @param VtfObj for whom component is got\r
3410 # @retval True Successfully find a component\r
3411 # @retval False Not able to find a component\r
3412 #\r
3413 def __GetComponentStatement(self, VtfObj):\r
3414 \r
3415 if not self.__IsKeyword("COMP_NAME"):\r
3416 return False\r
3417 \r
3418 if not self.__IsToken("="):\r
3419 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
3420\r
3421 if not self.__GetNextWord():\r
3422 raise Warning("expected Component Name At Line ", self.FileName, self.CurrentLineNumber)\r
3423\r
3424 CompStatementObj = ComponentStatement.ComponentStatement()\r
3425 CompStatementObj.CompName = self.__Token\r
3426 \r
3427 if not self.__IsKeyword("COMP_LOC"):\r
3428 raise Warning("expected COMP_LOC At Line ", self.FileName, self.CurrentLineNumber)\r
3429\r
3430 if not self.__IsToken("="):\r
3431 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
3432\r
3433 CompStatementObj.CompLoc = ""\r
3434 if self.__GetNextWord():\r
3435 CompStatementObj.CompLoc = self.__Token\r
3436 if self.__IsToken('|'):\r
3437 if not self.__GetNextWord():\r
3438 raise Warning("Expected Region Name At Line ", self.FileName, self.CurrentLineNumber)\r
3439 \r
3440 if self.__Token not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support\r
3441 raise Warning("Unknown location type At line ", self.FileName, self.CurrentLineNumber)\r
3442 \r
3443 CompStatementObj.FilePos = self.__Token\r
3444 else:\r
3445 self.CurrentLineNumber += 1\r
3446 self.CurrentOffsetWithinLine = 0\r
3447 \r
3448 if not self.__IsKeyword("COMP_TYPE"):\r
3449 raise Warning("expected COMP_TYPE At Line ", self.FileName, self.CurrentLineNumber)\r
3450\r
3451 if not self.__IsToken("="):\r
3452 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
3453\r
3454 if not self.__GetNextToken():\r
3455 raise Warning("expected Component type At Line ", self.FileName, self.CurrentLineNumber)\r
3456 if self.__Token not in ("FIT", "PAL_B", "PAL_A", "OEM"):\r
3457 if not self.__Token.startswith("0x") or len(self.__Token) < 3 or len(self.__Token) > 4 or \\r
3458 not self.__HexDigit(self.__Token[2]) or not self.__HexDigit(self.__Token[-1]):\r
3459 raise Warning("Unknown location type At line ", self.FileName, self.CurrentLineNumber)\r
3460 CompStatementObj.CompType = self.__Token\r
3461 \r
3462 if not self.__IsKeyword("COMP_VER"):\r
3463 raise Warning("expected COMP_VER At Line ", self.FileName, self.CurrentLineNumber)\r
3464\r
3465 if not self.__IsToken("="):\r
3466 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
3467\r
3468 if not self.__GetNextToken():\r
3469 raise Warning("expected Component version At Line ", self.FileName, self.CurrentLineNumber)\r
3470\r
3471 Pattern = re.compile('-$|[0-9]{0,1}[0-9]{1}\.[0-9]{0,1}[0-9]{1}')\r
3472 if Pattern.match(self.__Token) == None:\r
3473 raise Warning("Unknown version format At line ", self.FileName, self.CurrentLineNumber)\r
3474 CompStatementObj.CompVer = self.__Token\r
3475 \r
3476 if not self.__IsKeyword("COMP_CS"):\r
3477 raise Warning("expected COMP_CS At Line ", self.FileName, self.CurrentLineNumber)\r
3478\r
3479 if not self.__IsToken("="):\r
3480 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
3481\r
3482 if not self.__GetNextToken():\r
3483 raise Warning("expected Component CS At Line ", self.FileName, self.CurrentLineNumber)\r
3484 if self.__Token not in ("1", "0"):\r
3485 raise Warning("Unknown Component CS At line ", self.FileName, self.CurrentLineNumber)\r
3486 CompStatementObj.CompCs = self.__Token\r
3487 \r
3488 \r
3489 if not self.__IsKeyword("COMP_BIN"):\r
3490 raise Warning("expected COMP_BIN At Line ", self.FileName, self.CurrentLineNumber)\r
3491\r
3492 if not self.__IsToken("="):\r
3493 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
3494\r
3495 if not self.__GetNextToken():\r
3496 raise Warning("expected Component file At Line ", self.FileName, self.CurrentLineNumber)\r
3497\r
3498 CompStatementObj.CompBin = self.__Token\r
3499 \r
3500 if not self.__IsKeyword("COMP_SYM"):\r
3501 raise Warning("expected COMP_SYM At Line ", self.FileName, self.CurrentLineNumber)\r
3502\r
3503 if not self.__IsToken("="):\r
3504 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
3505\r
3506 if not self.__GetNextToken():\r
3507 raise Warning("expected Component symbol file At Line ", self.FileName, self.CurrentLineNumber)\r
3508\r
3509 CompStatementObj.CompSym = self.__Token\r
3510 \r
3511 if not self.__IsKeyword("COMP_SIZE"):\r
3512 raise Warning("expected COMP_SIZE At Line ", self.FileName, self.CurrentLineNumber)\r
3513\r
3514 if not self.__IsToken("="):\r
3515 raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)\r
3516\r
3517 if self.__IsToken("-"):\r
3518 CompStatementObj.CompSize = self.__Token\r
3519 elif self.__GetNextDecimalNumber():\r
3520 CompStatementObj.CompSize = self.__Token\r
3521 elif self.__GetNextHexNumber():\r
3522 CompStatementObj.CompSize = self.__Token\r
3523 else:\r
3524 raise Warning("Unknown size At line ", self.FileName, self.CurrentLineNumber)\r
3525 \r
3526 VtfObj.ComponentStatementList.append(CompStatementObj)\r
3527 return True\r
3528 \r
3529 ## __GetFvInFd() method\r
3530 #\r
3531 # Get FV list contained in FD\r
3532 #\r
3533 # @param self The object pointer\r
3534 # @param FdName FD name\r
3535 # @retval FvList list of FV in FD\r
3536 #\r
3537 def __GetFvInFd (self, FdName):\r
3538 \r
3539 FvList = []\r
3540 if FdName.upper() in self.Profile.FdDict.keys():\r
3541 FdObj = self.Profile.FdDict[FdName.upper()]\r
3542 for elementRegion in FdObj.RegionList:\r
3543 if elementRegion.RegionType == 'FV':\r
3544 for elementRegionData in elementRegion.RegionDataList:\r
3545 if elementRegionData != None and elementRegionData.upper() not in FvList:\r
3546 FvList.append(elementRegionData.upper())\r
3547 return FvList\r
3548 \r
3549 ## __GetReferencedFdFvTuple() method\r
3550 #\r
3551 # Get FD and FV list referenced by a FFS file\r
3552 #\r
3553 # @param self The object pointer\r
3554 # @param FfsFile contains sections to be searched\r
3555 # @param RefFdList referenced FD by section\r
3556 # @param RefFvList referenced FV by section\r
3557 #\r
3558 def __GetReferencedFdFvTuple(self, FvObj, RefFdList = [], RefFvList = []):\r
3559 \r
3560 for FfsObj in FvObj.FfsList:\r
3561 if isinstance(FfsObj, FfsFileStatement.FileStatement):\r
3562 if FfsObj.FvName != None and FfsObj.FvName.upper() not in RefFvList:\r
3563 RefFvList.append(FfsObj.FvName.upper())\r
3564 elif FfsObj.FdName != None and FfsObj.FdName.upper() not in RefFdList:\r
3565 RefFdList.append(FfsObj.FdName.upper())\r
3566 else:\r
3567 self.__GetReferencedFdFvTupleFromSection(FfsObj, RefFdList, RefFvList) \r
3568 \r
3569 ## __GetReferencedFdFvTupleFromSection() method\r
3570 #\r
3571 # Get FD and FV list referenced by a FFS section\r
3572 #\r
3573 # @param self The object pointer\r
3574 # @param FfsFile contains sections to be searched\r
3575 # @param FdList referenced FD by section\r
3576 # @param FvList referenced FV by section\r
3577 #\r
3578 def __GetReferencedFdFvTupleFromSection(self, FfsFile, FdList = [], FvList = []):\r
3579 \r
3580 SectionStack = []\r
3581 SectionStack.extend(FfsFile.SectionList)\r
3582 while SectionStack != []:\r
3583 SectionObj = SectionStack.pop()\r
3584 if isinstance(SectionObj, FvImageSection.FvImageSection):\r
3585 if SectionObj.FvName != None and SectionObj.FvName.upper() not in FvList:\r
3586 FvList.append(SectionObj.FvName.upper())\r
3587 if SectionObj.Fv != None and SectionObj.Fv.UiFvName != None and SectionObj.Fv.UiFvName.upper() not in FvList:\r
3588 FvList.append(SectionObj.Fv.UiFvName.upper())\r
3589 self.__GetReferencedFdFvTuple(SectionObj.Fv, FdList, FvList)\r
3590 \r
3591 if isinstance(SectionObj, CompressSection.CompressSection) or isinstance(SectionObj, GuidSection.GuidSection):\r
3592 SectionStack.extend(SectionObj.SectionList)\r
3593 \r
3594 ## CycleReferenceCheck() method\r
3595 #\r
3596 # Check whether cycle reference exists in FDF\r
3597 #\r
3598 # @param self The object pointer\r
3599 # @retval True cycle reference exists\r
3600 # @retval False Not exists cycle reference\r
3601 #\r
3602 def CycleReferenceCheck(self):\r
3603 \r
3604 CycleRefExists = False\r
3605 \r
3606 try:\r
3607 for FvName in self.Profile.FvDict.keys():\r
3608 LogStr = "Cycle Reference Checking for FV: %s\n" % FvName\r
3609 RefFvStack = []\r
3610 RefFvStack.append(FvName)\r
3611 FdAnalyzedList = []\r
3612 \r
3613 while RefFvStack != []:\r
3614 FvNameFromStack = RefFvStack.pop()\r
3615 if FvNameFromStack.upper() in self.Profile.FvDict.keys():\r
3616 FvObj = self.Profile.FvDict[FvNameFromStack.upper()]\r
3617 else:\r
3618 continue\r
3619 \r
3620 RefFdList = []\r
3621 RefFvList = []\r
3622 self.__GetReferencedFdFvTuple(FvObj, RefFdList, RefFvList)\r
3623 \r
3624 for RefFdName in RefFdList:\r
3625 if RefFdName in FdAnalyzedList:\r
3626 continue\r
3627 \r
3628 LogStr += "FD %s is referenced by FV %s\n" % (RefFdName, FvNameFromStack) \r
3629 FvInFdList = self.__GetFvInFd(RefFdName)\r
3630 if FvInFdList != []:\r
3631 LogStr += "FD %s contains FV: " % RefFdName\r
3632 for FvObj in FvInFdList:\r
3633 LogStr += FvObj\r
3634 LogStr += ' \n'\r
3635 if FvObj not in RefFvStack:\r
3636 RefFvStack.append(FvObj)\r
3637 \r
3638 if FvName in RefFvStack:\r
3639 CycleRefExists = True\r
3640 raise Warning(LogStr)\r
3641 FdAnalyzedList.append(RefFdName)\r
3642 \r
3643 for RefFvName in RefFvList:\r
3644 LogStr += "FV %s is referenced by FV %s\n" % (RefFvName, FvNameFromStack)\r
3645 if RefFvName not in RefFvStack:\r
3646 RefFvStack.append(RefFvName)\r
3647 \r
3648 if FvName in RefFvStack:\r
3649 CycleRefExists = True\r
3650 raise Warning(LogStr)\r
3651 \r
3652 except Warning:\r
3653 print LogStr\r
3654 \r
3655 finally:\r
3656 return CycleRefExists\r
3657 \r
3658if __name__ == "__main__":\r
b36d134f
LG
3659 import sys\r
3660 try:\r
3661 test_file = sys.argv[1]\r
3662 except IndexError, v:\r
3663 print "Usage: %s filename" % sys.argv[0]\r
3664 sys.exit(1)\r
3665\r
3666 parser = FdfParser(test_file)\r
30fdf114
LG
3667 try:\r
3668 parser.ParseFile()\r
3669 parser.CycleReferenceCheck()\r
3670 except Warning, X:\r
3671 print X.message\r
3672 else:\r
3673 print "Success!"\r
3674\r