## @file
# This file contained the parser for BuildOption sections in INF file
#
# Copyright (c) 2011 - 2018, 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
