1. Establish ECC progress
authorhche10x <hche10x@7335b38e-4728-0410-8992-fb3ffe349368>
Fri, 7 Mar 2008 09:20:13 +0000 (09:20 +0000)
committerhche10x <hche10x@7335b38e-4728-0410-8992-fb3ffe349368>
Fri, 7 Mar 2008 09:20:13 +0000 (09:20 +0000)
2. Finish ECC main entrance and Configuration parsing

git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@1049 7335b38e-4728-0410-8992-fb3ffe349368

Source/Python/Common/BuildToolError.py
Source/Python/Common/DataType.py
Source/Python/Ecc/Check.py [new file with mode: 0644]
Source/Python/Ecc/Configuration.py [new file with mode: 0644]
Source/Python/Ecc/Count.py [new file with mode: 0644]
Source/Python/Ecc/Database.py
Source/Python/Ecc/Ecc.py [new file with mode: 0644]
Source/Python/Ecc/EccGlobalData.py [new file with mode: 0644]

index 5aacd5d..61bc940 100755 (executable)
@@ -69,6 +69,7 @@ AUTOGEN_ERROR = 0xF000
 PARSER_ERROR = 0xF001
 BUILD_ERROR = 0xF002
 GENFDS_ERROR = 0xF003
+ECC_ERROR = 0xF004
 MIGRATION_ERROR = 0xF010
 UNKNOWN_ERROR = 0xFFFF
 
index 0f11c0f..255bfe1 100644 (file)
@@ -356,3 +356,6 @@ TAB_UNKNOWN = 'UNKNOWN'
 # Build database path\r
 #\r
 DATABASE_PATH = ":memory:" #"BuildDatabase.db"\r
