]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Ecc/c.py
Sync EDKII BaseTools to BaseTools project r1971
[mirror_edk2.git] / BaseTools / Source / Python / Ecc / c.py
index b8b1d2d6f5a04fc5239701b4945ef74a7a07f3b0..941392be0fe0a9322e96cf37a5e347fccdfd221c 100644 (file)
@@ -1,3 +1,16 @@
+## @file\r
+# This file is used to be the c coding style checking of ECC tool\r
+#\r
+# Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+# 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
 import sys\r
 import os\r
 import re\r
@@ -82,16 +95,16 @@ def GetIdentifierList():
     for comment in FileProfile.CommentList:\r
         IdComment = DataClass.IdentifierClass(-1, '', '', '', comment.Content, DataClass.MODEL_IDENTIFIER_COMMENT, -1, -1, comment.StartPos[0],comment.StartPos[1],comment.EndPos[0],comment.EndPos[1])\r
         IdList.append(IdComment)\r
-        \r
+\r
     for pp in FileProfile.PPDirectiveList:\r
         Type = GetIdType(pp.Content)\r
         IdPP = DataClass.IdentifierClass(-1, '', '', '', pp.Content, Type, -1, -1, pp.StartPos[0],pp.StartPos[1],pp.EndPos[0],pp.EndPos[1])\r
         IdList.append(IdPP)\r
-        \r
+\r
     for pe in FileProfile.PredicateExpressionList:\r
         IdPE = DataClass.IdentifierClass(-1, '', '', '', pe.Content, DataClass.MODEL_IDENTIFIER_PREDICATE_EXPRESSION, -1, -1, pe.StartPos[0],pe.StartPos[1],pe.EndPos[0],pe.EndPos[1])\r
         IdList.append(IdPE)\r
-        \r
+\r
     FuncDeclPattern = GetFuncDeclPattern()\r
     ArrayPattern = GetArrayPattern()\r
     for var in FileProfile.VariableDeclarationList:\r
@@ -125,10 +138,10 @@ def GetIdentifierList():
                 DeclText = DeclText[1:]\r
                 VarNameStartColumn += 1\r
             FirstChar = DeclText[0]\r
-            \r
+\r
         var.Declarator = DeclText\r
         if FuncDeclPattern.match(var.Declarator):\r
-            DeclSplitList = var.Declarator.split('(')     \r
+            DeclSplitList = var.Declarator.split('(')\r
             FuncName = DeclSplitList[0].strip()\r
             FuncNamePartList = FuncName.split()\r
             if len(FuncNamePartList) > 1:\r
@@ -168,8 +181,8 @@ def GetIdentifierList():
             IdVar = DataClass.IdentifierClass(-1, var.Modifier, '', var.Declarator, FuncName, DataClass.MODEL_IDENTIFIER_FUNCTION_DECLARATION, -1, -1, var.StartPos[0], var.StartPos[1], VarNameStartLine, VarNameStartColumn)\r
             IdList.append(IdVar)\r
             continue\r
-        \r
-        if var.Declarator.find('{') == -1:      \r
+\r
+        if var.Declarator.find('{') == -1:\r
             for decl in var.Declarator.split(','):\r
                 DeclList = decl.split('=')\r
                 Name = DeclList[0].strip()\r
@@ -177,7 +190,7 @@ def GetIdentifierList():
                     LSBPos = var.Declarator.find('[')\r
                     var.Modifier += ' ' + Name[LSBPos:]\r
                     Name = Name[0:LSBPos]\r
-            \r
+\r
                 IdVar = DataClass.IdentifierClass(-1, var.Modifier, '', Name, (len(DeclList) > 1 and [DeclList[1]]or [''])[0], DataClass.MODEL_IDENTIFIER_VARIABLE, -1, -1, var.StartPos[0],var.StartPos[1], VarNameStartLine, VarNameStartColumn)\r
                 IdList.append(IdVar)\r
         else:\r
@@ -189,7 +202,7 @@ def GetIdentifierList():
                 Name = Name[0:LSBPos]\r
             IdVar = DataClass.IdentifierClass(-1, var.Modifier, '', Name, (len(DeclList) > 1 and [DeclList[1]]or [''])[0], DataClass.MODEL_IDENTIFIER_VARIABLE, -1, -1, var.StartPos[0],var.StartPos[1], VarNameStartLine, VarNameStartColumn)\r
             IdList.append(IdVar)\r
-            \r
+\r
     for enum in FileProfile.EnumerationDefinitionList:\r
         LBPos = enum.Content.find('{')\r
         RBPos = enum.Content.find('}')\r
@@ -197,7 +210,7 @@ def GetIdentifierList():
         Value = enum.Content[LBPos+1:RBPos]\r
         IdEnum = DataClass.IdentifierClass(-1, '', '', Name, Value, DataClass.MODEL_IDENTIFIER_ENUMERATE, -1, -1, enum.StartPos[0],enum.StartPos[1],enum.EndPos[0],enum.EndPos[1])\r
         IdList.append(IdEnum)\r
-        \r
+\r
     for su in FileProfile.StructUnionDefinitionList:\r
         if SuOccurInTypedef(su, FileProfile.TypedefDefinitionList):\r
             continue\r
@@ -216,8 +229,8 @@ def GetIdentifierList():
             Value = su.Content[LBPos:RBPos+1]\r
         IdPE = DataClass.IdentifierClass(-1, '', '', Name, Value, Type, -1, -1, su.StartPos[0],su.StartPos[1],su.EndPos[0],su.EndPos[1])\r
         IdList.append(IdPE)\r
-    \r
-    TdFuncPointerPattern = GetTypedefFuncPointerPattern()    \r
+\r
+    TdFuncPointerPattern = GetTypedefFuncPointerPattern()\r
     for td in FileProfile.TypedefDefinitionList:\r
         Modifier = ''\r
         Name = td.ToType\r
@@ -240,16 +253,16 @@ def GetIdentifierList():
             while Name.startswith('*'):\r
                 Value += ' ' + '*'\r
                 Name = Name.lstrip('*').strip()\r
-                \r
+\r
         if Name.find('[') != -1:\r
             LBPos = Name.find('[')\r
             RBPos = Name.rfind(']')\r
             Value += Name[LBPos : RBPos + 1]\r
             Name = Name[0 : LBPos]\r
-                \r
+\r
         IdTd = DataClass.IdentifierClass(-1, Modifier, '', Name, Value, DataClass.MODEL_IDENTIFIER_TYPEDEF, -1, -1, td.StartPos[0],td.StartPos[1],td.EndPos[0],td.EndPos[1])\r
         IdList.append(IdTd)\r
-        \r
+\r
     for funcCall in FileProfile.FunctionCallingList:\r
         IdFC = DataClass.IdentifierClass(-1, '', '', funcCall.FuncName, funcCall.ParamList, DataClass.MODEL_IDENTIFIER_FUNCTION_CALLING, -1, -1, funcCall.StartPos[0],funcCall.StartPos[1],funcCall.EndPos[0],funcCall.EndPos[1])\r
         IdList.append(IdFC)\r
@@ -278,7 +291,7 @@ def GetParamList(FuncDeclarator, FuncNameLine = 0, FuncNameOffset = 0):
     OffsetSkipped = 0\r
     TailChar = FuncName[-1]\r
     while not TailChar.isalpha() and TailChar != '_':\r
-        \r
+\r
         if TailChar == '\n':\r
             FuncName = FuncName.rstrip('\r\n').rstrip('\n')\r
             LineSkipped += 1\r
@@ -296,9 +309,9 @@ def GetParamList(FuncDeclarator, FuncNameLine = 0, FuncNameOffset = 0):
         else:\r
             FuncName = FuncName[:-1]\r
         TailChar = FuncName[-1]\r
-               \r
+\r
     OffsetSkipped += 1 #skip '('\r
-    \r
+\r
     for p in ParamStr.split(','):\r
         ListP = p.split()\r
         if len(ListP) == 0:\r
@@ -325,13 +338,13 @@ def GetParamList(FuncDeclarator, FuncNameLine = 0, FuncNameOffset = 0):
         LBIndex = ParamName.find('[')\r
         if LBIndex != -1:\r
             ParamName = ParamName[0:LBIndex]\r
-        \r
+\r
         Start = RightSpacePos\r
         Index = 0\r
         PreChar = ''\r
         while Index < Start:\r
             FirstChar = p[Index]\r
-                \r
+\r
             if FirstChar == '\r':\r
                 Index += 1\r
                 LineSkipped += 1\r
@@ -351,15 +364,15 @@ def GetParamList(FuncDeclarator, FuncNameLine = 0, FuncNameOffset = 0):
                 Index += 1\r
                 OffsetSkipped += 1\r
             PreChar = FirstChar\r
-            \r
+\r
         ParamBeginLine = FuncNameLine + LineSkipped\r
         ParamBeginOffset = FuncNameOffset + OffsetSkipped\r
-        \r
+\r
         Index = Start + len(ParamName)\r
         PreChar = ''\r
         while Index < len(p):\r
             FirstChar = p[Index]\r
-                \r
+\r
             if FirstChar == '\r':\r
                 Index += 1\r
                 LineSkipped += 1\r
@@ -379,18 +392,18 @@ def GetParamList(FuncDeclarator, FuncNameLine = 0, FuncNameOffset = 0):
                 Index += 1\r
                 OffsetSkipped += 1\r
             PreChar = FirstChar\r
-        \r
+\r
         ParamEndLine = FuncNameLine + LineSkipped\r
         ParamEndOffset = FuncNameOffset + OffsetSkipped\r
         if ParamName != '...':\r
             ParamName = StripNonAlnumChars(ParamName)\r
         IdParam = DataClass.IdentifierClass(-1, ParamModifier, '', ParamName, '', DataClass.MODEL_IDENTIFIER_PARAMETER, -1, -1, ParamBeginLine, ParamBeginOffset, ParamEndLine, ParamEndOffset)\r
         ParamIdList.append(IdParam)\r
-        \r
+\r
         OffsetSkipped += 1 #skip ','\r
-    \r
+\r
     return ParamIdList\r
-    \r
+\r
 def GetFunctionList():\r
     FuncObjList = []\r
     for FuncDef in FileProfile.FunctionDefinitionList:\r
@@ -422,12 +435,12 @@ def GetFunctionList():
                 DeclText = DeclText[1:]\r
                 FuncNameStartColumn += 1\r
             FirstChar = DeclText[0]\r
-        \r
+\r
         FuncDef.Declarator = DeclText\r
         DeclSplitList = FuncDef.Declarator.split('(')\r
         if len(DeclSplitList) < 2:\r
             continue\r
-        \r
+\r
         FuncName = DeclSplitList[0]\r
         FuncNamePartList = FuncName.split()\r
         if len(FuncNamePartList) > 1:\r
