]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/Ecc/CodeFragmentCollector.py
BaseTools/ECC: Fix an issue of parameter parser
[mirror_edk2.git] / BaseTools / Source / Python / Ecc / CodeFragmentCollector.py
1 ## @file
2 # preprocess source file
3 #
4 # Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
5 #
6 # This program and the accompanying materials
7 # are licensed and made available under the terms and conditions of the BSD License
8 # which accompanies this distribution. The full text of the license may be found at
9 # http://opensource.org/licenses/bsd-license.php
10 #
11 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 #
14
15 ##
16 # Import Modules
17 #
18
19 import re
20 import Common.LongFilePathOs as os
21 import sys
22
23 import antlr3
24 from CLexer import CLexer
25 from CParser import CParser
26
27 import FileProfile
28 from CodeFragment import Comment
29 from CodeFragment import PP_Directive
30 from ParserWarning import Warning
31
32
33 ##define T_CHAR_SPACE ' '
34 ##define T_CHAR_NULL '\0'
35 ##define T_CHAR_CR '\r'
36 ##define T_CHAR_TAB '\t'
37 ##define T_CHAR_LF '\n'
38 ##define T_CHAR_SLASH '/'
39 ##define T_CHAR_BACKSLASH '\\'
40 ##define T_CHAR_DOUBLE_QUOTE '\"'
41 ##define T_CHAR_SINGLE_QUOTE '\''
42 ##define T_CHAR_STAR '*'
43 ##define T_CHAR_HASH '#'
44
45 (T_CHAR_SPACE, T_CHAR_NULL, T_CHAR_CR, T_CHAR_TAB, T_CHAR_LF, T_CHAR_SLASH, \
46 T_CHAR_BACKSLASH, T_CHAR_DOUBLE_QUOTE, T_CHAR_SINGLE_QUOTE, T_CHAR_STAR, T_CHAR_HASH) = \
47 (' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#')
48
49 SEPERATOR_TUPLE = ('=', '|', ',', '{', '}')
50
51 (T_COMMENT_TWO_SLASH, T_COMMENT_SLASH_STAR) = (0, 1)
52
53 (T_PP_INCLUDE, T_PP_DEFINE, T_PP_OTHERS) = (0, 1, 2)
54
55 ## The collector for source code fragments.
56 #
57 # PreprocessFile method should be called prior to ParseFile
58 #
59 # GetNext*** procedures mean these procedures will get next token first, then make judgement.
60 # Get*** procedures mean these procedures will make judgement on current token only.
61 #
62 class CodeFragmentCollector:
63 ## The constructor
64 #
65 # @param self The object pointer
66 # @param FileName The file that to be parsed
67 #
68 def __init__(self, FileName):
69 self.Profile = FileProfile.FileProfile(FileName)
70 self.Profile.FileLinesList.append(T_CHAR_LF)
71 self.FileName = FileName
72 self.CurrentLineNumber = 1
73 self.CurrentOffsetWithinLine = 0
74
75 self.__Token = ""
76 self.__SkippedChars = ""
77
78 ## __IsWhiteSpace() method
79 #
80 # Whether char at current FileBufferPos is whitespace
81 #
82 # @param self The object pointer
83 # @param Char The char to test
84 # @retval True The char is a kind of white space
85 # @retval False The char is NOT a kind of white space
86 #
87 def __IsWhiteSpace(self, Char):
88 if Char in (T_CHAR_NULL, T_CHAR_CR, T_CHAR_SPACE, T_CHAR_TAB, T_CHAR_LF):
89 return True
90 else:
91 return False
92
93 ## __SkipWhiteSpace() method
94 #
95 # Skip white spaces from current char, return number of chars skipped
96 #
97 # @param self The object pointer
98 # @retval Count The number of chars skipped
99 #
100 def __SkipWhiteSpace(self):
101 Count = 0
102 while not self.__EndOfFile():
103 Count += 1
104 if self.__CurrentChar() in (T_CHAR_NULL, T_CHAR_CR, T_CHAR_LF, T_CHAR_SPACE, T_CHAR_TAB):
105 self.__SkippedChars += str(self.__CurrentChar())
106 self.__GetOneChar()
107
108 else:
109 Count = Count - 1
110 return Count
111
112 ## __EndOfFile() method
113 #
114 # Judge current buffer pos is at file end
115 #
116 # @param self The object pointer
117 # @retval True Current File buffer position is at file end
118 # @retval False Current File buffer position is NOT at file end
119 #
120 def __EndOfFile(self):
121 NumberOfLines = len(self.Profile.FileLinesList)
122 SizeOfLastLine = NumberOfLines
123 if NumberOfLines > 0:
124 SizeOfLastLine = len(self.Profile.FileLinesList[-1])
125
126 if self.CurrentLineNumber == NumberOfLines and self.CurrentOffsetWithinLine >= SizeOfLastLine - 1:
127 return True
128 elif self.CurrentLineNumber > NumberOfLines:
129 return True
130 else:
131 return False
132
133 ## __EndOfLine() method
134 #
135 # Judge current buffer pos is at line end
136 #
137 # @param self The object pointer
138 # @retval True Current File buffer position is at line end
139 # @retval False Current File buffer position is NOT at line end
140 #
141 def __EndOfLine(self):
142 SizeOfCurrentLine = len(self.Profile.FileLinesList[self.CurrentLineNumber - 1])
143 if self.CurrentOffsetWithinLine >= SizeOfCurrentLine - 1:
144 return True
145 else:
146 return False
147
148 ## Rewind() method
149 #
150 # Reset file data buffer to the initial state
151 #
152 # @param self The object pointer
153 #
154 def Rewind(self):
155 self.CurrentLineNumber = 1
156 self.CurrentOffsetWithinLine = 0
157
158 ## __UndoOneChar() method
159 #
160 # Go back one char in the file buffer
161 #
162 # @param self The object pointer
163 # @retval True Successfully go back one char
164 # @retval False Not able to go back one char as file beginning reached
165 #
166 def __UndoOneChar(self):
167
168 if self.CurrentLineNumber == 1 and self.CurrentOffsetWithinLine == 0:
169 return False
170 elif self.CurrentOffsetWithinLine == 0:
171 self.CurrentLineNumber -= 1
172 self.CurrentOffsetWithinLine = len(self.__CurrentLine()) - 1
173 else:
174 self.CurrentOffsetWithinLine -= 1
175 return True
176
177 ## __GetOneChar() method
178 #
179 # Move forward one char in the file buffer
180 #
181 # @param self The object pointer
182 #
183 def __GetOneChar(self):
184 if self.CurrentOffsetWithinLine == len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) - 1:
185 self.CurrentLineNumber += 1
186 self.CurrentOffsetWithinLine = 0
187 else:
188 self.CurrentOffsetWithinLine += 1
189
190 ## __CurrentChar() method
191 #
192 # Get the char pointed to by the file buffer pointer
193 #
194 # @param self The object pointer
195 # @retval Char Current char
196 #
197 def __CurrentChar(self):
198 CurrentChar = self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine]
199 # if CurrentChar > 255:
200 # raise Warning("Non-Ascii char found At Line %d, offset %d" % (self.CurrentLineNumber, self.CurrentOffsetWithinLine), self.FileName, self.CurrentLineNumber)
201 return CurrentChar
202
203 ## __NextChar() method
204 #
205 # Get the one char pass the char pointed to by the file buffer pointer
206 #
207 # @param self The object pointer
208 # @retval Char Next char
209 #
210 def __NextChar(self):
211 if self.CurrentOffsetWithinLine == len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) - 1:
212 return self.Profile.FileLinesList[self.CurrentLineNumber][0]
213 else:
214 return self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine + 1]
215
216 ## __SetCurrentCharValue() method
217 #
218 # Modify the value of current char
219 #
220 # @param self The object pointer
221 # @param Value The new value of current char
222 #
223 def __SetCurrentCharValue(self, Value):
224 self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine] = Value
225
226 ## __SetCharValue() method
227 #
228 # Modify the value of current char
229 #
230 # @param self The object pointer
231 # @param Value The new value of current char
232 #
233 def __SetCharValue(self, Line, Offset, Value):
234 self.Profile.FileLinesList[Line - 1][Offset] = Value
235
236 ## __CurrentLine() method
237 #
238 # Get the list that contains current line contents
239 #
240 # @param self The object pointer
241 # @retval List current line contents
242 #
243 def __CurrentLine(self):
244 return self.Profile.FileLinesList[self.CurrentLineNumber - 1]
245
246 ## __InsertComma() method
247 #
248 # Insert ',' to replace PP
249 #
250 # @param self The object pointer
251 # @retval List current line contents
252 #
253 def __InsertComma(self, Line):
254
255
256 if self.Profile.FileLinesList[Line - 1][0] != T_CHAR_HASH:
257 BeforeHashPart = str(self.Profile.FileLinesList[Line - 1]).split(T_CHAR_HASH)[0]
258 if BeforeHashPart.rstrip().endswith(T_CHAR_COMMA) or BeforeHashPart.rstrip().endswith(';'):
259 return
260
261 if Line - 2 >= 0 and str(self.Profile.FileLinesList[Line - 2]).rstrip().endswith(','):
262 return
263
264 if Line - 2 >= 0 and str(self.Profile.FileLinesList[Line - 2]).rstrip().endswith(';'):
265 return
266
267 if str(self.Profile.FileLinesList[Line]).lstrip().startswith(',') or str(self.Profile.FileLinesList[Line]).lstrip().startswith(';'):
268 return
269
270 self.Profile.FileLinesList[Line - 1].insert(self.CurrentOffsetWithinLine, ',')
271
272 ## PreprocessFile() method
273 #
274 # Preprocess file contents, replace comments with spaces.
275 # In the end, rewind the file buffer pointer to the beginning
276 # BUGBUG: No !include statement processing contained in this procedure
277 # !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]
278 #
279 # @param self The object pointer
280 #
281 def PreprocessFile(self):
282
283 self.Rewind()
284 InComment = False
285 DoubleSlashComment = False
286 HashComment = False
287 PPExtend = False
288 CommentObj = None
289 PPDirectiveObj = None
290 # HashComment in quoted string " " is ignored.
291 InString = False
292 InCharLiteral = False
293
294 self.Profile.FileLinesList = [list(s) for s in self.Profile.FileLinesListFromFile]
295 while not self.__EndOfFile():
296
297 if not InComment and self.__CurrentChar() == T_CHAR_DOUBLE_QUOTE:
298 InString = not InString
299
300 if not InComment and self.__CurrentChar() == T_CHAR_SINGLE_QUOTE:
301 InCharLiteral = not InCharLiteral
302 # meet new line, then no longer in a comment for // and '#'
303 if self.__CurrentChar() == T_CHAR_LF:
304 if HashComment and PPDirectiveObj != None:
305 if PPDirectiveObj.Content.rstrip(T_CHAR_CR).endswith(T_CHAR_BACKSLASH):
306 PPDirectiveObj.Content += T_CHAR_LF
307 PPExtend = True
308 else:
309 PPExtend = False
310
311 EndLinePos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)
312
313 if InComment and DoubleSlashComment:
314 InComment = False
315 DoubleSlashComment = False
316 CommentObj.Content += T_CHAR_LF
317 CommentObj.EndPos = EndLinePos
318 FileProfile.CommentList.append(CommentObj)
319 CommentObj = None
320 if InComment and HashComment and not PPExtend:
321 InComment = False
322 HashComment = False
323 PPDirectiveObj.Content += T_CHAR_LF
324 PPDirectiveObj.EndPos = EndLinePos
325 FileProfile.PPDirectiveList.append(PPDirectiveObj)
326 PPDirectiveObj = None
327
328 if InString or InCharLiteral:
329 CurrentLine = "".join(self.__CurrentLine())
330 if CurrentLine.rstrip(T_CHAR_LF).rstrip(T_CHAR_CR).endswith(T_CHAR_BACKSLASH):
331 SlashIndex = CurrentLine.rindex(T_CHAR_BACKSLASH)
332 self.__SetCharValue(self.CurrentLineNumber, SlashIndex, T_CHAR_SPACE)
333
334 if InComment and not DoubleSlashComment and not HashComment:
335 CommentObj.Content += T_CHAR_LF
336 self.CurrentLineNumber += 1
337 self.CurrentOffsetWithinLine = 0
338 # check for */ comment end
339 elif InComment and not DoubleSlashComment and not HashComment and self.__CurrentChar() == T_CHAR_STAR and self.__NextChar() == T_CHAR_SLASH:
340 CommentObj.Content += self.__CurrentChar()
341 # self.__SetCurrentCharValue(T_CHAR_SPACE)
342 self.__GetOneChar()
343 CommentObj.Content += self.__CurrentChar()
344 # self.__SetCurrentCharValue(T_CHAR_SPACE)
345 CommentObj.EndPos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)
346 FileProfile.CommentList.append(CommentObj)
347 CommentObj = None
348 self.__GetOneChar()
349 InComment = False
350 # set comments to spaces
351 elif InComment:
352 if HashComment:
353 # // follows hash PP directive
354 if self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_SLASH:
355 InComment = False
356 HashComment = False
357 PPDirectiveObj.EndPos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine - 1)
358 FileProfile.PPDirectiveList.append(PPDirectiveObj)
359 PPDirectiveObj = None
360 continue
361 else:
362 PPDirectiveObj.Content += self.__CurrentChar()
363 if PPExtend:
364 self.__SetCurrentCharValue(T_CHAR_SPACE)
365 else:
366 CommentObj.Content += self.__CurrentChar()
367 # self.__SetCurrentCharValue(T_CHAR_SPACE)
368 self.__GetOneChar()
369 # check for // comment
370 elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_SLASH:
371 InComment = True
372 DoubleSlashComment = True
373 CommentObj = Comment('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None, T_COMMENT_TWO_SLASH)
374 # check for '#' comment
375 elif self.__CurrentChar() == T_CHAR_HASH and not InString and not InCharLiteral:
376 InComment = True
377 HashComment = True
378 PPDirectiveObj = PP_Directive('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None)
379 # check for /* comment start
380 elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_STAR:
381 CommentObj = Comment('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None, T_COMMENT_SLASH_STAR)
382 CommentObj.Content += self.__CurrentChar()
383 # self.__SetCurrentCharValue( T_CHAR_SPACE)
384 self.__GetOneChar()
385 CommentObj.Content += self.__CurrentChar()
386 # self.__SetCurrentCharValue( T_CHAR_SPACE)
387 self.__GetOneChar()
388 InComment = True
389 else:
390 self.__GetOneChar()
391
392 EndLinePos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)
393
394 if InComment and DoubleSlashComment:
395 CommentObj.EndPos = EndLinePos
396 FileProfile.CommentList.append(CommentObj)
397 if InComment and HashComment and not PPExtend:
398 PPDirectiveObj.EndPos = EndLinePos
399 FileProfile.PPDirectiveList.append(PPDirectiveObj)
400
401 self.Rewind()
402
403 def PreprocessFileWithClear(self):
404
405 self.Rewind()
406 InComment = False
407 DoubleSlashComment = False
408 HashComment = False
409 PPExtend = False
410 CommentObj = None
411 PPDirectiveObj = None
412 # HashComment in quoted string " " is ignored.
413 InString = False
414 InCharLiteral = False
415
416 self.Profile.FileLinesList = [list(s) for s in self.Profile.FileLinesListFromFile]
417 while not self.__EndOfFile():
418
419 if not InComment and self.__CurrentChar() == T_CHAR_DOUBLE_QUOTE:
420 InString = not InString
421
422 if not InComment and self.__CurrentChar() == T_CHAR_SINGLE_QUOTE:
423 InCharLiteral = not InCharLiteral
424 # meet new line, then no longer in a comment for // and '#'
425 if self.__CurrentChar() == T_CHAR_LF:
426 if HashComment and PPDirectiveObj != None:
427 if PPDirectiveObj.Content.rstrip(T_CHAR_CR).endswith(T_CHAR_BACKSLASH):
428 PPDirectiveObj.Content += T_CHAR_LF
429 PPExtend = True
430 else:
431 PPExtend = False
432
433 EndLinePos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)
434
435 if InComment and DoubleSlashComment:
436 InComment = False
437 DoubleSlashComment = False
438 CommentObj.Content += T_CHAR_LF
439 CommentObj.EndPos = EndLinePos
440 FileProfile.CommentList.append(CommentObj)
441 CommentObj = None
442 if InComment and HashComment and not PPExtend:
443 InComment = False
444 HashComment = False
445 PPDirectiveObj.Content += T_CHAR_LF
446 PPDirectiveObj.EndPos = EndLinePos
447 FileProfile.PPDirectiveList.append(PPDirectiveObj)
448 PPDirectiveObj = None
449
450 if InString or InCharLiteral:
451 CurrentLine = "".join(self.__CurrentLine())
452 if CurrentLine.rstrip(T_CHAR_LF).rstrip(T_CHAR_CR).endswith(T_CHAR_BACKSLASH):
453 SlashIndex = CurrentLine.rindex(T_CHAR_BACKSLASH)
454 self.__SetCharValue(self.CurrentLineNumber, SlashIndex, T_CHAR_SPACE)
455
456 if InComment and not DoubleSlashComment and not HashComment:
457 CommentObj.Content += T_CHAR_LF
458 self.CurrentLineNumber += 1
459 self.CurrentOffsetWithinLine = 0
460 # check for */ comment end
461 elif InComment and not DoubleSlashComment and not HashComment and self.__CurrentChar() == T_CHAR_STAR and self.__NextChar() == T_CHAR_SLASH:
462 CommentObj.Content += self.__CurrentChar()
463 self.__SetCurrentCharValue(T_CHAR_SPACE)
464 self.__GetOneChar()
465 CommentObj.Content += self.__CurrentChar()
466 self.__SetCurrentCharValue(T_CHAR_SPACE)
467 CommentObj.EndPos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)
468 FileProfile.CommentList.append(CommentObj)
469 CommentObj = None
470 self.__GetOneChar()
471 InComment = False
472 # set comments to spaces
473 elif InComment:
474 if HashComment:
475 # // follows hash PP directive
476 if self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_SLASH:
477 InComment = False
478 HashComment = False
479 PPDirectiveObj.EndPos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine - 1)
480 FileProfile.PPDirectiveList.append(PPDirectiveObj)
481 PPDirectiveObj = None
482 continue
483 else:
484 PPDirectiveObj.Content += self.__CurrentChar()
485 # if PPExtend:
486 # self.__SetCurrentCharValue(T_CHAR_SPACE)
487 else:
488 CommentObj.Content += self.__CurrentChar()
489 self.__SetCurrentCharValue(T_CHAR_SPACE)
490 self.__GetOneChar()
491 # check for // comment
492 elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_SLASH:
493 InComment = True
494 DoubleSlashComment = True
495 CommentObj = Comment('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None, T_COMMENT_TWO_SLASH)
496 # check for '#' comment
497 elif self.__CurrentChar() == T_CHAR_HASH and not InString and not InCharLiteral:
498 InComment = True
499 HashComment = True
500 PPDirectiveObj = PP_Directive('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None)
501 # check for /* comment start
502 elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_STAR:
503 CommentObj = Comment('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None, T_COMMENT_SLASH_STAR)
504 CommentObj.Content += self.__CurrentChar()
505 self.__SetCurrentCharValue( T_CHAR_SPACE)
506 self.__GetOneChar()
507 CommentObj.Content += self.__CurrentChar()
508 self.__SetCurrentCharValue( T_CHAR_SPACE)
509 self.__GetOneChar()
510 InComment = True
511 else:
512 self.__GetOneChar()
513
514 EndLinePos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)
515
516 if InComment and DoubleSlashComment:
517 CommentObj.EndPos = EndLinePos
518 FileProfile.CommentList.append(CommentObj)
519 if InComment and HashComment and not PPExtend:
520 PPDirectiveObj.EndPos = EndLinePos
521 FileProfile.PPDirectiveList.append(PPDirectiveObj)
522 self.Rewind()
523
524 ## ParseFile() method
525 #
526 # Parse the file profile buffer to extract fd, fv ... information
527 # Exception will be raised if syntax error found
528 #
529 # @param self The object pointer
530 #
531 def ParseFile(self):
532 self.PreprocessFile()
533 # restore from ListOfList to ListOfString
534 self.Profile.FileLinesList = ["".join(list) for list in self.Profile.FileLinesList]
535 FileStringContents = ''
536 for fileLine in self.Profile.FileLinesList:
537 FileStringContents += fileLine
538 cStream = antlr3.StringStream(FileStringContents)
539 lexer = CLexer(cStream)
540 tStream = antlr3.CommonTokenStream(lexer)
541 parser = CParser(tStream)
542 parser.translation_unit()
543
544 def ParseFileWithClearedPPDirective(self):
545 self.PreprocessFileWithClear()
546 # restore from ListOfList to ListOfString
547 self.Profile.FileLinesList = ["".join(list) for list in self.Profile.FileLinesList]
548 FileStringContents = ''
549 for fileLine in self.Profile.FileLinesList:
550 FileStringContents += fileLine
551 cStream = antlr3.StringStream(FileStringContents)
552 lexer = CLexer(cStream)
553 tStream = antlr3.CommonTokenStream(lexer)
554 parser = CParser(tStream)
555 parser.translation_unit()
556
557 def CleanFileProfileBuffer(self):
558 FileProfile.CommentList = []
559 FileProfile.PPDirectiveList = []
560 FileProfile.PredicateExpressionList = []
561 FileProfile.FunctionDefinitionList = []
562 FileProfile.VariableDeclarationList = []
563 FileProfile.EnumerationDefinitionList = []
564 FileProfile.StructUnionDefinitionList = []
565 FileProfile.TypedefDefinitionList = []
566 FileProfile.FunctionCallingList = []
567
568 def PrintFragments(self):
569
570 print '################# ' + self.FileName + '#####################'
571
572 print '/****************************************/'
573 print '/*************** COMMENTS ***************/'
574 print '/****************************************/'
575 for comment in FileProfile.CommentList:
576 print str(comment.StartPos) + comment.Content
577
578 print '/****************************************/'
579 print '/********* PREPROCESS DIRECTIVES ********/'
580 print '/****************************************/'
581 for pp in FileProfile.PPDirectiveList:
582 print str(pp.StartPos) + pp.Content
583
584 print '/****************************************/'
585 print '/********* VARIABLE DECLARATIONS ********/'
586 print '/****************************************/'
587 for var in FileProfile.VariableDeclarationList:
588 print str(var.StartPos) + var.Modifier + ' '+ var.Declarator
589
590 print '/****************************************/'
591 print '/********* FUNCTION DEFINITIONS *********/'
592 print '/****************************************/'
593 for func in FileProfile.FunctionDefinitionList:
594 print str(func.StartPos) + func.Modifier + ' '+ func.Declarator + ' ' + str(func.NamePos)
595
596 print '/****************************************/'
597 print '/************ ENUMERATIONS **************/'
598 print '/****************************************/'
599 for enum in FileProfile.EnumerationDefinitionList:
600 print str(enum.StartPos) + enum.Content
601
602 print '/****************************************/'
603 print '/*********** STRUCTS/UNIONS *************/'
604 print '/****************************************/'
605 for su in FileProfile.StructUnionDefinitionList:
606 print str(su.StartPos) + su.Content
607
608 print '/****************************************/'
609 print '/********* PREDICATE EXPRESSIONS ********/'
610 print '/****************************************/'
611 for predexp in FileProfile.PredicateExpressionList:
612 print str(predexp.StartPos) + predexp.Content
613
614 print '/****************************************/'
615 print '/************** TYPEDEFS ****************/'
616 print '/****************************************/'
617 for typedef in FileProfile.TypedefDefinitionList:
618 print str(typedef.StartPos) + typedef.ToType
619
620 if __name__ == "__main__":
621
622 collector = CodeFragmentCollector(sys.argv[1])
623 collector.PreprocessFile()
624 print "For Test."