+\r
+# used by ECC\r
+MODIFIER_LIST = ['IN', 'OUT', 'OPTIONAL', 'UNALIGNED', 'EFI_RUNTIMESERVICE', 'EFI_BOOTSERVICE', 'EFIAPI']\r
diff --git a/Source/Python/Ecc/Check.py b/Source/Python/Ecc/Check.py
new file mode 100644 (file)
index 0000000..22479fb
--- /dev/null
@@ -0,0 +1,124 @@
+## @file\r
+# This file is used to define checkpoints used by ECC tool\r
+#\r
+# Copyright (c) 2008, Intel Corporation\r
+# All rights reserved. This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution.  The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+\r
+## Check\r
+#\r
+# This class is to define checkpoints used by ECC tool\r
+#\r
+# @param object:          Inherited from object class\r
+#\r
+class Check(object):\r
+    def __init__(self):\r
+        pass\r
+     \r
+    #\r
+    # Check all required checkpoints\r
+    #   \r
+    def Check(self):\r
+        pass\r
+    \r
+    #\r
+    # Meta-Data File Processing Checking\r
+    #\r
+    def MetaDataFileCheck(self):\r
+        self.MetaDataFileCheckPathName()\r
+        self.MetaDataFileCheckGenerateFileList()\r
+        self.MetaDataFileCheckLibraryInstance()\r
+        self.MetaDataFileCheckLibraryInstanceDependent()\r
+        self.MetaDataFileCheckLibraryInstanceOrder()\r
+        self.MetaDataFileCheckLibraryNoUse()\r
+        self.MetaDataFileCheckBinaryInfInFdf()\r
+        self.MetaDataFileCheckPcdDuplicate()\r
+        self.MetaDataFileCheckPcdFlash()\r
+        self.MetaDataFileCheckPcdNoUse()\r
+\r
+    #\r
+    # Check whether each file defined in meta-data exists\r
+    #\r
+    def MetaDataFileCheckPathName(self):\r
+        if EccGlobalData.gConfig.MetaDataFileCheckPathName == 1 or EccGlobalData.gConfig.MetaDataFileCheckAll == 1:\r
+            pass\r
+    \r
+    #\r
+    # Generate a list for all files defined in meta-data files\r
+    #\r
+    def MetaDataFileCheckGenerateFileList(self):\r
+        if EccGlobalData.gConfig.MetaDataFileCheckGenerateFileList == 1 or EccGlobalData.gConfig.MetaDataFileCheckAll == 1:\r
+            File = EccGlobalData.gConfig.MetaDataFileCheckPathOfGenerateFileList\r
+            pass\r
+    \r
+    #\r
+    # Check whether all Library Instances defined for a given module (or dependent library instance) match the module's type.  \r
+    # Each Library Instance must specify the Supported Module Types in its INF file, \r
+    # and any module specifying the library instance must be one of the supported types.\r
+    #\r
+    def MetaDataFileCheckLibraryInstance(self):\r
+        if EccGlobalData.gConfig.MetaDataFileCheckLibraryInstance == 1 or EccGlobalData.gConfig.MetaDataFileCheckAll == 1:\r
+            pass\r
+\r
+    #\r
+    # Check whether a Library Instance has been defined for all dependent library classes\r
+    #\r
+    def MetaDataFileCheckLibraryInstanceDependent(self):\r
+        if EccGlobalData.gConfig.MetaDataFileCheckLibraryInstanceDependent == 1 or EccGlobalData.gConfig.MetaDataFileCheckAll == 1:\r
+            pass\r
+\r
+    #\r
+    # Check whether the Library Instances specified by the LibraryClasses sections are listed in order of dependencies\r
+    #\r
+    def MetaDataFileCheckLibraryInstanceOrder(self):\r
+        if EccGlobalData.gConfig.MetaDataFileCheckLibraryInstanceOrder == 1 or EccGlobalData.gConfig.MetaDataFileCheckAll == 1:\r
+            pass\r
+\r
+    #\r
+    # Check whether the unnecessary inclusion of library classes in the INF file\r
+    #\r
+    def MetaDataFileCheckLibraryNoUse(self):\r
+        if EccGlobalData.gConfig.MetaDataFileCheckLibraryNoUse == 1 or EccGlobalData.gConfig.MetaDataFileCheckAll == 1:\r
+            pass\r
+\r
+    #\r
+    # Check whether an INF file is specified in the FDF file, but not in the DSC file, then the INF file must be for a Binary module only\r
+    #\r
+    def MetaDataFileCheckBinaryInfInFdf(self):\r
+        if EccGlobalData.gConfig.MetaDataFileCheckBinaryInfInFdf == 1 or EccGlobalData.gConfig.MetaDataFileCheckAll == 1:\r
+            pass\r
+\r
+    #\r
+    # Not to report error and warning related OS include file such as "windows.h" and "stdio.h"\r
+    # Check whether a PCD is set in a DSC file or the FDF file, but not in both.\r
+    #\r
+    def MetaDataFileCheckPcdDuplicate(self):\r
+        if EccGlobalData.gConfig.MetaDataFileCheckPcdDuplicate == 1 or EccGlobalData.gConfig.MetaDataFileCheckAll == 1:\r
+            pass\r
+\r
+    #\r
+    # Check whether PCD settings in the FDF file can only be related to flash.\r
+    #\r
+    def MetaDataFileCheckPcdFlash(self):\r
+        if EccGlobalData.gConfig.MetaDataFileCheckPcdFlash == 1 or EccGlobalData.gConfig.MetaDataFileCheckAll == 1:\r
+            pass\r
+        \r
+    #\r
+    # Check whether PCDs used in INF files but not specified in DSC or FDF files\r
+    #\r
+    def MetaDataFileCheckPcdNoUse(self):\r
+        if EccGlobalData.gConfig.MetaDataFileCheckPcdNoUse == 1 or EccGlobalData.gConfig.MetaDataFileCheckAll == 1:\r
+            pass\r
+        \r
+    #\r
+    # Check whether having duplicate guids defined for Guid/Protocol/Ppi\r
+    #\r
+    def MetaDataFileCheckGuidDuplicate(self):\r
+        if EccGlobalData.gConfig.MetaDataFileCheckGuidDuplicate == 1 or EccGlobalData.gConfig.MetaDataFileCheckAll == 1:\r
+            pass\r
diff --git a/Source/Python/Ecc/Configuration.py b/Source/Python/Ecc/Configuration.py
new file mode 100644 (file)
index 0000000..0177665
--- /dev/null
@@ -0,0 +1,274 @@
+## @file\r
+# This file is used to define class Configuration\r
+#\r
+# Copyright (c) 2008, Intel Corporation\r
+# All rights reserved. This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution.  The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+\r
+##\r
+# Import Modules\r
+#\r
+import os\r
+import Common.EdkLogger as EdkLogger\r
+from Common.DataType import *\r
+from Common.String import *\r
+\r
+## Configuration\r
+#\r
+# This class is used to define all items in configuration file\r
+#\r
+# @param Filename:  The name of configuration file, the default is config.ini\r
+#\r
+class Configuration(object):\r
+    def __init__(self, Filename):\r
+        self.Filename = Filename\r
+        \r
+        self.Version = 0.1\r
+\r
+        #\r
+        # Identify to if check all items\r
+        # 1 - Check all items and ignore all other detailed items\r
+        # 0 - Not check all items, the tool will go through all other detailed items to decide to check or not\r
+        # \r
+        self.CheckAll = 0\r
+\r
+        #\r
+        # Identify to if automatically correct mistakes\r
+        # 1 - Automatically correct\r
+        # 0 - Not automatically correct\r
+        # Only the following check points can be automatically corrected, others not listed below are not supported even it is 1\r
+        #\r
+        # GeneralCheckTab\r
+        # GeneralCheckIndentation\r
+        # GeneralCheckLine\r
+        # GeneralCheckCarriageReturn\r
+        # SpaceCheckAll\r
+        #\r
+        self.AutoCorrect = 0\r
+        \r
+        #\r
+        # List customized Modifer here, split with ','\r
+        # Defaultly use the definition in class DataType\r
+        #\r
+        self.ModifierList = MODIFIER_LIST\r
+        \r
+        #\r
+        # General Checking\r
+        #\r
+        self.GeneralCheckAll = 0\r
+        \r
+        # Check whether NO Tab is used, replaced with spaces\r
+        self.GeneralCheckNoTab = 1\r
+        # The width of Tab\r
+        self.GeneralCheckTabWidth = 2\r
+        # Check whether the indentation is followed coding style\r
+        self.GeneralCheckIndentation = 1\r
+        # The width of indentation\r
+        self.GeneralCheckIndentationWidth = 2\r
+        # Check whether no line is exceeding defined widty\r
+        self.GeneralCheckLine = 1\r
+        # The width of a line\r
+        self.GeneralCheckLineWidth = 120\r
+        # Check whether no use of _asm in the source file\r
+        self.GeneralCheckNo_Asm = 1\r
+        # Check whether no use of "#progma" in source file except "#pragma pack(#)".\r
+        self.GeneralCheckNoProgma = 1\r
+        # Check whether there is a carriage return at the end of the file\r
+        self.GeneralCheckCarriageReturn = 1\r
+        # Check whether the file exists\r
+        self.GeneralCheckFileExistence = 1\r
+        \r
+        #\r
+        # Space Checking\r
+        #\r
+        self.SpaceCheckAll = 1\r
+        \r
+        #\r
+        # Predicate Expression Checking\r
+        #\r
+        self.PredicateExpressionCheckAll = 0\r
+        \r
+        # Check whether Boolean values, variable type BOOLEAN not use explicit comparisons to TRUE or FALSE\r
+        self.PredicateExpressionCheckBooleanValue = 1\r
+        # Check whether Non-Boolean comparisons use a compare operator (==, !=, >, < >=, <=). \r
+        self.PredicateExpressionCheckNonBooleanOperator = 1\r
+        # Check whether a comparison of any pointer to zero must be done via the NULL type\r
+        self.PredicateExpressionCheckComparisonNullType = 1\r
+        \r
+        #\r
+        # Headers Checking\r
+        #\r
+        self.HeaderCheckAll = 0\r
+        \r
+        # Check whether File header exists\r
+        self.HeaderCheckFile = 1\r
+        # Check whether Function header exists\r
+        self.HeaderCheckFunction = 1\r
+        \r
+        #\r
+        # C Function Layout Checking\r
+        #\r
+        self.CFunctionLayoutCheckAll = 0\r
+        \r
+        # Check whether return type exists and in the first line\r
+        self.CFunctionLayoutCheckReturnType = 1\r
+        # Check whether any optional functional modifiers exist and next to the return type\r
+        self.CFunctionLayoutCheckOptionalFunctionalModifier = 1\r
+        # Check whether the next line contains the function name, left justified, followed by the beginning of the parameter list\r
+        # Check whether the closing parenthesis is on its own line and also indented two spaces\r
+        self.CFunctionLayoutCheckFunctionName = 1\r
+        # Check whether the function prototypes in include files have the same form as function definitions\r
+        self.CFunctionLayoutCheckFunctionPrototype = 1\r
+        # Check whether the body of a function is contained by open and close braces that must be in the first column\r
+        self.CFunctionLayoutCheckFunctionBody = 1\r
+        # Check whether the data declarations is the first code in a module.\r
+        self.CFunctionLayoutCheckDataDeclaration = 1\r
+        # Check whether no initialization of a variable as part of its declaration\r
+        self.CFunctionLayoutCheckNoInitOfVariable = 1\r
+        # Check whether no use of STATIC for functions\r
+        self.CFunctionLayoutCheckNoStatic = 1\r
+        \r
+        #\r
+        # Include Files Checking\r
+        #\r
+        self.IncludeFileCheckAll = 0\r
+        \r
+        # Check whether all include file contents is guarded by a #ifndef statement.\r
+        # the #ifndef must be the first line of code following the file header comment\r
+        # the #endif must appear on the last line in the file\r
+        self.IncludeFileCheckIfndefStatement = 1\r
+        # Check whether include files contain only public or only private data\r
+        # Check whether include files NOT contain code or define data variables\r
+        self.IncludeFileCheckData = 1\r
+        \r
+        #\r
+        # Declarations and Data Types Checking\r
+        #\r
+        self.DeclarationDataTypeCheckAll = 0\r
+        \r
+        # Check whether no use of int, unsigned, char, void, static, long in any .c, .h or .asl files.\r
+        self.DeclarationDataTypeCheckNoUseCType = 1\r
+        # Check whether the modifiers IN, OUT, OPTIONAL, and UNALIGNED are used only to qualify arguments to a function and should not appear in a data type declaration\r
+        self.DeclarationDataTypeCheckInOutModifier = 1\r
+        # Check whether the EFIAPI modifier should be used at the entry of drivers, events, and member functions of protocols\r
+        self.DeclarationDataTypeCheckEFIAPIModifier = 1\r
+        # Check whether Enumerated Type has a 'typedef' and the name is capital\r
+        self.DeclarationDataTypeCheckEnumeratedType = 1\r
+        # Check whether Structure Type has a 'typedef' and the name is capital\r
+        self.DeclarationDataTypeCheckStructureDeclaration = 1\r
+        # Check whether Union Type has a 'typedef' and the name is capital\r
+        self.DeclarationDataTypeCheckUnionType = 1\r
+        \r
+        \r
+        #\r
+        # Naming Conventions Checking\r
+        #\r
+        self.NamingConventionCheckAll = 0\r
+        \r
+        # Check whether only capital letters are used for #define declarations\r
+        self.NamingConventionCheckDefineStatement = 1\r
+        # Check whether only capital letters are used for typedef declarations\r
+        self.NamingConventionCheckTypedefStatement = 1\r
+        # Check whether the #ifndef at the start of an include file uses both prefix and postfix underscore characters, '_'.\r
+        self.NamingConventionCheckIfndefStatement = 1\r
+        # Rule for path name, variable name and function name\r
+        # 1. First character should be upper case\r
+        # 2. Existing lower case in a word\r
+        # 3. No space existence\r
+        # Check whether the path name followed the rule\r
+        self.NamingConventionCheckPathName = 1\r
+        # Check whether the variable name followed the rule\r
+        self.NamingConventionCheckVariableName = 1\r
+        # Check whether the function name followed the rule\r
+        self.NamingConventionCheckFunctionName = 1\r
+        # Check whether NO use short variable name with single character\r
+        self.NamingConventionCheckSingleCharacterVariable = 1\r
+        \r
+        #\r
+        # Doxygen Checking\r
+        #\r
+        self.DoxygenCheckAll = 0\r
+        \r
+        # Check whether the file headers are followed Doxygen special documentation blocks in section 2.3.5\r
+        self.DoxygenCheckFileHeader = 1\r
+        # Check whether the function headers are followed Doxygen special documentation blocks in section 2.3.5\r
+        self.DoxygenCheckFunctionHeader = 1\r
+        # Check whether the first line of text in a comment block is a brief description of the element being documented. \r
+        # The brief description must end with a period.\r
+        self.DoxygenCheckCommentDescription = 1\r
+        # Check whether comment lines with '///< ... text ...' format, if it is used, it should be after the code section.\r
+        self.DoxygenCheckCommentFormat = 1\r
+        # Check whether only Doxygen commands allowed to mark the code are @bug and @todo.\r
+        self.DoxygenCheckCommand = 1\r
+        \r
+        #\r
+        # Meta-Data File Processing Checking\r
+        #\r
+        self.MetaDataFileCheckAll = 0\r
+        \r
+        # Check whether each file defined in meta-data exists\r
+        self.MetaDataFileCheckPathName = 1\r
+        # Generate a list for all files defined in meta-data files\r
+        self.MetaDataFileCheckGenerateFileList = 1\r
+        # The path of log file\r
+        self.MetaDataFileCheckPathOfGenerateFileList = "C:\File.log"\r
+        # Check whether all Library Instances defined for a given module (or dependent library instance) match the module's type.  \r
+        # Each Library Instance must specify the Supported Module Types in its INF file, \r
+        # and any module specifying the library instance must be one of the supported types.\r
+        self.MetaDataFileCheckLibraryInstance = 1\r
+        # Check whether a Library Instance has been defined for all dependent library classes\r
+        self.MetaDataFileCheckLibraryInstanceDependent = 1\r
+        # Check whether the Library Instances specified by the LibraryClasses sections are listed in order of dependencies\r
+        self.MetaDataFileCheckLibraryInstanceOrder = 1\r
+        # Check whether the unnecessary inclusion of library classes in the INF file\r
+        self.MetaDataFileCheckLibraryNoUse = 1\r
+        # Check whether an INF file is specified in the FDF file, but not in the DSC file, then the INF file must be for a Binary module only\r
+        self.MetaDataFileCheckBinaryInfInFdf = 1\r
+        # Not to report error and warning related OS include file such as "windows.h" and "stdio.h"\r
+        # Check whether a PCD is set in a DSC file or the FDF file, but not in both.\r
+        self.MetaDataFileCheckPcdDuplicate = 1\r
+        # Check whether PCD settings in the FDF file can only be related to flash.\r
+        self.MetaDataFileCheckPcdFlash = 1\r
+        # Check whether PCDs used in INF files but not specified in DSC or FDF files\r
+        self.MetaDataFileCheckPcdNoUse = 1\r
+        # Check whether having duplicate guids defined for Guid/Protocol/Ppi\r
+        self.MetaDataFileCheckGuidDuplicate = 1\r
+        \r
+        #\r
+        # The check points in this section are reserved\r
+        #\r
+        # GotoStatementCheckAll = 0\r
+        #\r
+        self.SpellingCheckAll = 0\r
+        \r
+        self.ParseConfig()\r
+        \r
+    def ParseConfig(self):\r
+        Filepath = os.path.normpath(self.Filename)\r
+        if not os.path.isfile(Filepath):\r
+            ErrorMsg = "Can't find configuration file '%s'" % Filepath\r
+            EdkLogger.error("Ecc", EdkLogger.ECC_ERROR, ErrorMsg, File = Filepath)\r
+        \r
+        LineNo = 0\r
+        for Line in open(Filepath, 'r'):\r
+            LineNo = LineNo + 1\r
+            Line = CleanString(Line)\r
+            if Line != '':\r
+                List = GetSplitValueList(Line, TAB_EQUAL_SPLIT)\r
+                if List[0] not in self.__dict__:\r
+                    ErrorMsg = "Invalid configuration option '%s' is found" % List[0]\r
+                    EdkLogger.error("Ecc", EdkLogger.ECC_ERROR, ErrorMsg, File = Filepath, Line = LineNo)\r
+                if List[0] == 'ModifierList':\r
+                    List[1] = GetSplitValueList(List[1], TAB_COMMA_SPLIT)\r
+                self.__dict__[List[0]] = List[1]\r
+    \r
+    def ShowMe(self):\r
+        print self.Filename\r
+        for Key in self.__dict__.keys():\r
+            print Key, '=', self.__dict__[Key]
\ No newline at end of file
diff --git a/Source/Python/Ecc/Count.py b/Source/Python/Ecc/Count.py
new file mode 100644 (file)
index 0000000..b79fc00
--- /dev/null
@@ -0,0 +1,34 @@
+import AutoGen.UniClassObject\r
+import AutoGen.StrGather as StrGather\r
+\r
+# This acts like the main() function for the script, unless it is 'import'ed into another\r
+# script.\r
+if __name__ == '__main__':\r
+    IncludeList = [\r
+            r'C:\SVN\BuildTools\BaseTools\Source\Python\AutoGen',\r
+            r'C:\SVN\BuildTools\BaseTools\Source\Python\build',\r
+            r'C:\SVN\BuildTools\BaseTools\Source\Python\CalcDeps',\r
+            r'C:\SVN\BuildTools\BaseTools\Source\Python\Common',\r
+            r'C:\SVN\BuildTools\BaseTools\Source\Python\CommonDataClass',\r
+            r'C:\SVN\BuildTools\BaseTools\Source\Python\Fdb',\r
+            r'C:\SVN\BuildTools\BaseTools\Source\Python\FixFlash',\r
+            r'C:\SVN\BuildTools\BaseTools\Source\Python\GenFds',\r
+            r'C:\SVN\BuildTools\BaseTools\Source\Python\InstallFar',\r
+            r'C:\SVN\BuildTools\BaseTools\Source\Python\MkBOM',\r
+            r'C:\SVN\BuildTools\BaseTools\Source\Python\MkFar',\r
+            r'C:\SVN\BuildTools\BaseTools\Source\Python\TargetTool',\r
+            r'C:\SVN\BuildTools\BaseTools\Source\Python\Trim',\r
+            r'C:\SVN\BuildTools\BaseTools\Source\Python\UpdateFv',\r
+            r'C:\SVN\BuildTools\BaseTools\Source\Python\WkSpace'\r
+        ]\r
+    f = StrGather.GetFileList(IncludeList, '.pyc')\r
+    tl = 0\r
+    for item in f:\r
+        l = 0\r
+        fin = open(item, mode='rb')\r
+        for line in fin:\r
+            l = l + 1\r
+        if l != 0:\r
+            print l, ',  ', item\r
+        tl = tl + l\r
+    print 'total:', tl
\ No newline at end of file
index 682eea6..ab3b78d 100644 (file)
@@ -82,7 +82,7 @@ class Database(object):
         self.TblFile.Create()\r
         self.TblFunction.Create()\r
         self.TblPcd.Create()\r