@@ -463,10 +476,10 @@ def GetFunctionList():
                         Index += 1\r
                         FuncNameStartColumn += 1\r
                     PreChar = FirstChar\r
-                \r
+\r
         FuncObj = DataClass.FunctionClass(-1, FuncDef.Declarator, FuncDef.Modifier, FuncName.strip(), '', FuncDef.StartPos[0],FuncDef.StartPos[1],FuncDef.EndPos[0],FuncDef.EndPos[1], FuncDef.LeftBracePos[0], FuncDef.LeftBracePos[1], -1, ParamIdList, [], FuncNameStartLine, FuncNameStartColumn)\r
         FuncObjList.append(FuncObj)\r
-        \r
+\r
     return FuncObjList\r
 \r
 def GetFileModificationTimeFromDB(FullFileName):\r
@@ -519,13 +532,13 @@ def CollectSourceCodeDataIntoDB(RootDir):
                 ModifiedTime = os.path.getmtime(FullName)\r
                 FileObj = DataClass.FileClass(-1, BaseName, Ext, DirName, FullName, model, ModifiedTime, GetFunctionList(), GetIdentifierList(), [])\r
                 FileObjList.append(FileObj)\r
-                collector.CleanFileProfileBuffer()   \r
-    \r
+                collector.CleanFileProfileBuffer()\r
+\r
     if len(ParseErrorFileList) > 0:\r
         EdkLogger.info("Found unrecoverable error during parsing:\n\t%s\n" % "\n\t".join(ParseErrorFileList))\r
-    \r
-    Db = GetDB()    \r
-    for file in FileObjList:    \r
+\r
+    Db = GetDB()\r
+    for file in FileObjList:\r
         Db.InsertOneFile(file)\r
 \r
     Db.UpdateIdentifierBelongsToFunction()\r
@@ -533,13 +546,13 @@ def CollectSourceCodeDataIntoDB(RootDir):
 def GetTableID(FullFileName, ErrorMsgList = None):\r
     if ErrorMsgList == None:\r
         ErrorMsgList = []\r
-        \r
+\r
     Db = GetDB()\r
     SqlStatement = """ select ID\r
                        from File\r
                        where FullPath like '%s'\r
                    """ % FullFileName\r
-    \r
+\r
     ResultSet = Db.TblFile.Exec(SqlStatement)\r
 \r
     FileID = -1\r
@@ -557,11 +570,11 @@ def GetIncludeFileList(FullFileName):
     IFList = IncludeFileListDict.get(FullFileName)\r
     if IFList != None:\r
         return IFList\r
-    \r
+\r
     FileID = GetTableID(FullFileName)\r
     if FileID < 0:\r
         return []\r
-    \r
+\r
     Db = GetDB()\r
     FileTable = 'Identifier' + str(FileID)\r
     SqlStatement = """ select Value\r
@@ -583,7 +596,7 @@ def GetFullPathOfIncludeFile(Str, IncludePathList):
 def GetAllIncludeFiles(FullFileName):\r
     if AllIncludeFileListDict.get(FullFileName) != None:\r
         return AllIncludeFileListDict.get(FullFileName)\r
-    \r
+\r
     FileDirName = os.path.dirname(FullFileName)\r
     IncludePathList = IncludePathListDict.get(FileDirName)\r
     if IncludePathList == None:\r
@@ -600,7 +613,7 @@ def GetAllIncludeFiles(FullFileName):
         FullPath = GetFullPathOfIncludeFile(FileName, IncludePathList)\r
         if FullPath != None:\r
             IncludeFileQueue.append(FullPath)\r
-        \r
+\r
     i = 0\r
     while i < len(IncludeFileQueue):\r
         for IncludeFile in GetIncludeFileList(IncludeFileQueue[i]):\r
@@ -612,7 +625,7 @@ def GetAllIncludeFiles(FullFileName):
             if FullPath != None and FullPath not in IncludeFileQueue:\r
                 IncludeFileQueue.insert(i + 1, FullPath)\r
         i += 1\r
-    \r
+\r
     AllIncludeFileListDict[FullFileName] = IncludeFileQueue\r
     return IncludeFileQueue\r
 \r
@@ -637,7 +650,7 @@ def GetPredicateListFromPredicateExpStr(PES):
             else:\r
                 PredicateList.append(Exp.rstrip(';').rstrip(')').strip())\r
         i += 1\r
-    \r
+\r
     if PredicateBegin > LogicOpPos:\r
         while PredicateBegin < len(PES):\r
             if PES[PredicateBegin].isalnum() or PES[PredicateBegin] == '_' or PES[PredicateBegin] == '*':\r
@@ -651,7 +664,7 @@ def GetPredicateListFromPredicateExpStr(PES):
         else:\r
             PredicateList.append(Exp.rstrip(';').rstrip(')').strip())\r
     return PredicateList\r
-    \r
+\r
 def GetCNameList(Lvalue, StarList = []):\r
     Lvalue += ' '\r
     i = 0\r
@@ -659,7 +672,7 @@ def GetCNameList(Lvalue, StarList = []):
     VarStart = -1\r
     VarEnd = -1\r
     VarList = []\r
-    \r
+\r
     while SearchBegin < len(Lvalue):\r
         while i < len(Lvalue):\r
             if Lvalue[i].isalnum() or Lvalue[i] == '_':\r
@@ -677,8 +690,8 @@ def GetCNameList(Lvalue, StarList = []):
                 i += 1\r
         if VarEnd == -1:\r
             break\r
-        \r
-        \r
+\r
+\r
         DotIndex = Lvalue[VarEnd:].find('.')\r
         ArrowIndex = Lvalue[VarEnd:].find('->')\r
         if DotIndex == -1 and ArrowIndex == -1:\r
@@ -688,19 +701,19 @@ def GetCNameList(Lvalue, StarList = []):
         elif ArrowIndex == -1 and DotIndex != -1:\r
             SearchBegin = VarEnd + DotIndex\r
         else:\r
-            SearchBegin = VarEnd + ((DotIndex < ArrowIndex) and DotIndex or ArrowIndex) \r
-            \r
+            SearchBegin = VarEnd + ((DotIndex < ArrowIndex) and DotIndex or ArrowIndex)\r
+\r
         i = SearchBegin\r
         VarStart = -1\r
         VarEnd = -1\r
-    \r
-    return VarList    \r
+\r
+    return VarList\r
 \r
 def SplitPredicateByOp(Str, Op, IsFuncCalling = False):\r
 \r
     Name = Str.strip()\r
     Value = None\r
-    \r
+\r
     if IsFuncCalling:\r
         Index = 0\r
         LBFound = False\r
@@ -708,7 +721,7 @@ def SplitPredicateByOp(Str, Op, IsFuncCalling = False):
         while Index < len(Str):\r
             while not LBFound and Str[Index] != '_' and not Str[Index].isalnum():\r
                 Index += 1\r
-            \r
+\r
             while not LBFound and (Str[Index].isalnum() or Str[Index] == '_'):\r
                 Index += 1\r
             # maybe type-cast at the begining, skip it.\r
@@ -716,79 +729,81 @@ def SplitPredicateByOp(Str, Op, IsFuncCalling = False):
             if RemainingStr.startswith(')') and not LBFound:\r
                 Index += 1\r
                 continue\r
-            \r
+\r
             if RemainingStr.startswith('(') and not LBFound:\r
                 LBFound = True\r
-                \r
+\r
             if Str[Index] == '(':\r
                 UnmatchedLBCount += 1\r
                 Index += 1\r
                 continue\r
-                \r
+\r
             if Str[Index] == ')':\r
                 UnmatchedLBCount -= 1\r
                 Index += 1\r
                 if UnmatchedLBCount == 0:\r
                     break\r
                 continue\r
-            \r
+\r
             Index += 1\r
-                \r
+\r
         if UnmatchedLBCount > 0:\r
             return [Name]\r
-            \r
+\r
         IndexInRemainingStr = Str[Index:].find(Op)\r
         if IndexInRemainingStr == -1:\r
             return [Name]\r
-        \r
+\r
         Name = Str[0:Index + IndexInRemainingStr].strip()\r
-        Value = Str[Index+IndexInRemainingStr+len(Op):].strip()\r
+        Value = Str[Index+IndexInRemainingStr+len(Op):].strip().strip(')')\r
         return [Name, Value]\r
-    \r
+\r
     TmpStr = Str.rstrip(';').rstrip(')')\r
     while True:\r
         Index = TmpStr.rfind(Op)\r
         if Index == -1:\r
             return [Name]\r
-        \r
+\r
         if Str[Index - 1].isalnum() or Str[Index - 1].isspace() or Str[Index - 1] == ')':\r
             Name = Str[0:Index].strip()\r
             Value = Str[Index + len(Op):].strip()\r
-            return [Name, Value]   \r
-    \r
+            return [Name, Value]\r
+\r
         TmpStr = Str[0:Index - 1]\r
 \r
 def SplitPredicateStr(Str):\r
+\r
+    Str = Str.lstrip('(')\r
     IsFuncCalling = False\r
     p = GetFuncDeclPattern()\r
     TmpStr = Str.replace('.', '').replace('->', '')\r
     if p.match(TmpStr):\r
         IsFuncCalling = True\r
-    \r
+\r
     PredPartList = SplitPredicateByOp(Str, '==', IsFuncCalling)\r
     if len(PredPartList) > 1:\r
         return [PredPartList, '==']\r
-    \r
+\r
     PredPartList = SplitPredicateByOp(Str, '!=', IsFuncCalling)\r
     if len(PredPartList) > 1:\r
         return [PredPartList, '!=']\r
-    \r
+\r
     PredPartList = SplitPredicateByOp(Str, '>=', IsFuncCalling)\r
     if len(PredPartList) > 1:\r
         return [PredPartList, '>=']\r
-        \r
+\r
     PredPartList = SplitPredicateByOp(Str, '<=', IsFuncCalling)\r
     if len(PredPartList) > 1:\r
         return [PredPartList, '<=']\r
-        \r
+\r
     PredPartList = SplitPredicateByOp(Str, '>', IsFuncCalling)\r
     if len(PredPartList) > 1:\r
         return [PredPartList, '>']\r
-        \r
+\r
     PredPartList = SplitPredicateByOp(Str, '<', IsFuncCalling)\r
     if len(PredPartList) > 1:\r
         return [PredPartList, '<']\r
-        \r
+\r
     return [[Str, None], None]\r
 \r
 def GetFuncContainsPE(ExpLine, ResultSet):\r
@@ -812,11 +827,11 @@ def GetDataTypeFromModifier(ModifierStr):
         # remove array sufix\r
         if M.startswith('['):\r
             MList.remove(M)\r
-            \r
+\r
     ReturnType = ''\r
     for M in MList:\r
         ReturnType += M + ' '\r
-        \r
+\r
     ReturnType = ReturnType.strip()\r
     if len(ReturnType) == 0:\r
         ReturnType = 'VOID'\r
@@ -829,13 +844,13 @@ def DiffModifier(Str1, Str2):
         return False\r
     else:\r
         return True\r
-    \r
+\r
 def GetTypedefDict(FullFileName):\r
-    \r
+\r
     Dict = ComplexTypeDict.get(FullFileName)\r
     if Dict != None:\r
         return Dict\r
-    \r
+\r
     FileID = GetTableID(FullFileName)\r
     FileTable = 'Identifier' + str(FileID)\r
     Db = GetDB()\r
@@ -844,25 +859,25 @@ def GetTypedefDict(FullFileName):
                        where Model = %d\r
                    """ % (FileTable, DataClass.MODEL_IDENTIFIER_TYPEDEF)\r
     ResultSet = Db.TblFile.Exec(SqlStatement)\r
