4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# This file is used to define common parser functions for meta-data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
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# http://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
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#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncimport os
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom CommonDataClass.DataClass import *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom EccToolError import *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncimport EccGlobalData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncimport re
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## Get the inlcude path list for a source file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
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#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GetIncludeListOfFile(WorkSpace, Filepath, Db):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IncludeList = []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Filepath = os.path.normpath(Filepath)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SqlCommand = """
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 RecordSet = Db.TblFile.Exec(SqlCommand)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Record in RecordSet:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DecFullPath = os.path.normpath(os.path.join(WorkSpace, Record[0]))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InfFullPath = os.path.normpath(os.path.join(WorkSpace, Record[1]))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (DecPath, DecName) = os.path.split(DecFullPath)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (InfPath, InfName) = os.path.split(InfFullPath)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SqlCommand = """select Value1 from Dec where BelongsToFile =
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (select ID from File where FullPath = '%s') and Model = %s""" \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync % (DecFullPath, MODEL_EFI_INCLUDE)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewRecordSet = Db.TblDec.Exec(SqlCommand)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if InfPath not in IncludeList:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IncludeList.append(InfPath)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for NewRecord in NewRecordSet:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IncludePath = os.path.normpath(os.path.join(DecPath, NewRecord[0]))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if IncludePath not in IncludeList:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IncludeList.append(IncludePath)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return IncludeList
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## Get the file list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Search table file and find all specific type files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GetFileList(FileModel, Db):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileList = []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SqlCommand = """select FullPath from File where Model = %s""" % str(FileModel)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecordSet = Db.TblFile.Exec(SqlCommand)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Record in RecordSet:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileList.append(Record[0])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FileList
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## Get the table list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Search table file and find all small tables
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef GetTableList(FileModelList, Table, Db):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TableList = []
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SqlCommand = """select ID from File where Model in %s""" % str(FileModelList)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecordSet = Db.TblFile.Exec(SqlCommand)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Record in RecordSet:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TableName = Table + str(Record[0])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TableList.append(TableName)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TableList
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## ParseHeaderCommentSection
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Parse Header comment section lines, extract Abstract, Description, Copyright
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# , License lines
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param CommentList: List of (Comment, LineNumber)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param FileName: FileName of the comment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef ParseHeaderCommentSection(CommentList, FileName = None):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Abstract = ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Description = ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright = ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync License = ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EndOfLine = "\n"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STR_HEADER_COMMENT_START = "@file"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # used to indicate the state of processing header comment section of dec,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # inf files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HEADER_COMMENT_NOT_STARTED = -1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HEADER_COMMENT_STARTED = 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HEADER_COMMENT_FILE = 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HEADER_COMMENT_ABSTRACT = 2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HEADER_COMMENT_DESCRIPTION = 3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HEADER_COMMENT_COPYRIGHT = 4
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HEADER_COMMENT_LICENSE = 5
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HEADER_COMMENT_END = 6
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # first find the last copyright line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Last = 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HeaderCommentStage = HEADER_COMMENT_NOT_STARTED
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Index in xrange(len(CommentList)-1, 0, -1):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line = CommentList[Index][0]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if _IsCopyrightLine(Line):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Last = Index
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Item in CommentList:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line = Item[0]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LineNo = Item[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not Line.startswith('#') and Line:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SqlStatement = """ select ID from File where FullPath like '%s'""" % FileName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ResultSet = EccGlobalData.gDb.TblFile.Exec(SqlStatement)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Result in ResultSet:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Msg = 'Comment must start with #'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EccGlobalData.gDb.TblReport.Insert(ERROR_DOXYGEN_CHECK_FILE_HEADER, Msg, "File", Result[0])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Comment = CleanString2(Line)[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Comment = Comment.strip()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
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 #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not Comment and HeaderCommentStage not in [HEADER_COMMENT_LICENSE, \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HEADER_COMMENT_DESCRIPTION, HEADER_COMMENT_ABSTRACT]:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if HeaderCommentStage == HEADER_COMMENT_NOT_STARTED:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Comment.startswith(STR_HEADER_COMMENT_START):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HeaderCommentStage = HEADER_COMMENT_ABSTRACT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync License += Comment + EndOfLine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if HeaderCommentStage == HEADER_COMMENT_ABSTRACT:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # in case there is no abstract and description
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not Comment:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Abstract = ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HeaderCommentStage = HEADER_COMMENT_DESCRIPTION
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif _IsCopyrightLine(Comment):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright += Comment + EndOfLine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HeaderCommentStage = HEADER_COMMENT_COPYRIGHT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Abstract += Comment + EndOfLine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HeaderCommentStage = HEADER_COMMENT_DESCRIPTION
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif HeaderCommentStage == HEADER_COMMENT_DESCRIPTION:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # in case there is no description
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if _IsCopyrightLine(Comment):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright += Comment + EndOfLine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HeaderCommentStage = HEADER_COMMENT_COPYRIGHT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Description += Comment + EndOfLine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elif HeaderCommentStage == HEADER_COMMENT_COPYRIGHT:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if _IsCopyrightLine(Comment):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright += Comment + EndOfLine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Contents after copyright line are license, those non-copyright lines in between
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # copyright line will be discarded
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if LineNo > Last:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if License:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync License += EndOfLine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync License += Comment + EndOfLine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HeaderCommentStage = HEADER_COMMENT_LICENSE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not Comment and not License:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync License += Comment + EndOfLine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not Copyright:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SqlStatement = """ select ID from File where FullPath like '%s'""" % FileName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ResultSet = EccGlobalData.gDb.TblFile.Exec(SqlStatement)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Result in ResultSet:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Msg = 'Header comment section must have copyright information'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EccGlobalData.gDb.TblReport.Insert(ERROR_DOXYGEN_CHECK_FILE_HEADER, Msg, "File", Result[0])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if not License:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SqlStatement = """ select ID from File where FullPath like '%s'""" % FileName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ResultSet = EccGlobalData.gDb.TblFile.Exec(SqlStatement)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Result in ResultSet:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Msg = 'Header comment section must have license information'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EccGlobalData.gDb.TblReport.Insert(ERROR_DOXYGEN_CHECK_FILE_HEADER, Msg, "File", Result[0])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Abstract.strip(), Description.strip(), Copyright.strip(), License.strip()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param LineContent: the line need to be checked
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @return: True if current line is copyright line, False else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef _IsCopyrightLine (LineContent):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LineContent = LineContent.upper()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result = False
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ReIsCopyrightRe = re.compile(r"""(^|\s)COPYRIGHT *\(""", re.DOTALL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ReIsCopyrightRe.search(LineContent):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result = True
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Result
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## CleanString2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Split comments in a string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Remove spaces
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdef CleanString2(Line, CommentCharacter='#', AllowCppStyleComment=False):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # remove whitespace
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line = Line.strip()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Replace EDK1's comment character
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if AllowCppStyleComment:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line = Line.replace('//', CommentCharacter)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # separate comments and statements
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LineParts = Line.split(CommentCharacter, 1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # remove whitespace again
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line = LineParts[0].strip()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if len(LineParts) > 1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Comment = LineParts[1].strip()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Remove prefixed and trailing comment characters
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Start = 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync End = len(Comment)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while Start < End and Comment.startswith(CommentCharacter, Start, End):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Start += 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while End >= 0 and Comment.endswith(CommentCharacter, Start, End):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync End -= 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Comment = Comment[Start:End]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Comment = Comment.strip()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Comment = ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Line, Comment