-        self.TblIdentifier.Create()\r
+        #self.TblIdentifier.Create()\r
         \r
         #\r
         # Initialize table DataModel\r
@@ -130,7 +130,7 @@ class Database(object):
         #\r
         FileID = self.TblFile.Insert(File.Name, File.ExtName, File.Path, File.FullPath, Model = File.Model, TimeStamp = File.TimeStamp)\r
         IdTable = TableIdentifier(self.Cur)\r
-        IdTable.Table = "file%s" % FileID\r
+        IdTable.Table = "Identifier%s" % FileID\r
         IdTable.Create()\r
 \r
         #\r
@@ -229,9 +229,7 @@ class Database(object):
         EdkLogger.verbose("Update 'BelongsToFunction' for Identifiers started ...")\r
         \r
         SqlCommand = """select ID, BelongsToFile, StartLine, EndLine from Function"""\r
-        EdkLogger.debug(4, "SqlCommand: %s" %SqlCommand)\r
-        self.Cur.execute(SqlCommand)\r
-        Records = self.Cur.fetchall()\r
+        Records = self.TblFunction.Exec(SqlCommand)\r
         Data1 = []\r
         Data2 = []\r
         for Record in Records:\r
@@ -242,13 +240,13 @@ class Database(object):
             #Data1.append(("'file%s'" % BelongsToFile, FunctionID, BelongsToFile, StartLine, EndLine))\r
             #Data2.append(("'file%s'" % BelongsToFile, FunctionID, DataClass.MODEL_IDENTIFIER_FUNCTION_HEADER, BelongsToFile, DataClass.MODEL_IDENTIFIER_COMMENT, StartLine - 1))\r
 \r
