#\r
\r
from __future__ import print_function\r
+from __future__ import absolute_import\r
import re\r
import Common.LongFilePathOs as os\r
import sys\r
\r
import antlr3\r
-from CLexer import CLexer\r
-from CParser import CParser\r
+from .CLexer import CLexer\r
+from .CParser import CParser\r
\r
-import FileProfile\r
-from CodeFragment import Comment\r
-from CodeFragment import PP_Directive\r
-from ParserWarning import Warning\r
+from . import FileProfile\r
+from .CodeFragment import Comment\r
+from .CodeFragment import PP_Directive\r
+from .ParserWarning import Warning\r
\r
\r
##define T_CHAR_SPACE ' '\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
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
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
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
+\r
print('################# ' + self.FileName + '#####################')\r
- \r
+\r
print('/****************************************/')\r
print('/*************** COMMENTS ***************/')\r
print('/****************************************/')\r
for comment in FileProfile.CommentList:\r
print(str(comment.StartPos) + comment.Content)\r
- \r
+\r
print('/****************************************/')\r
print('/********* PREPROCESS DIRECTIVES ********/')\r
print('/****************************************/')\r
for pp in FileProfile.PPDirectiveList:\r
print(str(pp.StartPos) + pp.Content)\r
- \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
+\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
+\r
print('/****************************************/')\r
print('/************ ENUMERATIONS **************/')\r
print('/****************************************/')\r
for enum in FileProfile.EnumerationDefinitionList:\r
print(str(enum.StartPos) + enum.Content)\r
- \r
+\r
print('/****************************************/')\r
print('/*********** STRUCTS/UNIONS *************/')\r
print('/****************************************/')\r
for su in FileProfile.StructUnionDefinitionList:\r
print(str(su.StartPos) + su.Content)\r
- \r
+\r
print('/****************************************/')\r
print('/********* PREDICATE EXPRESSIONS ********/')\r
print('/****************************************/')\r
for predexp in FileProfile.PredicateExpressionList:\r
print(str(predexp.StartPos) + predexp.Content)\r
- \r
+\r
print('/****************************************/')\r
print('/************** TYPEDEFS ****************/')\r
print('/****************************************/')\r
for typedef in FileProfile.TypedefDefinitionList:\r
print(str(typedef.StartPos) + typedef.ToType)\r
- \r
+\r
if __name__ == "__main__":\r
- \r
+\r
collector = CodeFragmentCollector(sys.argv[1])\r
collector.PreprocessFile()\r
print("For Test.")\r