## @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
+# Copyright (c) 2009 - 2017, 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
#\r
\r
import sys\r
-import os\r
+import Common.LongFilePathOs as os\r
import re\r
import string\r
import CodeFragmentCollector\r
def StripNonAlnumChars(Str):\r
StrippedStr = ''\r
for Char in Str:\r
- if Char.isalnum():\r
+ if Char.isalnum() or Char == '_':\r
StrippedStr += Char\r
return StrippedStr\r
\r
dirnames.append(Dirname)\r
\r
for f in filenames:\r
+ if f.lower() in EccGlobalData.gConfig.SkipFileList:\r
+ continue\r
collector = None\r
FullName = os.path.normpath(os.path.join(dirpath, f))\r
model = DataClass.MODEL_FILE_OTHERS\r
else:\r
TypeList = GetDataTypeFromModifier(Param.Modifier).split()\r
Type = TypeList[-1]\r
+ if Type == '*' and len(TypeList) >= 2:\r
+ Type = TypeList[-2]\r
if len(TypeList) > 1 and StarList != None:\r
for Star in StarList:\r
Type = Type.strip()\r
FuncName = Result[5]\r
if EccGlobalData.gException.IsException(ERROR_C_FUNCTION_LAYOUT_CHECK_RETURN_TYPE, FuncName):\r
continue\r
- Index = Result[0].find(TypeStart)\r
+ Result0 = Result[0]\r
+ if Result0.upper().startswith('STATIC'):\r
+ Result0 = Result0[6:].strip()\r
+ Index = Result0.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
FuncName = Result[5]\r
if EccGlobalData.gException.IsException(ERROR_C_FUNCTION_LAYOUT_CHECK_RETURN_TYPE, FuncName):\r
continue\r
- Index = Result[0].find(ReturnType)\r
+ Result0 = Result[0]\r
+ if Result0.upper().startswith('STATIC'):\r
+ Result0 = Result0[6:].strip()\r
+ Index = Result0.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
- 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
def CheckFuncLayoutModifier(FullFileName):\r
ErrorMsgList = []\r
\r
for Result in ResultSet:\r
ReturnType = GetDataTypeFromModifier(Result[0])\r
TypeStart = ReturnType.split()[0]\r
-# if len(ReturnType) == 0:\r
-# continue\r
- Index = Result[0].find(TypeStart)\r
+ Result0 = Result[0]\r
+ if Result0.upper().startswith('STATIC'):\r
+ Result0 = Result0[6:].strip()\r
+ Index = Result0.find(TypeStart)\r
if Index != 0:\r
PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_OPTIONAL_FUNCTIONAL_MODIFIER, '', FileTable, Result[1])\r
\r
for Result in ResultSet:\r
ReturnType = GetDataTypeFromModifier(Result[0])\r
TypeStart = ReturnType.split()[0]\r
-# if len(ReturnType) == 0:\r
-# continue\r
- Index = Result[0].find(TypeStart)\r
+ Result0 = Result[0]\r
+ if Result0.upper().startswith('STATIC'):\r
+ Result0 = Result0[6:].strip()\r
+ Index = Result0.find(TypeStart)\r
if Index != 0:\r
PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_OPTIONAL_FUNCTIONAL_MODIFIER, '', 'Function', Result[1])\r
\r
Fields = Value[LBPos + 1 : RBPos]\r
Fields = StripComments(Fields).strip()\r
NestPos = Fields.find ('struct')\r
- if NestPos != -1 and (NestPos + len('struct') < len(Fields)):\r
+ if NestPos != -1 and (NestPos + len('struct') < len(Fields)) and ModelId != DataClass.MODEL_IDENTIFIER_UNION:\r
if not Fields[NestPos + len('struct') + 1].isalnum():\r
if not EccGlobalData.gException.IsException(ERROR_DECLARATION_DATA_TYPE_CHECK_NESTED_STRUCTURE, Name):\r
PrintErrorMsg(ERROR_DECLARATION_DATA_TYPE_CHECK_NESTED_STRUCTURE, 'Nested struct in [%s].' % (Name), FileTable, TdId)\r
Field = Field.strip()\r
if Field == '':\r
continue\r
+ if Field.startswith("#"):\r
+ continue\r
# Enum could directly assign value to variable\r
Field = Field.split('=')[0].strip()\r
TokenList = Field.split()\r
# Remove pointers before variable\r
- if not Pattern.match(TokenList[-1].lstrip('*')):\r
- ErrMsgList.append(TokenList[-1].lstrip('*'))\r
+ Token = TokenList[-1]\r
+ if Token in ['OPTIONAL']:\r
+ Token = TokenList[-2]\r
+ if not Pattern.match(Token.lstrip('*')):\r
+ ErrMsgList.append(Token.lstrip('*'))\r
\r
return ErrMsgList\r
\r
where Model = %d or Model = %d\r
""" % (FileTable, DataClass.MODEL_IDENTIFIER_COMMENT, DataClass.MODEL_IDENTIFIER_FUNCTION_HEADER)\r
ResultSet = Db.TblFile.Exec(SqlStatement)\r
- DoxygenCommandList = ['bug', 'todo', 'example', 'file', 'attention', 'param', 'post', 'pre', 'retval', 'return', 'sa', 'since', 'test', 'note', 'par']\r
+ DoxygenCommandList = ['bug', 'todo', 'example', 'file', 'attention', 'param', 'post', 'pre', 'retval',\r
+ 'return', 'sa', 'since', 'test', 'note', 'par', 'endcode', 'code']\r
for Result in ResultSet:\r
CommentStr = Result[0]\r
CommentPartList = CommentStr.split()\r
if Part.startswith('@'):\r
if EccGlobalData.gException.IsException(ERROR_DOXYGEN_CHECK_COMMAND, Part):\r
continue\r
+ if not Part.replace('@', '').strip():\r
+ continue\r
+ if Part.lstrip('@') in ['{', '}']:\r
+ continue\r
if Part.lstrip('@').isalpha():\r
if Part.lstrip('@') not in DoxygenCommandList:\r
PrintErrorMsg(ERROR_DOXYGEN_CHECK_COMMAND, 'Unknown doxygen command %s' % Part, FileTable, Result[1])\r
if CommentLine.startswith('Copyright'):\r
NoCopyrightFlag = False\r
if CommentLine.find('All rights reserved') == -1:\r
- PrintErrorMsg(ERROR_HEADER_CHECK_FILE, '""All rights reserved"" announcement should be following the ""Copyright"" at the same line', FileTable, ID)\r
+ for Copyright in EccGlobalData.gConfig.Copyright:\r
+ if CommentLine.find(Copyright) > -1:\r
+ PrintErrorMsg(ERROR_HEADER_CHECK_FILE, '""All rights reserved"" announcement should be following the ""Copyright"" at the same line', FileTable, ID)\r
+ break\r
if CommentLine.endswith('<BR>') == -1:\r
PrintErrorMsg(ERROR_HEADER_CHECK_FILE, 'The ""<BR>"" at the end of the Copyright line is required', FileTable, ID)\r
if NextLineIndex < len(CommentStrList) and CommentStrList[NextLineIndex].strip().startswith('Copyright') == False and CommentStrList[NextLineIndex].strip():\r