+## @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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
dirnames.append(Dirname)\r
\r
for f in filenames:\r
+ collector = None\r
FullName = os.path.normpath(os.path.join(dirpath, f))\r
+ model = DataClass.MODEL_FILE_OTHERS\r
if os.path.splitext(f)[1] in ('.h', '.c'):\r
EdkLogger.info("Parsing " + FullName)\r
model = f.endswith('c') and DataClass.MODEL_FILE_C or DataClass.MODEL_FILE_H\r
collector.CleanFileProfileBuffer()\r
collector.ParseFileWithClearedPPDirective()\r
# collector.PrintFragments()\r
- BaseName = os.path.basename(f)\r
- DirName = os.path.dirname(FullName)\r
- Ext = os.path.splitext(f)[1].lstrip('.')\r
- 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
+ BaseName = os.path.basename(f)\r
+ DirName = os.path.dirname(FullName)\r
+ Ext = os.path.splitext(f)[1].lstrip('.')\r
+ ModifiedTime = os.path.getmtime(FullName)\r
+ FileObj = DataClass.FileClass(-1, BaseName, Ext, DirName, FullName, model, ModifiedTime, GetFunctionList(), GetIdentifierList(), [])\r
+ FileObjList.append(FileObj)\r
+ if collector:\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
- Db.InsertOneFile(file)\r
+\r
+ Db = GetDB()\r
+ for file in FileObjList:\r
+ if file.ExtName.upper() not in ['INF', 'DEC', 'DSC', 'FDF']:\r
+ Db.InsertOneFile(file)\r
\r
Db.UpdateIdentifierBelongsToFunction()\r
\r
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
ResultSet = Db.TblFile.Exec(SqlStatement)\r
\r
FileID = -1\r
return FileID\r
\r
def GetIncludeFileList(FullFileName):\r
+ if os.path.splitext(FullFileName)[1].upper() not in ('.H'):\r
+ return []\r
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
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
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
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
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
else:\r
PredicateList.append(Exp.rstrip(';').rstrip(')').strip())\r
return PredicateList\r
- \r
+\r
def GetCNameList(Lvalue, StarList = []):\r
Lvalue += ' '\r
i = 0\r
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
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
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
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
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().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
+\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
# 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
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
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
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
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
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
# 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
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
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
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
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
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
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
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
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
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
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
\r
def GetTypeFromArray(Type, Var):\r
Count = Var.count('[')\r
- \r
+\r
while Count > 0:\r
Type = Type.strip()\r
Type = Type.rstrip('*')\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
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
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
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
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
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
\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
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
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
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
\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
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
\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
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
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
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
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
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
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
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
ValueModelId = DataClass.MODEL_IDENTIFIER_UNION\r
else:\r
continue\r
- \r
+\r
if ValueModelId != ModelId:\r
continue\r
# Check member variable format.\r
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
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
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
""" % (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
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
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
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
\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
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
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
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
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
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
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
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
\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
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
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
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
# 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
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
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
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
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
# 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
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
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
\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
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
\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
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
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
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
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
\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
from %s\r
- where Model = %d and StartLine = 1 and StartColumn = 0\r
+ where Model = %d and (StartLine = 1 or StartLine = 7 or StartLine = 8) and StartColumn = 0\r
""" % (FileTable, DataClass.MODEL_IDENTIFIER_COMMENT)\r
ResultSet = Db.TblFile.Exec(SqlStatement)\r
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
+ IsFoundError1 = True\r
+ IsFoundError2 = True\r
+ IsFoundError3 = True\r
for Result in ResultSet:\r
- CommentStr = Result[0]\r
- if not CommentStr.startswith('/** @file'):\r
- PrintErrorMsg(ERROR_DOXYGEN_CHECK_FILE_HEADER, 'File header comment should begin with ""/** @file""', FileTable, Result[1])\r
- if not CommentStr.endswith('**/'):\r
- PrintErrorMsg(ERROR_HEADER_CHECK_FILE, 'File header comment should end with **/', FileTable, Result[1])\r
- if CommentStr.find('.') == -1:\r
- PrintErrorMsg(ERROR_DOXYGEN_CHECK_COMMENT_DESCRIPTION, 'Comment description should end with period \'.\'', FileTable, Result[1])\r
+ CommentStr = Result[0].strip()\r
+ ID = Result[1]\r
+ if CommentStr.startswith('/** @file'):\r
+ IsFoundError1 = False\r
+ if CommentStr.endswith('**/'):\r
+ IsFoundError2 = False\r
+ if CommentStr.find('.') != -1:\r
+ IsFoundError3 = False\r
+\r
+ if IsFoundError1:\r
+ PrintErrorMsg(ERROR_DOXYGEN_CHECK_FILE_HEADER, 'File header comment should begin with ""/** @file""', FileTable, ID)\r
+ if IsFoundError2:\r
+ PrintErrorMsg(ERROR_HEADER_CHECK_FILE, 'File header comment should end with ""**/""', FileTable, ID)\r
+ if IsFoundError3:\r
+ PrintErrorMsg(ERROR_DOXYGEN_CHECK_COMMENT_DESCRIPTION, 'Comment description should end with period "".""', FileTable, ID)\r
\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
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
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
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
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
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
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
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
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
\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