-    \r
+\r
     Dict = {}\r
     for Result in ResultSet:\r
         if len(Result[0]) == 0:\r
             Dict[Result[1]] = Result[2]\r
-        \r
+\r
     IncludeFileList = GetAllIncludeFiles(FullFileName)\r
     for F in IncludeFileList:\r
         FileID = GetTableID(F)\r
         if FileID < 0:\r
             continue\r
-    \r
+\r
         FileTable = 'Identifier' + str(FileID)\r
         SqlStatement = """ select Modifier, Name, Value, ID\r
                        from %s\r
                        where Model = %d\r
                    """ % (FileTable, DataClass.MODEL_IDENTIFIER_TYPEDEF)\r
         ResultSet = Db.TblFile.Exec(SqlStatement)\r
-    \r
+\r
         for Result in ResultSet:\r
             if not Result[2].startswith('FP ('):\r
                 Dict[Result[1]] = Result[2]\r
@@ -871,16 +886,16 @@ def GetTypedefDict(FullFileName):
                     Dict[Result[1]] = 'VOID'\r
                 else:\r
                     Dict[Result[1]] = GetDataTypeFromModifier(Result[0])\r
-                \r
+\r
     ComplexTypeDict[FullFileName] = Dict\r
     return Dict\r
 \r
 def GetSUDict(FullFileName):\r
-    \r
+\r
     Dict = SUDict.get(FullFileName)\r
     if Dict != None:\r
         return Dict\r
-    \r
+\r
     FileID = GetTableID(FullFileName)\r
     FileTable = 'Identifier' + str(FileID)\r
     Db = GetDB()\r
@@ -889,36 +904,36 @@ def GetSUDict(FullFileName):
                        where Model = %d or Model = %d\r
                    """ % (FileTable, DataClass.MODEL_IDENTIFIER_STRUCTURE, DataClass.MODEL_IDENTIFIER_UNION)\r
     ResultSet = Db.TblFile.Exec(SqlStatement)\r
-    \r
+\r
     Dict = {}\r
     for Result in ResultSet:\r
         if len(Result[1]) > 0:\r
             Dict[Result[0]] = Result[1]\r
-        \r
+\r
     IncludeFileList = GetAllIncludeFiles(FullFileName)\r
     for F in IncludeFileList:\r
         FileID = GetTableID(F)\r
         if FileID < 0:\r
             continue\r
-    \r
+\r
         FileTable = 'Identifier' + str(FileID)\r
         SqlStatement = """ select Name, Value, ID\r
                        from %s\r
                        where Model = %d or Model = %d\r
                    """ % (FileTable, DataClass.MODEL_IDENTIFIER_STRUCTURE, DataClass.MODEL_IDENTIFIER_UNION)\r
         ResultSet = Db.TblFile.Exec(SqlStatement)\r
-    \r
+\r
         for Result in ResultSet:\r
             if len(Result[1]) > 0:\r
                 Dict[Result[0]] = Result[1]\r
-                \r
+\r
     SUDict[FullFileName] = Dict\r
     return Dict\r
 \r
 def StripComments(Str):\r
     Str += '   '\r
     ListFromStr = list(Str)\r
-    \r
+\r
     InComment = False\r
     DoubleSlashComment = False\r
     Index = 0\r
@@ -944,7 +959,7 @@ def StripComments(Str):
         elif ListFromStr[Index] == '/' and ListFromStr[Index+1] == '/' and ListFromStr[Index+2] != '\n':\r
             InComment = True\r
             DoubleSlashComment = True\r
-        \r
+\r
         # check for /* comment start\r
         elif ListFromStr[Index] == '/' and ListFromStr[Index+1] == '*':\r
             ListFromStr[Index] = ' '\r
@@ -958,7 +973,7 @@ def StripComments(Str):
     # restore from List to String\r
     Str = "".join(ListFromStr)\r
     Str = Str.rstrip(' ')\r
-             \r
+\r
     return Str\r
 \r
 def GetFinalTypeValue(Type, FieldName, TypedefDict, SUDict):\r
@@ -967,7 +982,7 @@ def GetFinalTypeValue(Type, FieldName, TypedefDict, SUDict):
         Value = SUDict.get(Type)\r
     if Value == None:\r
         return None\r
-    \r
+\r
     LBPos = Value.find('{')\r
     while LBPos == -1:\r
         FTList = Value.split()\r
@@ -977,12 +992,12 @@ def GetFinalTypeValue(Type, FieldName, TypedefDict, SUDict):
                 if Value == None:\r
                     Value = SUDict.get(FT)\r
                 break\r
-        \r
+\r
         if Value == None:\r
             return None\r
-     \r
+\r
         LBPos = Value.find('{')\r
-     \r
+\r
 #    RBPos = Value.find('}')\r
     Fields = Value[LBPos + 1:]\r
     Fields = StripComments(Fields)\r
@@ -997,13 +1012,13 @@ def GetFinalTypeValue(Type, FieldName, TypedefDict, SUDict):
                 Type = GetDataTypeFromModifier(Field[0:Index])\r
                 return Type.strip()\r
             else:\r
-            # For the condition that the field in struct is an array with [] sufixes...               \r
+            # For the condition that the field in struct is an array with [] sufixes...\r
                 if not Field[Index + len(FieldName)].isalnum():\r
                     Type = GetDataTypeFromModifier(Field[0:Index])\r
                     return Type.strip()\r
-                \r
+\r
     return None\r
-    \r
+\r
 def GetRealType(Type, TypedefDict, TargetType = None):\r
     if TargetType != None and Type == TargetType:\r
             return Type\r
@@ -1017,7 +1032,7 @@ def GetTypeInfo(RefList, Modifier, FullFileName, TargetType = None):
     TypedefDict = GetTypedefDict(FullFileName)\r
     SUDict = GetSUDict(FullFileName)\r
     Type = GetDataTypeFromModifier(Modifier).replace('*', '').strip()\r
-    \r
+\r
     Type = Type.split()[-1]\r
     Index = 0\r
     while Index < len(RefList):\r
@@ -1034,7 +1049,7 @@ def GetTypeInfo(RefList, Modifier, FullFileName, TargetType = None):
             if Type.find('*') != -1 and Index == len(RefList)-1:\r
                 return Type\r
             Type = FromType.split()[0]\r
-            \r
+\r
         Index += 1\r
 \r
     Type = GetRealType(Type, TypedefDict, TargetType)\r
@@ -1042,14 +1057,14 @@ def GetTypeInfo(RefList, Modifier, FullFileName, TargetType = None):
     return Type\r
 \r
 def GetVarInfo(PredVarList, FuncRecord, FullFileName, IsFuncCall = False, TargetType = None, StarList = None):\r
-    \r
+\r
     PredVar = PredVarList[0]\r
     FileID = GetTableID(FullFileName)\r
-    \r
+\r
     Db = GetDB()\r
     FileTable = 'Identifier' + str(FileID)\r
     # search variable in include files\r
-    \r
+\r
     # it is a function call, search function declarations and definitions\r
     if IsFuncCall:\r
         SqlStatement = """ select Modifier, ID\r
