## @file\r
# preprocess source file\r
#\r
-# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
#\r
# This program and the accompanying materials\r
# are licensed and made available under the terms and conditions of the BSD License\r
# Import Modules\r
#\r
\r
+from __future__ import print_function\r
import re\r
import Common.LongFilePathOs as os\r
import sys\r
T_CHAR_BACKSLASH, T_CHAR_DOUBLE_QUOTE, T_CHAR_SINGLE_QUOTE, T_CHAR_STAR, T_CHAR_HASH) = \\r
(' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#')\r
\r
-SEPERATOR_TUPLE = ('=', '|', ',', '{', '}') \r
+SEPERATOR_TUPLE = ('=', '|', ',', '{', '}')\r
\r
(T_COMMENT_TWO_SLASH, T_COMMENT_SLASH_STAR) = (0, 1)\r
\r
#\r
# GetNext*** procedures mean these procedures will get next token first, then make judgement.\r
# Get*** procedures mean these procedures will make judgement on current token only.\r
-# \r
+#\r
class CodeFragmentCollector:\r
## The constructor\r
#\r
self.__Token = ""\r
self.__SkippedChars = ""\r
\r
- ## __IsWhiteSpace() method\r
- #\r
- # Whether char at current FileBufferPos is whitespace\r
- #\r
- # @param self The object pointer\r
- # @param Char The char to test\r
- # @retval True The char is a kind of white space\r
- # @retval False The char is NOT a kind of white space\r
- #\r
- def __IsWhiteSpace(self, Char):\r
- if Char in (T_CHAR_NULL, T_CHAR_CR, T_CHAR_SPACE, T_CHAR_TAB, T_CHAR_LF):\r
- return True\r
- else:\r
- return False\r
-\r
- ## __SkipWhiteSpace() method\r
- #\r
- # Skip white spaces from current char, return number of chars skipped\r
- #\r
- # @param self The object pointer\r
- # @retval Count The number of chars skipped\r
- #\r
- def __SkipWhiteSpace(self):\r
- Count = 0\r
- while not self.__EndOfFile():\r
- Count += 1\r
- if self.__CurrentChar() in (T_CHAR_NULL, T_CHAR_CR, T_CHAR_LF, T_CHAR_SPACE, T_CHAR_TAB):\r
- self.__SkippedChars += str(self.__CurrentChar())\r
- self.__GetOneChar()\r
-\r
- else:\r
- Count = Count - 1\r
- return Count\r
-\r
## __EndOfFile() method\r
#\r
# Judge current buffer pos is at file end\r
SizeOfLastLine = NumberOfLines\r
if NumberOfLines > 0:\r
SizeOfLastLine = len(self.Profile.FileLinesList[-1])\r
- \r
+\r
if self.CurrentLineNumber == NumberOfLines and self.CurrentOffsetWithinLine >= SizeOfLastLine - 1:\r
return True\r
elif self.CurrentLineNumber > NumberOfLines:\r
return True\r
else:\r
return False\r
- \r
+\r
## Rewind() method\r
#\r
# Reset file data buffer to the initial state\r
def Rewind(self):\r
self.CurrentLineNumber = 1\r
self.CurrentOffsetWithinLine = 0\r
- \r
+\r
## __UndoOneChar() method\r
#\r
# Go back one char in the file buffer\r
# @param self The object pointer\r
# @retval True Successfully go back one char\r
# @retval False Not able to go back one char as file beginning reached\r
- # \r
+ #\r
def __UndoOneChar(self):\r
- \r
+\r
if self.CurrentLineNumber == 1 and self.CurrentOffsetWithinLine == 0:\r
return False\r
elif self.CurrentOffsetWithinLine == 0:\r
else:\r
self.CurrentOffsetWithinLine -= 1\r
return True\r
- \r
+\r
## __GetOneChar() method\r
#\r
# Move forward one char in the file buffer\r
#\r
# @param self The object pointer\r
- # \r
+ #\r
def __GetOneChar(self):\r
if self.CurrentOffsetWithinLine == len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) - 1:\r
self.CurrentLineNumber += 1\r
#\r
# @param self The object pointer\r
# @retval Char Current char\r
- # \r
+ #\r
def __CurrentChar(self):\r
CurrentChar = self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine]\r
# if CurrentChar > 255:\r
# raise Warning("Non-Ascii char found At Line %d, offset %d" % (self.CurrentLineNumber, self.CurrentOffsetWithinLine), self.FileName, self.CurrentLineNumber)\r
return CurrentChar\r
- \r
+\r
## __NextChar() method\r
#\r
# Get the one char pass the char pointed to by the file buffer pointer\r
return self.Profile.FileLinesList[self.CurrentLineNumber][0]\r
else:\r
return self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine + 1]\r
- \r
+\r
## __SetCurrentCharValue() method\r
#\r
# Modify the value of current char\r
#\r
def __SetCurrentCharValue(self, Value):\r
self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine] = Value\r
- \r
+\r
## __SetCharValue() method\r
#\r
# Modify the value of current char\r
#\r
def __SetCharValue(self, Line, Offset, Value):\r
self.Profile.FileLinesList[Line - 1][Offset] = Value\r
- \r
+\r
## __CurrentLine() method\r
#\r
# Get the list that contains current line contents\r
#\r
def __CurrentLine(self):\r
return self.Profile.FileLinesList[self.CurrentLineNumber - 1]\r
- \r
+\r
## __InsertComma() method\r
#\r
# Insert ',' to replace PP\r
# @retval List current line contents\r
#\r
def __InsertComma(self, Line):\r
- \r
- \r
+\r
+\r
if self.Profile.FileLinesList[Line - 1][0] != T_CHAR_HASH:\r
BeforeHashPart = str(self.Profile.FileLinesList[Line - 1]).split(T_CHAR_HASH)[0]\r
if BeforeHashPart.rstrip().endswith(T_CHAR_COMMA) or BeforeHashPart.rstrip().endswith(';'):\r
return\r
- \r
+\r
if Line - 2 >= 0 and str(self.Profile.FileLinesList[Line - 2]).rstrip().endswith(','):\r
return\r
- \r
+\r
if Line - 2 >= 0 and str(self.Profile.FileLinesList[Line - 2]).rstrip().endswith(';'):\r
return\r
- \r
+\r
if str(self.Profile.FileLinesList[Line]).lstrip().startswith(',') or str(self.Profile.FileLinesList[Line]).lstrip().startswith(';'):\r
return\r
- \r
+\r
self.Profile.FileLinesList[Line - 1].insert(self.CurrentOffsetWithinLine, ',')\r
- \r
+\r
## PreprocessFile() method\r
#\r
# Preprocess file contents, replace comments with spaces.\r
# !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]\r
#\r
# @param self The object pointer\r
- # \r
+ #\r
def PreprocessFile(self):\r
\r
self.Rewind()\r
PPDirectiveObj = None\r
# HashComment in quoted string " " is ignored.\r
InString = False\r
- InCharLiteral = False \r
- \r
+ InCharLiteral = False\r
+\r
self.Profile.FileLinesList = [list(s) for s in self.Profile.FileLinesListFromFile]\r
while not self.__EndOfFile():\r
- \r
+\r
if not InComment and self.__CurrentChar() == T_CHAR_DOUBLE_QUOTE:\r
InString = not InString\r
- \r
+\r
if not InComment and self.__CurrentChar() == T_CHAR_SINGLE_QUOTE:\r
InCharLiteral = not InCharLiteral\r
# meet new line, then no longer in a comment for // and '#'\r
if self.__CurrentChar() == T_CHAR_LF:\r
- if HashComment and PPDirectiveObj != None:\r
+ if HashComment and PPDirectiveObj is not None:\r
if PPDirectiveObj.Content.rstrip(T_CHAR_CR).endswith(T_CHAR_BACKSLASH):\r
PPDirectiveObj.Content += T_CHAR_LF\r
PPExtend = True\r
else:\r
PPExtend = False\r
- \r
+\r
EndLinePos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
- \r
+\r
if InComment and DoubleSlashComment:\r
InComment = False\r
DoubleSlashComment = False\r
PPDirectiveObj.EndPos = EndLinePos\r
FileProfile.PPDirectiveList.append(PPDirectiveObj)\r
PPDirectiveObj = None\r
- \r
+\r
if InString or InCharLiteral:\r
CurrentLine = "".join(self.__CurrentLine())\r
if CurrentLine.rstrip(T_CHAR_LF).rstrip(T_CHAR_CR).endswith(T_CHAR_BACKSLASH):\r
SlashIndex = CurrentLine.rindex(T_CHAR_BACKSLASH)\r
self.__SetCharValue(self.CurrentLineNumber, SlashIndex, T_CHAR_SPACE)\r
- \r
+\r
if InComment and not DoubleSlashComment and not HashComment:\r
CommentObj.Content += T_CHAR_LF\r
self.CurrentLineNumber += 1\r
- self.CurrentOffsetWithinLine = 0 \r
+ self.CurrentOffsetWithinLine = 0\r
# check for */ comment end\r
elif InComment and not DoubleSlashComment and not HashComment and self.__CurrentChar() == T_CHAR_STAR and self.__NextChar() == T_CHAR_SLASH:\r
CommentObj.Content += self.__CurrentChar()\r
self.__GetOneChar()\r
InComment = False\r
# set comments to spaces\r
- elif InComment: \r
+ elif InComment:\r
if HashComment:\r
# // follows hash PP directive\r
if self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_SLASH:\r
# check for '#' comment\r
elif self.__CurrentChar() == T_CHAR_HASH and not InString and not InCharLiteral:\r
InComment = True\r
- HashComment = True \r
+ HashComment = True\r
PPDirectiveObj = PP_Directive('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None)\r
# check for /* comment start\r
elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_STAR:\r
InComment = True\r
else:\r
self.__GetOneChar()\r
- \r
+\r
EndLinePos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
- \r
+\r
if InComment and DoubleSlashComment:\r
CommentObj.EndPos = EndLinePos\r
FileProfile.CommentList.append(CommentObj)\r
PPDirectiveObj = None\r
# HashComment in quoted string " " is ignored.\r
InString = False\r
- InCharLiteral = False \r
+ InCharLiteral = False\r
\r
self.Profile.FileLinesList = [list(s) for s in self.Profile.FileLinesListFromFile]\r
while not self.__EndOfFile():\r
- \r
+\r
if not InComment and self.__CurrentChar() == T_CHAR_DOUBLE_QUOTE:\r
InString = not InString\r
- \r
+\r
if not InComment and self.__CurrentChar() == T_CHAR_SINGLE_QUOTE:\r
InCharLiteral = not InCharLiteral\r
# meet new line, then no longer in a comment for // and '#'\r
if self.__CurrentChar() == T_CHAR_LF:\r
- if HashComment and PPDirectiveObj != None:\r
+ if HashComment and PPDirectiveObj is not None:\r
if PPDirectiveObj.Content.rstrip(T_CHAR_CR).endswith(T_CHAR_BACKSLASH):\r
PPDirectiveObj.Content += T_CHAR_LF\r
PPExtend = True\r
else:\r
PPExtend = False\r
- \r
+\r
EndLinePos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
- \r
+\r
if InComment and DoubleSlashComment:\r
InComment = False\r
DoubleSlashComment = False\r
PPDirectiveObj.EndPos = EndLinePos\r
FileProfile.PPDirectiveList.append(PPDirectiveObj)\r
PPDirectiveObj = None\r
- \r
+\r
if InString or InCharLiteral:\r
CurrentLine = "".join(self.__CurrentLine())\r
if CurrentLine.rstrip(T_CHAR_LF).rstrip(T_CHAR_CR).endswith(T_CHAR_BACKSLASH):\r
SlashIndex = CurrentLine.rindex(T_CHAR_BACKSLASH)\r
self.__SetCharValue(self.CurrentLineNumber, SlashIndex, T_CHAR_SPACE)\r
- \r
+\r
if InComment and not DoubleSlashComment and not HashComment:\r
CommentObj.Content += T_CHAR_LF\r
self.CurrentLineNumber += 1\r
- self.CurrentOffsetWithinLine = 0 \r
+ self.CurrentOffsetWithinLine = 0\r
# check for */ comment end\r
elif InComment and not DoubleSlashComment and not HashComment and self.__CurrentChar() == T_CHAR_STAR and self.__NextChar() == T_CHAR_SLASH:\r
CommentObj.Content += self.__CurrentChar()\r
self.__GetOneChar()\r
InComment = False\r
# set comments to spaces\r
- elif InComment: \r
+ elif InComment:\r
if HashComment:\r
# // follows hash PP directive\r
if self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_SLASH:\r
# check for '#' comment\r
elif self.__CurrentChar() == T_CHAR_HASH and not InString and not InCharLiteral:\r
InComment = True\r
- HashComment = True \r
+ HashComment = True\r
PPDirectiveObj = PP_Directive('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None)\r
# check for /* comment start\r
elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_STAR:\r
self.__GetOneChar()\r
\r
EndLinePos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
- \r
+\r
if InComment and DoubleSlashComment:\r
CommentObj.EndPos = EndLinePos\r
FileProfile.CommentList.append(CommentObj)\r
tStream = antlr3.CommonTokenStream(lexer)\r
parser = CParser(tStream)\r
parser.translation_unit()\r
- \r
+\r
def ParseFileWithClearedPPDirective(self):\r
self.PreprocessFileWithClear()\r
# restore from ListOfList to ListOfString\r
tStream = antlr3.CommonTokenStream(lexer)\r
parser = CParser(tStream)\r
parser.translation_unit()\r
- \r
+\r
def CleanFileProfileBuffer(self):\r
FileProfile.CommentList = []\r
FileProfile.PPDirectiveList = []\r
FileProfile.StructUnionDefinitionList = []\r
FileProfile.TypedefDefinitionList = []\r
FileProfile.FunctionCallingList = []\r
- \r
+\r
def PrintFragments(self):\r
- \r
- print '################# ' + self.FileName + '#####################'\r
- \r
- print '/****************************************/'\r
- print '/*************** COMMENTS ***************/'\r
- print '/****************************************/'\r
+\r
+ print('################# ' + self.FileName + '#####################')\r
+\r
+ print('/****************************************/')\r
+ print('/*************** COMMENTS ***************/')\r
+ print('/****************************************/')\r
for comment in FileProfile.CommentList:\r
- print str(comment.StartPos) + comment.Content\r
- \r
- print '/****************************************/'\r
- print '/********* PREPROCESS DIRECTIVES ********/'\r
- print '/****************************************/'\r
+ print(str(comment.StartPos) + comment.Content)\r
+\r
+ print('/****************************************/')\r
+ print('/********* PREPROCESS DIRECTIVES ********/')\r
+ print('/****************************************/')\r
for pp in FileProfile.PPDirectiveList:\r
- print str(pp.StartPos) + pp.Content\r
- \r
- print '/****************************************/'\r
- print '/********* VARIABLE DECLARATIONS ********/'\r
- print '/****************************************/'\r
+ print(str(pp.StartPos) + pp.Content)\r
+\r
+ print('/****************************************/')\r
+ print('/********* VARIABLE DECLARATIONS ********/')\r
+ print('/****************************************/')\r
for var in FileProfile.VariableDeclarationList:\r
- print str(var.StartPos) + var.Modifier + ' '+ var.Declarator\r
- \r
- print '/****************************************/'\r
- print '/********* FUNCTION DEFINITIONS *********/'\r
- print '/****************************************/'\r
+ print(str(var.StartPos) + var.Modifier + ' '+ var.Declarator)\r
+\r
+ print('/****************************************/')\r
+ print('/********* FUNCTION DEFINITIONS *********/')\r
+ print('/****************************************/')\r
for func in FileProfile.FunctionDefinitionList:\r
- print str(func.StartPos) + func.Modifier + ' '+ func.Declarator + ' ' + str(func.NamePos)\r
- \r
- print '/****************************************/'\r
- print '/************ ENUMERATIONS **************/'\r
- print '/****************************************/'\r
+ print(str(func.StartPos) + func.Modifier + ' '+ func.Declarator + ' ' + str(func.NamePos))\r
+\r
+ print('/****************************************/')\r
+ print('/************ ENUMERATIONS **************/')\r
+ print('/****************************************/')\r
for enum in FileProfile.EnumerationDefinitionList:\r
- print str(enum.StartPos) + enum.Content\r
- \r
- print '/****************************************/'\r
- print '/*********** STRUCTS/UNIONS *************/'\r
- print '/****************************************/'\r
+ print(str(enum.StartPos) + enum.Content)\r
+\r
+ print('/****************************************/')\r
+ print('/*********** STRUCTS/UNIONS *************/')\r
+ print('/****************************************/')\r
for su in FileProfile.StructUnionDefinitionList:\r
- print str(su.StartPos) + su.Content\r
- \r
- print '/****************************************/'\r
- print '/********* PREDICATE EXPRESSIONS ********/'\r
- print '/****************************************/'\r
+ print(str(su.StartPos) + su.Content)\r
+\r
+ print('/****************************************/')\r
+ print('/********* PREDICATE EXPRESSIONS ********/')\r
+ print('/****************************************/')\r
for predexp in FileProfile.PredicateExpressionList:\r
- print str(predexp.StartPos) + predexp.Content\r
- \r
- print '/****************************************/' \r
- print '/************** TYPEDEFS ****************/'\r
- print '/****************************************/'\r
+ print(str(predexp.StartPos) + predexp.Content)\r
+\r
+ print('/****************************************/')\r
+ print('/************** TYPEDEFS ****************/')\r
+ print('/****************************************/')\r
for typedef in FileProfile.TypedefDefinitionList:\r
- print str(typedef.StartPos) + typedef.ToType\r
- \r
+ print(str(typedef.StartPos) + typedef.ToType)\r
+\r
if __name__ == "__main__":\r
- \r
+\r
collector = CodeFragmentCollector(sys.argv[1])\r
collector.PreprocessFile()\r
- print "For Test."\r
+ print("For Test.")\r