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
19import re
20import Common.LongFilePathOs as os
21import sys
22
23import antlr3
24from CLexer import CLexer
25from CParser import CParser
26
27import FileProfile
28from CodeFragment import Comment
29from CodeFragment import PP_Directive
30from 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, \
46T_CHAR_BACKSLASH, T_CHAR_DOUBLE_QUOTE, T_CHAR_SINGLE_QUOTE, T_CHAR_STAR, T_CHAR_HASH) = \
47(' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#')
48
49SEPERATOR_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#
62class 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
620if __name__ == "__main__":
621
622    collector = CodeFragmentCollector(sys.argv[1])
623    collector.PreprocessFile()
624    print "For Test."
625