@@ -1057,65 +1072,65 @@ def GetVarInfo(PredVarList, FuncRecord, FullFileName, IsFuncCall = False, Target
                        where Model = %d and Value = \'%s\'\r
                    """ % (FileTable, DataClass.MODEL_IDENTIFIER_FUNCTION_DECLARATION, PredVar)\r
         ResultSet = Db.TblFile.Exec(SqlStatement)\r
-    \r
-        for Result in ResultSet:        \r
+\r
+        for Result in ResultSet:\r
             Type = GetDataTypeFromModifier(Result[0]).split()[-1]\r
             TypedefDict = GetTypedefDict(FullFileName)\r
             Type = GetRealType(Type, TypedefDict, TargetType)\r
             return Type\r
-        \r
+\r
         IncludeFileList = GetAllIncludeFiles(FullFileName)\r
         for F in IncludeFileList:\r
             FileID = GetTableID(F)\r
             if FileID < 0:\r
                 continue\r
-        \r
+\r
             FileTable = 'Identifier' + str(FileID)\r
             SqlStatement = """ select Modifier, ID\r
                            from %s\r
                            where Model = %d and Value = \'%s\'\r
                        """ % (FileTable, DataClass.MODEL_IDENTIFIER_FUNCTION_DECLARATION, PredVar)\r
             ResultSet = Db.TblFile.Exec(SqlStatement)\r
-    \r
+\r
             for Result in ResultSet:\r
                 Type = GetDataTypeFromModifier(Result[0]).split()[-1]\r
                 TypedefDict = GetTypedefDict(FullFileName)\r
                 Type = GetRealType(Type, TypedefDict, TargetType)\r
                 return Type\r
-    \r
+\r
         FileID = GetTableID(FullFileName)\r
         SqlStatement = """ select Modifier, ID\r
                        from Function\r
                        where BelongsToFile = %d and Name = \'%s\'\r
                    """ % (FileID, PredVar)\r
         ResultSet = Db.TblFile.Exec(SqlStatement)\r
-    \r
-        for Result in ResultSet:        \r
+\r
+        for Result in ResultSet:\r
             Type = GetDataTypeFromModifier(Result[0]).split()[-1]\r
             TypedefDict = GetTypedefDict(FullFileName)\r
             Type = GetRealType(Type, TypedefDict, TargetType)\r
             return Type\r
-        \r
+\r
         for F in IncludeFileList:\r
             FileID = GetTableID(F)\r
             if FileID < 0:\r
                 continue\r
-        \r
+\r
             FileTable = 'Identifier' + str(FileID)\r
             SqlStatement = """ select Modifier, ID\r
                            from Function\r
                            where BelongsToFile = %d and Name = \'%s\'\r
                        """ % (FileID, PredVar)\r
             ResultSet = Db.TblFile.Exec(SqlStatement)\r
-    \r
+\r
             for Result in ResultSet:\r
                 Type = GetDataTypeFromModifier(Result[0]).split()[-1]\r
                 TypedefDict = GetTypedefDict(FullFileName)\r
                 Type = GetRealType(Type, TypedefDict, TargetType)\r
                 return Type\r
-         \r
+\r
         return None\r
-       \r
+\r
     # really variable, search local variable first\r
     SqlStatement = """ select Modifier, ID\r
                        from %s\r
@@ -1141,7 +1156,7 @@ def GetVarInfo(PredVarList, FuncRecord, FullFileName, IsFuncCall = False, Target
             TypedefDict = GetTypedefDict(FullFileName)\r
             Type = GetRealType(Type, TypedefDict, TargetType)\r
             return Type\r
-                \r
+\r
     # search function parameters second\r
     ParamList = GetParamList(FuncRecord[2])\r
     for Param in ParamList:\r
@@ -1162,7 +1177,7 @@ def GetVarInfo(PredVarList, FuncRecord, FullFileName, IsFuncCall = False, Target
                 TypedefDict = GetTypedefDict(FullFileName)\r
                 Type = GetRealType(Type, TypedefDict, TargetType)\r
                 return Type\r
-          \r
+\r
     # search global variable next\r
     SqlStatement = """ select Modifier, ID\r
            from %s\r
@@ -1187,13 +1202,13 @@ def GetVarInfo(PredVarList, FuncRecord, FullFileName, IsFuncCall = False, Target
             TypedefDict = GetTypedefDict(FullFileName)\r
             Type = GetRealType(Type, TypedefDict, TargetType)\r
             return Type\r
-    \r
+\r
     IncludeFileList = GetAllIncludeFiles(FullFileName)\r
     for F in IncludeFileList:\r
         FileID = GetTableID(F)\r
         if FileID < 0:\r
             continue\r
-    \r
+\r
         FileTable = 'Identifier' + str(FileID)\r
         SqlStatement = """ select Modifier, ID\r
                        from %s\r
@@ -1219,16 +1234,26 @@ def GetVarInfo(PredVarList, FuncRecord, FullFileName, IsFuncCall = False, Target
                 Type = GetRealType(Type, TypedefDict, TargetType)\r
                 return Type\r
 \r
+def GetTypeFromArray(Type, Var):\r
+    Count = Var.count('[')\r
+\r
+    while Count > 0:\r
+        Type = Type.strip()\r
+        Type = Type.rstrip('*')\r
+        Count = Count - 1\r
+\r
+    return Type\r
+\r
 def CheckFuncLayoutReturnType(FullFileName):\r
     ErrorMsgList = []\r
-    \r
+\r
     FileID = GetTableID(FullFileName, ErrorMsgList)\r
     if FileID < 0:\r
         return ErrorMsgList\r
-    \r
+\r
     Db = GetDB()\r
     FileTable = 'Identifier' + str(FileID)\r
-    SqlStatement = """ select Modifier, ID, StartLine, StartColumn, EndLine, Value \r
+    SqlStatement = """ select Modifier, ID, StartLine, StartColumn, EndLine, Value\r
                        from %s\r
                        where Model = %d\r
                    """ % (FileTable, DataClass.MODEL_IDENTIFIER_FUNCTION_DECLARATION)\r
@@ -1242,10 +1267,10 @@ def CheckFuncLayoutReturnType(FullFileName):
         Index = Result[0].find(TypeStart)\r
         if Index != 0 or Result[3] != 0:\r
             PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_RETURN_TYPE, '[%s] Return Type should appear at the start of line' % FuncName, FileTable, Result[1])\r
-            \r
+\r
         if Result[2] == Result[4]:\r
             PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_RETURN_TYPE, '[%s] Return Type should appear on its own line' % FuncName, FileTable, Result[1])\r
-            \r
+\r
     SqlStatement = """ select Modifier, ID, StartLine, StartColumn, FunNameStartLine, Name\r
                        from Function\r
                        where BelongsToFile = %d\r
@@ -1260,17 +1285,17 @@ def CheckFuncLayoutReturnType(FullFileName):
         Index = Result[0].find(ReturnType)\r
         if Index != 0 or Result[3] != 0:\r
             PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_RETURN_TYPE, '[%s] Return Type should appear at the start of line' % FuncName, 'Function', Result[1])\r
-            \r
+\r
         if Result[2] == Result[4]:\r
             PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_RETURN_TYPE, '[%s] Return Type should appear on its own line' % FuncName, 'Function', Result[1])\r
-    \r
+\r
 def CheckFuncLayoutModifier(FullFileName):\r
     ErrorMsgList = []\r
-    \r
+\r
     FileID = GetTableID(FullFileName, ErrorMsgList)\r
     if FileID < 0:\r
         return ErrorMsgList\r
-    \r
+\r
     Db = GetDB()\r
     FileTable = 'Identifier' + str(FileID)\r
     SqlStatement = """ select Modifier, ID\r
@@ -1286,7 +1311,7 @@ def CheckFuncLayoutModifier(FullFileName):
         Index = Result[0].find(TypeStart)\r
         if Index != 0:\r
             PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_OPTIONAL_FUNCTIONAL_MODIFIER, '', FileTable, Result[1])\r
-            \r
+\r
     SqlStatement = """ select Modifier, ID\r
                        from Function\r
                        where BelongsToFile = %d\r
@@ -1309,7 +1334,7 @@ def CheckFuncLayoutName(FullFileName):
     FileID = GetTableID(FullFileName, ErrorMsgList)\r
     if FileID < 0:\r
         return ErrorMsgList\r
-    \r
+\r
     Db = GetDB()\r
     FileTable = 'Identifier' + str(FileID)\r
     SqlStatement = """ select Name, ID, EndColumn, Value\r
@@ -1331,14 +1356,14 @@ def CheckFuncLayoutName(FullFileName):
             if Param.StartLine <= StartLine:\r
                 PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_NAME, 'Parameter %s should be in its own line.' % Param.Name, FileTable, Result[1])\r
             if Param.StartLine - StartLine > 1:\r
-                PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_NAME, 'Empty line appears before Parameter %s.' % Param.Name, FileTable, Result[1])    \r
+                PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_NAME, 'Empty line appears before Parameter %s.' % Param.Name, FileTable, Result[1])\r
             if not Pattern.match(Param.Name) and not Param.Name in ParamIgnoreList and not EccGlobalData.gException.IsException(ERROR_NAMING_CONVENTION_CHECK_VARIABLE_NAME, Param.Name):\r
                 PrintErrorMsg(ERROR_NAMING_CONVENTION_CHECK_VARIABLE_NAME, 'Parameter [%s] NOT follow naming convention.' % Param.Name, FileTable, Result[1])\r
             StartLine = Param.StartLine\r
-            \r
+\r
         if not Result[0].endswith('\n  )') and not Result[0].endswith('\r  )'):\r
             PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_NAME, '\')\' should be on a new line and indented two spaces', FileTable, Result[1])\r
-            \r
+\r
     SqlStatement = """ select Modifier, ID, FunNameStartColumn, Name\r
                        from Function\r
                        where BelongsToFile = %d\r
@@ -1367,11 +1392,11 @@ def CheckFuncLayoutName(FullFileName):
 \r
 def CheckFuncLayoutPrototype(FullFileName):\r
     ErrorMsgList = []\r
-    \r
+\r
     FileID = GetTableID(FullFileName, ErrorMsgList)\r
     if FileID < 0:\r
         return ErrorMsgList\r
-    \r
+\r
     FileTable = 'Identifier' + str(FileID)\r
     Db = GetDB()\r
     SqlStatement = """ select Modifier, Header, Name, ID\r
@@ -1381,11 +1406,11 @@ def CheckFuncLayoutPrototype(FullFileName):
     ResultSet = Db.TblFile.Exec(SqlStatement)\r
     if len(ResultSet) == 0:\r
         return ErrorMsgList\r
-    \r
+\r
     FuncDefList = []\r
     for Result in ResultSet:\r
         FuncDefList.append(Result)\r
-        \r
+\r
     SqlStatement = """ select Modifier, Name, ID\r
                        from %s\r
                        where Model = %d\r
@@ -1394,7 +1419,7 @@ def CheckFuncLayoutPrototype(FullFileName):
     FuncDeclList = []\r
     for Result in ResultSet:\r
         FuncDeclList.append(Result)\r
-    \r
+\r
     UndeclFuncList = []\r
     for FuncDef in FuncDefList:\r
         FuncName = FuncDef[2].strip()\r
@@ -1409,26 +1434,26 @@ def CheckFuncLayoutPrototype(FullFileName):
                     PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE, 'Function [%s] modifier different with prototype.' % FuncName, 'Function', FuncDef[3])\r
                 ParamListOfDef = GetParamList(FuncDefHeader)\r
                 ParamListOfDecl = GetParamList(FuncDecl[1])\r
-                if len(ParamListOfDef) != len(ParamListOfDecl):\r
-                    PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE, 'Parameter number different.', 'Function', FuncDef[3])\r
+                if len(ParamListOfDef) != len(ParamListOfDecl) and not EccGlobalData.gException.IsException(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE_2, FuncName):\r
+                    PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE_2, 'Parameter number different in function [%s].' % FuncName, 'Function', FuncDef[3])\r
                     break\r
 \r
                 Index = 0\r
                 while Index < len(ParamListOfDef):\r
-                    if DiffModifier(ParamListOfDef[Index].Modifier, ParamListOfDecl[Index].Modifier):\r
-                        PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE, 'Parameter %s has different modifier with prototype.' % ParamListOfDef[Index].Name, 'Function', FuncDef[3])\r
+                    if DiffModifier(ParamListOfDef[Index].Modifier, ParamListOfDecl[Index].Modifier) and not EccGlobalData.gException.IsException(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE_3, FuncName):\r
+                        PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE_3, 'Parameter %s has different modifier with prototype in function [%s].' % (ParamListOfDef[Index].Name, FuncName), 'Function', FuncDef[3])\r
                     Index += 1\r
                 break\r
         else:\r
             UndeclFuncList.append(FuncDef)\r
-            \r
+\r
     IncludeFileList = GetAllIncludeFiles(FullFileName)\r
     FuncDeclList = []\r
     for F in IncludeFileList:\r
         FileID = GetTableID(F, ErrorMsgList)\r
         if FileID < 0:\r
             continue\r
