4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# This file is used to define common parser functions for meta-data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Copyright (c) 2008, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## Get the inlcude path list for a source file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# 1. Find the source file belongs to which inf file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# 2. Find the inf's package
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# 3. Return the include path list of the package
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync select Value1, FullPath from Inf, File where Inf.Model = %s and Inf.BelongsToFile in(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync select distinct B.BelongsToFile from File as A left join Inf as B
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync where A.ID = B.BelongsToFile and B.Model = %s and (A.Path || '%s' || B.Value1) = '%s')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and Inf.BelongsToFile = File.ID""" \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync % (MODEL_META_DATA_PACKAGE, MODEL_EFI_SOURCE_FILE, '\\', Filepath)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DecFullPath = os.path.normpath(os.path.join(WorkSpace, Record[0]))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InfFullPath = os.path.normpath(os.path.join(WorkSpace, Record[1]))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SqlCommand = """select Value1 from Dec where BelongsToFile =
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (select ID from File where FullPath = '%s') and Model = %s""" \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IncludePath = os.path.normpath(os.path.join(DecPath, NewRecord[0]))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## Get the file list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Search table file and find all specific type files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SqlCommand = """select FullPath from File where Model = %s""" % str(FileModel)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## Get the table list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Search table file and find all small tables
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SqlCommand = """select ID from File where Model in %s""" % str(FileModelList)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## ParseHeaderCommentSection
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Parse Header comment section lines, extract Abstract, Description, Copyright
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# , License lines
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param CommentList: List of (Comment, LineNumber)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param FileName: FileName of the comment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef ParseHeaderCommentSection(CommentList, FileName = None):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # used to indicate the state of processing header comment section of dec,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # inf files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # first find the last copyright line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SqlStatement = """ select ID from File where FullPath like '%s'""" % FileName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ResultSet = EccGlobalData.gDb.TblFile.Exec(SqlStatement)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EccGlobalData.gDb.TblReport.Insert(ERROR_DOXYGEN_CHECK_FILE_HEADER, Msg, "File", Result[0])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # if there are blank lines between License or Description, keep them as they would be
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # indication of different block; or in the position that Abstract should be, also keep it
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # as it indicates that no abstract
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not Comment and HeaderCommentStage not in [HEADER_COMMENT_LICENSE, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HEADER_COMMENT_DESCRIPTION, HEADER_COMMENT_ABSTRACT]:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if HeaderCommentStage == HEADER_COMMENT_NOT_STARTED:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # in case there is no abstract and description
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif HeaderCommentStage == HEADER_COMMENT_DESCRIPTION:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # in case there is no description
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif HeaderCommentStage == HEADER_COMMENT_COPYRIGHT:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Contents after copyright line are license, those non-copyright lines in between
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # copyright line will be discarded
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SqlStatement = """ select ID from File where FullPath like '%s'""" % FileName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ResultSet = EccGlobalData.gDb.TblFile.Exec(SqlStatement)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Msg = 'Header comment section must have copyright information'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EccGlobalData.gDb.TblReport.Insert(ERROR_DOXYGEN_CHECK_FILE_HEADER, Msg, "File", Result[0])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SqlStatement = """ select ID from File where FullPath like '%s'""" % FileName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ResultSet = EccGlobalData.gDb.TblFile.Exec(SqlStatement)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Msg = 'Header comment section must have license information'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EccGlobalData.gDb.TblReport.Insert(ERROR_DOXYGEN_CHECK_FILE_HEADER, Msg, "File", Result[0])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Abstract.strip(), Description.strip(), Copyright.strip(), License.strip()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## _IsCopyrightLine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# check whether current line is copyright line, the criteria is whether there is case insensitive keyword "Copyright"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# followed by zero or more white space characters followed by a "(" character
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param LineContent: the line need to be checked
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @return: True if current line is copyright line, False else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ReIsCopyrightRe = re.compile(r"""(^|\s)COPYRIGHT *\(""", re.DOTALL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## CleanString2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Split comments in a string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Remove spaces
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param Line: The string to be cleaned
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param CommentCharacter: Comment char, used to ignore comment content,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# default is DataType.TAB_COMMENT_SPLIT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef CleanString2(Line, CommentCharacter='#', AllowCppStyleComment=False):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # remove whitespace
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Replace EDK1's comment character
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # separate comments and statements
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # remove whitespace again
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Remove prefixed and trailing comment characters
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while Start < End and Comment.startswith(CommentCharacter, Start, End):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while End >= 0 and Comment.endswith(CommentCharacter, Start, End):