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