]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Ecc/CodeFragmentCollector.py
BaseTools: Use absolute import in Ecc
[mirror_edk2.git] / BaseTools / Source / Python / Ecc / CodeFragmentCollector.py
index 134b15f81e7e07fed2b136b28b43541b1713863b..28b4e0196f5010e124c524684a3144131d928ad1 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # preprocess source file\r
 #\r
-#  Copyright (c) 2007, 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
+from __future__ import absolute_import\r
 import re\r
-import os\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
@@ -46,7 +48,7 @@ from ParserWarning import Warning
 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
@@ -58,7 +60,7 @@ SEPERATOR_TUPLE = ('=', '|', ',', '{', '}')
 #\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
@@ -75,40 +77,6 @@ class CodeFragmentCollector:
         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
@@ -122,7 +90,7 @@ class CodeFragmentCollector:
         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
@@ -144,7 +112,7 @@ class CodeFragmentCollector:
             return True\r
         else:\r
             return False\r
-    \r
+\r
     ## Rewind() method\r
     #\r
     #   Reset file data buffer to the initial state\r
@@ -154,7 +122,7 @@ class CodeFragmentCollector:
     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
@@ -162,9 +130,9 @@ class CodeFragmentCollector:
     #   @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
@@ -173,13 +141,13 @@ class CodeFragmentCollector:
         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
@@ -193,13 +161,13 @@ class CodeFragmentCollector:
     #\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
@@ -212,7 +180,7 @@ class CodeFragmentCollector:
             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
@@ -222,7 +190,7 @@ class CodeFragmentCollector:
     #\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
@@ -232,7 +200,7 @@ class CodeFragmentCollector:
     #\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
@@ -242,7 +210,7 @@ class CodeFragmentCollector:
     #\r
     def __CurrentLine(self):\r
         return self.Profile.FileLinesList[self.CurrentLineNumber - 1]\r
-    \r
+\r
     ## __InsertComma() method\r
     #\r
     #   Insert ',' to replace PP\r
@@ -251,24 +219,24 @@ class CodeFragmentCollector:
     #   @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
@@ -277,7 +245,7 @@ class CodeFragmentCollector:
     #   !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
@@ -289,27 +257,27 @@ class CodeFragmentCollector:
         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
@@ -324,17 +292,17 @@ class CodeFragmentCollector:
                     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
@@ -348,7 +316,7 @@ class CodeFragmentCollector:
                 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
@@ -374,7 +342,7 @@ class CodeFragmentCollector:
             # 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
@@ -388,9 +356,9 @@ class CodeFragmentCollector:
                 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
@@ -411,27 +379,27 @@ class CodeFragmentCollector:
         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
@@ -446,17 +414,17 @@ class CodeFragmentCollector:
                     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
@@ -470,7 +438,7 @@ class CodeFragmentCollector:
                 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
@@ -496,7 +464,7 @@ class CodeFragmentCollector:
             # 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
@@ -512,7 +480,7 @@ class CodeFragmentCollector:
                 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
@@ -540,7 +508,7 @@ class CodeFragmentCollector:
         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
@@ -553,7 +521,7 @@ class CodeFragmentCollector:
         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
@@ -564,61 +532,61 @@ class CodeFragmentCollector:
         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