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