-    \r
+\r
         FileTable = 'Identifier' + str(FileID)\r
         SqlStatement = """ select Modifier, Name, ID\r
                        from %s\r
@@ -1438,7 +1463,7 @@ def CheckFuncLayoutPrototype(FullFileName):
 \r
         for Result in ResultSet:\r
             FuncDeclList.append(Result)\r
-            \r
+\r
     for FuncDef in UndeclFuncList:\r
         FuncName = FuncDef[2].strip()\r
         FuncModifier = FuncDef[0]\r
@@ -1452,24 +1477,24 @@ def CheckFuncLayoutPrototype(FullFileName):
                     PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE, 'Function [%s] modifier different with prototype.' % FuncName, 'Function', FuncDef[3])\r
                 ParamListOfDef = GetParamList(FuncDefHeader)\r
                 ParamListOfDecl = GetParamList(FuncDecl[1])\r
-                if len(ParamListOfDef) != len(ParamListOfDecl):\r
-                    PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE, 'Parameter number different.', 'Function', FuncDef[3])\r
+                if len(ParamListOfDef) != len(ParamListOfDecl) and not EccGlobalData.gException.IsException(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE_2, FuncName):\r
+                    PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE_2, 'Parameter number different in function [%s].' % FuncName, 'Function', FuncDef[3])\r
                     break\r
 \r
                 Index = 0\r
                 while Index < len(ParamListOfDef):\r
-                    if DiffModifier(ParamListOfDef[Index].Modifier, ParamListOfDecl[Index].Modifier):\r
-                        PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE, 'Parameter %s has different modifier with prototype.' % ParamListOfDef[Index].Name, 'Function', FuncDef[3])\r
+                    if DiffModifier(ParamListOfDef[Index].Modifier, ParamListOfDecl[Index].Modifier) and not EccGlobalData.gException.IsException(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE_3, FuncName):\r
+                        PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE_3, 'Parameter %s has different modifier with prototype in function [%s].' % (ParamListOfDef[Index].Name, FuncName), 'Function', FuncDef[3])\r
                     Index += 1\r
                 break\r
-    \r
+\r
 def CheckFuncLayoutBody(FullFileName):\r
     ErrorMsgList = []\r
-    \r
+\r
     FileID = GetTableID(FullFileName, ErrorMsgList)\r
     if FileID < 0:\r
         return ErrorMsgList\r
-    \r
+\r
     FileTable = 'Identifier' + str(FileID)\r
     Db = GetDB()\r
     SqlStatement = """ select BodyStartColumn, EndColumn, ID\r
@@ -1487,11 +1512,11 @@ def CheckFuncLayoutBody(FullFileName):
 \r
 def CheckFuncLayoutLocalVariable(FullFileName):\r
     ErrorMsgList = []\r
-    \r
+\r
     FileID = GetTableID(FullFileName, ErrorMsgList)\r
     if FileID < 0:\r
         return ErrorMsgList\r
-    \r
+\r
     Db = GetDB()\r
     FileTable = 'Identifier' + str(FileID)\r
     SqlStatement = """ select ID\r
@@ -1504,7 +1529,7 @@ def CheckFuncLayoutLocalVariable(FullFileName):
     FL = []\r
     for Result in ResultSet:\r
         FL.append(Result)\r
-        \r
+\r
     for F in FL:\r
         SqlStatement = """ select Name, Value, ID\r
                        from %s\r
@@ -1513,21 +1538,21 @@ def CheckFuncLayoutLocalVariable(FullFileName):
         ResultSet = Db.TblFile.Exec(SqlStatement)\r
         if len(ResultSet) == 0:\r
             continue\r
-        \r
+\r
         for Result in ResultSet:\r
             if len(Result[1]) > 0:\r
                 PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_NO_INIT_OF_VARIABLE, 'Variable Name: %s' % Result[0], FileTable, Result[2])\r
-        \r
+\r
 def CheckMemberVariableFormat(Name, Value, FileTable, TdId, ModelId):\r
     ErrMsgList = []\r
     # Member variable format pattern.\r
     Pattern = re.compile(r'^[A-Z]+\S*[a-z]\S*$')\r
-    \r
+\r
     LBPos = Value.find('{')\r
     RBPos = Value.rfind('}')\r
     if LBPos == -1 or RBPos == -1:\r
         return ErrMsgList\r
-    \r
+\r
     Fields = Value[LBPos + 1 : RBPos]\r
     Fields = StripComments(Fields).strip()\r
     NestPos = Fields.find ('struct')\r
@@ -1548,7 +1573,7 @@ def CheckMemberVariableFormat(Name, Value, FileTable, TdId, ModelId):
             if not EccGlobalData.gException.IsException(ERROR_DECLARATION_DATA_TYPE_CHECK_NESTED_STRUCTURE, Name):\r
                 PrintErrorMsg(ERROR_DECLARATION_DATA_TYPE_CHECK_NESTED_STRUCTURE, 'Nested enum in [%s].' % (Name), FileTable, TdId)\r
             return ErrMsgList\r
-            \r
+\r
     if ModelId == DataClass.MODEL_IDENTIFIER_ENUMERATE:\r
         FieldsList = Fields.split(',')\r
         # deal with enum is pre-assigned a value by function call ( , , , ...)\r
@@ -1557,34 +1582,34 @@ def CheckMemberVariableFormat(Name, Value, FileTable, TdId, ModelId):
         RemoveCurrentElement = False\r
         while Index < len(FieldsList):\r
             Field = FieldsList[Index]\r
-                \r
+\r
             if Field.find('(') != -1:\r
                 QuoteCount += 1\r
                 RemoveCurrentElement = True\r
                 Index += 1\r
                 continue\r
-                \r
+\r
             if Field.find(')') != -1 and QuoteCount > 0:\r
                 QuoteCount -= 1\r
 \r
-            if RemoveCurrentElement:    \r
+            if RemoveCurrentElement:\r
                 FieldsList.remove(Field)\r
                 if QuoteCount == 0:\r
                     RemoveCurrentElement = False\r
                 continue\r
-                \r
+\r
             if QuoteCount == 0:\r
                 RemoveCurrentElement = False\r
-                \r
+\r
             Index += 1\r
     else:\r
         FieldsList = Fields.split(';')\r
-    \r
+\r
     for Field in FieldsList:\r
         Field = Field.strip()\r
         if Field == '':\r
             continue\r
-        # For the condition that the field in struct is an array with [] sufixes...               \r
+        # For the condition that the field in struct is an array with [] sufixes...\r
         if Field[-1] == ']':\r
             LBPos = Field.find('[')\r
             Field = Field[0:LBPos]\r
@@ -1592,26 +1617,26 @@ def CheckMemberVariableFormat(Name, Value, FileTable, TdId, ModelId):
         if Field.find(':') != -1:\r
             ColonPos = Field.find(':')\r
             Field = Field[0:ColonPos]\r
-            \r
+\r
         Field = Field.strip()\r
         if Field == '':\r
             continue\r
         # Enum could directly assign value to variable\r
         Field = Field.split('=')[0].strip()\r
-        TokenList = Field.split() \r
+        TokenList = Field.split()\r
         # Remove pointers before variable\r
         if not Pattern.match(TokenList[-1].lstrip('*')):\r
             ErrMsgList.append(TokenList[-1].lstrip('*'))\r
-        \r
+\r
     return ErrMsgList\r
 \r
 def CheckDeclTypedefFormat(FullFileName, ModelId):\r
     ErrorMsgList = []\r
-    \r
+\r
     FileID = GetTableID(FullFileName, ErrorMsgList)\r
     if FileID < 0:\r
         return ErrorMsgList\r
-    \r
+\r
     Db = GetDB()\r
     FileTable = 'Identifier' + str(FileID)\r
     SqlStatement = """ select Name, StartLine, EndLine, ID, Value\r
@@ -1622,7 +1647,7 @@ def CheckDeclTypedefFormat(FullFileName, ModelId):
     ResultList = []\r
     for Result in ResultSet:\r
         ResultList.append(Result)\r
-    \r
+\r
     ErrorType = ERROR_DECLARATION_DATA_TYPE_CHECK_ALL\r
     if ModelId == DataClass.MODEL_IDENTIFIER_STRUCTURE:\r
         ErrorType = ERROR_DECLARATION_DATA_TYPE_CHECK_STRUCTURE_DECLARATION\r
@@ -1630,7 +1655,7 @@ def CheckDeclTypedefFormat(FullFileName, ModelId):
         ErrorType = ERROR_DECLARATION_DATA_TYPE_CHECK_ENUMERATED_TYPE\r
     elif ModelId == DataClass.MODEL_IDENTIFIER_UNION:\r
         ErrorType = ERROR_DECLARATION_DATA_TYPE_CHECK_UNION_TYPE\r
-    \r
+\r
     SqlStatement = """ select Modifier, Name, Value, StartLine, EndLine, ID\r
                        from %s\r
                        where Model = %d\r
@@ -1651,7 +1676,7 @@ def CheckDeclTypedefFormat(FullFileName, ModelId):
             ValueModelId = DataClass.MODEL_IDENTIFIER_UNION\r
         else:\r
             continue\r
-        \r
+\r
         if ValueModelId != ModelId:\r
             continue\r
         # Check member variable format.\r
@@ -1660,7 +1685,7 @@ def CheckDeclTypedefFormat(FullFileName, ModelId):
             if EccGlobalData.gException.IsException(ERROR_NAMING_CONVENTION_CHECK_VARIABLE_NAME, Name+'.'+ErrMsg):\r
                 continue\r
             PrintErrorMsg(ERROR_NAMING_CONVENTION_CHECK_VARIABLE_NAME, 'Member variable [%s] NOT follow naming convention.' % (Name+'.'+ErrMsg), FileTable, Td[5])\r
-    \r
+\r
     # First check in current file to see whether struct/union/enum is typedef-ed.\r
     UntypedefedList = []\r
     for Result in ResultList:\r
@@ -1675,7 +1700,7 @@ def CheckDeclTypedefFormat(FullFileName, ModelId):
             ValueModelId = DataClass.MODEL_IDENTIFIER_UNION\r
         else:\r
             continue\r
-        \r
+\r
         if ValueModelId != ModelId:\r
             continue\r
         ErrMsgList = CheckMemberVariableFormat(Name, Value, FileTable, Result[3], ModelId)\r
@@ -1699,21 +1724,21 @@ def CheckDeclTypedefFormat(FullFileName, ModelId):
                     PrintErrorMsg(ErrorType, 'Typedef should be UPPER case', FileTable, Td[5])\r
             if Found:\r
                 break\r
-        \r
+\r
         if not Found:\r
             UntypedefedList.append(Result)\r
             continue\r
-    \r
+\r
     if len(UntypedefedList) == 0:\r
         return\r
-    \r
+\r
     IncludeFileList = GetAllIncludeFiles(FullFileName)\r
     TdList = []\r
     for F in IncludeFileList:\r
         FileID = GetTableID(F, ErrorMsgList)\r
         if FileID < 0:\r
             continue\r
-    \r
+\r
         IncludeFileTable = 'Identifier' + str(FileID)\r
         SqlStatement = """ select Modifier, Name, Value, StartLine, EndLine, ID\r
                        from %s\r
@@ -1721,13 +1746,13 @@ def CheckDeclTypedefFormat(FullFileName, ModelId):
                    """ % (IncludeFileTable, DataClass.MODEL_IDENTIFIER_TYPEDEF)\r
         ResultSet = Db.TblFile.Exec(SqlStatement)\r
         TdList.extend(ResultSet)\r
