## @file
# This file contained the parser for BuildOption sections in INF file 
#
# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
#
# This program and the accompanying materials 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.
#

'''
InfBuildOptionSectionParser
'''
##
# Import Modules
#
from Library import DataType as DT
from Library import GlobalData
import Logger.Log as Logger
from Logger import StringTable as ST
from Logger.ToolError import FORMAT_INVALID
from Parser.InfParserMisc import InfExpandMacro
from Library.Misc import GetSplitValueList
from Parser.InfParserMisc import IsAsBuildOptionInfo
from Library.Misc import GetHelpStringByRemoveHashKey
from Library.ParserValidate import IsValidFamily
from Library.ParserValidate import IsValidBuildOptionName
from Parser.InfParserMisc import InfParserSectionRoot

class InfBuildOptionSectionParser(InfParserSectionRoot):
    ## InfBuildOptionParser
    #
    #
    def InfBuildOptionParser(self, SectionString, InfSectionObject, FileName):
        
        BuildOptionList = []
        SectionContent  = ''
        
        if not GlobalData.gIS_BINARY_INF:
            ValueList       = []
            LineNo          = 0

            for Line in SectionString:
                LineContent = Line[0]
                LineNo      = Line[1]
                TailComments = ''
                ReplaceFlag = False
                
                if LineContent.strip() == '':
                    SectionContent += LineContent + DT.END_OF_LINE 
                    continue       
                #
                # Found Comment
                #
                if LineContent.strip().startswith(DT.TAB_COMMENT_SPLIT):
                    SectionContent += LineContent + DT.END_OF_LINE 
                    continue
                
                #
                # Find Tail comment.
                #
                if LineContent.find(DT.TAB_COMMENT_SPLIT) > -1:
                    TailComments = LineContent[LineContent.find(DT.TAB_COMMENT_SPLIT):]
                    LineContent = LineContent[:LineContent.find(DT.TAB_COMMENT_SPLIT)]               
                
                TokenList = GetSplitValueList(LineContent, DT.TAB_DEQUAL_SPLIT, 1)
                if len(TokenList) == 2:
                    #
                    # "Replace" type build option
                    #
                    TokenList.append('True')
                    ReplaceFlag = True
                else:
                    TokenList = GetSplitValueList(LineContent, DT.TAB_EQUAL_SPLIT, 1)
                    #
                    # "Append" type build option
                    #
                    if len(TokenList) == 2:
                        TokenList.append('False')
                    else:
                        Logger.Error('InfParser', 
                                     FORMAT_INVALID,
                                     ST.ERR_INF_PARSER_BUILD_OPTION_FORMAT_INVALID,
                                     ExtraData=LineContent, 
                                     File=FileName,
                                     Line=LineNo)               
                        
                ValueList[0:len(TokenList)] = TokenList
                
                #
                # Replace with [Defines] section Macro
                #
                ValueList[0] = InfExpandMacro(ValueList[0], (FileName, LineContent, LineNo), 
                                              self.FileLocalMacros, None)
                ValueList[1] = InfExpandMacro(ValueList[1], (FileName, LineContent, LineNo), 
                                              self.FileLocalMacros, None, True)
                EqualString = ''
                if not ReplaceFlag:
                    EqualString = ' = '
                else:
                    EqualString = ' == '

                SectionContent += ValueList[0] + EqualString + ValueList[1] + TailComments + DT.END_OF_LINE

                Family = GetSplitValueList(ValueList[0], DT.TAB_COLON_SPLIT, 1)
                if len(Family) == 2:
                    if not IsValidFamily(Family[0]):            
                        Logger.Error('InfParser', 
                                     FORMAT_INVALID,
                                     ST.ERR_INF_PARSER_BUILD_OPTION_FORMAT_INVALID,
                                     ExtraData=LineContent, 
                                     File=FileName,
                                     Line=LineNo)
                    if not IsValidBuildOptionName(Family[1]):
                        Logger.Error('InfParser', 
                                     FORMAT_INVALID,
                                     ST.ERR_INF_PARSER_BUILD_OPTION_FORMAT_INVALID,
                                     ExtraData=LineContent, 
                                     File=FileName,
                                     Line=LineNo)
                if len(Family) == 1:
                    if not IsValidBuildOptionName(Family[0]):
                        Logger.Error('InfParser', 
                                     FORMAT_INVALID,
                                     ST.ERR_INF_PARSER_BUILD_OPTION_FORMAT_INVALID,
                                     ExtraData=LineContent, 
                                     File=FileName,
                                     Line=LineNo)
                                                
                BuildOptionList.append(ValueList)                  
                ValueList = []
                continue
        else:
            BuildOptionList = InfAsBuiltBuildOptionParser(SectionString, FileName)

        #
        # Current section archs
        #
        ArchList = []
        LastItem = ''
        for Item in self.LastSectionHeaderContent:
            LastItem = Item
            if not (Item[1] == '' or Item[1] == '') and Item[1] not in ArchList:
                ArchList.append(Item[1])
                InfSectionObject.SetSupArchList(Item[1])
      
        InfSectionObject.SetAllContent(SectionContent)
        if not InfSectionObject.SetBuildOptions(BuildOptionList, ArchList, SectionContent):
            Logger.Error('InfParser', 
                         FORMAT_INVALID,
                         ST.ERR_INF_PARSER_MODULE_SECTION_TYPE_ERROR%("[BuilOptions]"),
                         File=FileName,
                         Line=LastItem[3]) 

## InfBuildOptionParser
#
#
def InfAsBuiltBuildOptionParser(SectionString, FileName):
    BuildOptionList = []       
    #
    # AsBuild Binary INF file.
    #
    AsBuildOptionFlag = False
    BuildOptionItem = []
    Count = 0
    for Line in SectionString:
        Count += 1
        LineContent = Line[0]
        LineNo      = Line[1]
        
        #
        # The last line
        #
        if len(SectionString) == Count:
            if LineContent.strip().startswith("##") and AsBuildOptionFlag:
                BuildOptionList.append(BuildOptionItem)
                BuildOptionList.append([GetHelpStringByRemoveHashKey(LineContent)])
            elif LineContent.strip().startswith("#") and AsBuildOptionFlag:
                BuildOptionInfo = GetHelpStringByRemoveHashKey(LineContent)
                BuildOptionItem.append(BuildOptionInfo)
                BuildOptionList.append(BuildOptionItem)
            else:
                if len(BuildOptionItem) > 0:
                    BuildOptionList.append(BuildOptionItem)
            
            break                    
        
        if LineContent.strip() == '':
            AsBuildOptionFlag = False
            continue
        
        if LineContent.strip().startswith("##") and AsBuildOptionFlag:
            if len(BuildOptionItem) > 0:
                BuildOptionList.append(BuildOptionItem) 
                
            BuildOptionItem = []
        
        if not LineContent.strip().startswith("#"):
            Logger.Error('InfParser', 
                        FORMAT_INVALID,
                        ST.ERR_BO_CONTATIN_ASBUILD_AND_COMMON, 
                        File=FileName, 
                        Line=LineNo, 
                        ExtraData=LineContent)
        
        if IsAsBuildOptionInfo(LineContent):
            AsBuildOptionFlag = True
            continue
        
        if AsBuildOptionFlag:
            BuildOptionInfo = GetHelpStringByRemoveHashKey(LineContent)
            BuildOptionItem.append(BuildOptionInfo)
        
    return BuildOptionList