152302d4dee589a5df43a464420c9fe68ba83937dlgao## @file 252302d4dee589a5df43a464420c9fe68ba83937dlgao# This file is used to be the c coding style checking of ECC tool 352302d4dee589a5df43a464420c9fe68ba83937dlgao# 48c3f9b4e3c639b6a694bdb8099267f646681a34cHess Chen# Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.<BR> 540d841f6a8f84e75409178e19e69b95e01bada0flgao# This program and the accompanying materials 652302d4dee589a5df43a464420c9fe68ba83937dlgao# are licensed and made available under the terms and conditions of the BSD License 752302d4dee589a5df43a464420c9fe68ba83937dlgao# which accompanies this distribution. The full text of the license may be found at 852302d4dee589a5df43a464420c9fe68ba83937dlgao# http://opensource.org/licenses/bsd-license.php 952302d4dee589a5df43a464420c9fe68ba83937dlgao# 1052302d4dee589a5df43a464420c9fe68ba83937dlgao# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 1152302d4dee589a5df43a464420c9fe68ba83937dlgao# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 1252302d4dee589a5df43a464420c9fe68ba83937dlgao# 1352302d4dee589a5df43a464420c9fe68ba83937dlgao 1430fdf1140b8d1ce93f3821d986fa165552023440lgaoimport sys 151be2ed90a20618d71ddf34b8a07d038da0b36854Hess Chenimport Common.LongFilePathOs as os 1630fdf1140b8d1ce93f3821d986fa165552023440lgaoimport re 1730fdf1140b8d1ce93f3821d986fa165552023440lgaoimport string 1830fdf1140b8d1ce93f3821d986fa165552023440lgaoimport CodeFragmentCollector 1930fdf1140b8d1ce93f3821d986fa165552023440lgaoimport FileProfile 2030fdf1140b8d1ce93f3821d986fa165552023440lgaofrom CommonDataClass import DataClass 2130fdf1140b8d1ce93f3821d986fa165552023440lgaoimport Database 2230fdf1140b8d1ce93f3821d986fa165552023440lgaofrom Common import EdkLogger 2330fdf1140b8d1ce93f3821d986fa165552023440lgaofrom EccToolError import * 2430fdf1140b8d1ce93f3821d986fa165552023440lgaoimport EccGlobalData 2530fdf1140b8d1ce93f3821d986fa165552023440lgaoimport MetaDataParser 2630fdf1140b8d1ce93f3821d986fa165552023440lgao 2730fdf1140b8d1ce93f3821d986fa165552023440lgaoIncludeFileListDict = {} 2830fdf1140b8d1ce93f3821d986fa165552023440lgaoAllIncludeFileListDict = {} 2930fdf1140b8d1ce93f3821d986fa165552023440lgaoIncludePathListDict = {} 3030fdf1140b8d1ce93f3821d986fa165552023440lgaoComplexTypeDict = {} 3130fdf1140b8d1ce93f3821d986fa165552023440lgaoSUDict = {} 3230fdf1140b8d1ce93f3821d986fa165552023440lgaoIgnoredKeywordList = ['EFI_ERROR'] 3330fdf1140b8d1ce93f3821d986fa165552023440lgao 3430fdf1140b8d1ce93f3821d986fa165552023440lgaodef GetIgnoredDirListPattern(): 3530fdf1140b8d1ce93f3821d986fa165552023440lgao skipList = list(EccGlobalData.gConfig.SkipDirList) + ['.svn'] 3630fdf1140b8d1ce93f3821d986fa165552023440lgao DirString = string.join(skipList, '|') 3730fdf1140b8d1ce93f3821d986fa165552023440lgao p = re.compile(r'.*[\\/](?:%s)[\\/]?.*' % DirString) 3830fdf1140b8d1ce93f3821d986fa165552023440lgao return p 3930fdf1140b8d1ce93f3821d986fa165552023440lgao 4030fdf1140b8d1ce93f3821d986fa165552023440lgaodef GetFuncDeclPattern(): 4130fdf1140b8d1ce93f3821d986fa165552023440lgao p = re.compile(r'(?:EFIAPI|EFI_BOOT_SERVICE|EFI_RUNTIME_SERVICE)?\s*[_\w]+\s*\(.*\)$', re.DOTALL) 4230fdf1140b8d1ce93f3821d986fa165552023440lgao return p 4330fdf1140b8d1ce93f3821d986fa165552023440lgao 4430fdf1140b8d1ce93f3821d986fa165552023440lgaodef GetArrayPattern(): 4530fdf1140b8d1ce93f3821d986fa165552023440lgao p = re.compile(r'[_\w]*\s*[\[.*\]]+') 4630fdf1140b8d1ce93f3821d986fa165552023440lgao return p 4730fdf1140b8d1ce93f3821d986fa165552023440lgao 4830fdf1140b8d1ce93f3821d986fa165552023440lgaodef GetTypedefFuncPointerPattern(): 4930fdf1140b8d1ce93f3821d986fa165552023440lgao p = re.compile('[_\w\s]*\([\w\s]*\*+\s*[_\w]+\s*\)\s*\(.*\)', re.DOTALL) 5030fdf1140b8d1ce93f3821d986fa165552023440lgao return p 5130fdf1140b8d1ce93f3821d986fa165552023440lgao 5230fdf1140b8d1ce93f3821d986fa165552023440lgaodef GetDB(): 5330fdf1140b8d1ce93f3821d986fa165552023440lgao return EccGlobalData.gDb 5430fdf1140b8d1ce93f3821d986fa165552023440lgao 5530fdf1140b8d1ce93f3821d986fa165552023440lgaodef GetConfig(): 5630fdf1140b8d1ce93f3821d986fa165552023440lgao return EccGlobalData.gConfig 5730fdf1140b8d1ce93f3821d986fa165552023440lgao 5830fdf1140b8d1ce93f3821d986fa165552023440lgaodef PrintErrorMsg(ErrorType, Msg, TableName, ItemId): 5930fdf1140b8d1ce93f3821d986fa165552023440lgao Msg = Msg.replace('\n', '').replace('\r', '') 6030fdf1140b8d1ce93f3821d986fa165552023440lgao MsgPartList = Msg.split() 6130fdf1140b8d1ce93f3821d986fa165552023440lgao Msg = '' 6230fdf1140b8d1ce93f3821d986fa165552023440lgao for Part in MsgPartList: 6330fdf1140b8d1ce93f3821d986fa165552023440lgao Msg += Part 6430fdf1140b8d1ce93f3821d986fa165552023440lgao Msg += ' ' 6579b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao GetDB().TblReport.Insert(ErrorType, OtherMsg=Msg, BelongsToTable=TableName, BelongsToItem=ItemId) 6630fdf1140b8d1ce93f3821d986fa165552023440lgao 6730fdf1140b8d1ce93f3821d986fa165552023440lgaodef GetIdType(Str): 6830fdf1140b8d1ce93f3821d986fa165552023440lgao Type = DataClass.MODEL_UNKNOWN 6930fdf1140b8d1ce93f3821d986fa165552023440lgao Str = Str.replace('#', '# ') 7030fdf1140b8d1ce93f3821d986fa165552023440lgao List = Str.split() 7130fdf1140b8d1ce93f3821d986fa165552023440lgao if List[1] == 'include': 7230fdf1140b8d1ce93f3821d986fa165552023440lgao Type = DataClass.MODEL_IDENTIFIER_INCLUDE 7330fdf1140b8d1ce93f3821d986fa165552023440lgao elif List[1] == 'define': 7430fdf1140b8d1ce93f3821d986fa165552023440lgao Type = DataClass.MODEL_IDENTIFIER_MACRO_DEFINE 7530fdf1140b8d1ce93f3821d986fa165552023440lgao elif List[1] == 'ifdef': 7630fdf1140b8d1ce93f3821d986fa165552023440lgao Type = DataClass.MODEL_IDENTIFIER_MACRO_IFDEF 7730fdf1140b8d1ce93f3821d986fa165552023440lgao elif List[1] == 'ifndef': 7830fdf1140b8d1ce93f3821d986fa165552023440lgao Type = DataClass.MODEL_IDENTIFIER_MACRO_IFNDEF 7930fdf1140b8d1ce93f3821d986fa165552023440lgao elif List[1] == 'endif': 8030fdf1140b8d1ce93f3821d986fa165552023440lgao Type = DataClass.MODEL_IDENTIFIER_MACRO_ENDIF 8130fdf1140b8d1ce93f3821d986fa165552023440lgao elif List[1] == 'pragma': 8230fdf1140b8d1ce93f3821d986fa165552023440lgao Type = DataClass.MODEL_IDENTIFIER_MACRO_PROGMA 8330fdf1140b8d1ce93f3821d986fa165552023440lgao else: 8430fdf1140b8d1ce93f3821d986fa165552023440lgao Type = DataClass.MODEL_UNKNOWN 8530fdf1140b8d1ce93f3821d986fa165552023440lgao return Type 8630fdf1140b8d1ce93f3821d986fa165552023440lgao 8730fdf1140b8d1ce93f3821d986fa165552023440lgaodef SuOccurInTypedef (Su, TdList): 8830fdf1140b8d1ce93f3821d986fa165552023440lgao for Td in TdList: 8930fdf1140b8d1ce93f3821d986fa165552023440lgao if Su.StartPos[0] == Td.StartPos[0] and Su.EndPos[0] == Td.EndPos[0]: 9030fdf1140b8d1ce93f3821d986fa165552023440lgao return True 9130fdf1140b8d1ce93f3821d986fa165552023440lgao return False 9230fdf1140b8d1ce93f3821d986fa165552023440lgao 9330fdf1140b8d1ce93f3821d986fa165552023440lgaodef GetIdentifierList(): 9430fdf1140b8d1ce93f3821d986fa165552023440lgao IdList = [] 9530fdf1140b8d1ce93f3821d986fa165552023440lgao for comment in FileProfile.CommentList: 9679b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao IdComment = DataClass.IdentifierClass(-1, '', '', '', comment.Content, DataClass.MODEL_IDENTIFIER_COMMENT, -1, -1, comment.StartPos[0], comment.StartPos[1], comment.EndPos[0], comment.EndPos[1]) 9730fdf1140b8d1ce93f3821d986fa165552023440lgao IdList.append(IdComment) 9852302d4dee589a5df43a464420c9fe68ba83937dlgao 9930fdf1140b8d1ce93f3821d986fa165552023440lgao for pp in FileProfile.PPDirectiveList: 10030fdf1140b8d1ce93f3821d986fa165552023440lgao Type = GetIdType(pp.Content) 10179b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao IdPP = DataClass.IdentifierClass(-1, '', '', '', pp.Content, Type, -1, -1, pp.StartPos[0], pp.StartPos[1], pp.EndPos[0], pp.EndPos[1]) 10230fdf1140b8d1ce93f3821d986fa165552023440lgao IdList.append(IdPP) 10352302d4dee589a5df43a464420c9fe68ba83937dlgao 10430fdf1140b8d1ce93f3821d986fa165552023440lgao for pe in FileProfile.PredicateExpressionList: 10579b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao 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]) 10630fdf1140b8d1ce93f3821d986fa165552023440lgao IdList.append(IdPE) 10752302d4dee589a5df43a464420c9fe68ba83937dlgao 10830fdf1140b8d1ce93f3821d986fa165552023440lgao FuncDeclPattern = GetFuncDeclPattern() 10930fdf1140b8d1ce93f3821d986fa165552023440lgao ArrayPattern = GetArrayPattern() 11030fdf1140b8d1ce93f3821d986fa165552023440lgao for var in FileProfile.VariableDeclarationList: 11130fdf1140b8d1ce93f3821d986fa165552023440lgao DeclText = var.Declarator.lstrip() 11230fdf1140b8d1ce93f3821d986fa165552023440lgao FuncPointerPattern = GetTypedefFuncPointerPattern() 11330fdf1140b8d1ce93f3821d986fa165552023440lgao if FuncPointerPattern.match(DeclText): 11430fdf1140b8d1ce93f3821d986fa165552023440lgao continue 11530fdf1140b8d1ce93f3821d986fa165552023440lgao VarNameStartLine = var.NameStartPos[0] 11630fdf1140b8d1ce93f3821d986fa165552023440lgao VarNameStartColumn = var.NameStartPos[1] 11730fdf1140b8d1ce93f3821d986fa165552023440lgao FirstChar = DeclText[0] 11830fdf1140b8d1ce93f3821d986fa165552023440lgao while not FirstChar.isalpha() and FirstChar != '_': 11930fdf1140b8d1ce93f3821d986fa165552023440lgao if FirstChar == '*': 12030fdf1140b8d1ce93f3821d986fa165552023440lgao var.Modifier += '*' 12130fdf1140b8d1ce93f3821d986fa165552023440lgao VarNameStartColumn += 1 12230fdf1140b8d1ce93f3821d986fa165552023440lgao DeclText = DeclText.lstrip('*') 12330fdf1140b8d1ce93f3821d986fa165552023440lgao elif FirstChar == '\r': 12430fdf1140b8d1ce93f3821d986fa165552023440lgao DeclText = DeclText.lstrip('\r\n').lstrip('\r') 12530fdf1140b8d1ce93f3821d986fa165552023440lgao VarNameStartLine += 1 12630fdf1140b8d1ce93f3821d986fa165552023440lgao VarNameStartColumn = 0 12730fdf1140b8d1ce93f3821d986fa165552023440lgao elif FirstChar == '\n': 12830fdf1140b8d1ce93f3821d986fa165552023440lgao DeclText = DeclText.lstrip('\n') 12930fdf1140b8d1ce93f3821d986fa165552023440lgao VarNameStartLine += 1 13030fdf1140b8d1ce93f3821d986fa165552023440lgao VarNameStartColumn = 0 13130fdf1140b8d1ce93f3821d986fa165552023440lgao elif FirstChar == ' ': 13230fdf1140b8d1ce93f3821d986fa165552023440lgao DeclText = DeclText.lstrip(' ') 13330fdf1140b8d1ce93f3821d986fa165552023440lgao VarNameStartColumn += 1 13430fdf1140b8d1ce93f3821d986fa165552023440lgao elif FirstChar == '\t': 13530fdf1140b8d1ce93f3821d986fa165552023440lgao DeclText = DeclText.lstrip('\t') 13630fdf1140b8d1ce93f3821d986fa165552023440lgao VarNameStartColumn += 8 13730fdf1140b8d1ce93f3821d986fa165552023440lgao else: 13830fdf1140b8d1ce93f3821d986fa165552023440lgao DeclText = DeclText[1:] 13930fdf1140b8d1ce93f3821d986fa165552023440lgao VarNameStartColumn += 1 14030fdf1140b8d1ce93f3821d986fa165552023440lgao FirstChar = DeclText[0] 14152302d4dee589a5df43a464420c9fe68ba83937dlgao 14230fdf1140b8d1ce93f3821d986fa165552023440lgao var.Declarator = DeclText 14330fdf1140b8d1ce93f3821d986fa165552023440lgao if FuncDeclPattern.match(var.Declarator): 14452302d4dee589a5df43a464420c9fe68ba83937dlgao DeclSplitList = var.Declarator.split('(') 14530fdf1140b8d1ce93f3821d986fa165552023440lgao FuncName = DeclSplitList[0].strip() 14630fdf1140b8d1ce93f3821d986fa165552023440lgao FuncNamePartList = FuncName.split() 14730fdf1140b8d1ce93f3821d986fa165552023440lgao if len(FuncNamePartList) > 1: 14830fdf1140b8d1ce93f3821d986fa165552023440lgao FuncName = FuncNamePartList[-1].strip() 14930fdf1140b8d1ce93f3821d986fa165552023440lgao NameStart = DeclSplitList[0].rfind(FuncName) 15030fdf1140b8d1ce93f3821d986fa165552023440lgao var.Declarator = var.Declarator[NameStart:] 15130fdf1140b8d1ce93f3821d986fa165552023440lgao if NameStart > 0: 15230fdf1140b8d1ce93f3821d986fa165552023440lgao var.Modifier += ' ' + DeclSplitList[0][0:NameStart] 15330fdf1140b8d1ce93f3821d986fa165552023440lgao Index = 0 15430fdf1140b8d1ce93f3821d986fa165552023440lgao PreChar = '' 15530fdf1140b8d1ce93f3821d986fa165552023440lgao while Index < NameStart: 15630fdf1140b8d1ce93f3821d986fa165552023440lgao FirstChar = DeclSplitList[0][Index] 15730fdf1140b8d1ce93f3821d986fa165552023440lgao if DeclSplitList[0][Index:].startswith('EFIAPI'): 15830fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 6 15930fdf1140b8d1ce93f3821d986fa165552023440lgao VarNameStartColumn += 6 16030fdf1140b8d1ce93f3821d986fa165552023440lgao PreChar = '' 16130fdf1140b8d1ce93f3821d986fa165552023440lgao continue 16230fdf1140b8d1ce93f3821d986fa165552023440lgao elif FirstChar == '\r': 16330fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 16430fdf1140b8d1ce93f3821d986fa165552023440lgao VarNameStartLine += 1 16530fdf1140b8d1ce93f3821d986fa165552023440lgao VarNameStartColumn = 0 16630fdf1140b8d1ce93f3821d986fa165552023440lgao elif FirstChar == '\n': 16730fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 16830fdf1140b8d1ce93f3821d986fa165552023440lgao if PreChar != '\r': 16930fdf1140b8d1ce93f3821d986fa165552023440lgao VarNameStartLine += 1 17030fdf1140b8d1ce93f3821d986fa165552023440lgao VarNameStartColumn = 0 17130fdf1140b8d1ce93f3821d986fa165552023440lgao elif FirstChar == ' ': 17230fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 17330fdf1140b8d1ce93f3821d986fa165552023440lgao VarNameStartColumn += 1 17430fdf1140b8d1ce93f3821d986fa165552023440lgao elif FirstChar == '\t': 17530fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 17630fdf1140b8d1ce93f3821d986fa165552023440lgao VarNameStartColumn += 8 17730fdf1140b8d1ce93f3821d986fa165552023440lgao else: 17830fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 17930fdf1140b8d1ce93f3821d986fa165552023440lgao VarNameStartColumn += 1 18030fdf1140b8d1ce93f3821d986fa165552023440lgao PreChar = FirstChar 18130fdf1140b8d1ce93f3821d986fa165552023440lgao IdVar = DataClass.IdentifierClass(-1, var.Modifier, '', var.Declarator, FuncName, DataClass.MODEL_IDENTIFIER_FUNCTION_DECLARATION, -1, -1, var.StartPos[0], var.StartPos[1], VarNameStartLine, VarNameStartColumn) 18230fdf1140b8d1ce93f3821d986fa165552023440lgao IdList.append(IdVar) 18330fdf1140b8d1ce93f3821d986fa165552023440lgao continue 18452302d4dee589a5df43a464420c9fe68ba83937dlgao 18552302d4dee589a5df43a464420c9fe68ba83937dlgao if var.Declarator.find('{') == -1: 18630fdf1140b8d1ce93f3821d986fa165552023440lgao for decl in var.Declarator.split(','): 18730fdf1140b8d1ce93f3821d986fa165552023440lgao DeclList = decl.split('=') 18830fdf1140b8d1ce93f3821d986fa165552023440lgao Name = DeclList[0].strip() 18930fdf1140b8d1ce93f3821d986fa165552023440lgao if ArrayPattern.match(Name): 19030fdf1140b8d1ce93f3821d986fa165552023440lgao LSBPos = var.Declarator.find('[') 19130fdf1140b8d1ce93f3821d986fa165552023440lgao var.Modifier += ' ' + Name[LSBPos:] 19230fdf1140b8d1ce93f3821d986fa165552023440lgao Name = Name[0:LSBPos] 19352302d4dee589a5df43a464420c9fe68ba83937dlgao 19479b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao 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) 19530fdf1140b8d1ce93f3821d986fa165552023440lgao IdList.append(IdVar) 19630fdf1140b8d1ce93f3821d986fa165552023440lgao else: 19730fdf1140b8d1ce93f3821d986fa165552023440lgao DeclList = var.Declarator.split('=') 19830fdf1140b8d1ce93f3821d986fa165552023440lgao Name = DeclList[0].strip() 19930fdf1140b8d1ce93f3821d986fa165552023440lgao if ArrayPattern.match(Name): 20030fdf1140b8d1ce93f3821d986fa165552023440lgao LSBPos = var.Declarator.find('[') 20130fdf1140b8d1ce93f3821d986fa165552023440lgao var.Modifier += ' ' + Name[LSBPos:] 20230fdf1140b8d1ce93f3821d986fa165552023440lgao Name = Name[0:LSBPos] 20379b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao 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) 20430fdf1140b8d1ce93f3821d986fa165552023440lgao IdList.append(IdVar) 20552302d4dee589a5df43a464420c9fe68ba83937dlgao 20630fdf1140b8d1ce93f3821d986fa165552023440lgao for enum in FileProfile.EnumerationDefinitionList: 20730fdf1140b8d1ce93f3821d986fa165552023440lgao LBPos = enum.Content.find('{') 20830fdf1140b8d1ce93f3821d986fa165552023440lgao RBPos = enum.Content.find('}') 20930fdf1140b8d1ce93f3821d986fa165552023440lgao Name = enum.Content[4:LBPos].strip() 21079b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao Value = enum.Content[LBPos + 1:RBPos] 21179b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao IdEnum = DataClass.IdentifierClass(-1, '', '', Name, Value, DataClass.MODEL_IDENTIFIER_ENUMERATE, -1, -1, enum.StartPos[0], enum.StartPos[1], enum.EndPos[0], enum.EndPos[1]) 21230fdf1140b8d1ce93f3821d986fa165552023440lgao IdList.append(IdEnum) 21352302d4dee589a5df43a464420c9fe68ba83937dlgao 21430fdf1140b8d1ce93f3821d986fa165552023440lgao for su in FileProfile.StructUnionDefinitionList: 21530fdf1140b8d1ce93f3821d986fa165552023440lgao if SuOccurInTypedef(su, FileProfile.TypedefDefinitionList): 21630fdf1140b8d1ce93f3821d986fa165552023440lgao continue 21730fdf1140b8d1ce93f3821d986fa165552023440lgao Type = DataClass.MODEL_IDENTIFIER_STRUCTURE 21830fdf1140b8d1ce93f3821d986fa165552023440lgao SkipLen = 6 21930fdf1140b8d1ce93f3821d986fa165552023440lgao if su.Content.startswith('union'): 22030fdf1140b8d1ce93f3821d986fa165552023440lgao Type = DataClass.MODEL_IDENTIFIER_UNION 22130fdf1140b8d1ce93f3821d986fa165552023440lgao SkipLen = 5 22230fdf1140b8d1ce93f3821d986fa165552023440lgao LBPos = su.Content.find('{') 22330fdf1140b8d1ce93f3821d986fa165552023440lgao RBPos = su.Content.find('}') 22430fdf1140b8d1ce93f3821d986fa165552023440lgao if LBPos == -1 or RBPos == -1: 22530fdf1140b8d1ce93f3821d986fa165552023440lgao Name = su.Content[SkipLen:].strip() 22630fdf1140b8d1ce93f3821d986fa165552023440lgao Value = '' 22730fdf1140b8d1ce93f3821d986fa165552023440lgao else: 22830fdf1140b8d1ce93f3821d986fa165552023440lgao Name = su.Content[SkipLen:LBPos].strip() 22979b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao Value = su.Content[LBPos:RBPos + 1] 23079b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao IdPE = DataClass.IdentifierClass(-1, '', '', Name, Value, Type, -1, -1, su.StartPos[0], su.StartPos[1], su.EndPos[0], su.EndPos[1]) 23130fdf1140b8d1ce93f3821d986fa165552023440lgao IdList.append(IdPE) 23252302d4dee589a5df43a464420c9fe68ba83937dlgao 23352302d4dee589a5df43a464420c9fe68ba83937dlgao TdFuncPointerPattern = GetTypedefFuncPointerPattern() 23430fdf1140b8d1ce93f3821d986fa165552023440lgao for td in FileProfile.TypedefDefinitionList: 23530fdf1140b8d1ce93f3821d986fa165552023440lgao Modifier = '' 23630fdf1140b8d1ce93f3821d986fa165552023440lgao Name = td.ToType 23730fdf1140b8d1ce93f3821d986fa165552023440lgao Value = td.FromType 23830fdf1140b8d1ce93f3821d986fa165552023440lgao if TdFuncPointerPattern.match(td.ToType): 23930fdf1140b8d1ce93f3821d986fa165552023440lgao Modifier = td.FromType 24030fdf1140b8d1ce93f3821d986fa165552023440lgao LBPos = td.ToType.find('(') 24179b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao TmpStr = td.ToType[LBPos + 1:].strip() 24230fdf1140b8d1ce93f3821d986fa165552023440lgao StarPos = TmpStr.find('*') 24330fdf1140b8d1ce93f3821d986fa165552023440lgao if StarPos != -1: 24430fdf1140b8d1ce93f3821d986fa165552023440lgao Modifier += ' ' + TmpStr[0:StarPos] 24530fdf1140b8d1ce93f3821d986fa165552023440lgao while TmpStr[StarPos] == '*': 24630fdf1140b8d1ce93f3821d986fa165552023440lgao# Modifier += ' ' + '*' 24730fdf1140b8d1ce93f3821d986fa165552023440lgao StarPos += 1 24830fdf1140b8d1ce93f3821d986fa165552023440lgao TmpStr = TmpStr[StarPos:].strip() 24930fdf1140b8d1ce93f3821d986fa165552023440lgao RBPos = TmpStr.find(')') 25030fdf1140b8d1ce93f3821d986fa165552023440lgao Name = TmpStr[0:RBPos] 25130fdf1140b8d1ce93f3821d986fa165552023440lgao Value = 'FP' + TmpStr[RBPos + 1:] 25230fdf1140b8d1ce93f3821d986fa165552023440lgao else: 25330fdf1140b8d1ce93f3821d986fa165552023440lgao while Name.startswith('*'): 25430fdf1140b8d1ce93f3821d986fa165552023440lgao Value += ' ' + '*' 25530fdf1140b8d1ce93f3821d986fa165552023440lgao Name = Name.lstrip('*').strip() 25652302d4dee589a5df43a464420c9fe68ba83937dlgao 25730fdf1140b8d1ce93f3821d986fa165552023440lgao if Name.find('[') != -1: 25830fdf1140b8d1ce93f3821d986fa165552023440lgao LBPos = Name.find('[') 25930fdf1140b8d1ce93f3821d986fa165552023440lgao RBPos = Name.rfind(']') 26030fdf1140b8d1ce93f3821d986fa165552023440lgao Value += Name[LBPos : RBPos + 1] 26130fdf1140b8d1ce93f3821d986fa165552023440lgao Name = Name[0 : LBPos] 26252302d4dee589a5df43a464420c9fe68ba83937dlgao 26379b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao 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]) 26430fdf1140b8d1ce93f3821d986fa165552023440lgao IdList.append(IdTd) 26552302d4dee589a5df43a464420c9fe68ba83937dlgao 26630fdf1140b8d1ce93f3821d986fa165552023440lgao for funcCall in FileProfile.FunctionCallingList: 26779b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao 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]) 26830fdf1140b8d1ce93f3821d986fa165552023440lgao IdList.append(IdFC) 26930fdf1140b8d1ce93f3821d986fa165552023440lgao return IdList 27030fdf1140b8d1ce93f3821d986fa165552023440lgao 27130fdf1140b8d1ce93f3821d986fa165552023440lgaodef StripNonAlnumChars(Str): 27230fdf1140b8d1ce93f3821d986fa165552023440lgao StrippedStr = '' 27330fdf1140b8d1ce93f3821d986fa165552023440lgao for Char in Str: 27430fdf1140b8d1ce93f3821d986fa165552023440lgao if Char.isalnum(): 27530fdf1140b8d1ce93f3821d986fa165552023440lgao StrippedStr += Char 27630fdf1140b8d1ce93f3821d986fa165552023440lgao return StrippedStr 27730fdf1140b8d1ce93f3821d986fa165552023440lgao 27879b74a03e018ecbf03d8d50e6f20301e249c1ba5lgaodef GetParamList(FuncDeclarator, FuncNameLine=0, FuncNameOffset=0): 27930fdf1140b8d1ce93f3821d986fa165552023440lgao FuncDeclarator = StripComments(FuncDeclarator) 28030fdf1140b8d1ce93f3821d986fa165552023440lgao ParamIdList = [] 28130fdf1140b8d1ce93f3821d986fa165552023440lgao #DeclSplitList = FuncDeclarator.split('(') 28230fdf1140b8d1ce93f3821d986fa165552023440lgao LBPos = FuncDeclarator.find('(') 28330fdf1140b8d1ce93f3821d986fa165552023440lgao #if len(DeclSplitList) < 2: 28430fdf1140b8d1ce93f3821d986fa165552023440lgao if LBPos == -1: 28530fdf1140b8d1ce93f3821d986fa165552023440lgao return ParamIdList 28630fdf1140b8d1ce93f3821d986fa165552023440lgao #FuncName = DeclSplitList[0] 28730fdf1140b8d1ce93f3821d986fa165552023440lgao FuncName = FuncDeclarator[0:LBPos] 28830fdf1140b8d1ce93f3821d986fa165552023440lgao #ParamStr = DeclSplitList[1].rstrip(')') 28930fdf1140b8d1ce93f3821d986fa165552023440lgao ParamStr = FuncDeclarator[LBPos + 1:].rstrip(')') 29030fdf1140b8d1ce93f3821d986fa165552023440lgao LineSkipped = 0 29130fdf1140b8d1ce93f3821d986fa165552023440lgao OffsetSkipped = 0 29230fdf1140b8d1ce93f3821d986fa165552023440lgao TailChar = FuncName[-1] 29330fdf1140b8d1ce93f3821d986fa165552023440lgao while not TailChar.isalpha() and TailChar != '_': 29452302d4dee589a5df43a464420c9fe68ba83937dlgao 29530fdf1140b8d1ce93f3821d986fa165552023440lgao if TailChar == '\n': 29630fdf1140b8d1ce93f3821d986fa165552023440lgao FuncName = FuncName.rstrip('\r\n').rstrip('\n') 29730fdf1140b8d1ce93f3821d986fa165552023440lgao LineSkipped += 1 29830fdf1140b8d1ce93f3821d986fa165552023440lgao OffsetSkipped = 0 29930fdf1140b8d1ce93f3821d986fa165552023440lgao elif TailChar == '\r': 30030fdf1140b8d1ce93f3821d986fa165552023440lgao FuncName = FuncName.rstrip('\r') 30130fdf1140b8d1ce93f3821d986fa165552023440lgao LineSkipped += 1 30230fdf1140b8d1ce93f3821d986fa165552023440lgao OffsetSkipped = 0 30330fdf1140b8d1ce93f3821d986fa165552023440lgao elif TailChar == ' ': 30430fdf1140b8d1ce93f3821d986fa165552023440lgao FuncName = FuncName.rstrip(' ') 30530fdf1140b8d1ce93f3821d986fa165552023440lgao OffsetSkipped += 1 30630fdf1140b8d1ce93f3821d986fa165552023440lgao elif TailChar == '\t': 30730fdf1140b8d1ce93f3821d986fa165552023440lgao FuncName = FuncName.rstrip('\t') 30830fdf1140b8d1ce93f3821d986fa165552023440lgao OffsetSkipped += 8 30930fdf1140b8d1ce93f3821d986fa165552023440lgao else: 31030fdf1140b8d1ce93f3821d986fa165552023440lgao FuncName = FuncName[:-1] 31130fdf1140b8d1ce93f3821d986fa165552023440lgao TailChar = FuncName[-1] 31252302d4dee589a5df43a464420c9fe68ba83937dlgao 31330fdf1140b8d1ce93f3821d986fa165552023440lgao OffsetSkipped += 1 #skip '(' 31452302d4dee589a5df43a464420c9fe68ba83937dlgao 31530fdf1140b8d1ce93f3821d986fa165552023440lgao for p in ParamStr.split(','): 31630fdf1140b8d1ce93f3821d986fa165552023440lgao ListP = p.split() 31730fdf1140b8d1ce93f3821d986fa165552023440lgao if len(ListP) == 0: 31830fdf1140b8d1ce93f3821d986fa165552023440lgao continue 31930fdf1140b8d1ce93f3821d986fa165552023440lgao ParamName = ListP[-1] 32030fdf1140b8d1ce93f3821d986fa165552023440lgao DeclText = ParamName.strip() 32130fdf1140b8d1ce93f3821d986fa165552023440lgao RightSpacePos = p.rfind(ParamName) 32230fdf1140b8d1ce93f3821d986fa165552023440lgao ParamModifier = p[0:RightSpacePos] 32330fdf1140b8d1ce93f3821d986fa165552023440lgao if ParamName == 'OPTIONAL': 32430fdf1140b8d1ce93f3821d986fa165552023440lgao if ParamModifier == '': 32530fdf1140b8d1ce93f3821d986fa165552023440lgao ParamModifier += ' ' + 'OPTIONAL' 32630fdf1140b8d1ce93f3821d986fa165552023440lgao DeclText = '' 32730fdf1140b8d1ce93f3821d986fa165552023440lgao else: 32830fdf1140b8d1ce93f3821d986fa165552023440lgao ParamName = ListP[-2] 32930fdf1140b8d1ce93f3821d986fa165552023440lgao DeclText = ParamName.strip() 33030fdf1140b8d1ce93f3821d986fa165552023440lgao RightSpacePos = p.rfind(ParamName) 33130fdf1140b8d1ce93f3821d986fa165552023440lgao ParamModifier = p[0:RightSpacePos] 33230fdf1140b8d1ce93f3821d986fa165552023440lgao ParamModifier += 'OPTIONAL' 33330fdf1140b8d1ce93f3821d986fa165552023440lgao while DeclText.startswith('*'): 33430fdf1140b8d1ce93f3821d986fa165552023440lgao ParamModifier += ' ' + '*' 33530fdf1140b8d1ce93f3821d986fa165552023440lgao DeclText = DeclText.lstrip('*').strip() 33630fdf1140b8d1ce93f3821d986fa165552023440lgao ParamName = DeclText 33730fdf1140b8d1ce93f3821d986fa165552023440lgao # ignore array length if exists. 33830fdf1140b8d1ce93f3821d986fa165552023440lgao LBIndex = ParamName.find('[') 33930fdf1140b8d1ce93f3821d986fa165552023440lgao if LBIndex != -1: 34030fdf1140b8d1ce93f3821d986fa165552023440lgao ParamName = ParamName[0:LBIndex] 34152302d4dee589a5df43a464420c9fe68ba83937dlgao 34230fdf1140b8d1ce93f3821d986fa165552023440lgao Start = RightSpacePos 34330fdf1140b8d1ce93f3821d986fa165552023440lgao Index = 0 34430fdf1140b8d1ce93f3821d986fa165552023440lgao PreChar = '' 34530fdf1140b8d1ce93f3821d986fa165552023440lgao while Index < Start: 34630fdf1140b8d1ce93f3821d986fa165552023440lgao FirstChar = p[Index] 34752302d4dee589a5df43a464420c9fe68ba83937dlgao 34830fdf1140b8d1ce93f3821d986fa165552023440lgao if FirstChar == '\r': 34930fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 35030fdf1140b8d1ce93f3821d986fa165552023440lgao LineSkipped += 1 35130fdf1140b8d1ce93f3821d986fa165552023440lgao OffsetSkipped = 0 35230fdf1140b8d1ce93f3821d986fa165552023440lgao elif FirstChar == '\n': 35330fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 35430fdf1140b8d1ce93f3821d986fa165552023440lgao if PreChar != '\r': 35530fdf1140b8d1ce93f3821d986fa165552023440lgao LineSkipped += 1 35630fdf1140b8d1ce93f3821d986fa165552023440lgao OffsetSkipped = 0 35730fdf1140b8d1ce93f3821d986fa165552023440lgao elif FirstChar == ' ': 35830fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 35930fdf1140b8d1ce93f3821d986fa165552023440lgao OffsetSkipped += 1 36030fdf1140b8d1ce93f3821d986fa165552023440lgao elif FirstChar == '\t': 36130fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 36230fdf1140b8d1ce93f3821d986fa165552023440lgao OffsetSkipped += 8 36330fdf1140b8d1ce93f3821d986fa165552023440lgao else: 36430fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 36530fdf1140b8d1ce93f3821d986fa165552023440lgao OffsetSkipped += 1 36630fdf1140b8d1ce93f3821d986fa165552023440lgao PreChar = FirstChar 36752302d4dee589a5df43a464420c9fe68ba83937dlgao 36830fdf1140b8d1ce93f3821d986fa165552023440lgao ParamBeginLine = FuncNameLine + LineSkipped 36930fdf1140b8d1ce93f3821d986fa165552023440lgao ParamBeginOffset = FuncNameOffset + OffsetSkipped 37052302d4dee589a5df43a464420c9fe68ba83937dlgao 37130fdf1140b8d1ce93f3821d986fa165552023440lgao Index = Start + len(ParamName) 37230fdf1140b8d1ce93f3821d986fa165552023440lgao PreChar = '' 37330fdf1140b8d1ce93f3821d986fa165552023440lgao while Index < len(p): 37430fdf1140b8d1ce93f3821d986fa165552023440lgao FirstChar = p[Index] 37552302d4dee589a5df43a464420c9fe68ba83937dlgao 37630fdf1140b8d1ce93f3821d986fa165552023440lgao if FirstChar == '\r': 37730fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 37830fdf1140b8d1ce93f3821d986fa165552023440lgao LineSkipped += 1 37930fdf1140b8d1ce93f3821d986fa165552023440lgao OffsetSkipped = 0 38030fdf1140b8d1ce93f3821d986fa165552023440lgao elif FirstChar == '\n': 38130fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 38230fdf1140b8d1ce93f3821d986fa165552023440lgao if PreChar != '\r': 38330fdf1140b8d1ce93f3821d986fa165552023440lgao LineSkipped += 1 38430fdf1140b8d1ce93f3821d986fa165552023440lgao OffsetSkipped = 0 38530fdf1140b8d1ce93f3821d986fa165552023440lgao elif FirstChar == ' ': 38630fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 38730fdf1140b8d1ce93f3821d986fa165552023440lgao OffsetSkipped += 1 38830fdf1140b8d1ce93f3821d986fa165552023440lgao elif FirstChar == '\t': 38930fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 39030fdf1140b8d1ce93f3821d986fa165552023440lgao OffsetSkipped += 8 39130fdf1140b8d1ce93f3821d986fa165552023440lgao else: 39230fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 39330fdf1140b8d1ce93f3821d986fa165552023440lgao OffsetSkipped += 1 39430fdf1140b8d1ce93f3821d986fa165552023440lgao PreChar = FirstChar 39552302d4dee589a5df43a464420c9fe68ba83937dlgao 39630fdf1140b8d1ce93f3821d986fa165552023440lgao ParamEndLine = FuncNameLine + LineSkipped 39730fdf1140b8d1ce93f3821d986fa165552023440lgao ParamEndOffset = FuncNameOffset + OffsetSkipped 39830fdf1140b8d1ce93f3821d986fa165552023440lgao if ParamName != '...': 39930fdf1140b8d1ce93f3821d986fa165552023440lgao ParamName = StripNonAlnumChars(ParamName) 40030fdf1140b8d1ce93f3821d986fa165552023440lgao IdParam = DataClass.IdentifierClass(-1, ParamModifier, '', ParamName, '', DataClass.MODEL_IDENTIFIER_PARAMETER, -1, -1, ParamBeginLine, ParamBeginOffset, ParamEndLine, ParamEndOffset) 40130fdf1140b8d1ce93f3821d986fa165552023440lgao ParamIdList.append(IdParam) 40252302d4dee589a5df43a464420c9fe68ba83937dlgao 40330fdf1140b8d1ce93f3821d986fa165552023440lgao OffsetSkipped += 1 #skip ',' 40452302d4dee589a5df43a464420c9fe68ba83937dlgao 40530fdf1140b8d1ce93f3821d986fa165552023440lgao return ParamIdList 40652302d4dee589a5df43a464420c9fe68ba83937dlgao 40730fdf1140b8d1ce93f3821d986fa165552023440lgaodef GetFunctionList(): 40830fdf1140b8d1ce93f3821d986fa165552023440lgao FuncObjList = [] 40930fdf1140b8d1ce93f3821d986fa165552023440lgao for FuncDef in FileProfile.FunctionDefinitionList: 41030fdf1140b8d1ce93f3821d986fa165552023440lgao ParamIdList = [] 41130fdf1140b8d1ce93f3821d986fa165552023440lgao DeclText = FuncDef.Declarator.lstrip() 41230fdf1140b8d1ce93f3821d986fa165552023440lgao FuncNameStartLine = FuncDef.NamePos[0] 41330fdf1140b8d1ce93f3821d986fa165552023440lgao FuncNameStartColumn = FuncDef.NamePos[1] 41430fdf1140b8d1ce93f3821d986fa165552023440lgao FirstChar = DeclText[0] 41530fdf1140b8d1ce93f3821d986fa165552023440lgao while not FirstChar.isalpha() and FirstChar != '_': 41630fdf1140b8d1ce93f3821d986fa165552023440lgao if FirstChar == '*': 41730fdf1140b8d1ce93f3821d986fa165552023440lgao FuncDef.Modifier += '*' 41830fdf1140b8d1ce93f3821d986fa165552023440lgao FuncNameStartColumn += 1 41930fdf1140b8d1ce93f3821d986fa165552023440lgao DeclText = DeclText.lstrip('*') 42030fdf1140b8d1ce93f3821d986fa165552023440lgao elif FirstChar == '\r': 42130fdf1140b8d1ce93f3821d986fa165552023440lgao DeclText = DeclText.lstrip('\r\n').lstrip('\r') 42230fdf1140b8d1ce93f3821d986fa165552023440lgao FuncNameStartLine += 1 42330fdf1140b8d1ce93f3821d986fa165552023440lgao FuncNameStartColumn = 0 42430fdf1140b8d1ce93f3821d986fa165552023440lgao elif FirstChar == '\n': 42530fdf1140b8d1ce93f3821d986fa165552023440lgao DeclText = DeclText.lstrip('\n') 42630fdf1140b8d1ce93f3821d986fa165552023440lgao FuncNameStartLine += 1 42730fdf1140b8d1ce93f3821d986fa165552023440lgao FuncNameStartColumn = 0 42830fdf1140b8d1ce93f3821d986fa165552023440lgao elif FirstChar == ' ': 42930fdf1140b8d1ce93f3821d986fa165552023440lgao DeclText = DeclText.lstrip(' ') 43030fdf1140b8d1ce93f3821d986fa165552023440lgao FuncNameStartColumn += 1 43130fdf1140b8d1ce93f3821d986fa165552023440lgao elif FirstChar == '\t': 43230fdf1140b8d1ce93f3821d986fa165552023440lgao DeclText = DeclText.lstrip('\t') 43330fdf1140b8d1ce93f3821d986fa165552023440lgao FuncNameStartColumn += 8 43430fdf1140b8d1ce93f3821d986fa165552023440lgao else: 43530fdf1140b8d1ce93f3821d986fa165552023440lgao DeclText = DeclText[1:] 43630fdf1140b8d1ce93f3821d986fa165552023440lgao FuncNameStartColumn += 1 43730fdf1140b8d1ce93f3821d986fa165552023440lgao FirstChar = DeclText[0] 43852302d4dee589a5df43a464420c9fe68ba83937dlgao 43930fdf1140b8d1ce93f3821d986fa165552023440lgao FuncDef.Declarator = DeclText 44030fdf1140b8d1ce93f3821d986fa165552023440lgao DeclSplitList = FuncDef.Declarator.split('(') 44130fdf1140b8d1ce93f3821d986fa165552023440lgao if len(DeclSplitList) < 2: 44230fdf1140b8d1ce93f3821d986fa165552023440lgao continue 44352302d4dee589a5df43a464420c9fe68ba83937dlgao 44430fdf1140b8d1ce93f3821d986fa165552023440lgao FuncName = DeclSplitList[0] 44530fdf1140b8d1ce93f3821d986fa165552023440lgao FuncNamePartList = FuncName.split() 44630fdf1140b8d1ce93f3821d986fa165552023440lgao if len(FuncNamePartList) > 1: 44730fdf1140b8d1ce93f3821d986fa165552023440lgao FuncName = FuncNamePartList[-1] 44830fdf1140b8d1ce93f3821d986fa165552023440lgao NameStart = DeclSplitList[0].rfind(FuncName) 44930fdf1140b8d1ce93f3821d986fa165552023440lgao if NameStart > 0: 45030fdf1140b8d1ce93f3821d986fa165552023440lgao FuncDef.Modifier += ' ' + DeclSplitList[0][0:NameStart] 45130fdf1140b8d1ce93f3821d986fa165552023440lgao Index = 0 45230fdf1140b8d1ce93f3821d986fa165552023440lgao PreChar = '' 45330fdf1140b8d1ce93f3821d986fa165552023440lgao while Index < NameStart: 45430fdf1140b8d1ce93f3821d986fa165552023440lgao FirstChar = DeclSplitList[0][Index] 45530fdf1140b8d1ce93f3821d986fa165552023440lgao if DeclSplitList[0][Index:].startswith('EFIAPI'): 45630fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 6 45730fdf1140b8d1ce93f3821d986fa165552023440lgao FuncNameStartColumn += 6 45830fdf1140b8d1ce93f3821d986fa165552023440lgao PreChar = '' 45930fdf1140b8d1ce93f3821d986fa165552023440lgao continue 46030fdf1140b8d1ce93f3821d986fa165552023440lgao elif FirstChar == '\r': 46130fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 46230fdf1140b8d1ce93f3821d986fa165552023440lgao FuncNameStartLine += 1 46330fdf1140b8d1ce93f3821d986fa165552023440lgao FuncNameStartColumn = 0 46430fdf1140b8d1ce93f3821d986fa165552023440lgao elif FirstChar == '\n': 46530fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 46630fdf1140b8d1ce93f3821d986fa165552023440lgao if PreChar != '\r': 46730fdf1140b8d1ce93f3821d986fa165552023440lgao FuncNameStartLine += 1 46830fdf1140b8d1ce93f3821d986fa165552023440lgao FuncNameStartColumn = 0 46930fdf1140b8d1ce93f3821d986fa165552023440lgao elif FirstChar == ' ': 47030fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 47130fdf1140b8d1ce93f3821d986fa165552023440lgao FuncNameStartColumn += 1 47230fdf1140b8d1ce93f3821d986fa165552023440lgao elif FirstChar == '\t': 47330fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 47430fdf1140b8d1ce93f3821d986fa165552023440lgao FuncNameStartColumn += 8 47530fdf1140b8d1ce93f3821d986fa165552023440lgao else: 47630fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 47730fdf1140b8d1ce93f3821d986fa165552023440lgao FuncNameStartColumn += 1 47830fdf1140b8d1ce93f3821d986fa165552023440lgao PreChar = FirstChar 47952302d4dee589a5df43a464420c9fe68ba83937dlgao 48079b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao 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) 48130fdf1140b8d1ce93f3821d986fa165552023440lgao FuncObjList.append(FuncObj) 48252302d4dee589a5df43a464420c9fe68ba83937dlgao 48330fdf1140b8d1ce93f3821d986fa165552023440lgao return FuncObjList 48430fdf1140b8d1ce93f3821d986fa165552023440lgao 48530fdf1140b8d1ce93f3821d986fa165552023440lgaodef GetFileModificationTimeFromDB(FullFileName): 48630fdf1140b8d1ce93f3821d986fa165552023440lgao TimeValue = 0.0 48730fdf1140b8d1ce93f3821d986fa165552023440lgao Db = GetDB() 48830fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select TimeStamp 48930fdf1140b8d1ce93f3821d986fa165552023440lgao from File 49030fdf1140b8d1ce93f3821d986fa165552023440lgao where FullPath = \'%s\' 49130fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FullFileName) 49230fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 49330fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 49430fdf1140b8d1ce93f3821d986fa165552023440lgao TimeValue = Result[0] 49530fdf1140b8d1ce93f3821d986fa165552023440lgao return TimeValue 49630fdf1140b8d1ce93f3821d986fa165552023440lgao 49730fdf1140b8d1ce93f3821d986fa165552023440lgaodef CollectSourceCodeDataIntoDB(RootDir): 49830fdf1140b8d1ce93f3821d986fa165552023440lgao FileObjList = [] 49930fdf1140b8d1ce93f3821d986fa165552023440lgao tuple = os.walk(RootDir) 50030fdf1140b8d1ce93f3821d986fa165552023440lgao IgnoredPattern = GetIgnoredDirListPattern() 50130fdf1140b8d1ce93f3821d986fa165552023440lgao ParseErrorFileList = [] 50230fdf1140b8d1ce93f3821d986fa165552023440lgao 50330fdf1140b8d1ce93f3821d986fa165552023440lgao for dirpath, dirnames, filenames in tuple: 50430fdf1140b8d1ce93f3821d986fa165552023440lgao if IgnoredPattern.match(dirpath.upper()): 50530fdf1140b8d1ce93f3821d986fa165552023440lgao continue 50630fdf1140b8d1ce93f3821d986fa165552023440lgao 50730fdf1140b8d1ce93f3821d986fa165552023440lgao for Dir in dirnames: 50830fdf1140b8d1ce93f3821d986fa165552023440lgao Dirname = os.path.join(dirpath, Dir) 50930fdf1140b8d1ce93f3821d986fa165552023440lgao if os.path.islink(Dirname): 51030fdf1140b8d1ce93f3821d986fa165552023440lgao Dirname = os.path.realpath(Dirname) 51130fdf1140b8d1ce93f3821d986fa165552023440lgao if os.path.isdir(Dirname): 51230fdf1140b8d1ce93f3821d986fa165552023440lgao # symlinks to directories are treated as directories 51330fdf1140b8d1ce93f3821d986fa165552023440lgao dirnames.remove(Dir) 51430fdf1140b8d1ce93f3821d986fa165552023440lgao dirnames.append(Dirname) 51530fdf1140b8d1ce93f3821d986fa165552023440lgao 51630fdf1140b8d1ce93f3821d986fa165552023440lgao for f in filenames: 5178c3f9b4e3c639b6a694bdb8099267f646681a34cHess Chen if f.lower() in EccGlobalData.gConfig.SkipFileList: 5188c3f9b4e3c639b6a694bdb8099267f646681a34cHess Chen continue 519e56468c072e0d53834787f4ad0e292b33cc6be08qhuang collector = None 52030fdf1140b8d1ce93f3821d986fa165552023440lgao FullName = os.path.normpath(os.path.join(dirpath, f)) 521e56468c072e0d53834787f4ad0e292b33cc6be08qhuang model = DataClass.MODEL_FILE_OTHERS 52230fdf1140b8d1ce93f3821d986fa165552023440lgao if os.path.splitext(f)[1] in ('.h', '.c'): 52330fdf1140b8d1ce93f3821d986fa165552023440lgao EdkLogger.info("Parsing " + FullName) 52430fdf1140b8d1ce93f3821d986fa165552023440lgao model = f.endswith('c') and DataClass.MODEL_FILE_C or DataClass.MODEL_FILE_H 52530fdf1140b8d1ce93f3821d986fa165552023440lgao collector = CodeFragmentCollector.CodeFragmentCollector(FullName) 52630fdf1140b8d1ce93f3821d986fa165552023440lgao try: 52730fdf1140b8d1ce93f3821d986fa165552023440lgao collector.ParseFile() 52830fdf1140b8d1ce93f3821d986fa165552023440lgao except UnicodeError: 52930fdf1140b8d1ce93f3821d986fa165552023440lgao ParseErrorFileList.append(FullName) 53030fdf1140b8d1ce93f3821d986fa165552023440lgao collector.CleanFileProfileBuffer() 53130fdf1140b8d1ce93f3821d986fa165552023440lgao collector.ParseFileWithClearedPPDirective() 53230fdf1140b8d1ce93f3821d986fa165552023440lgao# collector.PrintFragments() 533e56468c072e0d53834787f4ad0e292b33cc6be08qhuang BaseName = os.path.basename(f) 534e56468c072e0d53834787f4ad0e292b33cc6be08qhuang DirName = os.path.dirname(FullName) 535e56468c072e0d53834787f4ad0e292b33cc6be08qhuang Ext = os.path.splitext(f)[1].lstrip('.') 536e56468c072e0d53834787f4ad0e292b33cc6be08qhuang ModifiedTime = os.path.getmtime(FullName) 537e56468c072e0d53834787f4ad0e292b33cc6be08qhuang FileObj = DataClass.FileClass(-1, BaseName, Ext, DirName, FullName, model, ModifiedTime, GetFunctionList(), GetIdentifierList(), []) 538e56468c072e0d53834787f4ad0e292b33cc6be08qhuang FileObjList.append(FileObj) 539e56468c072e0d53834787f4ad0e292b33cc6be08qhuang if collector: 54052302d4dee589a5df43a464420c9fe68ba83937dlgao collector.CleanFileProfileBuffer() 54152302d4dee589a5df43a464420c9fe68ba83937dlgao 54230fdf1140b8d1ce93f3821d986fa165552023440lgao if len(ParseErrorFileList) > 0: 54330fdf1140b8d1ce93f3821d986fa165552023440lgao EdkLogger.info("Found unrecoverable error during parsing:\n\t%s\n" % "\n\t".join(ParseErrorFileList)) 54452302d4dee589a5df43a464420c9fe68ba83937dlgao 54552302d4dee589a5df43a464420c9fe68ba83937dlgao Db = GetDB() 54652302d4dee589a5df43a464420c9fe68ba83937dlgao for file in FileObjList: 547e56468c072e0d53834787f4ad0e292b33cc6be08qhuang if file.ExtName.upper() not in ['INF', 'DEC', 'DSC', 'FDF']: 548e56468c072e0d53834787f4ad0e292b33cc6be08qhuang Db.InsertOneFile(file) 54930fdf1140b8d1ce93f3821d986fa165552023440lgao 55030fdf1140b8d1ce93f3821d986fa165552023440lgao Db.UpdateIdentifierBelongsToFunction() 55130fdf1140b8d1ce93f3821d986fa165552023440lgao 55279b74a03e018ecbf03d8d50e6f20301e249c1ba5lgaodef GetTableID(FullFileName, ErrorMsgList=None): 55330fdf1140b8d1ce93f3821d986fa165552023440lgao if ErrorMsgList == None: 55430fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList = [] 55552302d4dee589a5df43a464420c9fe68ba83937dlgao 55630fdf1140b8d1ce93f3821d986fa165552023440lgao Db = GetDB() 55730fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select ID 55830fdf1140b8d1ce93f3821d986fa165552023440lgao from File 55930fdf1140b8d1ce93f3821d986fa165552023440lgao where FullPath like '%s' 56030fdf1140b8d1ce93f3821d986fa165552023440lgao """ % FullFileName 56130fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 56230fdf1140b8d1ce93f3821d986fa165552023440lgao 56330fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = -1 56430fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 56530fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID != -1: 56630fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList.append('Duplicate file ID found in DB for file %s' % FullFileName) 56779b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao return - 2 56830fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = Result[0] 56930fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID == -1: 57030fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList.append('NO file ID found in DB for file %s' % FullFileName) 57179b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao return - 1 57230fdf1140b8d1ce93f3821d986fa165552023440lgao return FileID 57330fdf1140b8d1ce93f3821d986fa165552023440lgao 57430fdf1140b8d1ce93f3821d986fa165552023440lgaodef GetIncludeFileList(FullFileName): 575e56468c072e0d53834787f4ad0e292b33cc6be08qhuang if os.path.splitext(FullFileName)[1].upper() not in ('.H'): 576e56468c072e0d53834787f4ad0e292b33cc6be08qhuang return [] 57730fdf1140b8d1ce93f3821d986fa165552023440lgao IFList = IncludeFileListDict.get(FullFileName) 57830fdf1140b8d1ce93f3821d986fa165552023440lgao if IFList != None: 57930fdf1140b8d1ce93f3821d986fa165552023440lgao return IFList 58052302d4dee589a5df43a464420c9fe68ba83937dlgao 58130fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(FullFileName) 58230fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 58330fdf1140b8d1ce93f3821d986fa165552023440lgao return [] 58452302d4dee589a5df43a464420c9fe68ba83937dlgao 58530fdf1140b8d1ce93f3821d986fa165552023440lgao Db = GetDB() 58630fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 58730fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Value 58830fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 58930fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d 59030fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_INCLUDE) 59130fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 59230fdf1140b8d1ce93f3821d986fa165552023440lgao IncludeFileListDict[FullFileName] = ResultSet 59330fdf1140b8d1ce93f3821d986fa165552023440lgao return ResultSet 59430fdf1140b8d1ce93f3821d986fa165552023440lgao 59530fdf1140b8d1ce93f3821d986fa165552023440lgaodef GetFullPathOfIncludeFile(Str, IncludePathList): 59630fdf1140b8d1ce93f3821d986fa165552023440lgao for IncludePath in IncludePathList: 59730fdf1140b8d1ce93f3821d986fa165552023440lgao FullPath = os.path.join(IncludePath, Str) 59830fdf1140b8d1ce93f3821d986fa165552023440lgao FullPath = os.path.normpath(FullPath) 59930fdf1140b8d1ce93f3821d986fa165552023440lgao if os.path.exists(FullPath): 60030fdf1140b8d1ce93f3821d986fa165552023440lgao return FullPath 60130fdf1140b8d1ce93f3821d986fa165552023440lgao return None 60230fdf1140b8d1ce93f3821d986fa165552023440lgao 60330fdf1140b8d1ce93f3821d986fa165552023440lgaodef GetAllIncludeFiles(FullFileName): 60430fdf1140b8d1ce93f3821d986fa165552023440lgao if AllIncludeFileListDict.get(FullFileName) != None: 60530fdf1140b8d1ce93f3821d986fa165552023440lgao return AllIncludeFileListDict.get(FullFileName) 60652302d4dee589a5df43a464420c9fe68ba83937dlgao 60730fdf1140b8d1ce93f3821d986fa165552023440lgao FileDirName = os.path.dirname(FullFileName) 60830fdf1140b8d1ce93f3821d986fa165552023440lgao IncludePathList = IncludePathListDict.get(FileDirName) 60930fdf1140b8d1ce93f3821d986fa165552023440lgao if IncludePathList == None: 61030fdf1140b8d1ce93f3821d986fa165552023440lgao IncludePathList = MetaDataParser.GetIncludeListOfFile(EccGlobalData.gWorkspace, FullFileName, GetDB()) 61130fdf1140b8d1ce93f3821d986fa165552023440lgao if FileDirName not in IncludePathList: 61230fdf1140b8d1ce93f3821d986fa165552023440lgao IncludePathList.insert(0, FileDirName) 61330fdf1140b8d1ce93f3821d986fa165552023440lgao IncludePathListDict[FileDirName] = IncludePathList 61430fdf1140b8d1ce93f3821d986fa165552023440lgao IncludeFileQueue = [] 61530fdf1140b8d1ce93f3821d986fa165552023440lgao for IncludeFile in GetIncludeFileList(FullFileName): 61630fdf1140b8d1ce93f3821d986fa165552023440lgao FileName = IncludeFile[0].lstrip('#').strip() 61730fdf1140b8d1ce93f3821d986fa165552023440lgao FileName = FileName.lstrip('include').strip() 61830fdf1140b8d1ce93f3821d986fa165552023440lgao FileName = FileName.strip('\"') 61930fdf1140b8d1ce93f3821d986fa165552023440lgao FileName = FileName.lstrip('<').rstrip('>').strip() 62030fdf1140b8d1ce93f3821d986fa165552023440lgao FullPath = GetFullPathOfIncludeFile(FileName, IncludePathList) 62130fdf1140b8d1ce93f3821d986fa165552023440lgao if FullPath != None: 62230fdf1140b8d1ce93f3821d986fa165552023440lgao IncludeFileQueue.append(FullPath) 62352302d4dee589a5df43a464420c9fe68ba83937dlgao 62430fdf1140b8d1ce93f3821d986fa165552023440lgao i = 0 62530fdf1140b8d1ce93f3821d986fa165552023440lgao while i < len(IncludeFileQueue): 62630fdf1140b8d1ce93f3821d986fa165552023440lgao for IncludeFile in GetIncludeFileList(IncludeFileQueue[i]): 62730fdf1140b8d1ce93f3821d986fa165552023440lgao FileName = IncludeFile[0].lstrip('#').strip() 62830fdf1140b8d1ce93f3821d986fa165552023440lgao FileName = FileName.lstrip('include').strip() 62930fdf1140b8d1ce93f3821d986fa165552023440lgao FileName = FileName.strip('\"') 63030fdf1140b8d1ce93f3821d986fa165552023440lgao FileName = FileName.lstrip('<').rstrip('>').strip() 63130fdf1140b8d1ce93f3821d986fa165552023440lgao FullPath = GetFullPathOfIncludeFile(FileName, IncludePathList) 63230fdf1140b8d1ce93f3821d986fa165552023440lgao if FullPath != None and FullPath not in IncludeFileQueue: 63330fdf1140b8d1ce93f3821d986fa165552023440lgao IncludeFileQueue.insert(i + 1, FullPath) 63430fdf1140b8d1ce93f3821d986fa165552023440lgao i += 1 63552302d4dee589a5df43a464420c9fe68ba83937dlgao 63630fdf1140b8d1ce93f3821d986fa165552023440lgao AllIncludeFileListDict[FullFileName] = IncludeFileQueue 63730fdf1140b8d1ce93f3821d986fa165552023440lgao return IncludeFileQueue 63830fdf1140b8d1ce93f3821d986fa165552023440lgao 63930fdf1140b8d1ce93f3821d986fa165552023440lgaodef GetPredicateListFromPredicateExpStr(PES): 64030fdf1140b8d1ce93f3821d986fa165552023440lgao 64130fdf1140b8d1ce93f3821d986fa165552023440lgao PredicateList = [] 64230fdf1140b8d1ce93f3821d986fa165552023440lgao i = 0 64330fdf1140b8d1ce93f3821d986fa165552023440lgao PredicateBegin = 0 64430fdf1140b8d1ce93f3821d986fa165552023440lgao #PredicateEnd = 0 64530fdf1140b8d1ce93f3821d986fa165552023440lgao LogicOpPos = -1 64630fdf1140b8d1ce93f3821d986fa165552023440lgao p = GetFuncDeclPattern() 64730fdf1140b8d1ce93f3821d986fa165552023440lgao while i < len(PES) - 1: 64830fdf1140b8d1ce93f3821d986fa165552023440lgao if (PES[i].isalnum() or PES[i] == '_' or PES[i] == '*') and LogicOpPos > PredicateBegin: 64930fdf1140b8d1ce93f3821d986fa165552023440lgao PredicateBegin = i 65079b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao if (PES[i] == '&' and PES[i + 1] == '&') or (PES[i] == '|' and PES[i + 1] == '|'): 65130fdf1140b8d1ce93f3821d986fa165552023440lgao LogicOpPos = i 65230fdf1140b8d1ce93f3821d986fa165552023440lgao Exp = PES[PredicateBegin:i].strip() 65330fdf1140b8d1ce93f3821d986fa165552023440lgao # Exp may contain '.' or '->' 65430fdf1140b8d1ce93f3821d986fa165552023440lgao TmpExp = Exp.replace('.', '').replace('->', '') 65530fdf1140b8d1ce93f3821d986fa165552023440lgao if p.match(TmpExp): 65630fdf1140b8d1ce93f3821d986fa165552023440lgao PredicateList.append(Exp) 65730fdf1140b8d1ce93f3821d986fa165552023440lgao else: 65830fdf1140b8d1ce93f3821d986fa165552023440lgao PredicateList.append(Exp.rstrip(';').rstrip(')').strip()) 65930fdf1140b8d1ce93f3821d986fa165552023440lgao i += 1 66052302d4dee589a5df43a464420c9fe68ba83937dlgao 66130fdf1140b8d1ce93f3821d986fa165552023440lgao if PredicateBegin > LogicOpPos: 66230fdf1140b8d1ce93f3821d986fa165552023440lgao while PredicateBegin < len(PES): 66330fdf1140b8d1ce93f3821d986fa165552023440lgao if PES[PredicateBegin].isalnum() or PES[PredicateBegin] == '_' or PES[PredicateBegin] == '*': 66430fdf1140b8d1ce93f3821d986fa165552023440lgao break 66530fdf1140b8d1ce93f3821d986fa165552023440lgao PredicateBegin += 1 66630fdf1140b8d1ce93f3821d986fa165552023440lgao Exp = PES[PredicateBegin:len(PES)].strip() 66730fdf1140b8d1ce93f3821d986fa165552023440lgao # Exp may contain '.' or '->' 66830fdf1140b8d1ce93f3821d986fa165552023440lgao TmpExp = Exp.replace('.', '').replace('->', '') 66930fdf1140b8d1ce93f3821d986fa165552023440lgao if p.match(TmpExp): 67030fdf1140b8d1ce93f3821d986fa165552023440lgao PredicateList.append(Exp) 67130fdf1140b8d1ce93f3821d986fa165552023440lgao else: 67230fdf1140b8d1ce93f3821d986fa165552023440lgao PredicateList.append(Exp.rstrip(';').rstrip(')').strip()) 67330fdf1140b8d1ce93f3821d986fa165552023440lgao return PredicateList 67452302d4dee589a5df43a464420c9fe68ba83937dlgao 67579b74a03e018ecbf03d8d50e6f20301e249c1ba5lgaodef GetCNameList(Lvalue, StarList=[]): 67630fdf1140b8d1ce93f3821d986fa165552023440lgao Lvalue += ' ' 67730fdf1140b8d1ce93f3821d986fa165552023440lgao i = 0 67830fdf1140b8d1ce93f3821d986fa165552023440lgao SearchBegin = 0 67930fdf1140b8d1ce93f3821d986fa165552023440lgao VarStart = -1 68030fdf1140b8d1ce93f3821d986fa165552023440lgao VarEnd = -1 68130fdf1140b8d1ce93f3821d986fa165552023440lgao VarList = [] 68252302d4dee589a5df43a464420c9fe68ba83937dlgao 68330fdf1140b8d1ce93f3821d986fa165552023440lgao while SearchBegin < len(Lvalue): 68430fdf1140b8d1ce93f3821d986fa165552023440lgao while i < len(Lvalue): 68530fdf1140b8d1ce93f3821d986fa165552023440lgao if Lvalue[i].isalnum() or Lvalue[i] == '_': 68630fdf1140b8d1ce93f3821d986fa165552023440lgao if VarStart == -1: 68730fdf1140b8d1ce93f3821d986fa165552023440lgao VarStart = i 68830fdf1140b8d1ce93f3821d986fa165552023440lgao VarEnd = i 68930fdf1140b8d1ce93f3821d986fa165552023440lgao i += 1 69030fdf1140b8d1ce93f3821d986fa165552023440lgao elif VarEnd != -1: 69179b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao VarList.append(Lvalue[VarStart:VarEnd + 1]) 69230fdf1140b8d1ce93f3821d986fa165552023440lgao i += 1 69330fdf1140b8d1ce93f3821d986fa165552023440lgao break 69430fdf1140b8d1ce93f3821d986fa165552023440lgao else: 69530fdf1140b8d1ce93f3821d986fa165552023440lgao if VarStart == -1 and Lvalue[i] == '*': 69630fdf1140b8d1ce93f3821d986fa165552023440lgao StarList.append('*') 69730fdf1140b8d1ce93f3821d986fa165552023440lgao i += 1 69830fdf1140b8d1ce93f3821d986fa165552023440lgao if VarEnd == -1: 69930fdf1140b8d1ce93f3821d986fa165552023440lgao break 70052302d4dee589a5df43a464420c9fe68ba83937dlgao 70152302d4dee589a5df43a464420c9fe68ba83937dlgao 70230fdf1140b8d1ce93f3821d986fa165552023440lgao DotIndex = Lvalue[VarEnd:].find('.') 70330fdf1140b8d1ce93f3821d986fa165552023440lgao ArrowIndex = Lvalue[VarEnd:].find('->') 70430fdf1140b8d1ce93f3821d986fa165552023440lgao if DotIndex == -1 and ArrowIndex == -1: 70530fdf1140b8d1ce93f3821d986fa165552023440lgao break 70630fdf1140b8d1ce93f3821d986fa165552023440lgao elif DotIndex == -1 and ArrowIndex != -1: 70730fdf1140b8d1ce93f3821d986fa165552023440lgao SearchBegin = VarEnd + ArrowIndex 70830fdf1140b8d1ce93f3821d986fa165552023440lgao elif ArrowIndex == -1 and DotIndex != -1: 70930fdf1140b8d1ce93f3821d986fa165552023440lgao SearchBegin = VarEnd + DotIndex 71030fdf1140b8d1ce93f3821d986fa165552023440lgao else: 71152302d4dee589a5df43a464420c9fe68ba83937dlgao SearchBegin = VarEnd + ((DotIndex < ArrowIndex) and DotIndex or ArrowIndex) 71252302d4dee589a5df43a464420c9fe68ba83937dlgao 71330fdf1140b8d1ce93f3821d986fa165552023440lgao i = SearchBegin 71430fdf1140b8d1ce93f3821d986fa165552023440lgao VarStart = -1 71530fdf1140b8d1ce93f3821d986fa165552023440lgao VarEnd = -1 71652302d4dee589a5df43a464420c9fe68ba83937dlgao 71752302d4dee589a5df43a464420c9fe68ba83937dlgao return VarList 71830fdf1140b8d1ce93f3821d986fa165552023440lgao 71979b74a03e018ecbf03d8d50e6f20301e249c1ba5lgaodef SplitPredicateByOp(Str, Op, IsFuncCalling=False): 72030fdf1140b8d1ce93f3821d986fa165552023440lgao 72130fdf1140b8d1ce93f3821d986fa165552023440lgao Name = Str.strip() 72230fdf1140b8d1ce93f3821d986fa165552023440lgao Value = None 72352302d4dee589a5df43a464420c9fe68ba83937dlgao 72430fdf1140b8d1ce93f3821d986fa165552023440lgao if IsFuncCalling: 72530fdf1140b8d1ce93f3821d986fa165552023440lgao Index = 0 72630fdf1140b8d1ce93f3821d986fa165552023440lgao LBFound = False 72730fdf1140b8d1ce93f3821d986fa165552023440lgao UnmatchedLBCount = 0 72830fdf1140b8d1ce93f3821d986fa165552023440lgao while Index < len(Str): 72930fdf1140b8d1ce93f3821d986fa165552023440lgao while not LBFound and Str[Index] != '_' and not Str[Index].isalnum(): 73030fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 73152302d4dee589a5df43a464420c9fe68ba83937dlgao 73230fdf1140b8d1ce93f3821d986fa165552023440lgao while not LBFound and (Str[Index].isalnum() or Str[Index] == '_'): 73330fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 73430fdf1140b8d1ce93f3821d986fa165552023440lgao # maybe type-cast at the begining, skip it. 73530fdf1140b8d1ce93f3821d986fa165552023440lgao RemainingStr = Str[Index:].lstrip() 73630fdf1140b8d1ce93f3821d986fa165552023440lgao if RemainingStr.startswith(')') and not LBFound: 73730fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 73830fdf1140b8d1ce93f3821d986fa165552023440lgao continue 73952302d4dee589a5df43a464420c9fe68ba83937dlgao 74030fdf1140b8d1ce93f3821d986fa165552023440lgao if RemainingStr.startswith('(') and not LBFound: 74130fdf1140b8d1ce93f3821d986fa165552023440lgao LBFound = True 74252302d4dee589a5df43a464420c9fe68ba83937dlgao 74330fdf1140b8d1ce93f3821d986fa165552023440lgao if Str[Index] == '(': 74430fdf1140b8d1ce93f3821d986fa165552023440lgao UnmatchedLBCount += 1 74530fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 74630fdf1140b8d1ce93f3821d986fa165552023440lgao continue 74752302d4dee589a5df43a464420c9fe68ba83937dlgao 74830fdf1140b8d1ce93f3821d986fa165552023440lgao if Str[Index] == ')': 74930fdf1140b8d1ce93f3821d986fa165552023440lgao UnmatchedLBCount -= 1 75030fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 75130fdf1140b8d1ce93f3821d986fa165552023440lgao if UnmatchedLBCount == 0: 75230fdf1140b8d1ce93f3821d986fa165552023440lgao break 75330fdf1140b8d1ce93f3821d986fa165552023440lgao continue 75452302d4dee589a5df43a464420c9fe68ba83937dlgao 75530fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 75652302d4dee589a5df43a464420c9fe68ba83937dlgao 75730fdf1140b8d1ce93f3821d986fa165552023440lgao if UnmatchedLBCount > 0: 75830fdf1140b8d1ce93f3821d986fa165552023440lgao return [Name] 75952302d4dee589a5df43a464420c9fe68ba83937dlgao 76030fdf1140b8d1ce93f3821d986fa165552023440lgao IndexInRemainingStr = Str[Index:].find(Op) 76130fdf1140b8d1ce93f3821d986fa165552023440lgao if IndexInRemainingStr == -1: 76230fdf1140b8d1ce93f3821d986fa165552023440lgao return [Name] 76352302d4dee589a5df43a464420c9fe68ba83937dlgao 76430fdf1140b8d1ce93f3821d986fa165552023440lgao Name = Str[0:Index + IndexInRemainingStr].strip() 76579b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao Value = Str[Index + IndexInRemainingStr + len(Op):].strip().strip(')') 76630fdf1140b8d1ce93f3821d986fa165552023440lgao return [Name, Value] 76752302d4dee589a5df43a464420c9fe68ba83937dlgao 76830fdf1140b8d1ce93f3821d986fa165552023440lgao TmpStr = Str.rstrip(';').rstrip(')') 76930fdf1140b8d1ce93f3821d986fa165552023440lgao while True: 77030fdf1140b8d1ce93f3821d986fa165552023440lgao Index = TmpStr.rfind(Op) 77130fdf1140b8d1ce93f3821d986fa165552023440lgao if Index == -1: 77230fdf1140b8d1ce93f3821d986fa165552023440lgao return [Name] 77352302d4dee589a5df43a464420c9fe68ba83937dlgao 77479b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao if Str[Index - 1].isalnum() or Str[Index - 1].isspace() or Str[Index - 1] == ')' or Str[Index - 1] == ']': 77530fdf1140b8d1ce93f3821d986fa165552023440lgao Name = Str[0:Index].strip() 77630fdf1140b8d1ce93f3821d986fa165552023440lgao Value = Str[Index + len(Op):].strip() 77752302d4dee589a5df43a464420c9fe68ba83937dlgao return [Name, Value] 77852302d4dee589a5df43a464420c9fe68ba83937dlgao 77930fdf1140b8d1ce93f3821d986fa165552023440lgao TmpStr = Str[0:Index - 1] 78030fdf1140b8d1ce93f3821d986fa165552023440lgao 78130fdf1140b8d1ce93f3821d986fa165552023440lgaodef SplitPredicateStr(Str): 78252302d4dee589a5df43a464420c9fe68ba83937dlgao 78352302d4dee589a5df43a464420c9fe68ba83937dlgao Str = Str.lstrip('(') 78430fdf1140b8d1ce93f3821d986fa165552023440lgao IsFuncCalling = False 78530fdf1140b8d1ce93f3821d986fa165552023440lgao p = GetFuncDeclPattern() 78630fdf1140b8d1ce93f3821d986fa165552023440lgao TmpStr = Str.replace('.', '').replace('->', '') 78730fdf1140b8d1ce93f3821d986fa165552023440lgao if p.match(TmpStr): 78830fdf1140b8d1ce93f3821d986fa165552023440lgao IsFuncCalling = True 78952302d4dee589a5df43a464420c9fe68ba83937dlgao 79030fdf1140b8d1ce93f3821d986fa165552023440lgao PredPartList = SplitPredicateByOp(Str, '==', IsFuncCalling) 79130fdf1140b8d1ce93f3821d986fa165552023440lgao if len(PredPartList) > 1: 79230fdf1140b8d1ce93f3821d986fa165552023440lgao return [PredPartList, '=='] 79352302d4dee589a5df43a464420c9fe68ba83937dlgao 79430fdf1140b8d1ce93f3821d986fa165552023440lgao PredPartList = SplitPredicateByOp(Str, '!=', IsFuncCalling) 79530fdf1140b8d1ce93f3821d986fa165552023440lgao if len(PredPartList) > 1: 79630fdf1140b8d1ce93f3821d986fa165552023440lgao return [PredPartList, '!='] 79752302d4dee589a5df43a464420c9fe68ba83937dlgao 79830fdf1140b8d1ce93f3821d986fa165552023440lgao PredPartList = SplitPredicateByOp(Str, '>=', IsFuncCalling) 79930fdf1140b8d1ce93f3821d986fa165552023440lgao if len(PredPartList) > 1: 80030fdf1140b8d1ce93f3821d986fa165552023440lgao return [PredPartList, '>='] 80152302d4dee589a5df43a464420c9fe68ba83937dlgao 80230fdf1140b8d1ce93f3821d986fa165552023440lgao PredPartList = SplitPredicateByOp(Str, '<=', IsFuncCalling) 80330fdf1140b8d1ce93f3821d986fa165552023440lgao if len(PredPartList) > 1: 80430fdf1140b8d1ce93f3821d986fa165552023440lgao return [PredPartList, '<='] 80552302d4dee589a5df43a464420c9fe68ba83937dlgao 80630fdf1140b8d1ce93f3821d986fa165552023440lgao PredPartList = SplitPredicateByOp(Str, '>', IsFuncCalling) 80730fdf1140b8d1ce93f3821d986fa165552023440lgao if len(PredPartList) > 1: 80830fdf1140b8d1ce93f3821d986fa165552023440lgao return [PredPartList, '>'] 80952302d4dee589a5df43a464420c9fe68ba83937dlgao 81030fdf1140b8d1ce93f3821d986fa165552023440lgao PredPartList = SplitPredicateByOp(Str, '<', IsFuncCalling) 81130fdf1140b8d1ce93f3821d986fa165552023440lgao if len(PredPartList) > 1: 81230fdf1140b8d1ce93f3821d986fa165552023440lgao return [PredPartList, '<'] 81352302d4dee589a5df43a464420c9fe68ba83937dlgao 81430fdf1140b8d1ce93f3821d986fa165552023440lgao return [[Str, None], None] 81530fdf1140b8d1ce93f3821d986fa165552023440lgao 81630fdf1140b8d1ce93f3821d986fa165552023440lgaodef GetFuncContainsPE(ExpLine, ResultSet): 81730fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 81830fdf1140b8d1ce93f3821d986fa165552023440lgao if Result[0] < ExpLine and Result[1] > ExpLine: 81930fdf1140b8d1ce93f3821d986fa165552023440lgao return Result 82030fdf1140b8d1ce93f3821d986fa165552023440lgao return None 82130fdf1140b8d1ce93f3821d986fa165552023440lgao 82230fdf1140b8d1ce93f3821d986fa165552023440lgaodef PatternInModifier(Modifier, SubStr): 82330fdf1140b8d1ce93f3821d986fa165552023440lgao PartList = Modifier.split() 82430fdf1140b8d1ce93f3821d986fa165552023440lgao for Part in PartList: 82530fdf1140b8d1ce93f3821d986fa165552023440lgao if Part == SubStr: 82630fdf1140b8d1ce93f3821d986fa165552023440lgao return True 82730fdf1140b8d1ce93f3821d986fa165552023440lgao return False 82830fdf1140b8d1ce93f3821d986fa165552023440lgao 82930fdf1140b8d1ce93f3821d986fa165552023440lgaodef GetDataTypeFromModifier(ModifierStr): 83030fdf1140b8d1ce93f3821d986fa165552023440lgao MList = ModifierStr.split() 83179b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao ReturnType = '' 83230fdf1140b8d1ce93f3821d986fa165552023440lgao for M in MList: 83330fdf1140b8d1ce93f3821d986fa165552023440lgao if M in EccGlobalData.gConfig.ModifierList: 83479b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao continue 83530fdf1140b8d1ce93f3821d986fa165552023440lgao # remove array sufix 83679b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao if M.startswith('[') or M.endswith(']'): 83779b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao continue 83830fdf1140b8d1ce93f3821d986fa165552023440lgao ReturnType += M + ' ' 83952302d4dee589a5df43a464420c9fe68ba83937dlgao 84030fdf1140b8d1ce93f3821d986fa165552023440lgao ReturnType = ReturnType.strip() 84130fdf1140b8d1ce93f3821d986fa165552023440lgao if len(ReturnType) == 0: 84230fdf1140b8d1ce93f3821d986fa165552023440lgao ReturnType = 'VOID' 84330fdf1140b8d1ce93f3821d986fa165552023440lgao return ReturnType 84430fdf1140b8d1ce93f3821d986fa165552023440lgao 84530fdf1140b8d1ce93f3821d986fa165552023440lgaodef DiffModifier(Str1, Str2): 84630fdf1140b8d1ce93f3821d986fa165552023440lgao PartList1 = Str1.split() 84730fdf1140b8d1ce93f3821d986fa165552023440lgao PartList2 = Str2.split() 84830fdf1140b8d1ce93f3821d986fa165552023440lgao if PartList1 == PartList2: 84930fdf1140b8d1ce93f3821d986fa165552023440lgao return False 85030fdf1140b8d1ce93f3821d986fa165552023440lgao else: 85130fdf1140b8d1ce93f3821d986fa165552023440lgao return True 85252302d4dee589a5df43a464420c9fe68ba83937dlgao 85330fdf1140b8d1ce93f3821d986fa165552023440lgaodef GetTypedefDict(FullFileName): 85452302d4dee589a5df43a464420c9fe68ba83937dlgao 85530fdf1140b8d1ce93f3821d986fa165552023440lgao Dict = ComplexTypeDict.get(FullFileName) 85630fdf1140b8d1ce93f3821d986fa165552023440lgao if Dict != None: 85730fdf1140b8d1ce93f3821d986fa165552023440lgao return Dict 85852302d4dee589a5df43a464420c9fe68ba83937dlgao 85930fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(FullFileName) 86030fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 86130fdf1140b8d1ce93f3821d986fa165552023440lgao Db = GetDB() 86230fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, Name, Value, ID 86330fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 86430fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d 86530fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_TYPEDEF) 86630fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 86752302d4dee589a5df43a464420c9fe68ba83937dlgao 86830fdf1140b8d1ce93f3821d986fa165552023440lgao Dict = {} 86930fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 87030fdf1140b8d1ce93f3821d986fa165552023440lgao if len(Result[0]) == 0: 87130fdf1140b8d1ce93f3821d986fa165552023440lgao Dict[Result[1]] = Result[2] 87252302d4dee589a5df43a464420c9fe68ba83937dlgao 87330fdf1140b8d1ce93f3821d986fa165552023440lgao IncludeFileList = GetAllIncludeFiles(FullFileName) 87430fdf1140b8d1ce93f3821d986fa165552023440lgao for F in IncludeFileList: 87530fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(F) 87630fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 87730fdf1140b8d1ce93f3821d986fa165552023440lgao continue 87852302d4dee589a5df43a464420c9fe68ba83937dlgao 87930fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 88030fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, Name, Value, ID 88130fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 88230fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d 88330fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_TYPEDEF) 88430fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 88552302d4dee589a5df43a464420c9fe68ba83937dlgao 88630fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 88730fdf1140b8d1ce93f3821d986fa165552023440lgao if not Result[2].startswith('FP ('): 88830fdf1140b8d1ce93f3821d986fa165552023440lgao Dict[Result[1]] = Result[2] 88930fdf1140b8d1ce93f3821d986fa165552023440lgao else: 89030fdf1140b8d1ce93f3821d986fa165552023440lgao if len(Result[0]) == 0: 89130fdf1140b8d1ce93f3821d986fa165552023440lgao Dict[Result[1]] = 'VOID' 89230fdf1140b8d1ce93f3821d986fa165552023440lgao else: 89330fdf1140b8d1ce93f3821d986fa165552023440lgao Dict[Result[1]] = GetDataTypeFromModifier(Result[0]) 89452302d4dee589a5df43a464420c9fe68ba83937dlgao 89530fdf1140b8d1ce93f3821d986fa165552023440lgao ComplexTypeDict[FullFileName] = Dict 89630fdf1140b8d1ce93f3821d986fa165552023440lgao return Dict 89730fdf1140b8d1ce93f3821d986fa165552023440lgao 89830fdf1140b8d1ce93f3821d986fa165552023440lgaodef GetSUDict(FullFileName): 89952302d4dee589a5df43a464420c9fe68ba83937dlgao 90030fdf1140b8d1ce93f3821d986fa165552023440lgao Dict = SUDict.get(FullFileName) 90130fdf1140b8d1ce93f3821d986fa165552023440lgao if Dict != None: 90230fdf1140b8d1ce93f3821d986fa165552023440lgao return Dict 90352302d4dee589a5df43a464420c9fe68ba83937dlgao 90430fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(FullFileName) 90530fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 90630fdf1140b8d1ce93f3821d986fa165552023440lgao Db = GetDB() 90730fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Name, Value, ID 90830fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 90930fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d or Model = %d 91030fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_STRUCTURE, DataClass.MODEL_IDENTIFIER_UNION) 91130fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 91252302d4dee589a5df43a464420c9fe68ba83937dlgao 91330fdf1140b8d1ce93f3821d986fa165552023440lgao Dict = {} 91430fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 91530fdf1140b8d1ce93f3821d986fa165552023440lgao if len(Result[1]) > 0: 91630fdf1140b8d1ce93f3821d986fa165552023440lgao Dict[Result[0]] = Result[1] 91752302d4dee589a5df43a464420c9fe68ba83937dlgao 91830fdf1140b8d1ce93f3821d986fa165552023440lgao IncludeFileList = GetAllIncludeFiles(FullFileName) 91930fdf1140b8d1ce93f3821d986fa165552023440lgao for F in IncludeFileList: 92030fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(F) 92130fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 92230fdf1140b8d1ce93f3821d986fa165552023440lgao continue 92352302d4dee589a5df43a464420c9fe68ba83937dlgao 92430fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 92530fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Name, Value, ID 92630fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 92730fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d or Model = %d 92830fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_STRUCTURE, DataClass.MODEL_IDENTIFIER_UNION) 92930fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 93052302d4dee589a5df43a464420c9fe68ba83937dlgao 93130fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 93230fdf1140b8d1ce93f3821d986fa165552023440lgao if len(Result[1]) > 0: 93330fdf1140b8d1ce93f3821d986fa165552023440lgao Dict[Result[0]] = Result[1] 93452302d4dee589a5df43a464420c9fe68ba83937dlgao 93530fdf1140b8d1ce93f3821d986fa165552023440lgao SUDict[FullFileName] = Dict 93630fdf1140b8d1ce93f3821d986fa165552023440lgao return Dict 93730fdf1140b8d1ce93f3821d986fa165552023440lgao 93830fdf1140b8d1ce93f3821d986fa165552023440lgaodef StripComments(Str): 93930fdf1140b8d1ce93f3821d986fa165552023440lgao Str += ' ' 94030fdf1140b8d1ce93f3821d986fa165552023440lgao ListFromStr = list(Str) 94152302d4dee589a5df43a464420c9fe68ba83937dlgao 94230fdf1140b8d1ce93f3821d986fa165552023440lgao InComment = False 94330fdf1140b8d1ce93f3821d986fa165552023440lgao DoubleSlashComment = False 94430fdf1140b8d1ce93f3821d986fa165552023440lgao Index = 0 94530fdf1140b8d1ce93f3821d986fa165552023440lgao while Index < len(ListFromStr): 94630fdf1140b8d1ce93f3821d986fa165552023440lgao # meet new line, then no longer in a comment for // 94730fdf1140b8d1ce93f3821d986fa165552023440lgao if ListFromStr[Index] == '\n': 94830fdf1140b8d1ce93f3821d986fa165552023440lgao if InComment and DoubleSlashComment: 94930fdf1140b8d1ce93f3821d986fa165552023440lgao InComment = False 95030fdf1140b8d1ce93f3821d986fa165552023440lgao DoubleSlashComment = False 95130fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 95230fdf1140b8d1ce93f3821d986fa165552023440lgao # check for */ comment end 95379b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao elif InComment and not DoubleSlashComment and ListFromStr[Index] == '*' and ListFromStr[Index + 1] == '/': 95430fdf1140b8d1ce93f3821d986fa165552023440lgao ListFromStr[Index] = ' ' 95530fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 95630fdf1140b8d1ce93f3821d986fa165552023440lgao ListFromStr[Index] = ' ' 95730fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 95830fdf1140b8d1ce93f3821d986fa165552023440lgao InComment = False 95930fdf1140b8d1ce93f3821d986fa165552023440lgao # set comments to spaces 96030fdf1140b8d1ce93f3821d986fa165552023440lgao elif InComment: 96130fdf1140b8d1ce93f3821d986fa165552023440lgao ListFromStr[Index] = ' ' 96230fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 96330fdf1140b8d1ce93f3821d986fa165552023440lgao # check for // comment 96479b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao elif ListFromStr[Index] == '/' and ListFromStr[Index + 1] == '/' and ListFromStr[Index + 2] != '\n': 96530fdf1140b8d1ce93f3821d986fa165552023440lgao InComment = True 96630fdf1140b8d1ce93f3821d986fa165552023440lgao DoubleSlashComment = True 96752302d4dee589a5df43a464420c9fe68ba83937dlgao 96830fdf1140b8d1ce93f3821d986fa165552023440lgao # check for /* comment start 96979b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao elif ListFromStr[Index] == '/' and ListFromStr[Index + 1] == '*': 97030fdf1140b8d1ce93f3821d986fa165552023440lgao ListFromStr[Index] = ' ' 97130fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 97230fdf1140b8d1ce93f3821d986fa165552023440lgao ListFromStr[Index] = ' ' 97330fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 97430fdf1140b8d1ce93f3821d986fa165552023440lgao InComment = True 97530fdf1140b8d1ce93f3821d986fa165552023440lgao else: 97630fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 97730fdf1140b8d1ce93f3821d986fa165552023440lgao 97830fdf1140b8d1ce93f3821d986fa165552023440lgao # restore from List to String 97930fdf1140b8d1ce93f3821d986fa165552023440lgao Str = "".join(ListFromStr) 98030fdf1140b8d1ce93f3821d986fa165552023440lgao Str = Str.rstrip(' ') 98152302d4dee589a5df43a464420c9fe68ba83937dlgao 98230fdf1140b8d1ce93f3821d986fa165552023440lgao return Str 98330fdf1140b8d1ce93f3821d986fa165552023440lgao 98430fdf1140b8d1ce93f3821d986fa165552023440lgaodef GetFinalTypeValue(Type, FieldName, TypedefDict, SUDict): 98530fdf1140b8d1ce93f3821d986fa165552023440lgao Value = TypedefDict.get(Type) 98630fdf1140b8d1ce93f3821d986fa165552023440lgao if Value == None: 98730fdf1140b8d1ce93f3821d986fa165552023440lgao Value = SUDict.get(Type) 98830fdf1140b8d1ce93f3821d986fa165552023440lgao if Value == None: 98930fdf1140b8d1ce93f3821d986fa165552023440lgao return None 99052302d4dee589a5df43a464420c9fe68ba83937dlgao 99130fdf1140b8d1ce93f3821d986fa165552023440lgao LBPos = Value.find('{') 99230fdf1140b8d1ce93f3821d986fa165552023440lgao while LBPos == -1: 99330fdf1140b8d1ce93f3821d986fa165552023440lgao FTList = Value.split() 99430fdf1140b8d1ce93f3821d986fa165552023440lgao for FT in FTList: 99530fdf1140b8d1ce93f3821d986fa165552023440lgao if FT not in ('struct', 'union'): 99630fdf1140b8d1ce93f3821d986fa165552023440lgao Value = TypedefDict.get(FT) 99730fdf1140b8d1ce93f3821d986fa165552023440lgao if Value == None: 99830fdf1140b8d1ce93f3821d986fa165552023440lgao Value = SUDict.get(FT) 99930fdf1140b8d1ce93f3821d986fa165552023440lgao break 100052302d4dee589a5df43a464420c9fe68ba83937dlgao 100130fdf1140b8d1ce93f3821d986fa165552023440lgao if Value == None: 100230fdf1140b8d1ce93f3821d986fa165552023440lgao return None 100352302d4dee589a5df43a464420c9fe68ba83937dlgao 100430fdf1140b8d1ce93f3821d986fa165552023440lgao LBPos = Value.find('{') 100552302d4dee589a5df43a464420c9fe68ba83937dlgao 100630fdf1140b8d1ce93f3821d986fa165552023440lgao# RBPos = Value.find('}') 100730fdf1140b8d1ce93f3821d986fa165552023440lgao Fields = Value[LBPos + 1:] 100830fdf1140b8d1ce93f3821d986fa165552023440lgao Fields = StripComments(Fields) 100930fdf1140b8d1ce93f3821d986fa165552023440lgao FieldsList = Fields.split(';') 101030fdf1140b8d1ce93f3821d986fa165552023440lgao for Field in FieldsList: 101130fdf1140b8d1ce93f3821d986fa165552023440lgao Field = Field.strip() 101230fdf1140b8d1ce93f3821d986fa165552023440lgao Index = Field.rfind(FieldName) 101330fdf1140b8d1ce93f3821d986fa165552023440lgao if Index < 1: 101430fdf1140b8d1ce93f3821d986fa165552023440lgao continue 101530fdf1140b8d1ce93f3821d986fa165552023440lgao if not Field[Index - 1].isalnum(): 101630fdf1140b8d1ce93f3821d986fa165552023440lgao if Index + len(FieldName) == len(Field): 101730fdf1140b8d1ce93f3821d986fa165552023440lgao Type = GetDataTypeFromModifier(Field[0:Index]) 101830fdf1140b8d1ce93f3821d986fa165552023440lgao return Type.strip() 101930fdf1140b8d1ce93f3821d986fa165552023440lgao else: 102052302d4dee589a5df43a464420c9fe68ba83937dlgao # For the condition that the field in struct is an array with [] sufixes... 102130fdf1140b8d1ce93f3821d986fa165552023440lgao if not Field[Index + len(FieldName)].isalnum(): 102230fdf1140b8d1ce93f3821d986fa165552023440lgao Type = GetDataTypeFromModifier(Field[0:Index]) 102330fdf1140b8d1ce93f3821d986fa165552023440lgao return Type.strip() 102452302d4dee589a5df43a464420c9fe68ba83937dlgao 102530fdf1140b8d1ce93f3821d986fa165552023440lgao return None 102652302d4dee589a5df43a464420c9fe68ba83937dlgao 102779b74a03e018ecbf03d8d50e6f20301e249c1ba5lgaodef GetRealType(Type, TypedefDict, TargetType=None): 102830fdf1140b8d1ce93f3821d986fa165552023440lgao if TargetType != None and Type == TargetType: 102930fdf1140b8d1ce93f3821d986fa165552023440lgao return Type 103030fdf1140b8d1ce93f3821d986fa165552023440lgao while TypedefDict.get(Type): 103130fdf1140b8d1ce93f3821d986fa165552023440lgao Type = TypedefDict.get(Type) 103230fdf1140b8d1ce93f3821d986fa165552023440lgao if TargetType != None and Type == TargetType: 103330fdf1140b8d1ce93f3821d986fa165552023440lgao return Type 103430fdf1140b8d1ce93f3821d986fa165552023440lgao return Type 103530fdf1140b8d1ce93f3821d986fa165552023440lgao 103679b74a03e018ecbf03d8d50e6f20301e249c1ba5lgaodef GetTypeInfo(RefList, Modifier, FullFileName, TargetType=None): 103730fdf1140b8d1ce93f3821d986fa165552023440lgao TypedefDict = GetTypedefDict(FullFileName) 103830fdf1140b8d1ce93f3821d986fa165552023440lgao SUDict = GetSUDict(FullFileName) 103930fdf1140b8d1ce93f3821d986fa165552023440lgao Type = GetDataTypeFromModifier(Modifier).replace('*', '').strip() 104052302d4dee589a5df43a464420c9fe68ba83937dlgao 104130fdf1140b8d1ce93f3821d986fa165552023440lgao Type = Type.split()[-1] 104230fdf1140b8d1ce93f3821d986fa165552023440lgao Index = 0 104330fdf1140b8d1ce93f3821d986fa165552023440lgao while Index < len(RefList): 104430fdf1140b8d1ce93f3821d986fa165552023440lgao FieldName = RefList[Index] 104530fdf1140b8d1ce93f3821d986fa165552023440lgao FromType = GetFinalTypeValue(Type, FieldName, TypedefDict, SUDict) 104630fdf1140b8d1ce93f3821d986fa165552023440lgao if FromType == None: 104730fdf1140b8d1ce93f3821d986fa165552023440lgao return None 104830fdf1140b8d1ce93f3821d986fa165552023440lgao # we want to determine the exact type. 104930fdf1140b8d1ce93f3821d986fa165552023440lgao if TargetType != None: 105030fdf1140b8d1ce93f3821d986fa165552023440lgao Type = FromType.split()[0] 105130fdf1140b8d1ce93f3821d986fa165552023440lgao # we only want to check if it is a pointer 105230fdf1140b8d1ce93f3821d986fa165552023440lgao else: 105330fdf1140b8d1ce93f3821d986fa165552023440lgao Type = FromType 105479b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao if Type.find('*') != -1 and Index == len(RefList) - 1: 105530fdf1140b8d1ce93f3821d986fa165552023440lgao return Type 105630fdf1140b8d1ce93f3821d986fa165552023440lgao Type = FromType.split()[0] 105752302d4dee589a5df43a464420c9fe68ba83937dlgao 105830fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 105930fdf1140b8d1ce93f3821d986fa165552023440lgao 106030fdf1140b8d1ce93f3821d986fa165552023440lgao Type = GetRealType(Type, TypedefDict, TargetType) 106130fdf1140b8d1ce93f3821d986fa165552023440lgao 106230fdf1140b8d1ce93f3821d986fa165552023440lgao return Type 106330fdf1140b8d1ce93f3821d986fa165552023440lgao 106479b74a03e018ecbf03d8d50e6f20301e249c1ba5lgaodef GetVarInfo(PredVarList, FuncRecord, FullFileName, IsFuncCall=False, TargetType=None, StarList=None): 106552302d4dee589a5df43a464420c9fe68ba83937dlgao 106630fdf1140b8d1ce93f3821d986fa165552023440lgao PredVar = PredVarList[0] 106730fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(FullFileName) 106852302d4dee589a5df43a464420c9fe68ba83937dlgao 106930fdf1140b8d1ce93f3821d986fa165552023440lgao Db = GetDB() 107030fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 107130fdf1140b8d1ce93f3821d986fa165552023440lgao # search variable in include files 107252302d4dee589a5df43a464420c9fe68ba83937dlgao 107330fdf1140b8d1ce93f3821d986fa165552023440lgao # it is a function call, search function declarations and definitions 107430fdf1140b8d1ce93f3821d986fa165552023440lgao if IsFuncCall: 107530fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, ID 107630fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 107730fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d and Value = \'%s\' 107830fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_FUNCTION_DECLARATION, PredVar) 107930fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 108052302d4dee589a5df43a464420c9fe68ba83937dlgao 108152302d4dee589a5df43a464420c9fe68ba83937dlgao for Result in ResultSet: 108230fdf1140b8d1ce93f3821d986fa165552023440lgao Type = GetDataTypeFromModifier(Result[0]).split()[-1] 108330fdf1140b8d1ce93f3821d986fa165552023440lgao TypedefDict = GetTypedefDict(FullFileName) 108430fdf1140b8d1ce93f3821d986fa165552023440lgao Type = GetRealType(Type, TypedefDict, TargetType) 108530fdf1140b8d1ce93f3821d986fa165552023440lgao return Type 108652302d4dee589a5df43a464420c9fe68ba83937dlgao 108730fdf1140b8d1ce93f3821d986fa165552023440lgao IncludeFileList = GetAllIncludeFiles(FullFileName) 108830fdf1140b8d1ce93f3821d986fa165552023440lgao for F in IncludeFileList: 108930fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(F) 109030fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 109130fdf1140b8d1ce93f3821d986fa165552023440lgao continue 109252302d4dee589a5df43a464420c9fe68ba83937dlgao 109330fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 109430fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, ID 109530fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 109630fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d and Value = \'%s\' 109730fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_FUNCTION_DECLARATION, PredVar) 109830fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 109952302d4dee589a5df43a464420c9fe68ba83937dlgao 110030fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 110130fdf1140b8d1ce93f3821d986fa165552023440lgao Type = GetDataTypeFromModifier(Result[0]).split()[-1] 110230fdf1140b8d1ce93f3821d986fa165552023440lgao TypedefDict = GetTypedefDict(FullFileName) 110330fdf1140b8d1ce93f3821d986fa165552023440lgao Type = GetRealType(Type, TypedefDict, TargetType) 110430fdf1140b8d1ce93f3821d986fa165552023440lgao return Type 110552302d4dee589a5df43a464420c9fe68ba83937dlgao 110630fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(FullFileName) 110730fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, ID 110830fdf1140b8d1ce93f3821d986fa165552023440lgao from Function 110930fdf1140b8d1ce93f3821d986fa165552023440lgao where BelongsToFile = %d and Name = \'%s\' 111030fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileID, PredVar) 111130fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 111252302d4dee589a5df43a464420c9fe68ba83937dlgao 111352302d4dee589a5df43a464420c9fe68ba83937dlgao for Result in ResultSet: 111430fdf1140b8d1ce93f3821d986fa165552023440lgao Type = GetDataTypeFromModifier(Result[0]).split()[-1] 111530fdf1140b8d1ce93f3821d986fa165552023440lgao TypedefDict = GetTypedefDict(FullFileName) 111630fdf1140b8d1ce93f3821d986fa165552023440lgao Type = GetRealType(Type, TypedefDict, TargetType) 111730fdf1140b8d1ce93f3821d986fa165552023440lgao return Type 111852302d4dee589a5df43a464420c9fe68ba83937dlgao 111930fdf1140b8d1ce93f3821d986fa165552023440lgao for F in IncludeFileList: 112030fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(F) 112130fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 112230fdf1140b8d1ce93f3821d986fa165552023440lgao continue 112352302d4dee589a5df43a464420c9fe68ba83937dlgao 112430fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 112530fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, ID 112630fdf1140b8d1ce93f3821d986fa165552023440lgao from Function 112730fdf1140b8d1ce93f3821d986fa165552023440lgao where BelongsToFile = %d and Name = \'%s\' 112830fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileID, PredVar) 112930fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 113052302d4dee589a5df43a464420c9fe68ba83937dlgao 113130fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 113230fdf1140b8d1ce93f3821d986fa165552023440lgao Type = GetDataTypeFromModifier(Result[0]).split()[-1] 113330fdf1140b8d1ce93f3821d986fa165552023440lgao TypedefDict = GetTypedefDict(FullFileName) 113430fdf1140b8d1ce93f3821d986fa165552023440lgao Type = GetRealType(Type, TypedefDict, TargetType) 113530fdf1140b8d1ce93f3821d986fa165552023440lgao return Type 113652302d4dee589a5df43a464420c9fe68ba83937dlgao 113730fdf1140b8d1ce93f3821d986fa165552023440lgao return None 113852302d4dee589a5df43a464420c9fe68ba83937dlgao 113930fdf1140b8d1ce93f3821d986fa165552023440lgao # really variable, search local variable first 114030fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, ID 114130fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 114230fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d and Name = \'%s\' and StartLine >= %d and StartLine <= %d 114330fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_VARIABLE, PredVar, FuncRecord[0], FuncRecord[1]) 114430fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 114530fdf1140b8d1ce93f3821d986fa165552023440lgao VarFound = False 114630fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 114730fdf1140b8d1ce93f3821d986fa165552023440lgao if len(PredVarList) > 1: 114830fdf1140b8d1ce93f3821d986fa165552023440lgao Type = GetTypeInfo(PredVarList[1:], Result[0], FullFileName, TargetType) 114930fdf1140b8d1ce93f3821d986fa165552023440lgao return Type 115030fdf1140b8d1ce93f3821d986fa165552023440lgao else: 115130fdf1140b8d1ce93f3821d986fa165552023440lgao# Type = GetDataTypeFromModifier(Result[0]).split()[-1] 115230fdf1140b8d1ce93f3821d986fa165552023440lgao TypeList = GetDataTypeFromModifier(Result[0]).split() 115330fdf1140b8d1ce93f3821d986fa165552023440lgao Type = TypeList[-1] 115430fdf1140b8d1ce93f3821d986fa165552023440lgao if len(TypeList) > 1 and StarList != None: 115530fdf1140b8d1ce93f3821d986fa165552023440lgao for Star in StarList: 115630fdf1140b8d1ce93f3821d986fa165552023440lgao Type = Type.strip() 115730fdf1140b8d1ce93f3821d986fa165552023440lgao Type = Type.rstrip(Star) 115830fdf1140b8d1ce93f3821d986fa165552023440lgao # Get real type after de-reference pointers. 115930fdf1140b8d1ce93f3821d986fa165552023440lgao if len(Type.strip()) == 0: 116030fdf1140b8d1ce93f3821d986fa165552023440lgao Type = TypeList[-2] 116130fdf1140b8d1ce93f3821d986fa165552023440lgao TypedefDict = GetTypedefDict(FullFileName) 116230fdf1140b8d1ce93f3821d986fa165552023440lgao Type = GetRealType(Type, TypedefDict, TargetType) 116330fdf1140b8d1ce93f3821d986fa165552023440lgao return Type 116452302d4dee589a5df43a464420c9fe68ba83937dlgao 116530fdf1140b8d1ce93f3821d986fa165552023440lgao # search function parameters second 116630fdf1140b8d1ce93f3821d986fa165552023440lgao ParamList = GetParamList(FuncRecord[2]) 116730fdf1140b8d1ce93f3821d986fa165552023440lgao for Param in ParamList: 116830fdf1140b8d1ce93f3821d986fa165552023440lgao if Param.Name.strip() == PredVar: 116930fdf1140b8d1ce93f3821d986fa165552023440lgao if len(PredVarList) > 1: 117030fdf1140b8d1ce93f3821d986fa165552023440lgao Type = GetTypeInfo(PredVarList[1:], Param.Modifier, FullFileName, TargetType) 117130fdf1140b8d1ce93f3821d986fa165552023440lgao return Type 117230fdf1140b8d1ce93f3821d986fa165552023440lgao else: 117330fdf1140b8d1ce93f3821d986fa165552023440lgao TypeList = GetDataTypeFromModifier(Param.Modifier).split() 117430fdf1140b8d1ce93f3821d986fa165552023440lgao Type = TypeList[-1] 117583461d2ce88bdeb12b25c74beaca84dcd457e5a3Hess Chen if Type == '*' and len(TypeList) >= 2: 117683461d2ce88bdeb12b25c74beaca84dcd457e5a3Hess Chen Type = TypeList[-2] 117730fdf1140b8d1ce93f3821d986fa165552023440lgao if len(TypeList) > 1 and StarList != None: 117830fdf1140b8d1ce93f3821d986fa165552023440lgao for Star in StarList: 117930fdf1140b8d1ce93f3821d986fa165552023440lgao Type = Type.strip() 118030fdf1140b8d1ce93f3821d986fa165552023440lgao Type = Type.rstrip(Star) 118130fdf1140b8d1ce93f3821d986fa165552023440lgao # Get real type after de-reference pointers. 118230fdf1140b8d1ce93f3821d986fa165552023440lgao if len(Type.strip()) == 0: 118330fdf1140b8d1ce93f3821d986fa165552023440lgao Type = TypeList[-2] 118430fdf1140b8d1ce93f3821d986fa165552023440lgao TypedefDict = GetTypedefDict(FullFileName) 118530fdf1140b8d1ce93f3821d986fa165552023440lgao Type = GetRealType(Type, TypedefDict, TargetType) 118630fdf1140b8d1ce93f3821d986fa165552023440lgao return Type 118752302d4dee589a5df43a464420c9fe68ba83937dlgao 118830fdf1140b8d1ce93f3821d986fa165552023440lgao # search global variable next 118930fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, ID 119030fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 119130fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d and Name = \'%s\' and BelongsToFunction = -1 119230fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_VARIABLE, PredVar) 119330fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 119430fdf1140b8d1ce93f3821d986fa165552023440lgao 119530fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 119630fdf1140b8d1ce93f3821d986fa165552023440lgao if len(PredVarList) > 1: 119730fdf1140b8d1ce93f3821d986fa165552023440lgao Type = GetTypeInfo(PredVarList[1:], Result[0], FullFileName, TargetType) 119830fdf1140b8d1ce93f3821d986fa165552023440lgao return Type 119930fdf1140b8d1ce93f3821d986fa165552023440lgao else: 120030fdf1140b8d1ce93f3821d986fa165552023440lgao TypeList = GetDataTypeFromModifier(Result[0]).split() 120130fdf1140b8d1ce93f3821d986fa165552023440lgao Type = TypeList[-1] 120230fdf1140b8d1ce93f3821d986fa165552023440lgao if len(TypeList) > 1 and StarList != None: 120330fdf1140b8d1ce93f3821d986fa165552023440lgao for Star in StarList: 120430fdf1140b8d1ce93f3821d986fa165552023440lgao Type = Type.strip() 120530fdf1140b8d1ce93f3821d986fa165552023440lgao Type = Type.rstrip(Star) 120630fdf1140b8d1ce93f3821d986fa165552023440lgao # Get real type after de-reference pointers. 120730fdf1140b8d1ce93f3821d986fa165552023440lgao if len(Type.strip()) == 0: 120830fdf1140b8d1ce93f3821d986fa165552023440lgao Type = TypeList[-2] 120930fdf1140b8d1ce93f3821d986fa165552023440lgao TypedefDict = GetTypedefDict(FullFileName) 121030fdf1140b8d1ce93f3821d986fa165552023440lgao Type = GetRealType(Type, TypedefDict, TargetType) 121130fdf1140b8d1ce93f3821d986fa165552023440lgao return Type 121252302d4dee589a5df43a464420c9fe68ba83937dlgao 121330fdf1140b8d1ce93f3821d986fa165552023440lgao IncludeFileList = GetAllIncludeFiles(FullFileName) 121430fdf1140b8d1ce93f3821d986fa165552023440lgao for F in IncludeFileList: 121530fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(F) 121630fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 121730fdf1140b8d1ce93f3821d986fa165552023440lgao continue 121852302d4dee589a5df43a464420c9fe68ba83937dlgao 121930fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 122030fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, ID 122130fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 122230fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d and BelongsToFunction = -1 and Name = \'%s\' 122330fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_VARIABLE, PredVar) 122430fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 122530fdf1140b8d1ce93f3821d986fa165552023440lgao 122630fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 122730fdf1140b8d1ce93f3821d986fa165552023440lgao if len(PredVarList) > 1: 122830fdf1140b8d1ce93f3821d986fa165552023440lgao Type = GetTypeInfo(PredVarList[1:], Result[0], FullFileName, TargetType) 122930fdf1140b8d1ce93f3821d986fa165552023440lgao return Type 123030fdf1140b8d1ce93f3821d986fa165552023440lgao else: 123130fdf1140b8d1ce93f3821d986fa165552023440lgao TypeList = GetDataTypeFromModifier(Result[0]).split() 123230fdf1140b8d1ce93f3821d986fa165552023440lgao Type = TypeList[-1] 123330fdf1140b8d1ce93f3821d986fa165552023440lgao if len(TypeList) > 1 and StarList != None: 123430fdf1140b8d1ce93f3821d986fa165552023440lgao for Star in StarList: 123530fdf1140b8d1ce93f3821d986fa165552023440lgao Type = Type.strip() 123630fdf1140b8d1ce93f3821d986fa165552023440lgao Type = Type.rstrip(Star) 123730fdf1140b8d1ce93f3821d986fa165552023440lgao # Get real type after de-reference pointers. 123830fdf1140b8d1ce93f3821d986fa165552023440lgao if len(Type.strip()) == 0: 123930fdf1140b8d1ce93f3821d986fa165552023440lgao Type = TypeList[-2] 124030fdf1140b8d1ce93f3821d986fa165552023440lgao TypedefDict = GetTypedefDict(FullFileName) 124130fdf1140b8d1ce93f3821d986fa165552023440lgao Type = GetRealType(Type, TypedefDict, TargetType) 124230fdf1140b8d1ce93f3821d986fa165552023440lgao return Type 124330fdf1140b8d1ce93f3821d986fa165552023440lgao 124452302d4dee589a5df43a464420c9fe68ba83937dlgaodef GetTypeFromArray(Type, Var): 124552302d4dee589a5df43a464420c9fe68ba83937dlgao Count = Var.count('[') 124652302d4dee589a5df43a464420c9fe68ba83937dlgao 124752302d4dee589a5df43a464420c9fe68ba83937dlgao while Count > 0: 124852302d4dee589a5df43a464420c9fe68ba83937dlgao Type = Type.strip() 124952302d4dee589a5df43a464420c9fe68ba83937dlgao Type = Type.rstrip('*') 125052302d4dee589a5df43a464420c9fe68ba83937dlgao Count = Count - 1 125152302d4dee589a5df43a464420c9fe68ba83937dlgao 125252302d4dee589a5df43a464420c9fe68ba83937dlgao return Type 125352302d4dee589a5df43a464420c9fe68ba83937dlgao 125430fdf1140b8d1ce93f3821d986fa165552023440lgaodef CheckFuncLayoutReturnType(FullFileName): 125530fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList = [] 125652302d4dee589a5df43a464420c9fe68ba83937dlgao 125730fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(FullFileName, ErrorMsgList) 125830fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 125930fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 126052302d4dee589a5df43a464420c9fe68ba83937dlgao 126130fdf1140b8d1ce93f3821d986fa165552023440lgao Db = GetDB() 126230fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 126352302d4dee589a5df43a464420c9fe68ba83937dlgao SqlStatement = """ select Modifier, ID, StartLine, StartColumn, EndLine, Value 126430fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 126530fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d 126630fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_FUNCTION_DECLARATION) 126730fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 126830fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 126930fdf1140b8d1ce93f3821d986fa165552023440lgao ReturnType = GetDataTypeFromModifier(Result[0]) 127030fdf1140b8d1ce93f3821d986fa165552023440lgao TypeStart = ReturnType.split()[0] 127130fdf1140b8d1ce93f3821d986fa165552023440lgao FuncName = Result[5] 127230fdf1140b8d1ce93f3821d986fa165552023440lgao if EccGlobalData.gException.IsException(ERROR_C_FUNCTION_LAYOUT_CHECK_RETURN_TYPE, FuncName): 127330fdf1140b8d1ce93f3821d986fa165552023440lgao continue 127400261e1dc62ec078391f0239683ba7a709d3122dHess Chen Result0 = Result[0] 127500261e1dc62ec078391f0239683ba7a709d3122dHess Chen if Result0.upper().startswith('STATIC'): 127600261e1dc62ec078391f0239683ba7a709d3122dHess Chen Result0 = Result0[6:].strip() 127700261e1dc62ec078391f0239683ba7a709d3122dHess Chen Index = Result0.find(TypeStart) 127830fdf1140b8d1ce93f3821d986fa165552023440lgao if Index != 0 or Result[3] != 0: 127930fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_RETURN_TYPE, '[%s] Return Type should appear at the start of line' % FuncName, FileTable, Result[1]) 128052302d4dee589a5df43a464420c9fe68ba83937dlgao 128130fdf1140b8d1ce93f3821d986fa165552023440lgao if Result[2] == Result[4]: 128230fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_RETURN_TYPE, '[%s] Return Type should appear on its own line' % FuncName, FileTable, Result[1]) 128352302d4dee589a5df43a464420c9fe68ba83937dlgao 128430fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, ID, StartLine, StartColumn, FunNameStartLine, Name 128530fdf1140b8d1ce93f3821d986fa165552023440lgao from Function 128630fdf1140b8d1ce93f3821d986fa165552023440lgao where BelongsToFile = %d 128730fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileID) 128830fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 128930fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 129030fdf1140b8d1ce93f3821d986fa165552023440lgao ReturnType = GetDataTypeFromModifier(Result[0]) 129130fdf1140b8d1ce93f3821d986fa165552023440lgao TypeStart = ReturnType.split()[0] 129230fdf1140b8d1ce93f3821d986fa165552023440lgao FuncName = Result[5] 129330fdf1140b8d1ce93f3821d986fa165552023440lgao if EccGlobalData.gException.IsException(ERROR_C_FUNCTION_LAYOUT_CHECK_RETURN_TYPE, FuncName): 129430fdf1140b8d1ce93f3821d986fa165552023440lgao continue 129572358997e75006fe024133a75478344c0fa7f3ffHess Chen Result0 = Result[0] 129672358997e75006fe024133a75478344c0fa7f3ffHess Chen if Result0.upper().startswith('STATIC'): 129772358997e75006fe024133a75478344c0fa7f3ffHess Chen Result0 = Result0[6:].strip() 129872358997e75006fe024133a75478344c0fa7f3ffHess Chen Index = Result0.find(ReturnType) 129930fdf1140b8d1ce93f3821d986fa165552023440lgao if Index != 0 or Result[3] != 0: 130030fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_RETURN_TYPE, '[%s] Return Type should appear at the start of line' % FuncName, 'Function', Result[1]) 130152302d4dee589a5df43a464420c9fe68ba83937dlgao 130230fdf1140b8d1ce93f3821d986fa165552023440lgaodef CheckFuncLayoutModifier(FullFileName): 130330fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList = [] 130452302d4dee589a5df43a464420c9fe68ba83937dlgao 130530fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(FullFileName, ErrorMsgList) 130630fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 130730fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 130852302d4dee589a5df43a464420c9fe68ba83937dlgao 130930fdf1140b8d1ce93f3821d986fa165552023440lgao Db = GetDB() 131030fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 131130fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, ID 131230fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 131330fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d 131430fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_FUNCTION_DECLARATION) 131530fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 131630fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 131730fdf1140b8d1ce93f3821d986fa165552023440lgao ReturnType = GetDataTypeFromModifier(Result[0]) 131830fdf1140b8d1ce93f3821d986fa165552023440lgao TypeStart = ReturnType.split()[0] 131900261e1dc62ec078391f0239683ba7a709d3122dHess Chen Result0 = Result[0] 132000261e1dc62ec078391f0239683ba7a709d3122dHess Chen if Result0.upper().startswith('STATIC'): 132100261e1dc62ec078391f0239683ba7a709d3122dHess Chen Result0 = Result0[6:].strip() 132200261e1dc62ec078391f0239683ba7a709d3122dHess Chen Index = Result0.find(TypeStart) 132330fdf1140b8d1ce93f3821d986fa165552023440lgao if Index != 0: 132430fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_OPTIONAL_FUNCTIONAL_MODIFIER, '', FileTable, Result[1]) 132552302d4dee589a5df43a464420c9fe68ba83937dlgao 132630fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, ID 132730fdf1140b8d1ce93f3821d986fa165552023440lgao from Function 132830fdf1140b8d1ce93f3821d986fa165552023440lgao where BelongsToFile = %d 132930fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileID) 133030fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 133130fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 133230fdf1140b8d1ce93f3821d986fa165552023440lgao ReturnType = GetDataTypeFromModifier(Result[0]) 133330fdf1140b8d1ce93f3821d986fa165552023440lgao TypeStart = ReturnType.split()[0] 133472358997e75006fe024133a75478344c0fa7f3ffHess Chen Result0 = Result[0] 133572358997e75006fe024133a75478344c0fa7f3ffHess Chen if Result0.upper().startswith('STATIC'): 133672358997e75006fe024133a75478344c0fa7f3ffHess Chen Result0 = Result0[6:].strip() 133772358997e75006fe024133a75478344c0fa7f3ffHess Chen Index = Result0.find(TypeStart) 133830fdf1140b8d1ce93f3821d986fa165552023440lgao if Index != 0: 133930fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_OPTIONAL_FUNCTIONAL_MODIFIER, '', 'Function', Result[1]) 134030fdf1140b8d1ce93f3821d986fa165552023440lgao 134130fdf1140b8d1ce93f3821d986fa165552023440lgaodef CheckFuncLayoutName(FullFileName): 134230fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList = [] 134330fdf1140b8d1ce93f3821d986fa165552023440lgao # Parameter variable format pattern. 134430fdf1140b8d1ce93f3821d986fa165552023440lgao Pattern = re.compile(r'^[A-Z]+\S*[a-z]\S*$') 134530fdf1140b8d1ce93f3821d986fa165552023440lgao ParamIgnoreList = ('VOID', '...') 134630fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(FullFileName, ErrorMsgList) 134730fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 134830fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 134952302d4dee589a5df43a464420c9fe68ba83937dlgao 135030fdf1140b8d1ce93f3821d986fa165552023440lgao Db = GetDB() 135130fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 135230fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Name, ID, EndColumn, Value 135330fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 135430fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d 135530fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_FUNCTION_DECLARATION) 135630fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 135730fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 135830fdf1140b8d1ce93f3821d986fa165552023440lgao FuncName = Result[3] 135930fdf1140b8d1ce93f3821d986fa165552023440lgao if EccGlobalData.gException.IsException(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_NAME, FuncName): 136030fdf1140b8d1ce93f3821d986fa165552023440lgao continue 136130fdf1140b8d1ce93f3821d986fa165552023440lgao if Result[2] != 0: 136230fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_NAME, 'Function name [%s] should appear at the start of a line' % FuncName, FileTable, Result[1]) 136330fdf1140b8d1ce93f3821d986fa165552023440lgao ParamList = GetParamList(Result[0]) 136430fdf1140b8d1ce93f3821d986fa165552023440lgao if len(ParamList) == 0: 136530fdf1140b8d1ce93f3821d986fa165552023440lgao continue 136630fdf1140b8d1ce93f3821d986fa165552023440lgao StartLine = 0 136730fdf1140b8d1ce93f3821d986fa165552023440lgao for Param in ParamList: 136830fdf1140b8d1ce93f3821d986fa165552023440lgao if Param.StartLine <= StartLine: 136930fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_NAME, 'Parameter %s should be in its own line.' % Param.Name, FileTable, Result[1]) 137030fdf1140b8d1ce93f3821d986fa165552023440lgao if Param.StartLine - StartLine > 1: 137152302d4dee589a5df43a464420c9fe68ba83937dlgao PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_NAME, 'Empty line appears before Parameter %s.' % Param.Name, FileTable, Result[1]) 137230fdf1140b8d1ce93f3821d986fa165552023440lgao 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): 137330fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_NAMING_CONVENTION_CHECK_VARIABLE_NAME, 'Parameter [%s] NOT follow naming convention.' % Param.Name, FileTable, Result[1]) 137430fdf1140b8d1ce93f3821d986fa165552023440lgao StartLine = Param.StartLine 137552302d4dee589a5df43a464420c9fe68ba83937dlgao 137630fdf1140b8d1ce93f3821d986fa165552023440lgao if not Result[0].endswith('\n )') and not Result[0].endswith('\r )'): 137730fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_NAME, '\')\' should be on a new line and indented two spaces', FileTable, Result[1]) 137852302d4dee589a5df43a464420c9fe68ba83937dlgao 137930fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, ID, FunNameStartColumn, Name 138030fdf1140b8d1ce93f3821d986fa165552023440lgao from Function 138130fdf1140b8d1ce93f3821d986fa165552023440lgao where BelongsToFile = %d 138230fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileID) 138330fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 138430fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 138530fdf1140b8d1ce93f3821d986fa165552023440lgao FuncName = Result[3] 138630fdf1140b8d1ce93f3821d986fa165552023440lgao if EccGlobalData.gException.IsException(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_NAME, FuncName): 138730fdf1140b8d1ce93f3821d986fa165552023440lgao continue 138830fdf1140b8d1ce93f3821d986fa165552023440lgao if Result[2] != 0: 138930fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_NAME, 'Function name [%s] should appear at the start of a line' % FuncName, 'Function', Result[1]) 139030fdf1140b8d1ce93f3821d986fa165552023440lgao ParamList = GetParamList(Result[0]) 139130fdf1140b8d1ce93f3821d986fa165552023440lgao if len(ParamList) == 0: 139230fdf1140b8d1ce93f3821d986fa165552023440lgao continue 139330fdf1140b8d1ce93f3821d986fa165552023440lgao StartLine = 0 139430fdf1140b8d1ce93f3821d986fa165552023440lgao for Param in ParamList: 139530fdf1140b8d1ce93f3821d986fa165552023440lgao if Param.StartLine <= StartLine: 139630fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_NAME, 'Parameter %s should be in its own line.' % Param.Name, 'Function', Result[1]) 139730fdf1140b8d1ce93f3821d986fa165552023440lgao if Param.StartLine - StartLine > 1: 139830fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_NAME, 'Empty line appears before Parameter %s.' % Param.Name, 'Function', Result[1]) 139930fdf1140b8d1ce93f3821d986fa165552023440lgao 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): 140030fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_NAMING_CONVENTION_CHECK_VARIABLE_NAME, 'Parameter [%s] NOT follow naming convention.' % Param.Name, FileTable, Result[1]) 140130fdf1140b8d1ce93f3821d986fa165552023440lgao StartLine = Param.StartLine 140230fdf1140b8d1ce93f3821d986fa165552023440lgao if not Result[0].endswith('\n )') and not Result[0].endswith('\r )'): 140330fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_NAME, '\')\' should be on a new line and indented two spaces', 'Function', Result[1]) 140430fdf1140b8d1ce93f3821d986fa165552023440lgao 140530fdf1140b8d1ce93f3821d986fa165552023440lgaodef CheckFuncLayoutPrototype(FullFileName): 140630fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList = [] 140752302d4dee589a5df43a464420c9fe68ba83937dlgao 140830fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(FullFileName, ErrorMsgList) 140930fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 141030fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 141152302d4dee589a5df43a464420c9fe68ba83937dlgao 141230fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 141330fdf1140b8d1ce93f3821d986fa165552023440lgao Db = GetDB() 141430fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, Header, Name, ID 141530fdf1140b8d1ce93f3821d986fa165552023440lgao from Function 141630fdf1140b8d1ce93f3821d986fa165552023440lgao where BelongsToFile = %d 141730fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileID) 141830fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 141930fdf1140b8d1ce93f3821d986fa165552023440lgao if len(ResultSet) == 0: 142030fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 142152302d4dee589a5df43a464420c9fe68ba83937dlgao 142230fdf1140b8d1ce93f3821d986fa165552023440lgao FuncDefList = [] 142330fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 142430fdf1140b8d1ce93f3821d986fa165552023440lgao FuncDefList.append(Result) 142552302d4dee589a5df43a464420c9fe68ba83937dlgao 142630fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, Name, ID 142730fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 142830fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d 142930fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_FUNCTION_DECLARATION) 143030fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 143130fdf1140b8d1ce93f3821d986fa165552023440lgao FuncDeclList = [] 143230fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 143330fdf1140b8d1ce93f3821d986fa165552023440lgao FuncDeclList.append(Result) 143452302d4dee589a5df43a464420c9fe68ba83937dlgao 143530fdf1140b8d1ce93f3821d986fa165552023440lgao UndeclFuncList = [] 143630fdf1140b8d1ce93f3821d986fa165552023440lgao for FuncDef in FuncDefList: 143730fdf1140b8d1ce93f3821d986fa165552023440lgao FuncName = FuncDef[2].strip() 143830fdf1140b8d1ce93f3821d986fa165552023440lgao FuncModifier = FuncDef[0] 143930fdf1140b8d1ce93f3821d986fa165552023440lgao FuncDefHeader = FuncDef[1] 144030fdf1140b8d1ce93f3821d986fa165552023440lgao for FuncDecl in FuncDeclList: 144130fdf1140b8d1ce93f3821d986fa165552023440lgao LBPos = FuncDecl[1].find('(') 144230fdf1140b8d1ce93f3821d986fa165552023440lgao DeclName = FuncDecl[1][0:LBPos].strip() 144330fdf1140b8d1ce93f3821d986fa165552023440lgao DeclModifier = FuncDecl[0] 144430fdf1140b8d1ce93f3821d986fa165552023440lgao if DeclName == FuncName: 144530fdf1140b8d1ce93f3821d986fa165552023440lgao if DiffModifier(FuncModifier, DeclModifier) and not EccGlobalData.gException.IsException(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE, FuncName): 144630fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE, 'Function [%s] modifier different with prototype.' % FuncName, 'Function', FuncDef[3]) 144730fdf1140b8d1ce93f3821d986fa165552023440lgao ParamListOfDef = GetParamList(FuncDefHeader) 144830fdf1140b8d1ce93f3821d986fa165552023440lgao ParamListOfDecl = GetParamList(FuncDecl[1]) 144952302d4dee589a5df43a464420c9fe68ba83937dlgao if len(ParamListOfDef) != len(ParamListOfDecl) and not EccGlobalData.gException.IsException(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE_2, FuncName): 145052302d4dee589a5df43a464420c9fe68ba83937dlgao PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE_2, 'Parameter number different in function [%s].' % FuncName, 'Function', FuncDef[3]) 145130fdf1140b8d1ce93f3821d986fa165552023440lgao break 145230fdf1140b8d1ce93f3821d986fa165552023440lgao 145330fdf1140b8d1ce93f3821d986fa165552023440lgao Index = 0 145430fdf1140b8d1ce93f3821d986fa165552023440lgao while Index < len(ParamListOfDef): 145552302d4dee589a5df43a464420c9fe68ba83937dlgao if DiffModifier(ParamListOfDef[Index].Modifier, ParamListOfDecl[Index].Modifier) and not EccGlobalData.gException.IsException(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE_3, FuncName): 145652302d4dee589a5df43a464420c9fe68ba83937dlgao 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]) 145730fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 145830fdf1140b8d1ce93f3821d986fa165552023440lgao break 145930fdf1140b8d1ce93f3821d986fa165552023440lgao else: 146030fdf1140b8d1ce93f3821d986fa165552023440lgao UndeclFuncList.append(FuncDef) 146152302d4dee589a5df43a464420c9fe68ba83937dlgao 146230fdf1140b8d1ce93f3821d986fa165552023440lgao IncludeFileList = GetAllIncludeFiles(FullFileName) 146330fdf1140b8d1ce93f3821d986fa165552023440lgao FuncDeclList = [] 146430fdf1140b8d1ce93f3821d986fa165552023440lgao for F in IncludeFileList: 146530fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(F, ErrorMsgList) 146630fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 146730fdf1140b8d1ce93f3821d986fa165552023440lgao continue 146852302d4dee589a5df43a464420c9fe68ba83937dlgao 146930fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 147030fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, Name, ID 147130fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 147230fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d 147330fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_FUNCTION_DECLARATION) 147430fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 147530fdf1140b8d1ce93f3821d986fa165552023440lgao 147630fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 147730fdf1140b8d1ce93f3821d986fa165552023440lgao FuncDeclList.append(Result) 147852302d4dee589a5df43a464420c9fe68ba83937dlgao 147930fdf1140b8d1ce93f3821d986fa165552023440lgao for FuncDef in UndeclFuncList: 148030fdf1140b8d1ce93f3821d986fa165552023440lgao FuncName = FuncDef[2].strip() 148130fdf1140b8d1ce93f3821d986fa165552023440lgao FuncModifier = FuncDef[0] 148230fdf1140b8d1ce93f3821d986fa165552023440lgao FuncDefHeader = FuncDef[1] 148330fdf1140b8d1ce93f3821d986fa165552023440lgao for FuncDecl in FuncDeclList: 148430fdf1140b8d1ce93f3821d986fa165552023440lgao LBPos = FuncDecl[1].find('(') 148530fdf1140b8d1ce93f3821d986fa165552023440lgao DeclName = FuncDecl[1][0:LBPos].strip() 148630fdf1140b8d1ce93f3821d986fa165552023440lgao DeclModifier = FuncDecl[0] 148730fdf1140b8d1ce93f3821d986fa165552023440lgao if DeclName == FuncName: 148830fdf1140b8d1ce93f3821d986fa165552023440lgao if DiffModifier(FuncModifier, DeclModifier) and not EccGlobalData.gException.IsException(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE, FuncName): 148930fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE, 'Function [%s] modifier different with prototype.' % FuncName, 'Function', FuncDef[3]) 149030fdf1140b8d1ce93f3821d986fa165552023440lgao ParamListOfDef = GetParamList(FuncDefHeader) 149130fdf1140b8d1ce93f3821d986fa165552023440lgao ParamListOfDecl = GetParamList(FuncDecl[1]) 149252302d4dee589a5df43a464420c9fe68ba83937dlgao if len(ParamListOfDef) != len(ParamListOfDecl) and not EccGlobalData.gException.IsException(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE_2, FuncName): 149352302d4dee589a5df43a464420c9fe68ba83937dlgao PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE_2, 'Parameter number different in function [%s].' % FuncName, 'Function', FuncDef[3]) 149430fdf1140b8d1ce93f3821d986fa165552023440lgao break 149530fdf1140b8d1ce93f3821d986fa165552023440lgao 149630fdf1140b8d1ce93f3821d986fa165552023440lgao Index = 0 149730fdf1140b8d1ce93f3821d986fa165552023440lgao while Index < len(ParamListOfDef): 149852302d4dee589a5df43a464420c9fe68ba83937dlgao if DiffModifier(ParamListOfDef[Index].Modifier, ParamListOfDecl[Index].Modifier) and not EccGlobalData.gException.IsException(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE_3, FuncName): 149952302d4dee589a5df43a464420c9fe68ba83937dlgao 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]) 150030fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 150130fdf1140b8d1ce93f3821d986fa165552023440lgao break 150252302d4dee589a5df43a464420c9fe68ba83937dlgao 150330fdf1140b8d1ce93f3821d986fa165552023440lgaodef CheckFuncLayoutBody(FullFileName): 150430fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList = [] 150552302d4dee589a5df43a464420c9fe68ba83937dlgao 150630fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(FullFileName, ErrorMsgList) 150730fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 150830fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 150952302d4dee589a5df43a464420c9fe68ba83937dlgao 151030fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 151130fdf1140b8d1ce93f3821d986fa165552023440lgao Db = GetDB() 151230fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select BodyStartColumn, EndColumn, ID 151330fdf1140b8d1ce93f3821d986fa165552023440lgao from Function 151430fdf1140b8d1ce93f3821d986fa165552023440lgao where BelongsToFile = %d 151530fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileID) 151630fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 151730fdf1140b8d1ce93f3821d986fa165552023440lgao if len(ResultSet) == 0: 151830fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 151930fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 152030fdf1140b8d1ce93f3821d986fa165552023440lgao if Result[0] != 0: 152130fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_BODY, 'open brace should be at the very beginning of a line.', 'Function', Result[2]) 152230fdf1140b8d1ce93f3821d986fa165552023440lgao if Result[1] != 0: 152330fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_BODY, 'close brace should be at the very beginning of a line.', 'Function', Result[2]) 152430fdf1140b8d1ce93f3821d986fa165552023440lgao 152530fdf1140b8d1ce93f3821d986fa165552023440lgaodef CheckFuncLayoutLocalVariable(FullFileName): 152630fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList = [] 152752302d4dee589a5df43a464420c9fe68ba83937dlgao 152830fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(FullFileName, ErrorMsgList) 152930fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 153030fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 153152302d4dee589a5df43a464420c9fe68ba83937dlgao 153230fdf1140b8d1ce93f3821d986fa165552023440lgao Db = GetDB() 153330fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 153430fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select ID 153530fdf1140b8d1ce93f3821d986fa165552023440lgao from Function 153630fdf1140b8d1ce93f3821d986fa165552023440lgao where BelongsToFile = %d 153730fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileID) 153830fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 153930fdf1140b8d1ce93f3821d986fa165552023440lgao if len(ResultSet) == 0: 154030fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 154130fdf1140b8d1ce93f3821d986fa165552023440lgao FL = [] 154230fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 154330fdf1140b8d1ce93f3821d986fa165552023440lgao FL.append(Result) 154452302d4dee589a5df43a464420c9fe68ba83937dlgao 154530fdf1140b8d1ce93f3821d986fa165552023440lgao for F in FL: 154679b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao SqlStatement = """ select Name, Value, ID, Modifier 154730fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 154830fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d and BelongsToFunction = %d 154930fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_VARIABLE, F[0]) 155030fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 155130fdf1140b8d1ce93f3821d986fa165552023440lgao if len(ResultSet) == 0: 155230fdf1140b8d1ce93f3821d986fa165552023440lgao continue 155352302d4dee589a5df43a464420c9fe68ba83937dlgao 155430fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 155579b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao if len(Result[1]) > 0 and 'CONST' not in Result[3]: 155630fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_C_FUNCTION_LAYOUT_CHECK_NO_INIT_OF_VARIABLE, 'Variable Name: %s' % Result[0], FileTable, Result[2]) 155752302d4dee589a5df43a464420c9fe68ba83937dlgao 155830fdf1140b8d1ce93f3821d986fa165552023440lgaodef CheckMemberVariableFormat(Name, Value, FileTable, TdId, ModelId): 155930fdf1140b8d1ce93f3821d986fa165552023440lgao ErrMsgList = [] 156030fdf1140b8d1ce93f3821d986fa165552023440lgao # Member variable format pattern. 156130fdf1140b8d1ce93f3821d986fa165552023440lgao Pattern = re.compile(r'^[A-Z]+\S*[a-z]\S*$') 156252302d4dee589a5df43a464420c9fe68ba83937dlgao 156330fdf1140b8d1ce93f3821d986fa165552023440lgao LBPos = Value.find('{') 156430fdf1140b8d1ce93f3821d986fa165552023440lgao RBPos = Value.rfind('}') 156530fdf1140b8d1ce93f3821d986fa165552023440lgao if LBPos == -1 or RBPos == -1: 156630fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrMsgList 156752302d4dee589a5df43a464420c9fe68ba83937dlgao 156830fdf1140b8d1ce93f3821d986fa165552023440lgao Fields = Value[LBPos + 1 : RBPos] 156930fdf1140b8d1ce93f3821d986fa165552023440lgao Fields = StripComments(Fields).strip() 157030fdf1140b8d1ce93f3821d986fa165552023440lgao NestPos = Fields.find ('struct') 157130fdf1140b8d1ce93f3821d986fa165552023440lgao if NestPos != -1 and (NestPos + len('struct') < len(Fields)): 157230fdf1140b8d1ce93f3821d986fa165552023440lgao if not Fields[NestPos + len('struct') + 1].isalnum(): 157330fdf1140b8d1ce93f3821d986fa165552023440lgao if not EccGlobalData.gException.IsException(ERROR_DECLARATION_DATA_TYPE_CHECK_NESTED_STRUCTURE, Name): 157430fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DECLARATION_DATA_TYPE_CHECK_NESTED_STRUCTURE, 'Nested struct in [%s].' % (Name), FileTable, TdId) 157530fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrMsgList 157630fdf1140b8d1ce93f3821d986fa165552023440lgao NestPos = Fields.find ('union') 157730fdf1140b8d1ce93f3821d986fa165552023440lgao if NestPos != -1 and (NestPos + len('union') < len(Fields)): 157830fdf1140b8d1ce93f3821d986fa165552023440lgao if not Fields[NestPos + len('union') + 1].isalnum(): 157930fdf1140b8d1ce93f3821d986fa165552023440lgao if not EccGlobalData.gException.IsException(ERROR_DECLARATION_DATA_TYPE_CHECK_NESTED_STRUCTURE, Name): 158030fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DECLARATION_DATA_TYPE_CHECK_NESTED_STRUCTURE, 'Nested union in [%s].' % (Name), FileTable, TdId) 158130fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrMsgList 158230fdf1140b8d1ce93f3821d986fa165552023440lgao NestPos = Fields.find ('enum') 158330fdf1140b8d1ce93f3821d986fa165552023440lgao if NestPos != -1 and (NestPos + len('enum') < len(Fields)): 158430fdf1140b8d1ce93f3821d986fa165552023440lgao if not Fields[NestPos + len('enum') + 1].isalnum(): 158530fdf1140b8d1ce93f3821d986fa165552023440lgao if not EccGlobalData.gException.IsException(ERROR_DECLARATION_DATA_TYPE_CHECK_NESTED_STRUCTURE, Name): 158630fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DECLARATION_DATA_TYPE_CHECK_NESTED_STRUCTURE, 'Nested enum in [%s].' % (Name), FileTable, TdId) 158730fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrMsgList 158852302d4dee589a5df43a464420c9fe68ba83937dlgao 158930fdf1140b8d1ce93f3821d986fa165552023440lgao if ModelId == DataClass.MODEL_IDENTIFIER_ENUMERATE: 159030fdf1140b8d1ce93f3821d986fa165552023440lgao FieldsList = Fields.split(',') 159130fdf1140b8d1ce93f3821d986fa165552023440lgao # deal with enum is pre-assigned a value by function call ( , , , ...) 159230fdf1140b8d1ce93f3821d986fa165552023440lgao QuoteCount = 0 159330fdf1140b8d1ce93f3821d986fa165552023440lgao Index = 0 159430fdf1140b8d1ce93f3821d986fa165552023440lgao RemoveCurrentElement = False 159530fdf1140b8d1ce93f3821d986fa165552023440lgao while Index < len(FieldsList): 159630fdf1140b8d1ce93f3821d986fa165552023440lgao Field = FieldsList[Index] 159752302d4dee589a5df43a464420c9fe68ba83937dlgao 159830fdf1140b8d1ce93f3821d986fa165552023440lgao if Field.find('(') != -1: 159930fdf1140b8d1ce93f3821d986fa165552023440lgao QuoteCount += 1 160030fdf1140b8d1ce93f3821d986fa165552023440lgao RemoveCurrentElement = True 160130fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 160230fdf1140b8d1ce93f3821d986fa165552023440lgao continue 160352302d4dee589a5df43a464420c9fe68ba83937dlgao 160430fdf1140b8d1ce93f3821d986fa165552023440lgao if Field.find(')') != -1 and QuoteCount > 0: 160530fdf1140b8d1ce93f3821d986fa165552023440lgao QuoteCount -= 1 160630fdf1140b8d1ce93f3821d986fa165552023440lgao 160752302d4dee589a5df43a464420c9fe68ba83937dlgao if RemoveCurrentElement: 160830fdf1140b8d1ce93f3821d986fa165552023440lgao FieldsList.remove(Field) 160930fdf1140b8d1ce93f3821d986fa165552023440lgao if QuoteCount == 0: 161030fdf1140b8d1ce93f3821d986fa165552023440lgao RemoveCurrentElement = False 161130fdf1140b8d1ce93f3821d986fa165552023440lgao continue 161252302d4dee589a5df43a464420c9fe68ba83937dlgao 161330fdf1140b8d1ce93f3821d986fa165552023440lgao if QuoteCount == 0: 161430fdf1140b8d1ce93f3821d986fa165552023440lgao RemoveCurrentElement = False 161552302d4dee589a5df43a464420c9fe68ba83937dlgao 161630fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 161730fdf1140b8d1ce93f3821d986fa165552023440lgao else: 161830fdf1140b8d1ce93f3821d986fa165552023440lgao FieldsList = Fields.split(';') 161952302d4dee589a5df43a464420c9fe68ba83937dlgao 162030fdf1140b8d1ce93f3821d986fa165552023440lgao for Field in FieldsList: 162130fdf1140b8d1ce93f3821d986fa165552023440lgao Field = Field.strip() 162230fdf1140b8d1ce93f3821d986fa165552023440lgao if Field == '': 162330fdf1140b8d1ce93f3821d986fa165552023440lgao continue 162452302d4dee589a5df43a464420c9fe68ba83937dlgao # For the condition that the field in struct is an array with [] sufixes... 162530fdf1140b8d1ce93f3821d986fa165552023440lgao if Field[-1] == ']': 162630fdf1140b8d1ce93f3821d986fa165552023440lgao LBPos = Field.find('[') 162730fdf1140b8d1ce93f3821d986fa165552023440lgao Field = Field[0:LBPos] 162830fdf1140b8d1ce93f3821d986fa165552023440lgao # For the condition that bit field ": Number" 162930fdf1140b8d1ce93f3821d986fa165552023440lgao if Field.find(':') != -1: 163030fdf1140b8d1ce93f3821d986fa165552023440lgao ColonPos = Field.find(':') 163130fdf1140b8d1ce93f3821d986fa165552023440lgao Field = Field[0:ColonPos] 163252302d4dee589a5df43a464420c9fe68ba83937dlgao 163330fdf1140b8d1ce93f3821d986fa165552023440lgao Field = Field.strip() 163430fdf1140b8d1ce93f3821d986fa165552023440lgao if Field == '': 163530fdf1140b8d1ce93f3821d986fa165552023440lgao continue 163600261e1dc62ec078391f0239683ba7a709d3122dHess Chen if Field.startswith("#"): 163700261e1dc62ec078391f0239683ba7a709d3122dHess Chen continue 163830fdf1140b8d1ce93f3821d986fa165552023440lgao # Enum could directly assign value to variable 163930fdf1140b8d1ce93f3821d986fa165552023440lgao Field = Field.split('=')[0].strip() 164052302d4dee589a5df43a464420c9fe68ba83937dlgao TokenList = Field.split() 164130fdf1140b8d1ce93f3821d986fa165552023440lgao # Remove pointers before variable 1642fa3a21569b05693f414ed39e3acd74e3e58b299cHess Chen Token = TokenList[-1] 1643fa3a21569b05693f414ed39e3acd74e3e58b299cHess Chen if Token in ['OPTIONAL']: 1644fa3a21569b05693f414ed39e3acd74e3e58b299cHess Chen Token = TokenList[-2] 1645fa3a21569b05693f414ed39e3acd74e3e58b299cHess Chen if not Pattern.match(Token.lstrip('*')): 1646fa3a21569b05693f414ed39e3acd74e3e58b299cHess Chen ErrMsgList.append(Token.lstrip('*')) 164752302d4dee589a5df43a464420c9fe68ba83937dlgao 164830fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrMsgList 164930fdf1140b8d1ce93f3821d986fa165552023440lgao 165030fdf1140b8d1ce93f3821d986fa165552023440lgaodef CheckDeclTypedefFormat(FullFileName, ModelId): 165130fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList = [] 165252302d4dee589a5df43a464420c9fe68ba83937dlgao 165330fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(FullFileName, ErrorMsgList) 165430fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 165530fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 165652302d4dee589a5df43a464420c9fe68ba83937dlgao 165730fdf1140b8d1ce93f3821d986fa165552023440lgao Db = GetDB() 165830fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 165930fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Name, StartLine, EndLine, ID, Value 166030fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 166130fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d 166230fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, ModelId) 166330fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 166430fdf1140b8d1ce93f3821d986fa165552023440lgao ResultList = [] 166530fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 166630fdf1140b8d1ce93f3821d986fa165552023440lgao ResultList.append(Result) 166752302d4dee589a5df43a464420c9fe68ba83937dlgao 166830fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorType = ERROR_DECLARATION_DATA_TYPE_CHECK_ALL 166930fdf1140b8d1ce93f3821d986fa165552023440lgao if ModelId == DataClass.MODEL_IDENTIFIER_STRUCTURE: 167030fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorType = ERROR_DECLARATION_DATA_TYPE_CHECK_STRUCTURE_DECLARATION 167130fdf1140b8d1ce93f3821d986fa165552023440lgao elif ModelId == DataClass.MODEL_IDENTIFIER_ENUMERATE: 167230fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorType = ERROR_DECLARATION_DATA_TYPE_CHECK_ENUMERATED_TYPE 167330fdf1140b8d1ce93f3821d986fa165552023440lgao elif ModelId == DataClass.MODEL_IDENTIFIER_UNION: 167430fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorType = ERROR_DECLARATION_DATA_TYPE_CHECK_UNION_TYPE 167552302d4dee589a5df43a464420c9fe68ba83937dlgao 167630fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, Name, Value, StartLine, EndLine, ID 167730fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 167830fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d 167930fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_TYPEDEF) 168030fdf1140b8d1ce93f3821d986fa165552023440lgao TdSet = Db.TblFile.Exec(SqlStatement) 168130fdf1140b8d1ce93f3821d986fa165552023440lgao TdList = [] 168230fdf1140b8d1ce93f3821d986fa165552023440lgao for Td in TdSet: 168330fdf1140b8d1ce93f3821d986fa165552023440lgao TdList.append(Td) 168430fdf1140b8d1ce93f3821d986fa165552023440lgao # Check member variable name format that from typedefs of ONLY this file. 168530fdf1140b8d1ce93f3821d986fa165552023440lgao for Td in TdList: 168630fdf1140b8d1ce93f3821d986fa165552023440lgao Name = Td[1].strip() 168730fdf1140b8d1ce93f3821d986fa165552023440lgao Value = Td[2].strip() 168830fdf1140b8d1ce93f3821d986fa165552023440lgao if Value.startswith('enum'): 168930fdf1140b8d1ce93f3821d986fa165552023440lgao ValueModelId = DataClass.MODEL_IDENTIFIER_ENUMERATE 169030fdf1140b8d1ce93f3821d986fa165552023440lgao elif Value.startswith('struct'): 169130fdf1140b8d1ce93f3821d986fa165552023440lgao ValueModelId = DataClass.MODEL_IDENTIFIER_STRUCTURE 169230fdf1140b8d1ce93f3821d986fa165552023440lgao elif Value.startswith('union'): 169330fdf1140b8d1ce93f3821d986fa165552023440lgao ValueModelId = DataClass.MODEL_IDENTIFIER_UNION 169430fdf1140b8d1ce93f3821d986fa165552023440lgao else: 169530fdf1140b8d1ce93f3821d986fa165552023440lgao continue 169652302d4dee589a5df43a464420c9fe68ba83937dlgao 169730fdf1140b8d1ce93f3821d986fa165552023440lgao if ValueModelId != ModelId: 169830fdf1140b8d1ce93f3821d986fa165552023440lgao continue 169930fdf1140b8d1ce93f3821d986fa165552023440lgao # Check member variable format. 170030fdf1140b8d1ce93f3821d986fa165552023440lgao ErrMsgList = CheckMemberVariableFormat(Name, Value, FileTable, Td[5], ModelId) 170130fdf1140b8d1ce93f3821d986fa165552023440lgao for ErrMsg in ErrMsgList: 170279b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao if EccGlobalData.gException.IsException(ERROR_NAMING_CONVENTION_CHECK_VARIABLE_NAME, Name + '.' + ErrMsg): 170330fdf1140b8d1ce93f3821d986fa165552023440lgao continue 170479b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao PrintErrorMsg(ERROR_NAMING_CONVENTION_CHECK_VARIABLE_NAME, 'Member variable [%s] NOT follow naming convention.' % (Name + '.' + ErrMsg), FileTable, Td[5]) 170552302d4dee589a5df43a464420c9fe68ba83937dlgao 170630fdf1140b8d1ce93f3821d986fa165552023440lgao # First check in current file to see whether struct/union/enum is typedef-ed. 170730fdf1140b8d1ce93f3821d986fa165552023440lgao UntypedefedList = [] 170830fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultList: 170930fdf1140b8d1ce93f3821d986fa165552023440lgao # Check member variable format. 171030fdf1140b8d1ce93f3821d986fa165552023440lgao Name = Result[0].strip() 171130fdf1140b8d1ce93f3821d986fa165552023440lgao Value = Result[4].strip() 171230fdf1140b8d1ce93f3821d986fa165552023440lgao if Value.startswith('enum'): 171330fdf1140b8d1ce93f3821d986fa165552023440lgao ValueModelId = DataClass.MODEL_IDENTIFIER_ENUMERATE 171430fdf1140b8d1ce93f3821d986fa165552023440lgao elif Value.startswith('struct'): 171530fdf1140b8d1ce93f3821d986fa165552023440lgao ValueModelId = DataClass.MODEL_IDENTIFIER_STRUCTURE 171630fdf1140b8d1ce93f3821d986fa165552023440lgao elif Value.startswith('union'): 171730fdf1140b8d1ce93f3821d986fa165552023440lgao ValueModelId = DataClass.MODEL_IDENTIFIER_UNION 171830fdf1140b8d1ce93f3821d986fa165552023440lgao else: 171930fdf1140b8d1ce93f3821d986fa165552023440lgao continue 172052302d4dee589a5df43a464420c9fe68ba83937dlgao 172130fdf1140b8d1ce93f3821d986fa165552023440lgao if ValueModelId != ModelId: 172230fdf1140b8d1ce93f3821d986fa165552023440lgao continue 172330fdf1140b8d1ce93f3821d986fa165552023440lgao ErrMsgList = CheckMemberVariableFormat(Name, Value, FileTable, Result[3], ModelId) 172430fdf1140b8d1ce93f3821d986fa165552023440lgao for ErrMsg in ErrMsgList: 172579b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao if EccGlobalData.gException.IsException(ERROR_NAMING_CONVENTION_CHECK_VARIABLE_NAME, Result[0] + '.' + ErrMsg): 172630fdf1140b8d1ce93f3821d986fa165552023440lgao continue 172779b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao PrintErrorMsg(ERROR_NAMING_CONVENTION_CHECK_VARIABLE_NAME, 'Member variable [%s] NOT follow naming convention.' % (Result[0] + '.' + ErrMsg), FileTable, Result[3]) 172830fdf1140b8d1ce93f3821d986fa165552023440lgao # Check whether it is typedefed. 172930fdf1140b8d1ce93f3821d986fa165552023440lgao Found = False 173030fdf1140b8d1ce93f3821d986fa165552023440lgao for Td in TdList: 173130fdf1140b8d1ce93f3821d986fa165552023440lgao # skip function pointer 173230fdf1140b8d1ce93f3821d986fa165552023440lgao if len(Td[0]) > 0: 173330fdf1140b8d1ce93f3821d986fa165552023440lgao continue 173430fdf1140b8d1ce93f3821d986fa165552023440lgao if Result[1] >= Td[3] and Td[4] >= Result[2]: 173530fdf1140b8d1ce93f3821d986fa165552023440lgao Found = True 173630fdf1140b8d1ce93f3821d986fa165552023440lgao if not Td[1].isupper(): 173730fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ErrorType, 'Typedef should be UPPER case', FileTable, Td[5]) 173830fdf1140b8d1ce93f3821d986fa165552023440lgao if Result[0] in Td[2].split(): 173930fdf1140b8d1ce93f3821d986fa165552023440lgao Found = True 174030fdf1140b8d1ce93f3821d986fa165552023440lgao if not Td[1].isupper(): 174130fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ErrorType, 'Typedef should be UPPER case', FileTable, Td[5]) 174230fdf1140b8d1ce93f3821d986fa165552023440lgao if Found: 174330fdf1140b8d1ce93f3821d986fa165552023440lgao break 174452302d4dee589a5df43a464420c9fe68ba83937dlgao 174530fdf1140b8d1ce93f3821d986fa165552023440lgao if not Found: 174630fdf1140b8d1ce93f3821d986fa165552023440lgao UntypedefedList.append(Result) 174730fdf1140b8d1ce93f3821d986fa165552023440lgao continue 174852302d4dee589a5df43a464420c9fe68ba83937dlgao 174930fdf1140b8d1ce93f3821d986fa165552023440lgao if len(UntypedefedList) == 0: 175030fdf1140b8d1ce93f3821d986fa165552023440lgao return 175152302d4dee589a5df43a464420c9fe68ba83937dlgao 175230fdf1140b8d1ce93f3821d986fa165552023440lgao IncludeFileList = GetAllIncludeFiles(FullFileName) 175330fdf1140b8d1ce93f3821d986fa165552023440lgao TdList = [] 175430fdf1140b8d1ce93f3821d986fa165552023440lgao for F in IncludeFileList: 175530fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(F, ErrorMsgList) 175630fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 175730fdf1140b8d1ce93f3821d986fa165552023440lgao continue 175852302d4dee589a5df43a464420c9fe68ba83937dlgao 175930fdf1140b8d1ce93f3821d986fa165552023440lgao IncludeFileTable = 'Identifier' + str(FileID) 176030fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, Name, Value, StartLine, EndLine, ID 176130fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 176230fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d 176330fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (IncludeFileTable, DataClass.MODEL_IDENTIFIER_TYPEDEF) 176430fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 176530fdf1140b8d1ce93f3821d986fa165552023440lgao TdList.extend(ResultSet) 176652302d4dee589a5df43a464420c9fe68ba83937dlgao 176730fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in UntypedefedList: 176852302d4dee589a5df43a464420c9fe68ba83937dlgao 176930fdf1140b8d1ce93f3821d986fa165552023440lgao # Check whether it is typedefed. 177030fdf1140b8d1ce93f3821d986fa165552023440lgao Found = False 177130fdf1140b8d1ce93f3821d986fa165552023440lgao for Td in TdList: 177252302d4dee589a5df43a464420c9fe68ba83937dlgao 177330fdf1140b8d1ce93f3821d986fa165552023440lgao if len(Td[0]) > 0: 177430fdf1140b8d1ce93f3821d986fa165552023440lgao continue 177530fdf1140b8d1ce93f3821d986fa165552023440lgao if Result[1] >= Td[3] and Td[4] >= Result[2]: 177630fdf1140b8d1ce93f3821d986fa165552023440lgao Found = True 177730fdf1140b8d1ce93f3821d986fa165552023440lgao if not Td[1].isupper(): 177830fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ErrorType, 'Typedef should be UPPER case', FileTable, Td[5]) 177930fdf1140b8d1ce93f3821d986fa165552023440lgao if Result[0] in Td[2].split(): 178030fdf1140b8d1ce93f3821d986fa165552023440lgao Found = True 178130fdf1140b8d1ce93f3821d986fa165552023440lgao if not Td[1].isupper(): 178230fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ErrorType, 'Typedef should be UPPER case', FileTable, Td[5]) 178330fdf1140b8d1ce93f3821d986fa165552023440lgao if Found: 178430fdf1140b8d1ce93f3821d986fa165552023440lgao break 178552302d4dee589a5df43a464420c9fe68ba83937dlgao 178630fdf1140b8d1ce93f3821d986fa165552023440lgao if not Found: 178730fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ErrorType, 'No Typedef for %s' % Result[0], FileTable, Result[3]) 178830fdf1140b8d1ce93f3821d986fa165552023440lgao continue 178952302d4dee589a5df43a464420c9fe68ba83937dlgao 179030fdf1140b8d1ce93f3821d986fa165552023440lgaodef CheckDeclStructTypedef(FullFileName): 179130fdf1140b8d1ce93f3821d986fa165552023440lgao CheckDeclTypedefFormat(FullFileName, DataClass.MODEL_IDENTIFIER_STRUCTURE) 179230fdf1140b8d1ce93f3821d986fa165552023440lgao 179330fdf1140b8d1ce93f3821d986fa165552023440lgaodef CheckDeclEnumTypedef(FullFileName): 179430fdf1140b8d1ce93f3821d986fa165552023440lgao CheckDeclTypedefFormat(FullFileName, DataClass.MODEL_IDENTIFIER_ENUMERATE) 179552302d4dee589a5df43a464420c9fe68ba83937dlgao 179630fdf1140b8d1ce93f3821d986fa165552023440lgaodef CheckDeclUnionTypedef(FullFileName): 179730fdf1140b8d1ce93f3821d986fa165552023440lgao CheckDeclTypedefFormat(FullFileName, DataClass.MODEL_IDENTIFIER_UNION) 179830fdf1140b8d1ce93f3821d986fa165552023440lgao 179930fdf1140b8d1ce93f3821d986fa165552023440lgaodef CheckDeclArgModifier(FullFileName): 180030fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList = [] 180152302d4dee589a5df43a464420c9fe68ba83937dlgao 180230fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(FullFileName, ErrorMsgList) 180330fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 180430fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 180552302d4dee589a5df43a464420c9fe68ba83937dlgao 180630fdf1140b8d1ce93f3821d986fa165552023440lgao Db = GetDB() 180730fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 180830fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, Name, ID 180930fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 181030fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d 181130fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_VARIABLE) 181230fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 181330fdf1140b8d1ce93f3821d986fa165552023440lgao ModifierTuple = ('IN', 'OUT', 'OPTIONAL', 'UNALIGNED') 181430fdf1140b8d1ce93f3821d986fa165552023440lgao MAX_MODIFIER_LENGTH = 100 181530fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 181630fdf1140b8d1ce93f3821d986fa165552023440lgao for Modifier in ModifierTuple: 181730fdf1140b8d1ce93f3821d986fa165552023440lgao if PatternInModifier(Result[0], Modifier) and len(Result[0]) < MAX_MODIFIER_LENGTH: 181830fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DECLARATION_DATA_TYPE_CHECK_IN_OUT_MODIFIER, 'Variable Modifier %s' % Result[0], FileTable, Result[2]) 181930fdf1140b8d1ce93f3821d986fa165552023440lgao break 182052302d4dee589a5df43a464420c9fe68ba83937dlgao 182130fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, Name, ID 182230fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 182330fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d 182430fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_FUNCTION_DECLARATION) 182530fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 182630fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 182730fdf1140b8d1ce93f3821d986fa165552023440lgao for Modifier in ModifierTuple: 182830fdf1140b8d1ce93f3821d986fa165552023440lgao if PatternInModifier(Result[0], Modifier): 182930fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DECLARATION_DATA_TYPE_CHECK_IN_OUT_MODIFIER, 'Return Type Modifier %s' % Result[0], FileTable, Result[2]) 183030fdf1140b8d1ce93f3821d986fa165552023440lgao break 183152302d4dee589a5df43a464420c9fe68ba83937dlgao 183230fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, Header, ID 183330fdf1140b8d1ce93f3821d986fa165552023440lgao from Function 183430fdf1140b8d1ce93f3821d986fa165552023440lgao where BelongsToFile = %d 183530fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileID) 183630fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 183730fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 183830fdf1140b8d1ce93f3821d986fa165552023440lgao for Modifier in ModifierTuple: 183930fdf1140b8d1ce93f3821d986fa165552023440lgao if PatternInModifier(Result[0], Modifier): 184030fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DECLARATION_DATA_TYPE_CHECK_IN_OUT_MODIFIER, 'Return Type Modifier %s' % Result[0], FileTable, Result[2]) 184130fdf1140b8d1ce93f3821d986fa165552023440lgao break 184230fdf1140b8d1ce93f3821d986fa165552023440lgao 184330fdf1140b8d1ce93f3821d986fa165552023440lgaodef CheckDeclNoUseCType(FullFileName): 184430fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList = [] 184552302d4dee589a5df43a464420c9fe68ba83937dlgao 184630fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(FullFileName, ErrorMsgList) 184730fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 184830fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 184952302d4dee589a5df43a464420c9fe68ba83937dlgao 185030fdf1140b8d1ce93f3821d986fa165552023440lgao Db = GetDB() 185130fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 185230fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, Name, ID 185330fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 185430fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d 185530fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_VARIABLE) 185630fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 185730fdf1140b8d1ce93f3821d986fa165552023440lgao CTypeTuple = ('int', 'unsigned', 'char', 'void', 'static', 'long') 185830fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 185930fdf1140b8d1ce93f3821d986fa165552023440lgao for Type in CTypeTuple: 186030fdf1140b8d1ce93f3821d986fa165552023440lgao if PatternInModifier(Result[0], Type): 186130fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DECLARATION_DATA_TYPE_CHECK_NO_USE_C_TYPE, 'Variable type %s' % Type, FileTable, Result[2]) 186230fdf1140b8d1ce93f3821d986fa165552023440lgao break 186352302d4dee589a5df43a464420c9fe68ba83937dlgao 186430fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, Name, ID, Value 186530fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 186630fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d 186730fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_FUNCTION_DECLARATION) 186830fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 186930fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 187030fdf1140b8d1ce93f3821d986fa165552023440lgao ParamList = GetParamList(Result[1]) 187130fdf1140b8d1ce93f3821d986fa165552023440lgao FuncName = Result[3] 187230fdf1140b8d1ce93f3821d986fa165552023440lgao if EccGlobalData.gException.IsException(ERROR_DECLARATION_DATA_TYPE_CHECK_NO_USE_C_TYPE, FuncName): 187330fdf1140b8d1ce93f3821d986fa165552023440lgao continue 187430fdf1140b8d1ce93f3821d986fa165552023440lgao for Type in CTypeTuple: 187530fdf1140b8d1ce93f3821d986fa165552023440lgao if PatternInModifier(Result[0], Type): 187630fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DECLARATION_DATA_TYPE_CHECK_NO_USE_C_TYPE, '%s Return type %s' % (FuncName, Result[0]), FileTable, Result[2]) 187752302d4dee589a5df43a464420c9fe68ba83937dlgao 187830fdf1140b8d1ce93f3821d986fa165552023440lgao for Param in ParamList: 187930fdf1140b8d1ce93f3821d986fa165552023440lgao if PatternInModifier(Param.Modifier, Type): 188030fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DECLARATION_DATA_TYPE_CHECK_NO_USE_C_TYPE, 'Parameter %s' % Param.Name, FileTable, Result[2]) 188152302d4dee589a5df43a464420c9fe68ba83937dlgao 188230fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, Header, ID, Name 188330fdf1140b8d1ce93f3821d986fa165552023440lgao from Function 188430fdf1140b8d1ce93f3821d986fa165552023440lgao where BelongsToFile = %d 188530fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileID) 188630fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 188730fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 188830fdf1140b8d1ce93f3821d986fa165552023440lgao ParamList = GetParamList(Result[1]) 188930fdf1140b8d1ce93f3821d986fa165552023440lgao FuncName = Result[3] 189030fdf1140b8d1ce93f3821d986fa165552023440lgao if EccGlobalData.gException.IsException(ERROR_DECLARATION_DATA_TYPE_CHECK_NO_USE_C_TYPE, FuncName): 189130fdf1140b8d1ce93f3821d986fa165552023440lgao continue 189230fdf1140b8d1ce93f3821d986fa165552023440lgao for Type in CTypeTuple: 189330fdf1140b8d1ce93f3821d986fa165552023440lgao if PatternInModifier(Result[0], Type): 189430fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DECLARATION_DATA_TYPE_CHECK_NO_USE_C_TYPE, '[%s] Return type %s' % (FuncName, Result[0]), FileTable, Result[2]) 189552302d4dee589a5df43a464420c9fe68ba83937dlgao 189630fdf1140b8d1ce93f3821d986fa165552023440lgao for Param in ParamList: 189730fdf1140b8d1ce93f3821d986fa165552023440lgao if PatternInModifier(Param.Modifier, Type): 189830fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DECLARATION_DATA_TYPE_CHECK_NO_USE_C_TYPE, 'Parameter %s' % Param.Name, FileTable, Result[2]) 189952302d4dee589a5df43a464420c9fe68ba83937dlgao 190030fdf1140b8d1ce93f3821d986fa165552023440lgao 190130fdf1140b8d1ce93f3821d986fa165552023440lgaodef CheckPointerNullComparison(FullFileName): 190230fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList = [] 190352302d4dee589a5df43a464420c9fe68ba83937dlgao 190430fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(FullFileName, ErrorMsgList) 190530fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 190630fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 190752302d4dee589a5df43a464420c9fe68ba83937dlgao 190830fdf1140b8d1ce93f3821d986fa165552023440lgao # cache the found function return type to accelerate later checking in this file. 190930fdf1140b8d1ce93f3821d986fa165552023440lgao FuncReturnTypeDict = {} 191052302d4dee589a5df43a464420c9fe68ba83937dlgao 191130fdf1140b8d1ce93f3821d986fa165552023440lgao Db = GetDB() 191230fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 191330fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Value, StartLine, ID 191430fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 191530fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d 191630fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_PREDICATE_EXPRESSION) 191730fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 191830fdf1140b8d1ce93f3821d986fa165552023440lgao if len(ResultSet) == 0: 191930fdf1140b8d1ce93f3821d986fa165552023440lgao return 192030fdf1140b8d1ce93f3821d986fa165552023440lgao PSL = [] 192130fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 192230fdf1140b8d1ce93f3821d986fa165552023440lgao PSL.append([Result[0], Result[1], Result[2]]) 192352302d4dee589a5df43a464420c9fe68ba83937dlgao 192430fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select BodyStartLine, EndLine, Header, Modifier, ID 192530fdf1140b8d1ce93f3821d986fa165552023440lgao from Function 192630fdf1140b8d1ce93f3821d986fa165552023440lgao where BelongsToFile = %d 192730fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileID) 192830fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 192930fdf1140b8d1ce93f3821d986fa165552023440lgao FL = [] 193030fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 193130fdf1140b8d1ce93f3821d986fa165552023440lgao FL.append([Result[0], Result[1], Result[2], Result[3], Result[4]]) 193252302d4dee589a5df43a464420c9fe68ba83937dlgao 193330fdf1140b8d1ce93f3821d986fa165552023440lgao p = GetFuncDeclPattern() 193430fdf1140b8d1ce93f3821d986fa165552023440lgao for Str in PSL: 193530fdf1140b8d1ce93f3821d986fa165552023440lgao FuncRecord = GetFuncContainsPE(Str[1], FL) 193630fdf1140b8d1ce93f3821d986fa165552023440lgao if FuncRecord == None: 193730fdf1140b8d1ce93f3821d986fa165552023440lgao continue 193852302d4dee589a5df43a464420c9fe68ba83937dlgao 193930fdf1140b8d1ce93f3821d986fa165552023440lgao for Exp in GetPredicateListFromPredicateExpStr(Str[0]): 194030fdf1140b8d1ce93f3821d986fa165552023440lgao PredInfo = SplitPredicateStr(Exp) 194130fdf1140b8d1ce93f3821d986fa165552023440lgao if PredInfo[1] == None: 194230fdf1140b8d1ce93f3821d986fa165552023440lgao PredVarStr = PredInfo[0][0].strip() 194330fdf1140b8d1ce93f3821d986fa165552023440lgao IsFuncCall = False 194430fdf1140b8d1ce93f3821d986fa165552023440lgao SearchInCache = False 194530fdf1140b8d1ce93f3821d986fa165552023440lgao # PredVarStr may contain '.' or '->' 194630fdf1140b8d1ce93f3821d986fa165552023440lgao TmpStr = PredVarStr.replace('.', '').replace('->', '') 194730fdf1140b8d1ce93f3821d986fa165552023440lgao if p.match(TmpStr): 194830fdf1140b8d1ce93f3821d986fa165552023440lgao PredVarStr = PredVarStr[0:PredVarStr.find('(')] 194930fdf1140b8d1ce93f3821d986fa165552023440lgao SearchInCache = True 195030fdf1140b8d1ce93f3821d986fa165552023440lgao # Only direct function call using IsFuncCall branch. Multi-level ref. function call is considered a variable. 195152302d4dee589a5df43a464420c9fe68ba83937dlgao if TmpStr.startswith(PredVarStr): 195230fdf1140b8d1ce93f3821d986fa165552023440lgao IsFuncCall = True 195352302d4dee589a5df43a464420c9fe68ba83937dlgao 195430fdf1140b8d1ce93f3821d986fa165552023440lgao if PredVarStr.strip() in IgnoredKeywordList: 195530fdf1140b8d1ce93f3821d986fa165552023440lgao continue 195630fdf1140b8d1ce93f3821d986fa165552023440lgao StarList = [] 195730fdf1140b8d1ce93f3821d986fa165552023440lgao PredVarList = GetCNameList(PredVarStr, StarList) 195830fdf1140b8d1ce93f3821d986fa165552023440lgao # No variable found, maybe value first? like (0 == VarName) 195930fdf1140b8d1ce93f3821d986fa165552023440lgao if len(PredVarList) == 0: 196030fdf1140b8d1ce93f3821d986fa165552023440lgao continue 196130fdf1140b8d1ce93f3821d986fa165552023440lgao if SearchInCache: 196230fdf1140b8d1ce93f3821d986fa165552023440lgao Type = FuncReturnTypeDict.get(PredVarStr) 196330fdf1140b8d1ce93f3821d986fa165552023440lgao if Type != None: 196479b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao if Type.find('*') != -1 and Type != 'BOOLEAN*': 196530fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_PREDICATE_EXPRESSION_CHECK_COMPARISON_NULL_TYPE, 'Predicate Expression: %s' % Exp, FileTable, Str[2]) 196630fdf1140b8d1ce93f3821d986fa165552023440lgao continue 196752302d4dee589a5df43a464420c9fe68ba83937dlgao 196830fdf1140b8d1ce93f3821d986fa165552023440lgao if PredVarStr in FuncReturnTypeDict: 196930fdf1140b8d1ce93f3821d986fa165552023440lgao continue 197052302d4dee589a5df43a464420c9fe68ba83937dlgao 197130fdf1140b8d1ce93f3821d986fa165552023440lgao Type = GetVarInfo(PredVarList, FuncRecord, FullFileName, IsFuncCall, None, StarList) 197230fdf1140b8d1ce93f3821d986fa165552023440lgao if SearchInCache: 197330fdf1140b8d1ce93f3821d986fa165552023440lgao FuncReturnTypeDict[PredVarStr] = Type 197430fdf1140b8d1ce93f3821d986fa165552023440lgao if Type == None: 197530fdf1140b8d1ce93f3821d986fa165552023440lgao continue 197652302d4dee589a5df43a464420c9fe68ba83937dlgao Type = GetTypeFromArray(Type, PredVarStr) 197779b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao if Type.find('*') != -1 and Type != 'BOOLEAN*': 197830fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_PREDICATE_EXPRESSION_CHECK_COMPARISON_NULL_TYPE, 'Predicate Expression: %s' % Exp, FileTable, Str[2]) 197930fdf1140b8d1ce93f3821d986fa165552023440lgao 198030fdf1140b8d1ce93f3821d986fa165552023440lgaodef CheckNonBooleanValueComparison(FullFileName): 198130fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList = [] 198252302d4dee589a5df43a464420c9fe68ba83937dlgao 198330fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(FullFileName, ErrorMsgList) 198430fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 198530fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 198652302d4dee589a5df43a464420c9fe68ba83937dlgao 198730fdf1140b8d1ce93f3821d986fa165552023440lgao # cache the found function return type to accelerate later checking in this file. 198830fdf1140b8d1ce93f3821d986fa165552023440lgao FuncReturnTypeDict = {} 198952302d4dee589a5df43a464420c9fe68ba83937dlgao 199030fdf1140b8d1ce93f3821d986fa165552023440lgao Db = GetDB() 199130fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 199230fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Value, StartLine, ID 199330fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 199430fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d 199530fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_PREDICATE_EXPRESSION) 199630fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 199730fdf1140b8d1ce93f3821d986fa165552023440lgao if len(ResultSet) == 0: 199830fdf1140b8d1ce93f3821d986fa165552023440lgao return 199930fdf1140b8d1ce93f3821d986fa165552023440lgao PSL = [] 200030fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 200130fdf1140b8d1ce93f3821d986fa165552023440lgao PSL.append([Result[0], Result[1], Result[2]]) 200252302d4dee589a5df43a464420c9fe68ba83937dlgao 200330fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select BodyStartLine, EndLine, Header, Modifier, ID 200430fdf1140b8d1ce93f3821d986fa165552023440lgao from Function 200530fdf1140b8d1ce93f3821d986fa165552023440lgao where BelongsToFile = %d 200630fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileID) 200730fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 200830fdf1140b8d1ce93f3821d986fa165552023440lgao FL = [] 200930fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 201030fdf1140b8d1ce93f3821d986fa165552023440lgao FL.append([Result[0], Result[1], Result[2], Result[3], Result[4]]) 201152302d4dee589a5df43a464420c9fe68ba83937dlgao 201230fdf1140b8d1ce93f3821d986fa165552023440lgao p = GetFuncDeclPattern() 201330fdf1140b8d1ce93f3821d986fa165552023440lgao for Str in PSL: 201430fdf1140b8d1ce93f3821d986fa165552023440lgao FuncRecord = GetFuncContainsPE(Str[1], FL) 201530fdf1140b8d1ce93f3821d986fa165552023440lgao if FuncRecord == None: 201630fdf1140b8d1ce93f3821d986fa165552023440lgao continue 201752302d4dee589a5df43a464420c9fe68ba83937dlgao 201830fdf1140b8d1ce93f3821d986fa165552023440lgao for Exp in GetPredicateListFromPredicateExpStr(Str[0]): 201930fdf1140b8d1ce93f3821d986fa165552023440lgao PredInfo = SplitPredicateStr(Exp) 202030fdf1140b8d1ce93f3821d986fa165552023440lgao if PredInfo[1] == None: 202130fdf1140b8d1ce93f3821d986fa165552023440lgao PredVarStr = PredInfo[0][0].strip() 202230fdf1140b8d1ce93f3821d986fa165552023440lgao IsFuncCall = False 202330fdf1140b8d1ce93f3821d986fa165552023440lgao SearchInCache = False 202430fdf1140b8d1ce93f3821d986fa165552023440lgao # PredVarStr may contain '.' or '->' 202530fdf1140b8d1ce93f3821d986fa165552023440lgao TmpStr = PredVarStr.replace('.', '').replace('->', '') 202630fdf1140b8d1ce93f3821d986fa165552023440lgao if p.match(TmpStr): 202730fdf1140b8d1ce93f3821d986fa165552023440lgao PredVarStr = PredVarStr[0:PredVarStr.find('(')] 202830fdf1140b8d1ce93f3821d986fa165552023440lgao SearchInCache = True 202930fdf1140b8d1ce93f3821d986fa165552023440lgao # Only direct function call using IsFuncCall branch. Multi-level ref. function call is considered a variable. 203052302d4dee589a5df43a464420c9fe68ba83937dlgao if TmpStr.startswith(PredVarStr): 203130fdf1140b8d1ce93f3821d986fa165552023440lgao IsFuncCall = True 203252302d4dee589a5df43a464420c9fe68ba83937dlgao 203330fdf1140b8d1ce93f3821d986fa165552023440lgao if PredVarStr.strip() in IgnoredKeywordList: 203430fdf1140b8d1ce93f3821d986fa165552023440lgao continue 203530fdf1140b8d1ce93f3821d986fa165552023440lgao StarList = [] 203630fdf1140b8d1ce93f3821d986fa165552023440lgao PredVarList = GetCNameList(PredVarStr, StarList) 203730fdf1140b8d1ce93f3821d986fa165552023440lgao # No variable found, maybe value first? like (0 == VarName) 203830fdf1140b8d1ce93f3821d986fa165552023440lgao if len(PredVarList) == 0: 203930fdf1140b8d1ce93f3821d986fa165552023440lgao continue 204052302d4dee589a5df43a464420c9fe68ba83937dlgao 204130fdf1140b8d1ce93f3821d986fa165552023440lgao if SearchInCache: 204230fdf1140b8d1ce93f3821d986fa165552023440lgao Type = FuncReturnTypeDict.get(PredVarStr) 204330fdf1140b8d1ce93f3821d986fa165552023440lgao if Type != None: 204430fdf1140b8d1ce93f3821d986fa165552023440lgao if Type.find('BOOLEAN') == -1: 204530fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_PREDICATE_EXPRESSION_CHECK_NO_BOOLEAN_OPERATOR, 'Predicate Expression: %s' % Exp, FileTable, Str[2]) 204630fdf1140b8d1ce93f3821d986fa165552023440lgao continue 204752302d4dee589a5df43a464420c9fe68ba83937dlgao 204830fdf1140b8d1ce93f3821d986fa165552023440lgao if PredVarStr in FuncReturnTypeDict: 204930fdf1140b8d1ce93f3821d986fa165552023440lgao continue 205030fdf1140b8d1ce93f3821d986fa165552023440lgao Type = GetVarInfo(PredVarList, FuncRecord, FullFileName, IsFuncCall, 'BOOLEAN', StarList) 205130fdf1140b8d1ce93f3821d986fa165552023440lgao if SearchInCache: 205230fdf1140b8d1ce93f3821d986fa165552023440lgao FuncReturnTypeDict[PredVarStr] = Type 205330fdf1140b8d1ce93f3821d986fa165552023440lgao if Type == None: 205430fdf1140b8d1ce93f3821d986fa165552023440lgao continue 205530fdf1140b8d1ce93f3821d986fa165552023440lgao if Type.find('BOOLEAN') == -1: 205630fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_PREDICATE_EXPRESSION_CHECK_NO_BOOLEAN_OPERATOR, 'Predicate Expression: %s' % Exp, FileTable, Str[2]) 205752302d4dee589a5df43a464420c9fe68ba83937dlgao 205830fdf1140b8d1ce93f3821d986fa165552023440lgao 205930fdf1140b8d1ce93f3821d986fa165552023440lgaodef CheckBooleanValueComparison(FullFileName): 206030fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList = [] 206152302d4dee589a5df43a464420c9fe68ba83937dlgao 206230fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(FullFileName, ErrorMsgList) 206330fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 206430fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 206552302d4dee589a5df43a464420c9fe68ba83937dlgao 206630fdf1140b8d1ce93f3821d986fa165552023440lgao # cache the found function return type to accelerate later checking in this file. 206730fdf1140b8d1ce93f3821d986fa165552023440lgao FuncReturnTypeDict = {} 206852302d4dee589a5df43a464420c9fe68ba83937dlgao 206930fdf1140b8d1ce93f3821d986fa165552023440lgao Db = GetDB() 207030fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 207130fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Value, StartLine, ID 207230fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 207330fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d 207430fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_PREDICATE_EXPRESSION) 207530fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 207630fdf1140b8d1ce93f3821d986fa165552023440lgao if len(ResultSet) == 0: 207730fdf1140b8d1ce93f3821d986fa165552023440lgao return 207830fdf1140b8d1ce93f3821d986fa165552023440lgao PSL = [] 207930fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 208030fdf1140b8d1ce93f3821d986fa165552023440lgao PSL.append([Result[0], Result[1], Result[2]]) 208152302d4dee589a5df43a464420c9fe68ba83937dlgao 208230fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select BodyStartLine, EndLine, Header, Modifier, ID 208330fdf1140b8d1ce93f3821d986fa165552023440lgao from Function 208430fdf1140b8d1ce93f3821d986fa165552023440lgao where BelongsToFile = %d 208530fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileID) 208630fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 208730fdf1140b8d1ce93f3821d986fa165552023440lgao FL = [] 208830fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 208930fdf1140b8d1ce93f3821d986fa165552023440lgao FL.append([Result[0], Result[1], Result[2], Result[3], Result[4]]) 209052302d4dee589a5df43a464420c9fe68ba83937dlgao 209130fdf1140b8d1ce93f3821d986fa165552023440lgao p = GetFuncDeclPattern() 209230fdf1140b8d1ce93f3821d986fa165552023440lgao for Str in PSL: 209330fdf1140b8d1ce93f3821d986fa165552023440lgao FuncRecord = GetFuncContainsPE(Str[1], FL) 209430fdf1140b8d1ce93f3821d986fa165552023440lgao if FuncRecord == None: 209530fdf1140b8d1ce93f3821d986fa165552023440lgao continue 209652302d4dee589a5df43a464420c9fe68ba83937dlgao 209730fdf1140b8d1ce93f3821d986fa165552023440lgao for Exp in GetPredicateListFromPredicateExpStr(Str[0]): 209830fdf1140b8d1ce93f3821d986fa165552023440lgao PredInfo = SplitPredicateStr(Exp) 209930fdf1140b8d1ce93f3821d986fa165552023440lgao if PredInfo[1] in ('==', '!=') and PredInfo[0][1] in ('TRUE', 'FALSE'): 210030fdf1140b8d1ce93f3821d986fa165552023440lgao PredVarStr = PredInfo[0][0].strip() 210130fdf1140b8d1ce93f3821d986fa165552023440lgao IsFuncCall = False 210230fdf1140b8d1ce93f3821d986fa165552023440lgao SearchInCache = False 210330fdf1140b8d1ce93f3821d986fa165552023440lgao # PredVarStr may contain '.' or '->' 210430fdf1140b8d1ce93f3821d986fa165552023440lgao TmpStr = PredVarStr.replace('.', '').replace('->', '') 210530fdf1140b8d1ce93f3821d986fa165552023440lgao if p.match(TmpStr): 210630fdf1140b8d1ce93f3821d986fa165552023440lgao PredVarStr = PredVarStr[0:PredVarStr.find('(')] 210730fdf1140b8d1ce93f3821d986fa165552023440lgao SearchInCache = True 210830fdf1140b8d1ce93f3821d986fa165552023440lgao # Only direct function call using IsFuncCall branch. Multi-level ref. function call is considered a variable. 210952302d4dee589a5df43a464420c9fe68ba83937dlgao if TmpStr.startswith(PredVarStr): 211030fdf1140b8d1ce93f3821d986fa165552023440lgao IsFuncCall = True 211152302d4dee589a5df43a464420c9fe68ba83937dlgao 211230fdf1140b8d1ce93f3821d986fa165552023440lgao if PredVarStr.strip() in IgnoredKeywordList: 211330fdf1140b8d1ce93f3821d986fa165552023440lgao continue 211430fdf1140b8d1ce93f3821d986fa165552023440lgao StarList = [] 211530fdf1140b8d1ce93f3821d986fa165552023440lgao PredVarList = GetCNameList(PredVarStr, StarList) 211630fdf1140b8d1ce93f3821d986fa165552023440lgao # No variable found, maybe value first? like (0 == VarName) 211730fdf1140b8d1ce93f3821d986fa165552023440lgao if len(PredVarList) == 0: 211830fdf1140b8d1ce93f3821d986fa165552023440lgao continue 211952302d4dee589a5df43a464420c9fe68ba83937dlgao 212030fdf1140b8d1ce93f3821d986fa165552023440lgao if SearchInCache: 212130fdf1140b8d1ce93f3821d986fa165552023440lgao Type = FuncReturnTypeDict.get(PredVarStr) 212230fdf1140b8d1ce93f3821d986fa165552023440lgao if Type != None: 212330fdf1140b8d1ce93f3821d986fa165552023440lgao if Type.find('BOOLEAN') != -1: 212430fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_PREDICATE_EXPRESSION_CHECK_BOOLEAN_VALUE, 'Predicate Expression: %s' % Exp, FileTable, Str[2]) 212530fdf1140b8d1ce93f3821d986fa165552023440lgao continue 212652302d4dee589a5df43a464420c9fe68ba83937dlgao 212730fdf1140b8d1ce93f3821d986fa165552023440lgao if PredVarStr in FuncReturnTypeDict: 212830fdf1140b8d1ce93f3821d986fa165552023440lgao continue 212952302d4dee589a5df43a464420c9fe68ba83937dlgao 213030fdf1140b8d1ce93f3821d986fa165552023440lgao Type = GetVarInfo(PredVarList, FuncRecord, FullFileName, IsFuncCall, 'BOOLEAN', StarList) 213130fdf1140b8d1ce93f3821d986fa165552023440lgao if SearchInCache: 213230fdf1140b8d1ce93f3821d986fa165552023440lgao FuncReturnTypeDict[PredVarStr] = Type 213330fdf1140b8d1ce93f3821d986fa165552023440lgao if Type == None: 213430fdf1140b8d1ce93f3821d986fa165552023440lgao continue 213530fdf1140b8d1ce93f3821d986fa165552023440lgao if Type.find('BOOLEAN') != -1: 213630fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_PREDICATE_EXPRESSION_CHECK_BOOLEAN_VALUE, 'Predicate Expression: %s' % Exp, FileTable, Str[2]) 213752302d4dee589a5df43a464420c9fe68ba83937dlgao 213830fdf1140b8d1ce93f3821d986fa165552023440lgao 213930fdf1140b8d1ce93f3821d986fa165552023440lgaodef CheckHeaderFileData(FullFileName): 214030fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList = [] 214152302d4dee589a5df43a464420c9fe68ba83937dlgao 214230fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(FullFileName, ErrorMsgList) 214330fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 214430fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 214552302d4dee589a5df43a464420c9fe68ba83937dlgao 214630fdf1140b8d1ce93f3821d986fa165552023440lgao Db = GetDB() 214730fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 214830fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select ID, Modifier 214930fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 215030fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d 215130fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_VARIABLE) 215230fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 215330fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 215430fdf1140b8d1ce93f3821d986fa165552023440lgao if not Result[1].startswith('extern'): 215530fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_INCLUDE_FILE_CHECK_DATA, 'Variable definition appears in header file', FileTable, Result[0]) 215652302d4dee589a5df43a464420c9fe68ba83937dlgao 215730fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select ID 215830fdf1140b8d1ce93f3821d986fa165552023440lgao from Function 215930fdf1140b8d1ce93f3821d986fa165552023440lgao where BelongsToFile = %d 216030fdf1140b8d1ce93f3821d986fa165552023440lgao """ % FileID 216130fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 216230fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 216330fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_INCLUDE_FILE_CHECK_DATA, 'Function definition appears in header file', 'Function', Result[0]) 216430fdf1140b8d1ce93f3821d986fa165552023440lgao 216530fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 216630fdf1140b8d1ce93f3821d986fa165552023440lgao 216730fdf1140b8d1ce93f3821d986fa165552023440lgaodef CheckHeaderFileIfndef(FullFileName): 216830fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList = [] 216952302d4dee589a5df43a464420c9fe68ba83937dlgao 217030fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(FullFileName, ErrorMsgList) 217130fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 217230fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 217352302d4dee589a5df43a464420c9fe68ba83937dlgao 217430fdf1140b8d1ce93f3821d986fa165552023440lgao Db = GetDB() 217530fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 217630fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Value, StartLine 217730fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 217830fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d order by StartLine 217930fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_MACRO_IFNDEF) 218030fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 218130fdf1140b8d1ce93f3821d986fa165552023440lgao if len(ResultSet) == 0: 218230fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_INCLUDE_FILE_CHECK_IFNDEF_STATEMENT_1, '', 'File', FileID) 218330fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 218430fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 218530fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Value, EndLine 218630fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 218730fdf1140b8d1ce93f3821d986fa165552023440lgao where EndLine < %d 218830fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, Result[1]) 218930fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 219030fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 219130fdf1140b8d1ce93f3821d986fa165552023440lgao if not Result[0].startswith('/*') and not Result[0].startswith('//'): 219230fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_INCLUDE_FILE_CHECK_IFNDEF_STATEMENT_2, '', 'File', FileID) 219330fdf1140b8d1ce93f3821d986fa165552023440lgao break 219452302d4dee589a5df43a464420c9fe68ba83937dlgao 219530fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Value 219630fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 219730fdf1140b8d1ce93f3821d986fa165552023440lgao where StartLine > (select max(EndLine) from %s where Model = %d) 219830fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, FileTable, DataClass.MODEL_IDENTIFIER_MACRO_ENDIF) 219930fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 220030fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 220130fdf1140b8d1ce93f3821d986fa165552023440lgao if not Result[0].startswith('/*') and not Result[0].startswith('//'): 220230fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_INCLUDE_FILE_CHECK_IFNDEF_STATEMENT_3, '', 'File', FileID) 220330fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 220430fdf1140b8d1ce93f3821d986fa165552023440lgao 220530fdf1140b8d1ce93f3821d986fa165552023440lgaodef CheckDoxygenCommand(FullFileName): 220630fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList = [] 220752302d4dee589a5df43a464420c9fe68ba83937dlgao 220830fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(FullFileName, ErrorMsgList) 220930fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 221030fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 221152302d4dee589a5df43a464420c9fe68ba83937dlgao 221230fdf1140b8d1ce93f3821d986fa165552023440lgao Db = GetDB() 221330fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 221430fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Value, ID 221530fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 221630fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d or Model = %d 221730fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_COMMENT, DataClass.MODEL_IDENTIFIER_FUNCTION_HEADER) 221830fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 221930fdf1140b8d1ce93f3821d986fa165552023440lgao DoxygenCommandList = ['bug', 'todo', 'example', 'file', 'attention', 'param', 'post', 'pre', 'retval', 'return', 'sa', 'since', 'test', 'note', 'par'] 222030fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 222130fdf1140b8d1ce93f3821d986fa165552023440lgao CommentStr = Result[0] 222230fdf1140b8d1ce93f3821d986fa165552023440lgao CommentPartList = CommentStr.split() 222330fdf1140b8d1ce93f3821d986fa165552023440lgao for Part in CommentPartList: 222430fdf1140b8d1ce93f3821d986fa165552023440lgao if Part.upper() == 'BUGBUG': 222530fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DOXYGEN_CHECK_COMMAND, 'Bug should be marked with doxygen tag @bug', FileTable, Result[1]) 222630fdf1140b8d1ce93f3821d986fa165552023440lgao if Part.upper() == 'TODO': 222730fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DOXYGEN_CHECK_COMMAND, 'ToDo should be marked with doxygen tag @todo', FileTable, Result[1]) 222830fdf1140b8d1ce93f3821d986fa165552023440lgao if Part.startswith('@'): 222930fdf1140b8d1ce93f3821d986fa165552023440lgao if EccGlobalData.gException.IsException(ERROR_DOXYGEN_CHECK_COMMAND, Part): 223030fdf1140b8d1ce93f3821d986fa165552023440lgao continue 223130fdf1140b8d1ce93f3821d986fa165552023440lgao if Part.lstrip('@').isalpha(): 223230fdf1140b8d1ce93f3821d986fa165552023440lgao if Part.lstrip('@') not in DoxygenCommandList: 223330fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DOXYGEN_CHECK_COMMAND, 'Unknown doxygen command %s' % Part, FileTable, Result[1]) 223430fdf1140b8d1ce93f3821d986fa165552023440lgao else: 223530fdf1140b8d1ce93f3821d986fa165552023440lgao Index = Part.find('[') 223630fdf1140b8d1ce93f3821d986fa165552023440lgao if Index == -1: 223730fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DOXYGEN_CHECK_COMMAND, 'Unknown doxygen command %s' % Part, FileTable, Result[1]) 223830fdf1140b8d1ce93f3821d986fa165552023440lgao RealCmd = Part[1:Index] 223930fdf1140b8d1ce93f3821d986fa165552023440lgao if RealCmd not in DoxygenCommandList: 224030fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DOXYGEN_CHECK_COMMAND, 'Unknown doxygen command %s' % Part, FileTable, Result[1]) 224152302d4dee589a5df43a464420c9fe68ba83937dlgao 224252302d4dee589a5df43a464420c9fe68ba83937dlgao 224330fdf1140b8d1ce93f3821d986fa165552023440lgaodef CheckDoxygenTripleForwardSlash(FullFileName): 224430fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList = [] 224552302d4dee589a5df43a464420c9fe68ba83937dlgao 224630fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(FullFileName, ErrorMsgList) 224730fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 224830fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 224952302d4dee589a5df43a464420c9fe68ba83937dlgao 225030fdf1140b8d1ce93f3821d986fa165552023440lgao Db = GetDB() 225152302d4dee589a5df43a464420c9fe68ba83937dlgao 225230fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select ID, BodyStartLine, BodyStartColumn, EndLine, EndColumn 225330fdf1140b8d1ce93f3821d986fa165552023440lgao from Function 225430fdf1140b8d1ce93f3821d986fa165552023440lgao where BelongsToFile = %d 225530fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileID) 225630fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 225730fdf1140b8d1ce93f3821d986fa165552023440lgao if len(ResultSet) == 0: 225830fdf1140b8d1ce93f3821d986fa165552023440lgao return 225952302d4dee589a5df43a464420c9fe68ba83937dlgao 226052302d4dee589a5df43a464420c9fe68ba83937dlgao FuncDefSet = [] 226130fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 226230fdf1140b8d1ce93f3821d986fa165552023440lgao FuncDefSet.append(Result) 226352302d4dee589a5df43a464420c9fe68ba83937dlgao 226452302d4dee589a5df43a464420c9fe68ba83937dlgao 226530fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 226630fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Value, ID, StartLine, StartColumn, EndLine, EndColumn 226730fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 226852302d4dee589a5df43a464420c9fe68ba83937dlgao where Model = %d 226952302d4dee589a5df43a464420c9fe68ba83937dlgao 227030fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_COMMENT) 227130fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 227230fdf1140b8d1ce93f3821d986fa165552023440lgao CommentSet = [] 227330fdf1140b8d1ce93f3821d986fa165552023440lgao try: 227430fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 227530fdf1140b8d1ce93f3821d986fa165552023440lgao CommentSet.append(Result) 227630fdf1140b8d1ce93f3821d986fa165552023440lgao except: 227730fdf1140b8d1ce93f3821d986fa165552023440lgao print 'Unrecognized chars in comment of file %s', FullFileName 227852302d4dee589a5df43a464420c9fe68ba83937dlgao 227952302d4dee589a5df43a464420c9fe68ba83937dlgao 228030fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in CommentSet: 228130fdf1140b8d1ce93f3821d986fa165552023440lgao CommentStr = Result[0] 228230fdf1140b8d1ce93f3821d986fa165552023440lgao StartLine = Result[2] 228330fdf1140b8d1ce93f3821d986fa165552023440lgao StartColumn = Result[3] 228430fdf1140b8d1ce93f3821d986fa165552023440lgao EndLine = Result[4] 228530fdf1140b8d1ce93f3821d986fa165552023440lgao EndColumn = Result[5] 228630fdf1140b8d1ce93f3821d986fa165552023440lgao if not CommentStr.startswith('///<'): 228730fdf1140b8d1ce93f3821d986fa165552023440lgao continue 228852302d4dee589a5df43a464420c9fe68ba83937dlgao 228930fdf1140b8d1ce93f3821d986fa165552023440lgao Found = False 229030fdf1140b8d1ce93f3821d986fa165552023440lgao for FuncDef in FuncDefSet: 229130fdf1140b8d1ce93f3821d986fa165552023440lgao if StartLine == FuncDef[1] and StartColumn > FuncDef[2] and EndLine == FuncDef[3] and EndColumn < FuncDef[4]: 229230fdf1140b8d1ce93f3821d986fa165552023440lgao Found = True 229330fdf1140b8d1ce93f3821d986fa165552023440lgao break 229430fdf1140b8d1ce93f3821d986fa165552023440lgao if StartLine > FuncDef[1] and EndLine < FuncDef[3]: 229530fdf1140b8d1ce93f3821d986fa165552023440lgao Found = True 229630fdf1140b8d1ce93f3821d986fa165552023440lgao break 229730fdf1140b8d1ce93f3821d986fa165552023440lgao if StartLine == FuncDef[1] and StartColumn > FuncDef[2] and EndLine < FuncDef[3]: 229830fdf1140b8d1ce93f3821d986fa165552023440lgao Found = True 229930fdf1140b8d1ce93f3821d986fa165552023440lgao break 230030fdf1140b8d1ce93f3821d986fa165552023440lgao if StartLine > FuncDef[1] and EndLine == FuncDef[3] and EndColumn < FuncDef[4]: 230130fdf1140b8d1ce93f3821d986fa165552023440lgao Found = True 230230fdf1140b8d1ce93f3821d986fa165552023440lgao break 230330fdf1140b8d1ce93f3821d986fa165552023440lgao if Found: 230430fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DOXYGEN_CHECK_COMMENT_FORMAT, '', FileTable, Result[1]) 230530fdf1140b8d1ce93f3821d986fa165552023440lgao 230630fdf1140b8d1ce93f3821d986fa165552023440lgao 230730fdf1140b8d1ce93f3821d986fa165552023440lgaodef CheckFileHeaderDoxygenComments(FullFileName): 230830fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList = [] 230952302d4dee589a5df43a464420c9fe68ba83937dlgao 231030fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(FullFileName, ErrorMsgList) 231130fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 231230fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 231352302d4dee589a5df43a464420c9fe68ba83937dlgao 231430fdf1140b8d1ce93f3821d986fa165552023440lgao Db = GetDB() 231530fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 231630fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Value, ID 231730fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 2318e56468c072e0d53834787f4ad0e292b33cc6be08qhuang where Model = %d and (StartLine = 1 or StartLine = 7 or StartLine = 8) and StartColumn = 0 231930fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_COMMENT) 232030fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 232130fdf1140b8d1ce93f3821d986fa165552023440lgao if len(ResultSet) == 0: 2322d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao PrintErrorMsg(ERROR_HEADER_CHECK_FILE, 'No File License header appear at the very beginning of file.', 'File', FileID) 232330fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 232452302d4dee589a5df43a464420c9fe68ba83937dlgao 2325d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao NoHeaderCommentStartFlag = True 2326d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao NoHeaderCommentEndFlag = True 2327d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao NoHeaderCommentPeriodFlag = True 2328d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao NoCopyrightFlag = True 2329d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao NoLicenseFlag = True 2330d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao NoRevReferFlag = True 2331d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao NextLineIndex = 0 233230fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 2333d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao FileStartFlag = False 2334d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao CommentStrList = [] 2335e56468c072e0d53834787f4ad0e292b33cc6be08qhuang CommentStr = Result[0].strip() 2336d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao CommentStrListTemp = CommentStr.split('\n') 2337d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao if (len(CommentStrListTemp) <= 1): 2338d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao # For Mac 2339d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao CommentStrListTemp = CommentStr.split('\r') 2340d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao # Skip the content before the file header 2341d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao for CommentLine in CommentStrListTemp: 2342d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao if CommentLine.strip().startswith('/** @file'): 2343d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao FileStartFlag = True 2344d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao if FileStartFlag == True: 2345d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao CommentStrList.append(CommentLine) 2346d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao 2347e56468c072e0d53834787f4ad0e292b33cc6be08qhuang ID = Result[1] 2348d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao Index = 0 2349d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao if CommentStrList and CommentStrList[0].strip().startswith('/** @file'): 2350d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao NoHeaderCommentStartFlag = False 2351d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao else: 2352d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao continue 2353d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao if CommentStrList and CommentStrList[-1].strip().endswith('**/'): 2354d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao NoHeaderCommentEndFlag = False 2355d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao else: 2356d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao continue 2357d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao 2358d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao for CommentLine in CommentStrList: 2359d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao Index = Index + 1 2360d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao NextLineIndex = Index 2361d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao if CommentLine.startswith('/** @file'): 2362d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao continue 2363d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao if CommentLine.startswith('**/'): 2364d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao break 2365d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao # Check whether C File header Comment content start with two spaces. 2366d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao if EccGlobalData.gConfig.HeaderCheckCFileCommentStartSpacesNum == '1' or EccGlobalData.gConfig.HeaderCheckAll == '1' or EccGlobalData.gConfig.CheckAll == '1': 2367d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao if CommentLine.startswith('/** @file') == False and CommentLine.startswith('**/') == False and CommentLine.strip() and CommentLine.startswith(' ') == False: 2368d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao PrintErrorMsg(ERROR_HEADER_CHECK_FILE, 'File header comment content should start with two spaces at each line', FileTable, ID) 2369d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao 2370d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao CommentLine = CommentLine.strip() 2371d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao if CommentLine.startswith('Copyright'): 2372d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao NoCopyrightFlag = False 2373d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao if CommentLine.find('All rights reserved') == -1: 2374d77cc2063de7be8a1b28ef2efb5770df4578975aHess Chen for Copyright in EccGlobalData.gConfig.Copyright: 2375d77cc2063de7be8a1b28ef2efb5770df4578975aHess Chen if CommentLine.find(Copyright) > -1: 2376d77cc2063de7be8a1b28ef2efb5770df4578975aHess Chen PrintErrorMsg(ERROR_HEADER_CHECK_FILE, '""All rights reserved"" announcement should be following the ""Copyright"" at the same line', FileTable, ID) 2377d77cc2063de7be8a1b28ef2efb5770df4578975aHess Chen break 2378d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao if CommentLine.endswith('<BR>') == -1: 2379d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao PrintErrorMsg(ERROR_HEADER_CHECK_FILE, 'The ""<BR>"" at the end of the Copyright line is required', FileTable, ID) 2380d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao if NextLineIndex < len(CommentStrList) and CommentStrList[NextLineIndex].strip().startswith('Copyright') == False and CommentStrList[NextLineIndex].strip(): 2381d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao NoLicenseFlag = False 2382d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao if CommentLine.startswith('@par Revision Reference:'): 2383d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao NoRevReferFlag = False 2384d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao RefListFlag = False 2385d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao for RefLine in CommentStrList[NextLineIndex:]: 2386d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao if RefLine.strip() and (NextLineIndex + 1) < len(CommentStrList) and CommentStrList[NextLineIndex+1].strip() and CommentStrList[NextLineIndex+1].strip().startswith('**/') == False: 2387d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao RefListFlag = True 2388d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao if RefLine.strip() == False or RefLine.strip().startswith('**/'): 2389d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao RefListFlag = False 2390d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao break 2391d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao # Check whether C File header Comment's each reference at list should begin with a bullet character. 2392d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao if EccGlobalData.gConfig.HeaderCheckCFileCommentReferenceFormat == '1' or EccGlobalData.gConfig.HeaderCheckAll == '1' or EccGlobalData.gConfig.CheckAll == '1': 2393d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao if RefListFlag == True: 2394d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao if RefLine.strip() and RefLine.strip().startswith('**/') == False and RefLine.startswith(' -') == False: 2395d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao PrintErrorMsg(ERROR_HEADER_CHECK_FILE, 'Each reference on a separate line should begin with a bullet character ""-"" ', FileTable, ID) 2396d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao 2397d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao if NoHeaderCommentStartFlag: 2398e56468c072e0d53834787f4ad0e292b33cc6be08qhuang PrintErrorMsg(ERROR_DOXYGEN_CHECK_FILE_HEADER, 'File header comment should begin with ""/** @file""', FileTable, ID) 2399d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao return 2400d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao if NoHeaderCommentEndFlag: 2401e56468c072e0d53834787f4ad0e292b33cc6be08qhuang PrintErrorMsg(ERROR_HEADER_CHECK_FILE, 'File header comment should end with ""**/""', FileTable, ID) 2402d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao return 2403d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao if NoCopyrightFlag: 2404d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao PrintErrorMsg(ERROR_HEADER_CHECK_FILE, 'File header comment missing the ""Copyright""', FileTable, ID) 2405d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao #Check whether C File header Comment have the License immediately after the ""Copyright"" line. 2406d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao if EccGlobalData.gConfig.HeaderCheckCFileCommentLicenseFormat == '1' or EccGlobalData.gConfig.HeaderCheckAll == '1' or EccGlobalData.gConfig.CheckAll == '1': 2407d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao if NoLicenseFlag: 2408d0acc87a41d9aa25fe87eb096efa62afacd1f865lgao PrintErrorMsg(ERROR_HEADER_CHECK_FILE, 'File header comment should have the License immediately after the ""Copyright"" line', FileTable, ID) 240930fdf1140b8d1ce93f3821d986fa165552023440lgao 241030fdf1140b8d1ce93f3821d986fa165552023440lgaodef CheckFuncHeaderDoxygenComments(FullFileName): 241130fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList = [] 241252302d4dee589a5df43a464420c9fe68ba83937dlgao 241330fdf1140b8d1ce93f3821d986fa165552023440lgao FileID = GetTableID(FullFileName, ErrorMsgList) 241430fdf1140b8d1ce93f3821d986fa165552023440lgao if FileID < 0: 241530fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 241652302d4dee589a5df43a464420c9fe68ba83937dlgao 241730fdf1140b8d1ce93f3821d986fa165552023440lgao Db = GetDB() 241830fdf1140b8d1ce93f3821d986fa165552023440lgao FileTable = 'Identifier' + str(FileID) 241930fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Value, StartLine, EndLine, ID 242030fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 242130fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d 242230fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_COMMENT) 242352302d4dee589a5df43a464420c9fe68ba83937dlgao 242430fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 242530fdf1140b8d1ce93f3821d986fa165552023440lgao CommentSet = [] 242630fdf1140b8d1ce93f3821d986fa165552023440lgao try: 242730fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 242830fdf1140b8d1ce93f3821d986fa165552023440lgao CommentSet.append(Result) 242930fdf1140b8d1ce93f3821d986fa165552023440lgao except: 243030fdf1140b8d1ce93f3821d986fa165552023440lgao print 'Unrecognized chars in comment of file %s', FullFileName 243152302d4dee589a5df43a464420c9fe68ba83937dlgao 243230fdf1140b8d1ce93f3821d986fa165552023440lgao # Func Decl check 243330fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, Name, StartLine, ID, Value 243430fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 243530fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d 243630fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_FUNCTION_DECLARATION) 243730fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 243830fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 243930fdf1140b8d1ce93f3821d986fa165552023440lgao FuncName = Result[4] 244030fdf1140b8d1ce93f3821d986fa165552023440lgao FunctionHeaderComment = CheckCommentImmediatelyPrecedeFunctionHeader(Result[1], Result[2], CommentSet) 244130fdf1140b8d1ce93f3821d986fa165552023440lgao if FunctionHeaderComment: 244230fdf1140b8d1ce93f3821d986fa165552023440lgao CheckFunctionHeaderConsistentWithDoxygenComment(Result[0], Result[1], Result[2], FunctionHeaderComment[0], FunctionHeaderComment[1], ErrorMsgList, FunctionHeaderComment[3], FileTable) 244330fdf1140b8d1ce93f3821d986fa165552023440lgao else: 244430fdf1140b8d1ce93f3821d986fa165552023440lgao if EccGlobalData.gException.IsException(ERROR_HEADER_CHECK_FUNCTION, FuncName): 244530fdf1140b8d1ce93f3821d986fa165552023440lgao continue 244630fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList.append('Line %d :Function %s has NO comment immediately preceding it.' % (Result[2], Result[1])) 244730fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_HEADER_CHECK_FUNCTION, 'Function [%s] has NO comment immediately preceding it.' % (FuncName), FileTable, Result[3]) 244852302d4dee589a5df43a464420c9fe68ba83937dlgao 244930fdf1140b8d1ce93f3821d986fa165552023440lgao # Func Def check 245030fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Value, StartLine, EndLine, ID 245130fdf1140b8d1ce93f3821d986fa165552023440lgao from %s 245230fdf1140b8d1ce93f3821d986fa165552023440lgao where Model = %d 245330fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileTable, DataClass.MODEL_IDENTIFIER_FUNCTION_HEADER) 245452302d4dee589a5df43a464420c9fe68ba83937dlgao 245530fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 245630fdf1140b8d1ce93f3821d986fa165552023440lgao CommentSet = [] 245730fdf1140b8d1ce93f3821d986fa165552023440lgao try: 245830fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 245930fdf1140b8d1ce93f3821d986fa165552023440lgao CommentSet.append(Result) 246030fdf1140b8d1ce93f3821d986fa165552023440lgao except: 246130fdf1140b8d1ce93f3821d986fa165552023440lgao print 'Unrecognized chars in comment of file %s', FullFileName 246252302d4dee589a5df43a464420c9fe68ba83937dlgao 246330fdf1140b8d1ce93f3821d986fa165552023440lgao SqlStatement = """ select Modifier, Header, StartLine, ID, Name 246430fdf1140b8d1ce93f3821d986fa165552023440lgao from Function 246530fdf1140b8d1ce93f3821d986fa165552023440lgao where BelongsToFile = %d 246630fdf1140b8d1ce93f3821d986fa165552023440lgao """ % (FileID) 246730fdf1140b8d1ce93f3821d986fa165552023440lgao ResultSet = Db.TblFile.Exec(SqlStatement) 246830fdf1140b8d1ce93f3821d986fa165552023440lgao for Result in ResultSet: 246930fdf1140b8d1ce93f3821d986fa165552023440lgao FuncName = Result[4] 247030fdf1140b8d1ce93f3821d986fa165552023440lgao FunctionHeaderComment = CheckCommentImmediatelyPrecedeFunctionHeader(Result[1], Result[2], CommentSet) 247130fdf1140b8d1ce93f3821d986fa165552023440lgao if FunctionHeaderComment: 247230fdf1140b8d1ce93f3821d986fa165552023440lgao CheckFunctionHeaderConsistentWithDoxygenComment(Result[0], Result[1], Result[2], FunctionHeaderComment[0], FunctionHeaderComment[1], ErrorMsgList, FunctionHeaderComment[3], FileTable) 247330fdf1140b8d1ce93f3821d986fa165552023440lgao else: 247430fdf1140b8d1ce93f3821d986fa165552023440lgao if EccGlobalData.gException.IsException(ERROR_HEADER_CHECK_FUNCTION, FuncName): 247530fdf1140b8d1ce93f3821d986fa165552023440lgao continue 247630fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList.append('Line %d :Function [%s] has NO comment immediately preceding it.' % (Result[2], Result[1])) 247730fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_HEADER_CHECK_FUNCTION, 'Function [%s] has NO comment immediately preceding it.' % (FuncName), 'Function', Result[3]) 247830fdf1140b8d1ce93f3821d986fa165552023440lgao return ErrorMsgList 247930fdf1140b8d1ce93f3821d986fa165552023440lgao 248030fdf1140b8d1ce93f3821d986fa165552023440lgaodef CheckCommentImmediatelyPrecedeFunctionHeader(FuncName, FuncStartLine, CommentSet): 248130fdf1140b8d1ce93f3821d986fa165552023440lgao 248230fdf1140b8d1ce93f3821d986fa165552023440lgao for Comment in CommentSet: 248330fdf1140b8d1ce93f3821d986fa165552023440lgao if Comment[2] == FuncStartLine - 1: 248430fdf1140b8d1ce93f3821d986fa165552023440lgao return Comment 248530fdf1140b8d1ce93f3821d986fa165552023440lgao return None 248630fdf1140b8d1ce93f3821d986fa165552023440lgao 248730fdf1140b8d1ce93f3821d986fa165552023440lgaodef GetDoxygenStrFromComment(Str): 248830fdf1140b8d1ce93f3821d986fa165552023440lgao DoxygenStrList = [] 248930fdf1140b8d1ce93f3821d986fa165552023440lgao ParamTagList = Str.split('@param') 249030fdf1140b8d1ce93f3821d986fa165552023440lgao if len(ParamTagList) > 1: 249130fdf1140b8d1ce93f3821d986fa165552023440lgao i = 1 249230fdf1140b8d1ce93f3821d986fa165552023440lgao while i < len(ParamTagList): 249330fdf1140b8d1ce93f3821d986fa165552023440lgao DoxygenStrList.append('@param' + ParamTagList[i]) 249430fdf1140b8d1ce93f3821d986fa165552023440lgao i += 1 249552302d4dee589a5df43a464420c9fe68ba83937dlgao 249630fdf1140b8d1ce93f3821d986fa165552023440lgao Str = ParamTagList[0] 249752302d4dee589a5df43a464420c9fe68ba83937dlgao 249830fdf1140b8d1ce93f3821d986fa165552023440lgao RetvalTagList = ParamTagList[-1].split('@retval') 249930fdf1140b8d1ce93f3821d986fa165552023440lgao if len(RetvalTagList) > 1: 250030fdf1140b8d1ce93f3821d986fa165552023440lgao if len(ParamTagList) > 1: 250130fdf1140b8d1ce93f3821d986fa165552023440lgao DoxygenStrList[-1] = '@param' + RetvalTagList[0] 250230fdf1140b8d1ce93f3821d986fa165552023440lgao i = 1 250330fdf1140b8d1ce93f3821d986fa165552023440lgao while i < len(RetvalTagList): 250430fdf1140b8d1ce93f3821d986fa165552023440lgao DoxygenStrList.append('@retval' + RetvalTagList[i]) 250530fdf1140b8d1ce93f3821d986fa165552023440lgao i += 1 250652302d4dee589a5df43a464420c9fe68ba83937dlgao 250730fdf1140b8d1ce93f3821d986fa165552023440lgao ReturnTagList = RetvalTagList[-1].split('@return') 250830fdf1140b8d1ce93f3821d986fa165552023440lgao if len(ReturnTagList) > 1: 250930fdf1140b8d1ce93f3821d986fa165552023440lgao if len(RetvalTagList) > 1: 251030fdf1140b8d1ce93f3821d986fa165552023440lgao DoxygenStrList[-1] = '@retval' + ReturnTagList[0] 251130fdf1140b8d1ce93f3821d986fa165552023440lgao elif len(ParamTagList) > 1: 251230fdf1140b8d1ce93f3821d986fa165552023440lgao DoxygenStrList[-1] = '@param' + ReturnTagList[0] 251330fdf1140b8d1ce93f3821d986fa165552023440lgao i = 1 251430fdf1140b8d1ce93f3821d986fa165552023440lgao while i < len(ReturnTagList): 251530fdf1140b8d1ce93f3821d986fa165552023440lgao DoxygenStrList.append('@return' + ReturnTagList[i]) 251630fdf1140b8d1ce93f3821d986fa165552023440lgao i += 1 251752302d4dee589a5df43a464420c9fe68ba83937dlgao 251830fdf1140b8d1ce93f3821d986fa165552023440lgao if len(DoxygenStrList) > 0: 251930fdf1140b8d1ce93f3821d986fa165552023440lgao DoxygenStrList[-1] = DoxygenStrList[-1].rstrip('--*/') 252052302d4dee589a5df43a464420c9fe68ba83937dlgao 252130fdf1140b8d1ce93f3821d986fa165552023440lgao return DoxygenStrList 252252302d4dee589a5df43a464420c9fe68ba83937dlgao 252379b74a03e018ecbf03d8d50e6f20301e249c1ba5lgaodef CheckGeneralDoxygenCommentLayout(Str, StartLine, ErrorMsgList, CommentId= -1, TableName=''): 252430fdf1140b8d1ce93f3821d986fa165552023440lgao #/** --*/ @retval after @param 252530fdf1140b8d1ce93f3821d986fa165552023440lgao if not Str.startswith('/**'): 252630fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList.append('Line %d : Comment does NOT have prefix /** ' % StartLine) 252730fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DOXYGEN_CHECK_FUNCTION_HEADER, 'Comment does NOT have prefix /** ', TableName, CommentId) 252830fdf1140b8d1ce93f3821d986fa165552023440lgao if not Str.endswith('**/'): 252930fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList.append('Line %d : Comment does NOT have tail **/ ' % StartLine) 253030fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DOXYGEN_CHECK_FUNCTION_HEADER, 'Comment does NOT have tail **/ ', TableName, CommentId) 253130fdf1140b8d1ce93f3821d986fa165552023440lgao FirstRetvalIndex = Str.find('@retval') 253230fdf1140b8d1ce93f3821d986fa165552023440lgao LastParamIndex = Str.rfind('@param') 253330fdf1140b8d1ce93f3821d986fa165552023440lgao if (FirstRetvalIndex > 0) and (LastParamIndex > 0) and (FirstRetvalIndex < LastParamIndex): 253430fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList.append('Line %d : @retval appear before @param ' % StartLine) 253530fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DOXYGEN_CHECK_FUNCTION_HEADER, 'in Comment, @retval appear before @param ', TableName, CommentId) 253652302d4dee589a5df43a464420c9fe68ba83937dlgao 253779b74a03e018ecbf03d8d50e6f20301e249c1ba5lgaodef CheckFunctionHeaderConsistentWithDoxygenComment(FuncModifier, FuncHeader, FuncStartLine, CommentStr, CommentStartLine, ErrorMsgList, CommentId= -1, TableName=''): 253852302d4dee589a5df43a464420c9fe68ba83937dlgao 253952302d4dee589a5df43a464420c9fe68ba83937dlgao ParamList = GetParamList(FuncHeader) 254030fdf1140b8d1ce93f3821d986fa165552023440lgao CheckGeneralDoxygenCommentLayout(CommentStr, CommentStartLine, ErrorMsgList, CommentId, TableName) 254130fdf1140b8d1ce93f3821d986fa165552023440lgao DescriptionStr = CommentStr 254230fdf1140b8d1ce93f3821d986fa165552023440lgao DoxygenStrList = GetDoxygenStrFromComment(DescriptionStr) 254330fdf1140b8d1ce93f3821d986fa165552023440lgao if DescriptionStr.find('.') == -1: 254430fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DOXYGEN_CHECK_COMMENT_DESCRIPTION, 'Comment description should end with period \'.\'', TableName, CommentId) 254530fdf1140b8d1ce93f3821d986fa165552023440lgao DoxygenTagNumber = len(DoxygenStrList) 254630fdf1140b8d1ce93f3821d986fa165552023440lgao ParamNumber = len(ParamList) 254730fdf1140b8d1ce93f3821d986fa165552023440lgao for Param in ParamList: 254830fdf1140b8d1ce93f3821d986fa165552023440lgao if Param.Name.upper() == 'VOID' and ParamNumber == 1: 254930fdf1140b8d1ce93f3821d986fa165552023440lgao ParamNumber -= 1 255030fdf1140b8d1ce93f3821d986fa165552023440lgao Index = 0 255130fdf1140b8d1ce93f3821d986fa165552023440lgao if ParamNumber > 0 and DoxygenTagNumber > 0: 255230fdf1140b8d1ce93f3821d986fa165552023440lgao while Index < ParamNumber and Index < DoxygenTagNumber: 255330fdf1140b8d1ce93f3821d986fa165552023440lgao ParamModifier = ParamList[Index].Modifier 255430fdf1140b8d1ce93f3821d986fa165552023440lgao ParamName = ParamList[Index].Name.strip() 255530fdf1140b8d1ce93f3821d986fa165552023440lgao Tag = DoxygenStrList[Index].strip(' ') 255630fdf1140b8d1ce93f3821d986fa165552023440lgao if (not Tag[-1] == ('\n')) and (not Tag[-1] == ('\r')): 255779b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao ErrorMsgList.append('Line %d : in Comment, <%s> does NOT end with new line ' % (CommentStartLine, Tag.replace('\n', '').replace('\r', ''))) 255879b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao PrintErrorMsg(ERROR_HEADER_CHECK_FUNCTION, 'in Comment, <%s> does NOT end with new line ' % (Tag.replace('\n', '').replace('\r', '')), TableName, CommentId) 255930fdf1140b8d1ce93f3821d986fa165552023440lgao TagPartList = Tag.split() 256030fdf1140b8d1ce93f3821d986fa165552023440lgao if len(TagPartList) < 2: 256179b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao ErrorMsgList.append('Line %d : in Comment, <%s> does NOT contain doxygen contents ' % (CommentStartLine, Tag.replace('\n', '').replace('\r', ''))) 256279b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao PrintErrorMsg(ERROR_DOXYGEN_CHECK_FUNCTION_HEADER, 'in Comment, <%s> does NOT contain doxygen contents ' % (Tag.replace('\n', '').replace('\r', '')), TableName, CommentId) 256330fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 256430fdf1140b8d1ce93f3821d986fa165552023440lgao continue 256530fdf1140b8d1ce93f3821d986fa165552023440lgao LBPos = Tag.find('[') 256630fdf1140b8d1ce93f3821d986fa165552023440lgao RBPos = Tag.find(']') 256730fdf1140b8d1ce93f3821d986fa165552023440lgao ParamToLBContent = Tag[len('@param'):LBPos].strip() 256879b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao if LBPos > 0 and len(ParamToLBContent) == 0 and RBPos > LBPos: 256930fdf1140b8d1ce93f3821d986fa165552023440lgao InOutStr = '' 257030fdf1140b8d1ce93f3821d986fa165552023440lgao ModifierPartList = ParamModifier.split() 257130fdf1140b8d1ce93f3821d986fa165552023440lgao for Part in ModifierPartList: 257230fdf1140b8d1ce93f3821d986fa165552023440lgao if Part.strip() == 'IN': 257330fdf1140b8d1ce93f3821d986fa165552023440lgao InOutStr += 'in' 257430fdf1140b8d1ce93f3821d986fa165552023440lgao if Part.strip() == 'OUT': 257552302d4dee589a5df43a464420c9fe68ba83937dlgao if InOutStr != '': 257630fdf1140b8d1ce93f3821d986fa165552023440lgao InOutStr += ', out' 257730fdf1140b8d1ce93f3821d986fa165552023440lgao else: 257830fdf1140b8d1ce93f3821d986fa165552023440lgao InOutStr = 'out' 257952302d4dee589a5df43a464420c9fe68ba83937dlgao 258030fdf1140b8d1ce93f3821d986fa165552023440lgao if InOutStr != '': 258179b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao if Tag.find('[' + InOutStr + ']') == -1: 258279b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao if InOutStr != 'in, out': 258379b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao ErrorMsgList.append('Line %d : in Comment, <%s> does NOT have %s ' % (CommentStartLine, (TagPartList[0] + ' ' + TagPartList[1]).replace('\n', '').replace('\r', ''), '[' + InOutStr + ']')) 258479b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao PrintErrorMsg(ERROR_DOXYGEN_CHECK_FUNCTION_HEADER, 'in Comment, <%s> does NOT have %s ' % ((TagPartList[0] + ' ' + TagPartList[1]).replace('\n', '').replace('\r', ''), '[' + InOutStr + ']'), TableName, CommentId) 258579b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao else: 258679b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao if Tag.find('[in,out]') == -1: 258779b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao ErrorMsgList.append('Line %d : in Comment, <%s> does NOT have %s ' % (CommentStartLine, (TagPartList[0] + ' ' + TagPartList[1]).replace('\n', '').replace('\r', ''), '[' + InOutStr + ']')) 258879b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao PrintErrorMsg(ERROR_DOXYGEN_CHECK_FUNCTION_HEADER, 'in Comment, <%s> does NOT have %s ' % ((TagPartList[0] + ' ' + TagPartList[1]).replace('\n', '').replace('\r', ''), '[' + InOutStr + ']'), TableName, CommentId) 258979b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao 259079b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao 259130fdf1140b8d1ce93f3821d986fa165552023440lgao if Tag.find(ParamName) == -1 and ParamName != 'VOID' and ParamName != 'void': 259279b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao ErrorMsgList.append('Line %d : in Comment, <%s> does NOT consistent with parameter name %s ' % (CommentStartLine, (TagPartList[0] + ' ' + TagPartList[1]).replace('\n', '').replace('\r', ''), ParamName)) 259379b74a03e018ecbf03d8d50e6f20301e249c1ba5lgao 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) 259430fdf1140b8d1ce93f3821d986fa165552023440lgao Index += 1 259552302d4dee589a5df43a464420c9fe68ba83937dlgao 259630fdf1140b8d1ce93f3821d986fa165552023440lgao if Index < ParamNumber: 259730fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList.append('Line %d : Number of doxygen tags in comment less than number of function parameters' % CommentStartLine) 259830fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DOXYGEN_CHECK_FUNCTION_HEADER, 'Number of doxygen tags in comment less than number of function parameters ', TableName, CommentId) 259930fdf1140b8d1ce93f3821d986fa165552023440lgao # VOID return type, NOT VOID*. VOID* should be matched with a doxygen tag. 260030fdf1140b8d1ce93f3821d986fa165552023440lgao if (FuncModifier.find('VOID') != -1 or FuncModifier.find('void') != -1) and FuncModifier.find('*') == -1: 260152302d4dee589a5df43a464420c9fe68ba83937dlgao 260230fdf1140b8d1ce93f3821d986fa165552023440lgao # assume we allow a return description tag for void func. return. that's why 'DoxygenTagNumber - 1' is used instead of 'DoxygenTagNumber' 260330fdf1140b8d1ce93f3821d986fa165552023440lgao if Index < DoxygenTagNumber - 1 or (Index < DoxygenTagNumber and DoxygenStrList[Index].startswith('@retval')): 260430fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList.append('Line %d : VOID return type need NO doxygen tags in comment' % CommentStartLine) 260530fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DOXYGEN_CHECK_FUNCTION_HEADER, 'VOID return type need no doxygen tags in comment ', TableName, CommentId) 260630fdf1140b8d1ce93f3821d986fa165552023440lgao else: 260752302d4dee589a5df43a464420c9fe68ba83937dlgao if Index < DoxygenTagNumber and not DoxygenStrList[Index].startswith('@retval') and not DoxygenStrList[Index].startswith('@return'): 260830fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList.append('Line %d : Number of @param doxygen tags in comment does NOT match number of function parameters' % CommentStartLine) 260930fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DOXYGEN_CHECK_FUNCTION_HEADER, 'Number of @param doxygen tags in comment does NOT match number of function parameters ', TableName, CommentId) 261030fdf1140b8d1ce93f3821d986fa165552023440lgao else: 261130fdf1140b8d1ce93f3821d986fa165552023440lgao if ParamNumber == 0 and DoxygenTagNumber != 0 and ((FuncModifier.find('VOID') != -1 or FuncModifier.find('void') != -1) and FuncModifier.find('*') == -1): 261230fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList.append('Line %d : VOID return type need NO doxygen tags in comment' % CommentStartLine) 261330fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DOXYGEN_CHECK_FUNCTION_HEADER, 'VOID return type need NO doxygen tags in comment ', TableName, CommentId) 261430fdf1140b8d1ce93f3821d986fa165552023440lgao if ParamNumber != 0 and DoxygenTagNumber == 0: 261530fdf1140b8d1ce93f3821d986fa165552023440lgao ErrorMsgList.append('Line %d : No doxygen tags in comment' % CommentStartLine) 261630fdf1140b8d1ce93f3821d986fa165552023440lgao PrintErrorMsg(ERROR_DOXYGEN_CHECK_FUNCTION_HEADER, 'No doxygen tags in comment ', TableName, CommentId) 261730fdf1140b8d1ce93f3821d986fa165552023440lgao 261830fdf1140b8d1ce93f3821d986fa165552023440lgaoif __name__ == '__main__': 261930fdf1140b8d1ce93f3821d986fa165552023440lgao 262030fdf1140b8d1ce93f3821d986fa165552023440lgao# EdkLogger.Initialize() 262130fdf1140b8d1ce93f3821d986fa165552023440lgao# EdkLogger.SetLevel(EdkLogger.QUIET) 262252302d4dee589a5df43a464420c9fe68ba83937dlgao# CollectSourceCodeDataIntoDB(sys.argv[1]) 2623b36d134faf4305247830522b8e2bb255e98c5699lgao try: 2624b36d134faf4305247830522b8e2bb255e98c5699lgao test_file = sys.argv[1] 2625b36d134faf4305247830522b8e2bb255e98c5699lgao except IndexError, v: 2626b36d134faf4305247830522b8e2bb255e98c5699lgao print "Usage: %s filename" % sys.argv[0] 2627b36d134faf4305247830522b8e2bb255e98c5699lgao sys.exit(1) 2628b36d134faf4305247830522b8e2bb255e98c5699lgao MsgList = CheckFuncHeaderDoxygenComments(test_file) 262930fdf1140b8d1ce93f3821d986fa165552023440lgao for Msg in MsgList: 263030fdf1140b8d1ce93f3821d986fa165552023440lgao print Msg 263130fdf1140b8d1ce93f3821d986fa165552023440lgao print 'Done!' 2632