-            SqlCommand = """Update file%s set BelongsToFunction = %s where BelongsToFile = %s and StartLine > %s and EndLine < %s""" % \\r
+            SqlCommand = """Update Identifier%s set BelongsToFunction = %s where BelongsToFile = %s and StartLine > %s and EndLine < %s""" % \\r
                         (BelongsToFile, FunctionID, BelongsToFile, StartLine, EndLine)\r
-            self.Cur.execute(SqlCommand)\r
+            self.TblIdentifier.Exec(SqlCommand)\r
 \r
-            SqlCommand = """Update file%s set BelongsToFunction = %s, Model = %s where BelongsToFile = %s and Model = %s and EndLine = %s""" % \\r
+            SqlCommand = """Update Identifier%s set BelongsToFunction = %s, Model = %s where BelongsToFile = %s and Model = %s and EndLine = %s""" % \\r
                          (BelongsToFile, FunctionID, DataClass.MODEL_IDENTIFIER_FUNCTION_HEADER, BelongsToFile, DataClass.MODEL_IDENTIFIER_COMMENT, StartLine - 1)\r
-            self.Cur.execute(SqlCommand)\r
+            self.TblIdentifier.Exec(SqlCommand)\r
 #       #\r
 #       # Check whether an identifier belongs to a function\r
 #       #\r
