]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/AutoGen/InfSectionParser.py
License header updated to match correct format.
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / InfSectionParser.py
1 ## @file
2 # Parser a Inf file and Get specify section data.
3 #
4 # Copyright (c) 2007 - 2012, Intel Corporation. All rights reserved.<BR>
5 # This program and the accompanying materials
6 # are licensed and made available under the terms and conditions of the BSD License
7 # which accompanies this distribution. The full text of the license may be found at
8 # http://opensource.org/licenses/bsd-license.php
9 #
10 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 #
13
14 ## Import Modules
15 #
16
17 import Common.EdkLogger as EdkLogger
18 from Common.BuildToolError import *
19 from Common.DataType import *
20
21
22 class InfSectionParser():
23 def __init__(self, FilePath):
24 self._FilePath = FilePath
25 self._FileSectionDataList = []
26 self._ParserInf()
27
28 def _ParserInf(self):
29 Filename = self._FilePath
30 FileLinesList = []
31 UserExtFind = False
32 FindEnd = True
33 FileLastLine = False
34 SectionLine = ''
35 SectionData = []
36
37 try:
38 FileLinesList = open(Filename, "r", 0).readlines()
39 except BaseException:
40 EdkLogger.error("build", AUTOGEN_ERROR, 'File %s is opened failed.' % Filename)
41
42 for Index in range(0, len(FileLinesList)):
43 line = str(FileLinesList[Index]).strip()
44 if Index + 1 == len(FileLinesList):
45 FileLastLine = True
46 NextLine = ''
47 else:
48 NextLine = str(FileLinesList[Index + 1]).strip()
49 if UserExtFind and FindEnd == False:
50 if line:
51 SectionData.append(line)
52 if line.lower().startswith(TAB_SECTION_START) and line.lower().endswith(TAB_SECTION_END):
53 SectionLine = line
54 UserExtFind = True
55 FindEnd = False
56
57 if (NextLine != '' and NextLine[0] == TAB_SECTION_START and \
58 NextLine[-1] == TAB_SECTION_END) or FileLastLine:
59 UserExtFind = False
60 FindEnd = True
61 self._FileSectionDataList.append({SectionLine: SectionData[:]})
62 SectionData = []
63 SectionLine = ''
64
65
66 # Get depex expresion
67 #
68 # @return: a list include some dictionary that key is section and value is a list contain all data.
69 def GetDepexExpresionList(self):
70 DepexExpresionList = []
71 if not self._FileSectionDataList:
72 return DepexExpresionList
73 for SectionDataDict in self._FileSectionDataList:
74 for key in SectionDataDict.keys():
75 if key.lower() == "[depex]" or key.lower().startswith("[depex."):
76 SectionLine = key.lstrip(TAB_SECTION_START).rstrip(TAB_SECTION_END)
77 SubSectionList = [SectionLine]
78 if str(SectionLine).find(TAB_COMMA_SPLIT) > -1:
79 SubSectionList = str(SectionLine).split(TAB_COMMA_SPLIT)
80 for SubSection in SubSectionList:
81 SectionList = SubSection.split(TAB_SPLIT)
82 SubKey = ()
83 if len(SectionList) == 1:
84 SubKey = (TAB_ARCH_COMMON, TAB_ARCH_COMMON)
85 elif len(SectionList) == 2:
86 SubKey = (SectionList[1], TAB_ARCH_COMMON)
87 elif len(SectionList) == 3:
88 SubKey = (SectionList[1], SectionList[2])
89 else:
90 EdkLogger.error("build", AUTOGEN_ERROR, 'Section %s is invalid.' % key)
91 DepexExpresionList.append({SubKey: SectionDataDict[key]})
92 return DepexExpresionList
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107