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