diff --git a/Source/Python/Ecc/Ecc.py b/Source/Python/Ecc/Ecc.py
new file mode 100644 (file)
index 0000000..d88dcdc
--- /dev/null
@@ -0,0 +1,190 @@
+## @file\r
+# This file is used to be the main entrance of ECC tool\r
+#\r
+# Copyright (c) 2008, Intel Corporation\r
+# All rights reserved. This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution.  The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+\r
+##\r
+# Import Modules\r
+#\r
+import os\r
+from optparse import OptionParser\r
+import Common.EdkLogger as EdkLogger\r
+from Configuration import Configuration\r
+from Check import Check\r
+import EccGlobalData\r
+import time\r
+import c\r
+\r
+## Ecc\r
+#\r
+# This class is used to define Ecc main entrance\r
+#\r
+# @param object:          Inherited from object class\r
+#\r
+class Ecc(object):\r
+    def __init__(self):\r
+        # Version and Copyright\r
+        self.VersionNumber = "0.01"\r
+        self.Version = "%prog Version " + self.VersionNumber\r
+        self.Copyright = "Copyright (c) 2008, Intel Corporation  All rights reserved."\r
+        \r
+        self.ConfigFile = 'config.ini'\r
+        self.OutputFile = 'output.txt'\r
+        \r
+        #\r
+        # Initialize log system\r
+        #\r
+        EdkLogger.Initialize()\r
+        EdkLogger.quiet(time.strftime("%H:%M:%S, %b.%d %Y ", time.localtime()) + "[00:00]" + "\n")\r
+        \r
+        #\r
+        # Parse the options and args\r
+        #\r
+        self.ParseOption()\r
+\r
+        #\r
+        # Generate checkpoints list\r
+        #\r
+        EccGlobalData.gConfig = Configuration(self.ConfigFile)\r
+        \r
+        #\r
+        # Build ECC database\r
+        #\r
+        self.BuildDatabase()\r
+        \r
+        #\r
+        # Start to check\r
+        #\r
+        self.Check()\r
+        \r
+        #\r
+        # Show report\r
+        #\r
+        self.GenReport()\r
+\r
+    ##\r
+    #\r
+    # Build the database for target\r
+    #\r
+    def BuildDatabase(self):\r
+        EdkLogger.quiet("Parsing target ...")\r
+        c.CollectSourceCodeDataIntoDB(EccGlobalData.gTarget)\r
+        EdkLogger.quiet("Parsing target done!")\r
+\r
+    ##\r
+    #\r
+    # Check each checkpoint\r
+    #\r
+    def Check(self):\r
+        EdkLogger.quiet("Checking ...")\r
+        EccCheck = Check()\r
+        EccCheck.Check()\r
+        EdkLogger.quiet("Checking  done!")\r
+    \r
+    ##\r
+    #\r
+    # Generate the scan report\r
+    #\r
+    def GenReport(self):\r
+        EdkLogger.quiet("Generating report ...")\r
+        EdkLogger.quiet("Generating report done!")\r
+    \r
+    ## ParseOption\r
+    #\r
+    # Parse options\r
+    #\r
+    def ParseOption(self):\r
+        EdkLogger.quiet("Loading ECC configuration ... done")\r
+        (Options, Target) = self.EccOptionParser()\r
+        \r
+        #\r
+        # Check workspace envirnoment\r
+        #\r
+        if "WORKSPACE" not in os.environ:\r
+            EdkLogger.error("ECC", ATTRIBUTE_NOT_AVAILABLE, "Environment variable not found", \r
+                            ExtraData="WORKSPACE")\r
+        else:\r
+            EccGlobalData.gWorkspace = os.path.normpath(os.getenv("WORKSPACE"))\r
+            if not os.path.exists(EccGlobalData.gWorkspace):\r
+                EdkLogger.error("ECC", FILE_NOT_FOUND, ExtraData="WORKSPACE = %s" % EccGlobalData.gWorkspace)\r
+            os.environ["WORKSPACE"] = EccGlobalData.gWorkspace\r
+        #\r
+        # Set log level\r
+        #\r
+        self.SetLogLevel(Options)\r
+        \r
+        #\r
+        # Set other options\r
+        #\r
+        if Options.ConfigFile != None:\r
+            self.ConfigFile = Options.ConfigFile\r
+        if Options.OutputFile != None:\r
+            self.OutputFile = Options.OutputFile\r
+        if Options.Target != None:\r
+            EccGlobalData.gTarget = Options.Target\r
+        else:\r
+            EdkLogger.error("Ecc", EdkLogger.ECC_ERROR, "A target workspace must be specified!")\r
+           \r
+    ## SetLogLevel\r
+    #\r
+    # Set current log level of the tool based on args\r
+    #\r
+    # @param Option:  The option list including log level setting \r
+    #\r
+    def SetLogLevel(self, Option):\r
+        if Option.verbose != None:\r
+            EdkLogger.SetLevel(EdkLogger.VERBOSE)\r
+        elif Option.quiet != None:\r
+            EdkLogger.SetLevel(EdkLogger.QUIET)\r
+        elif Option.debug != None:\r
+            EdkLogger.SetLevel(Option.debug + 1)\r
+        else:\r
+            EdkLogger.SetLevel(EdkLogger.INFO)    \r
+\r
+    ## Parse command line options\r
+    #\r
+    # Using standard Python module optparse to parse command line option of this tool.\r
+    #\r
+    # @retval Opt   A optparse.Values object containing the parsed options\r
+    # @retval Args  Target of build command\r
+    #\r
+    def EccOptionParser(self):\r
+        Parser = OptionParser(description = self.Copyright, version = self.Version, prog = "Ecc.exe", usage = "%prog [options]")\r
+        Parser.add_option("-t", "--target sourcepath", action="store", type="string", dest='Target',\r
+            help="Check all files under the target workspace.")\r
+        Parser.add_option("-c", "--config filename", action="store", type="string", dest="ConfigFile",\r
+            help="Specify a configuration file. Defaultly use config.ini under ECC tool directory.")\r
+        Parser.add_option("-o", "--outfile filename", action="store", type="string", dest="OutputFile",\r
+            help="Specify the name of an output file, if and only if one filename was specified.")\r
+    \r
+        Parser.add_option("-l", "--log filename", action="store", dest="LogFile", help="""If specified, the tool should emit the changes that \r
+                                                                                          were made by the tool after printing the result message. \r
+                                                                                          If filename, the emit to the file, otherwise emit to \r
+                                                                                          standard output. If no modifications were made, then do not \r
+                                                                                          create a log file, or output a log message.""")\r
+        Parser.add_option("-q", "--quiet", action="store_true", type=None, help="Disable all messages except FATAL ERRORS.")\r
+        Parser.add_option("-v", "--verbose", action="store_true", type=None, help="Turn on verbose output with informational messages printed, "\\r
+                                                                                   "including library instances selected, final dependency expression, "\\r
+                                                                                   "and warning messages, etc.")\r
+        Parser.add_option("-d", "--debug", action="store", type="int", help="Enable debug messages at specified level.")\r
+    \r
+        (Opt, Args)=Parser.parse_args()\r
+        \r
+        return (Opt, Args)\r
+\r
+##\r
+#\r
+# This acts like the main() function for the script, unless it is 'import'ed into another\r
+# script.\r
+#\r
+if __name__ == '__main__':\r
+    Ecc = Ecc()\r
+    
\ No newline at end of file
diff --git a/Source/Python/Ecc/EccGlobalData.py b/Source/Python/Ecc/EccGlobalData.py
new file mode 100644 (file)
index 0000000..1d7bb4f
--- /dev/null
@@ -0,0 +1,21 @@
+## @file\r
+# This file is used to save global datas used by ECC tool\r
+#\r
+# Copyright (c) 2008, Intel Corporation\r
+# All rights reserved. This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution.  The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+\r
+##\r
+# Import Modules\r
+#\r
+import os\r
+\r
+gWorkspace = ''\r
+gTarget = ''\r
+gConfig = None
\ No newline at end of file