-            \r
+\r
     for Result in UntypedefedList:\r
-        \r
+\r
         # Check whether it is typedefed.\r
         Found = False\r
         for Td in TdList:\r
-            \r
+\r
             if len(Td[0]) > 0:\r
                 continue\r
             if Result[1] >= Td[3] and Td[4] >= Result[2]:\r
@@ -1740,27 +1765,27 @@ def CheckDeclTypedefFormat(FullFileName, ModelId):
                     PrintErrorMsg(ErrorType, 'Typedef should be UPPER case', FileTable, Td[5])\r
             if Found:\r
                 break\r
-                    \r
+\r
         if not Found:\r
             PrintErrorMsg(ErrorType, 'No Typedef for %s' % Result[0], FileTable, Result[3])\r
             continue\r
-                \r
+\r
 def CheckDeclStructTypedef(FullFileName):\r
     CheckDeclTypedefFormat(FullFileName, DataClass.MODEL_IDENTIFIER_STRUCTURE)\r
 \r
 def CheckDeclEnumTypedef(FullFileName):\r
     CheckDeclTypedefFormat(FullFileName, DataClass.MODEL_IDENTIFIER_ENUMERATE)\r
-    \r
+\r
 def CheckDeclUnionTypedef(FullFileName):\r
     CheckDeclTypedefFormat(FullFileName, DataClass.MODEL_IDENTIFIER_UNION)\r
 \r
 def CheckDeclArgModifier(FullFileName):\r
     ErrorMsgList = []\r
-    \r
+\r
     FileID = GetTableID(FullFileName, ErrorMsgList)\r
     if FileID < 0:\r
         return ErrorMsgList\r
-    \r
+\r
     Db = GetDB()\r
     FileTable = 'Identifier' + str(FileID)\r
     SqlStatement = """ select Modifier, Name, ID\r
@@ -1775,7 +1800,7 @@ def CheckDeclArgModifier(FullFileName):
             if PatternInModifier(Result[0], Modifier) and len(Result[0]) < MAX_MODIFIER_LENGTH:\r
                 PrintErrorMsg(ERROR_DECLARATION_DATA_TYPE_CHECK_IN_OUT_MODIFIER, 'Variable Modifier %s' % Result[0], FileTable, Result[2])\r
                 break\r
-    \r
+\r
     SqlStatement = """ select Modifier, Name, ID\r
                        from %s\r
                        where Model = %d\r
@@ -1786,7 +1811,7 @@ def CheckDeclArgModifier(FullFileName):
             if PatternInModifier(Result[0], Modifier):\r
                 PrintErrorMsg(ERROR_DECLARATION_DATA_TYPE_CHECK_IN_OUT_MODIFIER, 'Return Type Modifier %s' % Result[0], FileTable, Result[2])\r
                 break\r
-                    \r
+\r
     SqlStatement = """ select Modifier, Header, ID\r
                        from Function\r
                        where BelongsToFile = %d\r
@@ -1800,11 +1825,11 @@ def CheckDeclArgModifier(FullFileName):
 \r
 def CheckDeclNoUseCType(FullFileName):\r
     ErrorMsgList = []\r
-    \r
+\r
     FileID = GetTableID(FullFileName, ErrorMsgList)\r
     if FileID < 0:\r
         return ErrorMsgList\r
-    \r
+\r
     Db = GetDB()\r
     FileTable = 'Identifier' + str(FileID)\r
     SqlStatement = """ select Modifier, Name, ID\r
@@ -1818,7 +1843,7 @@ def CheckDeclNoUseCType(FullFileName):
             if PatternInModifier(Result[0], Type):\r
                 PrintErrorMsg(ERROR_DECLARATION_DATA_TYPE_CHECK_NO_USE_C_TYPE, 'Variable type %s' % Type, FileTable, Result[2])\r
                 break\r
-    \r
+\r
     SqlStatement = """ select Modifier, Name, ID, Value\r
                        from %s\r
                        where Model = %d\r
@@ -1832,11 +1857,11 @@ def CheckDeclNoUseCType(FullFileName):
         for Type in CTypeTuple:\r
             if PatternInModifier(Result[0], Type):\r
                 PrintErrorMsg(ERROR_DECLARATION_DATA_TYPE_CHECK_NO_USE_C_TYPE, '%s Return type %s' % (FuncName, Result[0]), FileTable, Result[2])\r
-            \r
+\r
             for Param in ParamList:\r
                 if PatternInModifier(Param.Modifier, Type):\r
                     PrintErrorMsg(ERROR_DECLARATION_DATA_TYPE_CHECK_NO_USE_C_TYPE, 'Parameter %s' % Param.Name, FileTable, Result[2])\r
-                    \r
+\r
     SqlStatement = """ select Modifier, Header, ID, Name\r
                        from Function\r
                        where BelongsToFile = %d\r
@@ -1850,22 +1875,22 @@ def CheckDeclNoUseCType(FullFileName):
         for Type in CTypeTuple:\r
             if PatternInModifier(Result[0], Type):\r
                 PrintErrorMsg(ERROR_DECLARATION_DATA_TYPE_CHECK_NO_USE_C_TYPE, '[%s] Return type %s' % (FuncName, Result[0]), FileTable, Result[2])\r
-            \r
+\r
             for Param in ParamList:\r
                 if PatternInModifier(Param.Modifier, Type):\r
                     PrintErrorMsg(ERROR_DECLARATION_DATA_TYPE_CHECK_NO_USE_C_TYPE, 'Parameter %s' % Param.Name, FileTable, Result[2])\r
-            \r
+\r
 \r
 def CheckPointerNullComparison(FullFileName):\r
     ErrorMsgList = []\r
-    \r
+\r
     FileID = GetTableID(FullFileName, ErrorMsgList)\r
     if FileID < 0:\r
         return ErrorMsgList\r
-    \r
+\r
     # cache the found function return type to accelerate later checking in this file.\r
     FuncReturnTypeDict = {}\r
-    \r
+\r
     Db = GetDB()\r
     FileTable = 'Identifier' + str(FileID)\r
     SqlStatement = """ select Value, StartLine, ID\r
@@ -1878,7 +1903,7 @@ def CheckPointerNullComparison(FullFileName):
     PSL = []\r
     for Result in ResultSet:\r
         PSL.append([Result[0], Result[1], Result[2]])\r
-    \r
+\r
     SqlStatement = """ select BodyStartLine, EndLine, Header, Modifier, ID\r
                        from Function\r
                        where BelongsToFile = %d\r
@@ -1887,13 +1912,13 @@ def CheckPointerNullComparison(FullFileName):
     FL = []\r
     for Result in ResultSet:\r
         FL.append([Result[0], Result[1], Result[2], Result[3], Result[4]])\r
-    \r
+\r
     p = GetFuncDeclPattern()\r
     for Str in PSL:\r
         FuncRecord = GetFuncContainsPE(Str[1], FL)\r
         if FuncRecord == None:\r
             continue\r
-        \r
+\r
         for Exp in GetPredicateListFromPredicateExpStr(Str[0]):\r
             PredInfo = SplitPredicateStr(Exp)\r
             if PredInfo[1] == None:\r
@@ -1906,9 +1931,9 @@ def CheckPointerNullComparison(FullFileName):
                     PredVarStr = PredVarStr[0:PredVarStr.find('(')]\r
                     SearchInCache = True\r
                     # Only direct function call using IsFuncCall branch. Multi-level ref. function call is considered a variable.\r
-                    if TmpStr.startswith(PredVarStr):    \r
+                    if TmpStr.startswith(PredVarStr):\r
                         IsFuncCall = True\r
-                    \r
+\r
                 if PredVarStr.strip() in IgnoredKeywordList:\r
                     continue\r
                 StarList = []\r
@@ -1922,28 +1947,29 @@ def CheckPointerNullComparison(FullFileName):
                         if Type.find('*') != -1:\r
                             PrintErrorMsg(ERROR_PREDICATE_EXPRESSION_CHECK_COMPARISON_NULL_TYPE, 'Predicate Expression: %s' % Exp, FileTable, Str[2])\r
                         continue\r
-                    \r
+\r
                     if PredVarStr in FuncReturnTypeDict:\r
                         continue\r
-                \r
+\r
                 Type = GetVarInfo(PredVarList, FuncRecord, FullFileName, IsFuncCall, None, StarList)\r
                 if SearchInCache:\r
                     FuncReturnTypeDict[PredVarStr] = Type\r
                 if Type == None:\r
                     continue\r
+                Type = GetTypeFromArray(Type, PredVarStr)\r
                 if Type.find('*') != -1:\r
                     PrintErrorMsg(ERROR_PREDICATE_EXPRESSION_CHECK_COMPARISON_NULL_TYPE, 'Predicate Expression: %s' % Exp, FileTable, Str[2])\r
 \r
 def CheckNonBooleanValueComparison(FullFileName):\r
     ErrorMsgList = []\r
-    \r
+\r
     FileID = GetTableID(FullFileName, ErrorMsgList)\r
     if FileID < 0:\r
         return ErrorMsgList\r
-    \r
+\r
     # cache the found function return type to accelerate later checking in this file.\r
     FuncReturnTypeDict = {}\r
-    \r
+\r
     Db = GetDB()\r
     FileTable = 'Identifier' + str(FileID)\r
     SqlStatement = """ select Value, StartLine, ID\r
@@ -1956,7 +1982,7 @@ def CheckNonBooleanValueComparison(FullFileName):
     PSL = []\r
     for Result in ResultSet:\r
         PSL.append([Result[0], Result[1], Result[2]])\r
-    \r
+\r
     SqlStatement = """ select BodyStartLine, EndLine, Header, Modifier, ID\r
                        from Function\r
                        where BelongsToFile = %d\r
@@ -1965,13 +1991,13 @@ def CheckNonBooleanValueComparison(FullFileName):
     FL = []\r
     for Result in ResultSet:\r
         FL.append([Result[0], Result[1], Result[2], Result[3], Result[4]])\r
-    \r
+\r
     p = GetFuncDeclPattern()\r
     for Str in PSL:\r
         FuncRecord = GetFuncContainsPE(Str[1], FL)\r
         if FuncRecord == None:\r
             continue\r
-        \r
+\r
         for Exp in GetPredicateListFromPredicateExpStr(Str[0]):\r
 #            if p.match(Exp):\r
 #                continue\r
@@ -1986,9 +2012,9 @@ def CheckNonBooleanValueComparison(FullFileName):
                     PredVarStr = PredVarStr[0:PredVarStr.find('(')]\r
                     SearchInCache = True\r
                     # Only direct function call using IsFuncCall branch. Multi-level ref. function call is considered a variable.\r
