2010-03-01 00:39:39 +01:00
## @file
# This file is used to define common parsing related functions used in parsing
# Inf/Dsc/Makefile process
#
2010-05-18 07:04:32 +02:00
# Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.<BR>
# This program and the accompanying materials
2010-03-01 00:39:39 +01:00
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
##
# Import Modules
#
import os , re
import Common . EdkLogger as EdkLogger
from Common . DataType import *
from CommonDataClass . DataClass import *
from Common . String import CleanString , GetSplitValueList , ReplaceMacro
import EotGlobalData
from Common . Misc import sdict
## PreProcess() method
#
# Pre process a file
#
# 1. Remove all comments
# 2. Merge multiple lines code to one line
#
# @param Filename: Name of the file to be parsed
# @param MergeMultipleLines: Switch for if merge multiple lines
# @param LineNo: Default line no
#
# @return Lines: The file contents after remvoing comments
#
def PreProcess ( Filename , MergeMultipleLines = True , LineNo = - 1 ) :
Lines = [ ]
Filename = os . path . normpath ( Filename )
if not os . path . isfile ( Filename ) :
EdkLogger . error ( " Eot " , EdkLogger . FILE_NOT_FOUND , ExtraData = Filename )
IsFindBlockComment = False
IsFindBlockCode = False
ReservedLine = ' '
ReservedLineLength = 0
for Line in open ( Filename , ' r ' ) :
Line = Line . strip ( )
# Remove comment block
if Line . find ( TAB_COMMENT_R8_START ) > - 1 :
ReservedLine = GetSplitValueList ( Line , TAB_COMMENT_R8_START , 1 ) [ 0 ]
IsFindBlockComment = True
if Line . find ( TAB_COMMENT_R8_END ) > - 1 :
Line = ReservedLine + GetSplitValueList ( Line , TAB_COMMENT_R8_END , 1 ) [ 1 ]
ReservedLine = ' '
IsFindBlockComment = False
if IsFindBlockComment :
Lines . append ( ' ' )
continue
# Remove comments at tail and remove spaces again
Line = CleanString ( Line )
if Line == ' ' :
Lines . append ( ' ' )
continue
if MergeMultipleLines :
# Add multiple lines to one line
if IsFindBlockCode and Line [ - 1 ] != TAB_SLASH :
ReservedLine = ( ReservedLine + TAB_SPACE_SPLIT + Line ) . strip ( )
Lines . append ( ReservedLine )
for Index in ( 0 , ReservedLineLength ) :
Lines . append ( ' ' )
ReservedLine = ' '
ReservedLineLength = 0
IsFindBlockCode = False
continue
if Line [ - 1 ] == TAB_SLASH :
ReservedLine = ReservedLine + TAB_SPACE_SPLIT + Line [ 0 : - 1 ] . strip ( )
ReservedLineLength = ReservedLineLength + 1
IsFindBlockCode = True
continue
Lines . append ( Line )
return Lines
## AddToGlobalMacro() method
#
# Add a macro to EotGlobalData.gMACRO
#
# @param Name: Name of the macro
# @param Value: Value of the macro
#
def AddToGlobalMacro ( Name , Value ) :
Value = ReplaceMacro ( Value , EotGlobalData . gMACRO , True )
EotGlobalData . gMACRO [ Name ] = Value
## AddToSelfMacro() method
#
# Parse a line of macro definition and add it to a macro set
#
# @param SelfMacro: The self macro set
# @param Line: The line of a macro definition
#
# @return Name: Name of macro
# @return Value: Value of macro
#
def AddToSelfMacro ( SelfMacro , Line ) :
Name , Value = ' ' , ' '
List = GetSplitValueList ( Line , TAB_EQUAL_SPLIT , 1 )
if len ( List ) == 2 :
Name = List [ 0 ]
Value = List [ 1 ]
Value = ReplaceMacro ( Value , EotGlobalData . gMACRO , True )
Value = ReplaceMacro ( Value , SelfMacro , True )
SelfMacro [ Name ] = Value
return ( Name , Value )
## GetIncludeListOfFile() method
#
# Get the include path list for a source file
#
# 1. Find the source file belongs to which INF file
# 2. Find the inf's package
# 3. Return the include path list of the package
#
# @param WorkSpace: WORKSPACE path
# @param Filepath: File path
# @param Db: Eot database
#
# @return IncludeList: A list of include directories
#
def GetIncludeListOfFile ( WorkSpace , Filepath , Db ) :
IncludeList = [ ]
Filepath = os . path . normpath ( Filepath )
SqlCommand = """
select Value1 from Inf where Model = % s and BelongsToFile in (
select distinct B . BelongsToFile from File as A left join Inf as B
where A . ID = B . BelongsToFile and B . Model = % s and ( A . Path | | ' %s ' | | B . Value1 ) = ' %s ' ) """ \
% ( MODEL_META_DATA_PACKAGE , MODEL_EFI_SOURCE_FILE , ' \\ ' , Filepath )
RecordSet = Db . TblFile . Exec ( SqlCommand )
for Record in RecordSet :
DecFullPath = os . path . normpath ( os . path . join ( WorkSpace , Record [ 0 ] ) )
( DecPath , DecName ) = os . path . split ( DecFullPath )
SqlCommand = """ select Value1 from Dec where BelongsToFile =
( select ID from File where FullPath = ' %s ' ) and Model = % s """ \
% ( DecFullPath , MODEL_EFI_INCLUDE )
NewRecordSet = Db . TblDec . Exec ( SqlCommand )
for NewRecord in NewRecordSet :
IncludePath = os . path . normpath ( os . path . join ( DecPath , NewRecord [ 0 ] ) )
if IncludePath not in IncludeList :
IncludeList . append ( IncludePath )
return IncludeList
## GetTableList() method
#
# Search table file and find all small tables
#
# @param FileModelList: Model code for the file list
# @param Table: Table to insert records
# @param Db: Eot database
#
# @return TableList: A list of tables
#
def GetTableList ( FileModelList , Table , Db ) :
TableList = [ ]
SqlCommand = """ select ID, FullPath from File where Model in %s """ % str ( FileModelList )
RecordSet = Db . TblFile . Exec ( SqlCommand )
for Record in RecordSet :
TableName = Table + str ( Record [ 0 ] )
TableList . append ( [ TableName , Record [ 1 ] ] )
return TableList
## GetAllIncludeDir() method
#
# Find all Include directories
#
# @param Db: Eot database
#
# @return IncludeList: A list of include directories
#
def GetAllIncludeDirs ( Db ) :
IncludeList = [ ]
SqlCommand = """ select distinct Value1 from Inf where Model = %s order by Value1 """ % MODEL_EFI_INCLUDE
RecordSet = Db . TblInf . Exec ( SqlCommand )
for Record in RecordSet :
IncludeList . append ( Record [ 0 ] )
return IncludeList
## GetAllIncludeFiles() method
#
# Find all Include files
#
# @param Db: Eot database
#
# @return IncludeFileList: A list of include files
#
def GetAllIncludeFiles ( Db ) :
IncludeList = GetAllIncludeDirs ( Db )
IncludeFileList = [ ]
for Dir in IncludeList :
if os . path . isdir ( Dir ) :
SubDir = os . listdir ( Dir )
for Item in SubDir :
if os . path . isfile ( Item ) :
IncludeFileList . append ( Item )
return IncludeFileList
## GetAllSourceFiles() method
#
# Find all source files
#
# @param Db: Eot database
#
# @return SourceFileList: A list of source files
#
def GetAllSourceFiles ( Db ) :
SourceFileList = [ ]
SqlCommand = """ select distinct Value1 from Inf where Model = %s order by Value1 """ % MODEL_EFI_SOURCE_FILE
RecordSet = Db . TblInf . Exec ( SqlCommand )
for Record in RecordSet :
SourceFileList . append ( Record [ 0 ] )
return SourceFileList
## GetAllFiles() method
#
# Find all files, both source files and include files
#
# @param Db: Eot database
#
# @return FileList: A list of files
#
def GetAllFiles ( Db ) :
FileList = [ ]
IncludeFileList = GetAllIncludeFiles ( Db )
SourceFileList = GetAllSourceFiles ( Db )
for Item in IncludeFileList :
if os . path . isfile ( Item ) and Item not in FileList :
FileList . append ( Item )
for Item in SourceFileList :
if os . path . isfile ( Item ) and Item not in FileList :
FileList . append ( Item )
return FileList
## ParseConditionalStatement() method
#
# Parse conditional statement
#
# @param Line: One line to be parsed
# @param Macros: A set of all macro
# @param StatusSet: A set of all status
#
# @retval True: Find keyword of conditional statement
# @retval False: Not find keyword of conditional statement
#
def ParseConditionalStatement ( Line , Macros , StatusSet ) :
NewLine = Line . upper ( )
if NewLine . find ( TAB_IF_EXIST . upper ( ) ) > - 1 :
IfLine = Line [ NewLine . find ( TAB_IF_EXIST ) + len ( TAB_IF_EXIST ) + 1 : ] . strip ( )
IfLine = ReplaceMacro ( IfLine , EotGlobalData . gMACRO , True )
IfLine = ReplaceMacro ( IfLine , Macros , True )
IfLine = IfLine . replace ( " \" " , ' ' )
IfLine = IfLine . replace ( " ( " , ' ' )
IfLine = IfLine . replace ( " ) " , ' ' )
Status = os . path . exists ( os . path . normpath ( IfLine ) )
StatusSet . append ( [ Status ] )
return True
if NewLine . find ( TAB_IF_DEF . upper ( ) ) > - 1 :
IfLine = Line [ NewLine . find ( TAB_IF_DEF ) + len ( TAB_IF_DEF ) + 1 : ] . strip ( )
Status = False
if IfLine in Macros or IfLine in EotGlobalData . gMACRO :
Status = True
StatusSet . append ( [ Status ] )
return True
if NewLine . find ( TAB_IF_N_DEF . upper ( ) ) > - 1 :
IfLine = Line [ NewLine . find ( TAB_IF_N_DEF ) + len ( TAB_IF_N_DEF ) + 1 : ] . strip ( )
Status = False
if IfLine not in Macros and IfLine not in EotGlobalData . gMACRO :
Status = True
StatusSet . append ( [ Status ] )
return True
if NewLine . find ( TAB_IF . upper ( ) ) > - 1 :
IfLine = Line [ NewLine . find ( TAB_IF ) + len ( TAB_IF ) + 1 : ] . strip ( )
Status = ParseConditionalStatementMacros ( IfLine , Macros )
StatusSet . append ( [ Status ] )
return True
if NewLine . find ( TAB_ELSE_IF . upper ( ) ) > - 1 :
IfLine = Line [ NewLine . find ( TAB_ELSE_IF ) + len ( TAB_ELSE_IF ) + 1 : ] . strip ( )
Status = ParseConditionalStatementMacros ( IfLine , Macros )
StatusSet [ - 1 ] . append ( Status )
return True
if NewLine . find ( TAB_ELSE . upper ( ) ) > - 1 :
Status = False
for Item in StatusSet [ - 1 ] :
Status = Status or Item
StatusSet [ - 1 ] . append ( not Status )
return True
if NewLine . find ( TAB_END_IF . upper ( ) ) > - 1 :
StatusSet . pop ( )
return True
return False
## ParseConditionalStatement() method
#
# Parse conditional statement with Macros
#
# @param Line: One line to be parsed
# @param Macros: A set of macros
#
# @return Line: New line after replacing macros
#
def ParseConditionalStatementMacros ( Line , Macros ) :
if Line . upper ( ) . find ( ' DEFINED( ' ) > - 1 or Line . upper ( ) . find ( ' EXIST ' ) > - 1 :
return False
Line = ReplaceMacro ( Line , EotGlobalData . gMACRO , True )
Line = ReplaceMacro ( Line , Macros , True )
Line = Line . replace ( " && " , " and " )
Line = Line . replace ( " || " , " or " )
return eval ( Line )
## GetConditionalStatementStatus() method
#
# 1. Assume the latest status as True
# 2. Pop the top status of status set, previous status
# 3. Compare the latest one and the previous one and get new status
#
# @param StatusSet: A set of all status
#
# @return Status: The final status
#
def GetConditionalStatementStatus ( StatusSet ) :
Status = True
for Item in StatusSet :
Status = Status and Item [ - 1 ]
return Status
## SearchBelongsToFunction() method
#
# Search all functions belong to the file
#
# @param BelongsToFile: File id
# @param StartLine: Start line of search scope
# @param EndLine: End line of search scope
#
# @return: The found function
#
def SearchBelongsToFunction ( BelongsToFile , StartLine , EndLine ) :
SqlCommand = """ select ID, Name from Function where BelongsToFile = %s and StartLine <= %s and EndLine >= %s """ % ( BelongsToFile , StartLine , EndLine )
RecordSet = EotGlobalData . gDb . TblFunction . Exec ( SqlCommand )
if RecordSet != [ ] :
return RecordSet [ 0 ] [ 0 ] , RecordSet [ 0 ] [ 1 ]
else :
return - 1 , ' '
## SearchPpiCallFunction() method
#
# Search all used PPI calling function 'PeiServicesReInstallPpi' and 'PeiServicesInstallPpi'
# Store the result to database
#
# @param Identifier: Table id
# @param SourceFileID: Source file id
# @param SourceFileFullPath: Source file full path
# @param ItemMode: Mode of the item
#
def SearchPpiCallFunction ( Identifier , SourceFileID , SourceFileFullPath , ItemMode ) :
ItemName , ItemType , GuidName , GuidMacro , GuidValue = ' ' , ' Ppi ' , ' ' , ' ' , ' '
SqlCommand = """ select Value, Name, BelongsToFile, StartLine, EndLine from %s
where ( Name like ' %% %s %% ' and Model = % s ) """ \
% ( Identifier , ' PeiServicesReInstallPpi ' , MODEL_IDENTIFIER_FUNCTION_CALLING )
BelongsToFunctionID , BelongsToFunction = - 1 , ' '
Db = EotGlobalData . gDb . TblReport
RecordSet = Db . Exec ( SqlCommand )
for Record in RecordSet :
Index = 0
BelongsToFile , StartLine , EndLine = Record [ 2 ] , Record [ 3 ] , Record [ 4 ]
BelongsToFunctionID , BelongsToFunction = SearchBelongsToFunction ( BelongsToFile , StartLine , EndLine )
VariableList = Record [ 0 ] . split ( ' , ' )
for Variable in VariableList :
Variable = Variable . strip ( )
# Get index of the variable
if Variable . find ( ' [ ' ) > - 1 :
Index = int ( Variable [ Variable . find ( ' [ ' ) + 1 : Variable . find ( ' ] ' ) ] )
Variable = Variable [ : Variable . find ( ' [ ' ) ]
# Get variable name
if Variable . startswith ( ' & ' ) :
Variable = Variable [ 1 : ]
# Get variable value
SqlCommand = """ select Value from %s where (Name like ' %% %s %% ' ) and Model = %s """ \
% ( Identifier , Variable , MODEL_IDENTIFIER_VARIABLE )
NewRecordSet = Db . Exec ( SqlCommand )
if NewRecordSet :
NewRecord = NewRecordSet [ 0 ] [ 0 ]
VariableValueList = NewRecord . split ( ' }, ' )
if len ( VariableValueList ) > Index :
VariableValue = VariableValueList [ Index ]
NewVariableValueList = VariableValue . split ( ' , ' )
if len ( NewVariableValueList ) > 1 :
NewVariableValue = NewVariableValueList [ 1 ] . strip ( )
if NewVariableValue . startswith ( ' & ' ) :
Db . Insert ( - 1 , ' ' , ' ' , SourceFileID , SourceFileFullPath , ItemName , ItemType , ItemMode , NewVariableValue [ 1 : ] , GuidMacro , GuidValue , BelongsToFunction , 0 )
continue
else :
EotGlobalData . gOP_UN_MATCHED . write ( ' %s , %s , %s , %s , %s , %s \n ' % ( ItemType , ItemMode , SourceFileID , SourceFileFullPath , StartLine , NewParameter ) )
ItemName , ItemType , GuidName , GuidMacro , GuidValue = ' ' , ' Ppi ' , ' ' , ' ' , ' '
SqlCommand = """ select Value, Name, BelongsToFile, StartLine, EndLine from %s
where ( Value like ' %% %s %% ' and Model = % s ) """ \
% ( Identifier , ' PeiServicesInstallPpi ' , MODEL_IDENTIFIER_ASSIGNMENT_EXPRESSION )
BelongsToFunctionID , BelongsToFunction = - 1 , ' '
Db = EotGlobalData . gDb . TblReport
RecordSet = Db . Exec ( SqlCommand )
SqlCommand = """ select Value, Name, BelongsToFile, StartLine, EndLine from %s
where ( Name like ' %% %s %% ' and Model = % s ) """ \
% ( Identifier , ' PeiServicesInstallPpi ' , MODEL_IDENTIFIER_FUNCTION_CALLING )
Db = EotGlobalData . gDb . TblReport
RecordSet2 = Db . Exec ( SqlCommand )
for Record in RecordSet + RecordSet2 :
if Record == [ ] :
continue
Index = 0
BelongsToFile , StartLine , EndLine = Record [ 2 ] , Record [ 3 ] , Record [ 4 ]
BelongsToFunctionID , BelongsToFunction = SearchBelongsToFunction ( BelongsToFile , StartLine , EndLine )
Variable = Record [ 0 ] . replace ( ' PeiServicesInstallPpi ' , ' ' ) . replace ( ' ( ' , ' ' ) . replace ( ' ) ' , ' ' ) . replace ( ' & ' , ' ' ) . strip ( )
Variable = Variable [ Variable . find ( ' , ' ) + 1 : ] . strip ( )
# Get index of the variable
if Variable . find ( ' [ ' ) > - 1 :
Index = int ( Variable [ Variable . find ( ' [ ' ) + 1 : Variable . find ( ' ] ' ) ] )
Variable = Variable [ : Variable . find ( ' [ ' ) ]
# Get variable name
if Variable . startswith ( ' & ' ) :
Variable = Variable [ 1 : ]
# Get variable value
SqlCommand = """ select Value from %s where (Name like ' %% %s %% ' ) and Model = %s """ \
% ( Identifier , Variable , MODEL_IDENTIFIER_VARIABLE )
NewRecordSet = Db . Exec ( SqlCommand )
if NewRecordSet :
NewRecord = NewRecordSet [ 0 ] [ 0 ]
VariableValueList = NewRecord . split ( ' }, ' )
2010-05-18 07:04:32 +02:00
for VariableValue in VariableValueList [ Index : ] :
2010-03-01 00:39:39 +01:00
NewVariableValueList = VariableValue . split ( ' , ' )
if len ( NewVariableValueList ) > 1 :
NewVariableValue = NewVariableValueList [ 1 ] . strip ( )
if NewVariableValue . startswith ( ' & ' ) :
Db . Insert ( - 1 , ' ' , ' ' , SourceFileID , SourceFileFullPath , ItemName , ItemType , ItemMode , NewVariableValue [ 1 : ] , GuidMacro , GuidValue , BelongsToFunction , 0 )
continue
else :
EotGlobalData . gOP_UN_MATCHED . write ( ' %s , %s , %s , %s , %s , %s \n ' % ( ItemType , ItemMode , SourceFileID , SourceFileFullPath , StartLine , NewParameter ) )
## SearchPpis() method
#
# Search all used PPI calling function
# Store the result to database
#
# @param SqlCommand: SQL command statement
# @param Table: Table id
# @param SourceFileID: Source file id
# @param SourceFileFullPath: Source file full path
# @param ItemMode: Mode of the item
# @param PpiMode: Mode of PPI
#
def SearchPpi ( SqlCommand , Table , SourceFileID , SourceFileFullPath , ItemMode , PpiMode = 1 ) :
ItemName , ItemType , GuidName , GuidMacro , GuidValue = ' ' , ' Ppi ' , ' ' , ' ' , ' '
BelongsToFunctionID , BelongsToFunction = - 1 , ' '
Db = EotGlobalData . gDb . TblReport
RecordSet = Db . Exec ( SqlCommand )
for Record in RecordSet :
Parameter = GetPpiParameter ( Record [ 0 ] , PpiMode )
BelongsToFile , StartLine , EndLine = Record [ 2 ] , Record [ 3 ] , Record [ 4 ]
# Get BelongsToFunction
BelongsToFunctionID , BelongsToFunction = SearchBelongsToFunction ( BelongsToFile , StartLine , EndLine )
# Default is Not Found
IsFound = False
# For Consumed Ppi
if ItemMode == ' Consumed ' :
if Parameter . startswith ( ' g ' ) :
Db . Insert ( - 1 , ' ' , ' ' , SourceFileID , SourceFileFullPath , ItemName , ItemType , ItemMode , Parameter , GuidMacro , GuidValue , BelongsToFunction , 0 )
else :
EotGlobalData . gOP_UN_MATCHED . write ( ' %s , %s , %s , %s , %s , %s \n ' % ( ItemType , ItemMode , SourceFileID , SourceFileFullPath , StartLine , Parameter ) )
continue
# Direct Parameter.Guid
SqlCommand = """ select Value from %s where (Name like ' %% %s .Guid %% ' or Name like ' %% %s ->Guid %% ' ) and Model = %s """ % ( Table , Parameter , Parameter , MODEL_IDENTIFIER_ASSIGNMENT_EXPRESSION )
NewRecordSet = Db . Exec ( SqlCommand )
for NewRecord in NewRecordSet :
GuidName = GetParameterName ( NewRecord [ 0 ] )
Db . Insert ( - 1 , ' ' , ' ' , SourceFileID , SourceFileFullPath , ItemName , ItemType , ItemMode , GuidName , GuidMacro , GuidValue , BelongsToFunction , 0 )
IsFound = True
# Defined Parameter
if not IsFound :
Key = Parameter
if Key . rfind ( ' ' ) > - 1 :
Key = Key [ Key . rfind ( ' ' ) : ] . strip ( ) . replace ( ' & ' , ' ' )
Value = FindKeyValue ( EotGlobalData . gDb . TblFile , Table , Key )
List = GetSplitValueList ( Value . replace ( ' \n ' , ' ' ) , TAB_COMMA_SPLIT )
if len ( List ) > 1 :
GuidName = GetParameterName ( List [ 1 ] )
Db . Insert ( - 1 , ' ' , ' ' , SourceFileID , SourceFileFullPath , ItemName , ItemType , ItemMode , GuidName , GuidMacro , GuidValue , BelongsToFunction , 0 )
IsFound = True
# A list Parameter
if not IsFound :
Start = Parameter . find ( ' [ ' )
End = Parameter . find ( ' ] ' )
if Start > - 1 and End > - 1 and Start < End :
try :
Index = int ( Parameter [ Start + 1 : End ] )
Parameter = Parameter [ 0 : Start ]
SqlCommand = """ select Value from %s where Name = ' %s ' and Model = %s """ % ( Table , Parameter , MODEL_IDENTIFIER_VARIABLE )
NewRecordSet = Db . Exec ( SqlCommand )
for NewRecord in NewRecordSet :
NewParameter = GetSplitValueList ( NewRecord [ 0 ] , ' } ' ) [ Index ]
GuidName = GetPpiParameter ( NewParameter [ NewParameter . find ( ' { ' ) : ] )
Db . Insert ( - 1 , ' ' , ' ' , SourceFileID , SourceFileFullPath , ItemName , ItemType , ItemMode , GuidName , GuidMacro , GuidValue , BelongsToFunction , 0 )
IsFound = True
except Exception :
pass
# A External Parameter
if not IsFound :
SqlCommand = """ select File.ID from Inf, File
where BelongsToFile = ( select BelongsToFile from Inf where Value1 = ' %s ' )
and Inf . Model = % s and Inf . Value1 = File . FullPath and File . Model = % s """ % (SourceFileFullPath, MODEL_EFI_SOURCE_FILE, MODEL_FILE_C)
NewRecordSet = Db . Exec ( SqlCommand )
for NewRecord in NewRecordSet :
Table = ' Identifier ' + str ( NewRecord [ 0 ] )
SqlCommand = """ select Value from %s where Name = ' %s ' and Modifier = ' EFI_PEI_PPI_DESCRIPTOR ' and Model = %s """ % ( Table , Parameter , MODEL_IDENTIFIER_VARIABLE )
PpiSet = Db . Exec ( SqlCommand )
if PpiSet != [ ] :
GuidName = GetPpiParameter ( PpiSet [ 0 ] [ 0 ] )
if GuidName != ' ' :
Db . Insert ( - 1 , ' ' , ' ' , SourceFileID , SourceFileFullPath , ItemName , ItemType , ItemMode , GuidName , GuidMacro , GuidValue , BelongsToFunction , 0 )
IsFound = True
break
if not IsFound :
EotGlobalData . gOP_UN_MATCHED . write ( ' %s , %s , %s , %s , %s , %s \n ' % ( ItemType , ItemMode , SourceFileID , SourceFileFullPath , StartLine , Parameter ) )
## SearchProtocols() method
#
# Search all used PROTOCOL calling function
# Store the result to database
#
# @param SqlCommand: SQL command statement
# @param Table: Table id
# @param SourceFileID: Source file id
# @param SourceFileFullPath: Source file full path
# @param ItemMode: Mode of the item
# @param ProtocolMode: Mode of PROTOCOL
#
def SearchProtocols ( SqlCommand , Table , SourceFileID , SourceFileFullPath , ItemMode , ProtocolMode ) :
ItemName , ItemType , GuidName , GuidMacro , GuidValue = ' ' , ' Protocol ' , ' ' , ' ' , ' '
BelongsToFunctionID , BelongsToFunction = - 1 , ' '
Db = EotGlobalData . gDb . TblReport
RecordSet = Db . Exec ( SqlCommand )
for Record in RecordSet :
Parameter = ' '
BelongsToFile , StartLine , EndLine = Record [ 2 ] , Record [ 3 ] , Record [ 4 ]
# Get BelongsToFunction
BelongsToFunctionID , BelongsToFunction = SearchBelongsToFunction ( BelongsToFile , StartLine , EndLine )
# Default is Not Found
IsFound = False
if ProtocolMode == 0 or ProtocolMode == 1 :
Parameter = GetProtocolParameter ( Record [ 0 ] , ProtocolMode )
if Parameter . startswith ( ' g ' ) or Parameter . endswith ( ' Guid ' ) or Parameter == ' ShellEnvProtocol ' or Parameter == ' ShellInterfaceProtocol ' :
GuidName = GetParameterName ( Parameter )
Db . Insert ( - 1 , ' ' , ' ' , SourceFileID , SourceFileFullPath , ItemName , ItemType , ItemMode , GuidName , GuidMacro , GuidValue , BelongsToFunction , 0 )
IsFound = True
if ProtocolMode == 2 :
Protocols = GetSplitValueList ( Record [ 0 ] , TAB_COMMA_SPLIT )
for Protocol in Protocols :
if Protocol . startswith ( ' & ' ) and Protocol . endswith ( ' Guid ' ) :
GuidName = GetParameterName ( Protocol )
Db . Insert ( - 1 , ' ' , ' ' , SourceFileID , SourceFileFullPath , ItemName , ItemType , ItemMode , GuidName , GuidMacro , GuidValue , BelongsToFunction , 0 )
IsFound = True
else :
NewValue = FindKeyValue ( EotGlobalData . gDb . TblFile , Table , Protocol )
if Protocol != NewValue and NewValue . endswith ( ' Guid ' ) :
GuidName = GetParameterName ( NewValue )
Db . Insert ( - 1 , ' ' , ' ' , SourceFileID , SourceFileFullPath , ItemName , ItemType , ItemMode , GuidName , GuidMacro , GuidValue , BelongsToFunction , 0 )
IsFound = True
if not IsFound :
if BelongsToFunction in EotGlobalData . gProducedProtocolLibrary or BelongsToFunction in EotGlobalData . gConsumedProtocolLibrary :
EotGlobalData . gOP_UN_MATCHED_IN_LIBRARY_CALLING . write ( ' %s , %s , %s , %s , %s , %s , %s \n ' % ( ItemType , ItemMode , SourceFileID , SourceFileFullPath , StartLine , Parameter , BelongsToFunction ) )
else :
EotGlobalData . gOP_UN_MATCHED . write ( ' %s , %s , %s , %s , %s , %s \n ' % ( ItemType , ItemMode , SourceFileID , SourceFileFullPath , StartLine , Parameter ) )
## SearchFunctionCalling() method
#
# Search all used PPI/PROTOCOL calling function by library
# Store the result to database
#
# @param SqlCommand: SQL command statement
# @param Table: Table id
# @param SourceFileID: Source file id
# @param SourceFileFullPath: Source file full path
# @param ItemType: Type of the item, PPI or PROTOCOL
# @param ItemMode: Mode of item
#
def SearchFunctionCalling ( Table , SourceFileID , SourceFileFullPath , ItemType , ItemMode ) :
LibraryList = sdict ( )
Db = EotGlobalData . gDb . TblReport
Parameters , ItemName , GuidName , GuidMacro , GuidValue , BelongsToFunction = [ ] , ' ' , ' ' , ' ' , ' ' , ' '
if ItemType == ' Protocol ' and ItemMode == ' Produced ' :
LibraryList = EotGlobalData . gProducedProtocolLibrary
elif ItemType == ' Protocol ' and ItemMode == ' Consumed ' :
LibraryList = EotGlobalData . gConsumedProtocolLibrary
elif ItemType == ' Protocol ' and ItemMode == ' Callback ' :
LibraryList = EotGlobalData . gCallbackProtocolLibrary
elif ItemType == ' Ppi ' and ItemMode == ' Produced ' :
LibraryList = EotGlobalData . gProducedPpiLibrary
elif ItemType == ' Ppi ' and ItemMode == ' Consumed ' :
LibraryList = EotGlobalData . gConsumedPpiLibrary
for Library in LibraryList :
Index = LibraryList [ Library ]
SqlCommand = """ select Value, StartLine from %s
where Name like ' %% %s %% ' and Model = % s """ \
% ( Table , Library , MODEL_IDENTIFIER_FUNCTION_CALLING )
RecordSet = Db . Exec ( SqlCommand )
for Record in RecordSet :
IsFound = False
if Index == - 1 :
ParameterList = GetSplitValueList ( Record [ 0 ] , TAB_COMMA_SPLIT )
for Parameter in ParameterList :
Parameters . append ( GetParameterName ( Parameter ) )
else :
Parameters = [ GetProtocolParameter ( Record [ 0 ] , Index ) ]
StartLine = Record [ 1 ]
for Parameter in Parameters :
if Parameter . startswith ( ' g ' ) or Parameter . endswith ( ' Guid ' ) or Parameter == ' ShellEnvProtocol ' or Parameter == ' ShellInterfaceProtocol ' :
GuidName = GetParameterName ( Parameter )
Db . Insert ( - 1 , ' ' , ' ' , SourceFileID , SourceFileFullPath , ItemName , ItemType , ItemMode , GuidName , GuidMacro , GuidValue , BelongsToFunction , 0 )
IsFound = True
if not IsFound :
EotGlobalData . gOP_UN_MATCHED . write ( ' %s , %s , %s , %s , %s , %s \n ' % ( ItemType , ItemMode , SourceFileID , SourceFileFullPath , StartLine , Parameter ) )
## FindProtocols() method
#
# Find defined protocols
#
# @param SqlCommand: SQL command statement
# @param Table: Table id
# @param SourceFileID: Source file id
# @param SourceFileFullPath: Source file full path
# @param ItemName: String of protocol definition
# @param ItemType: Type of the item, PPI or PROTOCOL
# @param ItemMode: Mode of item
#
#def FindProtocols(Db, SqlCommand, Table, SourceFileID, SourceFileFullPath, ItemName, ItemType, ItemMode, GuidName, GuidMacro, GuidValue):
# BelongsToFunction = ''
# RecordSet = Db.Exec(SqlCommand)
# for Record in RecordSet:
# IsFound = True
# Parameter = GetProtocolParameter(Record[0])
## GetProtocolParameter() method
#
# Parse string of protocol and find parameters
#
# @param Parameter: Parameter to be parsed
# @param Index: The index of the parameter
#
# @return: call common GetParameter
#
def GetProtocolParameter ( Parameter , Index = 1 ) :
return GetParameter ( Parameter , Index )
## GetPpiParameter() method
#
# Parse string of ppi and find parameters
#
# @param Parameter: Parameter to be parsed
# @param Index: The index of the parameter
#
# @return: call common GetParameter
#
def GetPpiParameter ( Parameter , Index = 1 ) :
return GetParameter ( Parameter , Index )
## GetParameter() method
#
# Get a parameter by index
#
# @param Parameter: Parameter to be parsed
# @param Index: The index of the parameter
#
# @return Parameter: The found parameter
#
def GetParameter ( Parameter , Index = 1 ) :
ParameterList = GetSplitValueList ( Parameter , TAB_COMMA_SPLIT )
if len ( ParameterList ) > Index :
Parameter = GetParameterName ( ParameterList [ Index ] )
return Parameter
return ' '
## GetParameterName() method
#
# Get a parameter name
#
# @param Parameter: Parameter to be parsed
#
# @return: The name of parameter
#
def GetParameterName ( Parameter ) :
if type ( Parameter ) == type ( ' ' ) and Parameter . startswith ( ' & ' ) :
return Parameter [ 1 : ] . replace ( ' { ' , ' ' ) . replace ( ' } ' , ' ' ) . replace ( ' \r ' , ' ' ) . replace ( ' \n ' , ' ' ) . strip ( )
else :
return Parameter . strip ( )
## FindKeyValue() method
#
# Find key value of a variable
#
# @param Db: Database to be searched
# @param Table: Table to be searched
# @param Key: The keyword
#
# @return Value: The value of the the keyword
#
def FindKeyValue ( Db , Table , Key ) :
SqlCommand = """ select Value from %s where Name = ' %s ' and (Model = %s or Model = %s ) """ % ( Table , Key , MODEL_IDENTIFIER_VARIABLE , MODEL_IDENTIFIER_ASSIGNMENT_EXPRESSION )
RecordSet = Db . Exec ( SqlCommand )
Value = ' '
for Record in RecordSet :
if Record [ 0 ] != ' NULL ' :
Value = FindKeyValue ( Db , Table , GetParameterName ( Record [ 0 ] ) )
if Value != ' ' :
return Value
else :
return Key
## ParseMapFile() method
#
# Parse map files to get a dict of 'ModuleName' : {FunName : FunAddress}
#
# @param Files: A list of map files
#
# @return AllMaps: An object of all map files
#
def ParseMapFile ( Files ) :
AllMaps = { }
CurrentModule = ' '
CurrentMaps = { }
for File in Files :
Content = open ( File , ' r ' ) . readlines ( )
for Line in Content :
Line = CleanString ( Line )
# skip empty line
if Line == ' ' :
continue
if Line . find ( ' ( ' ) > - 1 and Line . find ( ' ) ' ) > - 1 :
if CurrentModule != ' ' and CurrentMaps != { } :
AllMaps [ CurrentModule ] = CurrentMaps
CurrentModule = Line [ : Line . find ( ' ( ' ) ]
CurrentMaps = { }
continue
else :
Name = ' '
Address = ' '
List = Line . split ( )
Address = List [ 0 ]
if List [ 1 ] == ' F ' or List [ 1 ] == ' FS ' :
Name = List [ 2 ]
else :
Name = List [ 1 ]
CurrentMaps [ Name ] = Address
continue
return AllMaps
## ConvertGuid
#
# Convert a GUID to a GUID with all upper letters
#
# @param guid: The GUID to be converted
#
# @param newGuid: The GUID with all upper letters.
#
def ConvertGuid ( guid ) :
numList = [ ' 0 ' , ' 1 ' , ' 2 ' , ' 3 ' , ' 4 ' , ' 5 ' , ' 6 ' , ' 7 ' , ' 8 ' , ' 9 ' ]
newGuid = ' '
if guid . startswith ( ' g ' ) :
guid = guid [ 1 : ]
for i in guid :
if i . upper ( ) == i and i not in numList :
newGuid = newGuid + ( ' _ ' + i )
else :
newGuid = newGuid + i . upper ( )
if newGuid . startswith ( ' _ ' ) :
newGuid = newGuid [ 1 : ]
if newGuid . endswith ( ' _ ' ) :
newGuid = newGuid [ : - 1 ]
return newGuid
## ConvertGuid2() method
#
# Convert a GUID to a GUID with new string instead of old string
#
# @param guid: The GUID to be converted
# @param old: Old string to be replaced
# @param new: New string to replace the old one
#
# @param newGuid: The GUID after replacement
#
def ConvertGuid2 ( guid , old , new ) :
newGuid = ConvertGuid ( guid )
newGuid = newGuid . replace ( old , new )
return newGuid
##
#
# This acts like the main() function for the script, unless it is 'import'ed into another
# script.
#
if __name__ == ' __main__ ' :
pass