-                    if TmpStr.startswith(PredVarStr):    \r
+                    if TmpStr.startswith(PredVarStr):\r
                         IsFuncCall = True\r
-                    \r
+\r
                 if PredVarStr.strip() in IgnoredKeywordList:\r
                     continue\r
                 StarList = []\r
@@ -1996,17 +2022,17 @@ def CheckNonBooleanValueComparison(FullFileName):
                 # No variable found, maybe value first? like (0 == VarName)\r
                 if len(PredVarList) == 0:\r
                     continue\r
-                   \r
+\r
                 if SearchInCache:\r
                     Type = FuncReturnTypeDict.get(PredVarStr)\r
                     if Type != None:\r
                         if Type.find('BOOLEAN') == -1:\r
                             PrintErrorMsg(ERROR_PREDICATE_EXPRESSION_CHECK_NO_BOOLEAN_OPERATOR, 'Predicate Expression: %s' % Exp, FileTable, Str[2])\r
                         continue\r
-                    \r
+\r
                     if PredVarStr in FuncReturnTypeDict:\r
                         continue\r
-                    \r
+\r
                 Type = GetVarInfo(PredVarList, FuncRecord, FullFileName, IsFuncCall, 'BOOLEAN', StarList)\r
                 if SearchInCache:\r
                     FuncReturnTypeDict[PredVarStr] = Type\r
@@ -2014,18 +2040,18 @@ def CheckNonBooleanValueComparison(FullFileName):
                     continue\r
                 if Type.find('BOOLEAN') == -1:\r
                     PrintErrorMsg(ERROR_PREDICATE_EXPRESSION_CHECK_NO_BOOLEAN_OPERATOR, 'Predicate Expression: %s' % Exp, FileTable, Str[2])\r
-            \r
+\r
 \r
 def CheckBooleanValueComparison(FullFileName):\r
     ErrorMsgList = []\r
-    \r
+\r
     FileID = GetTableID(FullFileName, ErrorMsgList)\r
     if FileID < 0:\r
         return ErrorMsgList\r
-    \r
+\r
     # cache the found function return type to accelerate later checking in this file.\r
     FuncReturnTypeDict = {}\r
-    \r
+\r
     Db = GetDB()\r
     FileTable = 'Identifier' + str(FileID)\r
     SqlStatement = """ select Value, StartLine, ID\r
@@ -2038,7 +2064,7 @@ def CheckBooleanValueComparison(FullFileName):
     PSL = []\r
     for Result in ResultSet:\r
         PSL.append([Result[0], Result[1], Result[2]])\r
-    \r
+\r
     SqlStatement = """ select BodyStartLine, EndLine, Header, Modifier, ID\r
                        from Function\r
                        where BelongsToFile = %d\r
@@ -2047,13 +2073,13 @@ def CheckBooleanValueComparison(FullFileName):
     FL = []\r
     for Result in ResultSet:\r
         FL.append([Result[0], Result[1], Result[2], Result[3], Result[4]])\r
-    \r
+\r
     p = GetFuncDeclPattern()\r
     for Str in PSL:\r
         FuncRecord = GetFuncContainsPE(Str[1], FL)\r
         if FuncRecord == None:\r
             continue\r
-        \r
+\r
         for Exp in GetPredicateListFromPredicateExpStr(Str[0]):\r
             PredInfo = SplitPredicateStr(Exp)\r
             if PredInfo[1] in ('==', '!=') and PredInfo[0][1] in ('TRUE', 'FALSE'):\r
@@ -2066,9 +2092,9 @@ def CheckBooleanValueComparison(FullFileName):
                     PredVarStr = PredVarStr[0:PredVarStr.find('(')]\r
                     SearchInCache = True\r
                     # Only direct function call using IsFuncCall branch. Multi-level ref. function call is considered a variable.\r
-                    if TmpStr.startswith(PredVarStr):    \r
+                    if TmpStr.startswith(PredVarStr):\r
                         IsFuncCall = True\r
-                    \r
+\r
                 if PredVarStr.strip() in IgnoredKeywordList:\r
                     continue\r
                 StarList = []\r
@@ -2076,17 +2102,17 @@ def CheckBooleanValueComparison(FullFileName):
                 # No variable found, maybe value first? like (0 == VarName)\r
                 if len(PredVarList) == 0:\r
                     continue\r
-          \r
+\r
                 if SearchInCache:\r
                     Type = FuncReturnTypeDict.get(PredVarStr)\r
                     if Type != None:\r
                         if Type.find('BOOLEAN') != -1:\r
                             PrintErrorMsg(ERROR_PREDICATE_EXPRESSION_CHECK_BOOLEAN_VALUE, 'Predicate Expression: %s' % Exp, FileTable, Str[2])\r
                         continue\r
-                    \r
+\r
                     if PredVarStr in FuncReturnTypeDict:\r
                         continue\r
-                \r
+\r
                 Type = GetVarInfo(PredVarList, FuncRecord, FullFileName, IsFuncCall, 'BOOLEAN', StarList)\r
                 if SearchInCache:\r
                     FuncReturnTypeDict[PredVarStr] = Type\r
@@ -2094,15 +2120,15 @@ def CheckBooleanValueComparison(FullFileName):
                     continue\r
                 if Type.find('BOOLEAN') != -1:\r
                     PrintErrorMsg(ERROR_PREDICATE_EXPRESSION_CHECK_BOOLEAN_VALUE, 'Predicate Expression: %s' % Exp, FileTable, Str[2])\r
-                \r
+\r
 \r
 def CheckHeaderFileData(FullFileName):\r
     ErrorMsgList = []\r
-    \r
+\r
     FileID = GetTableID(FullFileName, ErrorMsgList)\r
     if FileID < 0:\r
         return ErrorMsgList\r
-    \r
+\r
     Db = GetDB()\r
     FileTable = 'Identifier' + str(FileID)\r
     SqlStatement = """ select ID, Modifier\r
@@ -2113,7 +2139,7 @@ def CheckHeaderFileData(FullFileName):
     for Result in ResultSet:\r
         if not Result[1].startswith('extern'):\r
             PrintErrorMsg(ERROR_INCLUDE_FILE_CHECK_DATA, 'Variable definition appears in header file', FileTable, Result[0])\r
-        \r
+\r
     SqlStatement = """ select ID\r
                        from Function\r
                        where BelongsToFile = %d\r
@@ -2126,11 +2152,11 @@ def CheckHeaderFileData(FullFileName):
 \r
 def CheckHeaderFileIfndef(FullFileName):\r
     ErrorMsgList = []\r
-    \r
+\r
     FileID = GetTableID(FullFileName, ErrorMsgList)\r
     if FileID < 0:\r
         return ErrorMsgList\r
-    \r
+\r
     Db = GetDB()\r
     FileTable = 'Identifier' + str(FileID)\r
     SqlStatement = """ select Value, StartLine\r
@@ -2151,7 +2177,7 @@ def CheckHeaderFileIfndef(FullFileName):
             if not Result[0].startswith('/*') and not Result[0].startswith('//'):\r
                 PrintErrorMsg(ERROR_INCLUDE_FILE_CHECK_IFNDEF_STATEMENT_2, '', 'File', FileID)\r
         break\r
-    \r
+\r
     SqlStatement = """ select Value\r
                        from %s\r
                        where StartLine > (select max(EndLine) from %s where Model = %d)\r
@@ -2164,11 +2190,11 @@ def CheckHeaderFileIfndef(FullFileName):
 \r
 def CheckDoxygenCommand(FullFileName):\r
     ErrorMsgList = []\r
-    \r
+\r
     FileID = GetTableID(FullFileName, ErrorMsgList)\r
     if FileID < 0:\r
         return ErrorMsgList\r
-    \r
+\r
     Db = GetDB()\r
     FileTable = 'Identifier' + str(FileID)\r
     SqlStatement = """ select Value, ID\r
@@ -2198,17 +2224,17 @@ def CheckDoxygenCommand(FullFileName):
                     RealCmd = Part[1:Index]\r
                     if RealCmd not in DoxygenCommandList:\r
                         PrintErrorMsg(ERROR_DOXYGEN_CHECK_COMMAND, 'Unknown doxygen command %s' % Part, FileTable, Result[1])\r
-        \r
-    \r
+\r
+\r
 def CheckDoxygenTripleForwardSlash(FullFileName):\r
     ErrorMsgList = []\r
-    \r
+\r
     FileID = GetTableID(FullFileName, ErrorMsgList)\r
     if FileID < 0:\r
         return ErrorMsgList\r
-    \r
+\r
     Db = GetDB()\r
-    \r
+\r
     SqlStatement = """ select ID, BodyStartLine, BodyStartColumn, EndLine, EndColumn\r
                        from Function\r
                        where BelongsToFile = %d\r
@@ -2216,17 +2242,17 @@ def CheckDoxygenTripleForwardSlash(FullFileName):
     ResultSet = Db.TblFile.Exec(SqlStatement)\r
     if len(ResultSet) == 0:\r
         return\r
-    \r
-    FuncDefSet = []    \r
+\r
+    FuncDefSet = []\r
     for Result in ResultSet:\r
         FuncDefSet.append(Result)\r
-    \r
-    \r
+\r
+\r
     FileTable = 'Identifier' + str(FileID)\r
     SqlStatement = """ select Value, ID, StartLine, StartColumn, EndLine, EndColumn\r
                        from %s\r
-                       where Model = %d \r
-                       \r
+                       where Model = %d\r
+\r
                    """ % (FileTable, DataClass.MODEL_IDENTIFIER_COMMENT)\r
     ResultSet = Db.TblFile.Exec(SqlStatement)\r
     CommentSet = []\r
@@ -2235,8 +2261,8 @@ def CheckDoxygenTripleForwardSlash(FullFileName):
             CommentSet.append(Result)\r
     except:\r
         print 'Unrecognized chars in comment of file %s', FullFileName\r
-    \r
-    \r
+\r
+\r
     for Result in CommentSet:\r
         CommentStr = Result[0]\r
         StartLine = Result[2]\r
@@ -2245,7 +2271,7 @@ def CheckDoxygenTripleForwardSlash(FullFileName):
         EndColumn = Result[5]\r
         if not CommentStr.startswith('///<'):\r
             continue\r
-        \r
+\r
         Found = False\r
         for FuncDef in FuncDefSet:\r
             if StartLine == FuncDef[1] and StartColumn > FuncDef[2] and EndLine == FuncDef[3] and EndColumn < FuncDef[4]:\r
@@ -2266,11 +2292,11 @@ def CheckDoxygenTripleForwardSlash(FullFileName):
 \r
 def CheckFileHeaderDoxygenComments(FullFileName):\r
     ErrorMsgList = []\r
-    \r
+\r
     FileID = GetTableID(FullFileName, ErrorMsgList)\r
     if FileID < 0:\r
         return ErrorMsgList\r
-    \r
+\r
     Db = GetDB()\r
     FileTable = 'Identifier' + str(FileID)\r
     SqlStatement = """ select Value, ID\r
@@ -2281,7 +2307,7 @@ def CheckFileHeaderDoxygenComments(FullFileName):
     if len(ResultSet) == 0:\r
         PrintErrorMsg(ERROR_HEADER_CHECK_FILE, 'No Comment appear at the very beginning of file.', 'File', FileID)\r
         return ErrorMsgList\r
-    \r
+\r
     for Result in ResultSet:\r
         CommentStr = Result[0]\r
         if not CommentStr.startswith('/** @file'):\r
@@ -2293,18 +2319,18 @@ def CheckFileHeaderDoxygenComments(FullFileName):
 \r
 def CheckFuncHeaderDoxygenComments(FullFileName):\r
     ErrorMsgList = []\r
-    \r
+\r
     FileID = GetTableID(FullFileName, ErrorMsgList)\r
     if FileID < 0:\r
         return ErrorMsgList\r
-    \r
+\r
     Db = GetDB()\r
     FileTable = 'Identifier' + str(FileID)\r
     SqlStatement = """ select Value, StartLine, EndLine, ID\r
                        from %s\r
                        where Model = %d\r
                    """ % (FileTable, DataClass.MODEL_IDENTIFIER_COMMENT)\r
-    \r
+\r
     ResultSet = Db.TblFile.Exec(SqlStatement)\r
     CommentSet = []\r
     try:\r
@@ -2312,7 +2338,7 @@ def CheckFuncHeaderDoxygenComments(FullFileName):
             CommentSet.append(Result)\r
     except:\r
         print 'Unrecognized chars in comment of file %s', FullFileName\r
-    \r
+\r
     # Func Decl check\r
     SqlStatement = """ select Modifier, Name, StartLine, ID, Value\r
                        from %s\r
@@ -2329,13 +2355,13 @@ def CheckFuncHeaderDoxygenComments(FullFileName):
                 continue\r
             ErrorMsgList.append('Line %d :Function %s has NO comment immediately preceding it.' % (Result[2], Result[1]))\r
             PrintErrorMsg(ERROR_HEADER_CHECK_FUNCTION, 'Function [%s] has NO comment immediately preceding it.' % (FuncName), FileTable, Result[3])\r
-    \r
+\r
     # Func Def check\r
     SqlStatement = """ select Value, StartLine, EndLine, ID\r
                        from %s\r
                        where Model = %d\r
                    """ % (FileTable, DataClass.MODEL_IDENTIFIER_FUNCTION_HEADER)\r
-    \r
+\r
     ResultSet = Db.TblFile.Exec(SqlStatement)\r
     CommentSet = []\r
     try:\r
@@ -2343,7 +2369,7 @@ def CheckFuncHeaderDoxygenComments(FullFileName):
             CommentSet.append(Result)\r
     except:\r
         print 'Unrecognized chars in comment of file %s', FullFileName\r
-    \r
+\r
     SqlStatement = """ select Modifier, Header, StartLine, ID, Name\r
                        from Function\r
                        where BelongsToFile = %d\r
@@ -2376,9 +2402,9 @@ def GetDoxygenStrFromComment(Str):
         while i < len(ParamTagList):\r
             DoxygenStrList.append('@param' + ParamTagList[i])\r
             i += 1\r
-    \r
+\r
     Str = ParamTagList[0]\r
-            \r
+\r
     RetvalTagList = ParamTagList[-1].split('@retval')\r
     if len(RetvalTagList) > 1:\r
         if len(ParamTagList) > 1:\r
@@ -2387,7 +2413,7 @@ def GetDoxygenStrFromComment(Str):
         while i < len(RetvalTagList):\r
             DoxygenStrList.append('@retval' + RetvalTagList[i])\r
             i += 1\r
-    \r
+\r
     ReturnTagList = RetvalTagList[-1].split('@return')\r
     if len(ReturnTagList) > 1:\r
         if len(RetvalTagList) > 1:\r
@@ -2398,12 +2424,12 @@ def GetDoxygenStrFromComment(Str):
         while i < len(ReturnTagList):\r
             DoxygenStrList.append('@return' + ReturnTagList[i])\r
             i += 1\r
-    \r
+\r
     if len(DoxygenStrList) > 0:\r
         DoxygenStrList[-1] = DoxygenStrList[-1].rstrip('--*/')\r
-    \r
+\r
     return DoxygenStrList\r
-    \r
+\r
 def CheckGeneralDoxygenCommentLayout(Str, StartLine, ErrorMsgList, CommentId = -1, TableName = ''):\r
     #/** --*/ @retval after @param\r
     if not Str.startswith('/**'):\r
@@ -2417,10 +2443,10 @@ def CheckGeneralDoxygenCommentLayout(Str, StartLine, ErrorMsgList, CommentId = -
     if (FirstRetvalIndex > 0) and (LastParamIndex > 0) and (FirstRetvalIndex < LastParamIndex):\r
         ErrorMsgList.append('Line %d : @retval appear before @param ' % StartLine)\r
         PrintErrorMsg(ERROR_DOXYGEN_CHECK_FUNCTION_HEADER, 'in Comment, @retval appear before @param  ', TableName, CommentId)\r
-    \r
+\r
 def CheckFunctionHeaderConsistentWithDoxygenComment(FuncModifier, FuncHeader, FuncStartLine, CommentStr, CommentStartLine, ErrorMsgList, CommentId = -1, TableName = ''):\r
-    \r
-    ParamList = GetParamList(FuncHeader) \r
+\r
+    ParamList = GetParamList(FuncHeader)\r
     CheckGeneralDoxygenCommentLayout(CommentStr, CommentStartLine, ErrorMsgList, CommentId, TableName)\r
     DescriptionStr = CommentStr\r
     DoxygenStrList = GetDoxygenStrFromComment(DescriptionStr)\r
@@ -2456,32 +2482,32 @@ def CheckFunctionHeaderConsistentWithDoxygenComment(FuncModifier, FuncHeader, Fu
                     if Part.strip() == 'IN':\r
                         InOutStr += 'in'\r
                     if Part.strip() == 'OUT':\r
-                        if InOutStr != '':    \r
+                        if InOutStr != '':\r
                             InOutStr += ', out'\r
                         else:\r
                             InOutStr = 'out'\r
-                \r
+\r
                 if InOutStr != '':\r
                     if Tag.find('['+InOutStr+']') == -1:\r
-                        ErrorMsgList.append('Line %d : in Comment, \"%s\" does NOT have %s ' % (CommentStartLine, (TagPartList[0] + ' ' +TagPartList[1]).replace('\n', '').replace('\r', ''), '['+InOutStr+']'))    \r
+                        ErrorMsgList.append('Line %d : in Comment, \"%s\" does NOT have %s ' % (CommentStartLine, (TagPartList[0] + ' ' +TagPartList[1]).replace('\n', '').replace('\r', ''), '['+InOutStr+']'))\r
                         PrintErrorMsg(ERROR_DOXYGEN_CHECK_FUNCTION_HEADER, 'in Comment, \"%s\" does NOT have %s ' % ((TagPartList[0] + ' ' +TagPartList[1]).replace('\n', '').replace('\r', ''), '['+InOutStr+']'), TableName, CommentId)\r
             if Tag.find(ParamName) == -1 and ParamName != 'VOID' and ParamName != 'void':\r
-                ErrorMsgList.append('Line %d : in Comment, \"%s\" does NOT consistent with parameter name %s ' % (CommentStartLine, (TagPartList[0] + ' ' +TagPartList[1]).replace('\n', '').replace('\r', ''), ParamName))    \r
+                ErrorMsgList.append('Line %d : in Comment, \"%s\" does NOT consistent with parameter name %s ' % (CommentStartLine, (TagPartList[0] + ' ' +TagPartList[1]).replace('\n', '').replace('\r', ''), ParamName))\r
                 PrintErrorMsg(ERROR_DOXYGEN_CHECK_FUNCTION_HEADER, 'in Comment, \"%s\" does NOT consistent with parameter name %s ' % ((TagPartList[0] + ' ' +TagPartList[1]).replace('\n', '').replace('\r', ''), ParamName), TableName, CommentId)\r
             Index += 1\r
-        \r
+\r
         if Index < ParamNumber:\r
             ErrorMsgList.append('Line %d : Number of doxygen tags in comment less than number of function parameters' % CommentStartLine)\r
             PrintErrorMsg(ERROR_DOXYGEN_CHECK_FUNCTION_HEADER, 'Number of doxygen tags in comment less than number of function parameters ', TableName, CommentId)\r
         # VOID return type, NOT VOID*. VOID* should be matched with a doxygen tag.\r
         if (FuncModifier.find('VOID') != -1 or FuncModifier.find('void') != -1) and FuncModifier.find('*') == -1:\r
-            \r
+\r
             # assume we allow a return description tag for void func. return. that's why 'DoxygenTagNumber - 1' is used instead of 'DoxygenTagNumber'\r
             if Index < DoxygenTagNumber - 1 or (Index < DoxygenTagNumber and DoxygenStrList[Index].startswith('@retval')):\r
                 ErrorMsgList.append('Line %d : VOID return type need NO doxygen tags in comment' % CommentStartLine)\r
                 PrintErrorMsg(ERROR_DOXYGEN_CHECK_FUNCTION_HEADER, 'VOID return type need no doxygen tags in comment ', TableName, CommentId)\r
         else:\r
-            if Index < DoxygenTagNumber and not DoxygenStrList[Index].startswith('@retval') and not DoxygenStrList[Index].startswith('@return'): \r
+            if Index < DoxygenTagNumber and not DoxygenStrList[Index].startswith('@retval') and not DoxygenStrList[Index].startswith('@return'):\r
                 ErrorMsgList.append('Line %d : Number of @param doxygen tags in comment does NOT match number of function parameters' % CommentStartLine)\r
                 PrintErrorMsg(ERROR_DOXYGEN_CHECK_FUNCTION_HEADER, 'Number of @param doxygen tags in comment does NOT match number of function parameters ', TableName, CommentId)\r
     else:\r
@@ -2496,7 +2522,7 @@ if __name__ == '__main__':
 \r
 #    EdkLogger.Initialize()\r
 #    EdkLogger.SetLevel(EdkLogger.QUIET)\r
-#    CollectSourceCodeDataIntoDB(sys.argv[1])       \r
+#    CollectSourceCodeDataIntoDB(sys.argv[1])\r
     MsgList = CheckFuncHeaderDoxygenComments('C:\\Combo\\R9\\LakeportX64Dev\\FlashDevicePkg\\Library\\SpiFlashChipM25P64\\SpiFlashChipM25P64.c')\r
     for Msg in MsgList:\r
         print Msg\r