1## @file 2# This file contained the parser for INF file 3# 4# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR> 5# 6# This program and the accompanying materials are licensed and made available 7# under the terms and conditions of the BSD License which accompanies this 8# distribution. The full text of the license may be found at 9# http://opensource.org/licenses/bsd-license.php 10# 11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 13# 14 15''' 16InfParser 17''' 18 19## 20# Import Modules 21# 22import re 23import os 24from copy import deepcopy 25 26from Library.String import GetSplitValueList 27from Library.String import ConvertSpecialChar 28from Library.Misc import ProcessLineExtender 29from Library.Misc import ProcessEdkComment 30from Library.Parsing import NormPath 31from Library.ParserValidate import IsValidInfMoudleTypeList 32from Library.ParserValidate import IsValidArch 33from Library import DataType as DT 34from Library import GlobalData 35 36import Logger.Log as Logger 37from Logger import StringTable as ST 38from Logger.ToolError import FORMAT_INVALID 39from Logger.ToolError import FILE_READ_FAILURE 40from Logger.ToolError import PARSER_ERROR 41 42from Object.Parser.InfCommonObject import InfSectionCommonDef 43from Parser.InfSectionParser import InfSectionParser 44from Parser.InfParserMisc import gINF_SECTION_DEF 45from Parser.InfParserMisc import IsBinaryInf 46 47## OpenInfFile 48# 49# 50def OpenInfFile(Filename): 51 FileLinesList = [] 52 53 try: 54 FInputfile = open(Filename, "rb", 0) 55 try: 56 FileLinesList = FInputfile.readlines() 57 except BaseException: 58 Logger.Error("InfParser", 59 FILE_READ_FAILURE, 60 ST.ERR_FILE_OPEN_FAILURE, 61 File=Filename) 62 finally: 63 FInputfile.close() 64 except BaseException: 65 Logger.Error("InfParser", 66 FILE_READ_FAILURE, 67 ST.ERR_FILE_OPEN_FAILURE, 68 File=Filename) 69 70 return FileLinesList 71 72## InfParser 73# 74# This class defined the structure used in InfParser object 75# 76# @param InfObject: Inherited from InfSectionParser class 77# @param Filename: Input value for Filename of INF file, default is 78# None 79# @param WorkspaceDir: Input value for current workspace directory, 80# default is None 81# 82class InfParser(InfSectionParser): 83 84 def __init__(self, Filename = None, WorkspaceDir = None): 85 86 # 87 # Call parent class construct function 88 # 89 super(InfParser, self).__init__() 90 91 self.WorkspaceDir = WorkspaceDir 92 self.SupArchList = DT.ARCH_LIST 93 self.EventList = [] 94 self.HobList = [] 95 self.BootModeList = [] 96 97 # 98 # Load Inf file if filename is not None 99 # 100 if Filename != None: 101 self.ParseInfFile(Filename) 102 103 ## Parse INF file 104 # 105 # Parse the file if it exists 106 # 107 # @param Filename: Input value for filename of INF file 108 # 109 def ParseInfFile(self, Filename): 110 111 Filename = NormPath(Filename) 112 (Path, Name) = os.path.split(Filename) 113 self.FullPath = Filename 114 self.RelaPath = Path 115 self.FileName = Name 116 GlobalData.gINF_MODULE_DIR = Path 117 GlobalData.gINF_MODULE_NAME = self.FullPath 118 GlobalData.gIS_BINARY_INF = False 119 # 120 # Initialize common data 121 # 122 LineNo = 0 123 CurrentSection = DT.MODEL_UNKNOWN 124 SectionLines = [] 125 126 # 127 # Flags 128 # 129 HeaderCommentStart = False 130 HeaderCommentEnd = False 131 HeaderStarLineNo = -1 132 BinaryHeaderCommentStart = False 133 BinaryHeaderCommentEnd = False 134 BinaryHeaderStarLineNo = -1 135 136 # 137 # While Section ends. parse whole section contents. 138 # 139 NewSectionStartFlag = False 140 FirstSectionStartFlag = False 141 142 # 143 # Parse file content 144 # 145 CommentBlock = [] 146 147 # 148 # Variables for Event/Hob/BootMode 149 # 150 self.EventList = [] 151 self.HobList = [] 152 self.BootModeList = [] 153 SectionType = '' 154 155 FileLinesList = OpenInfFile (Filename) 156 157 # 158 # One INF file can only has one [Defines] section. 159 # 160 DefineSectionParsedFlag = False 161 162 # 163 # Convert special characters in lines to space character. 164 # 165 FileLinesList = ConvertSpecialChar(FileLinesList) 166 167 # 168 # Process Line Extender 169 # 170 FileLinesList = ProcessLineExtender(FileLinesList) 171 172 # 173 # Process EdkI INF style comment if found 174 # 175 OrigLines = [Line for Line in FileLinesList] 176 FileLinesList, EdkCommentStartPos = ProcessEdkComment(FileLinesList) 177 178 # 179 # Judge whether the INF file is Binary INF or not 180 # 181 if IsBinaryInf(FileLinesList): 182 GlobalData.gIS_BINARY_INF = True 183 184 InfSectionCommonDefObj = None 185 186 for Line in FileLinesList: 187 LineNo = LineNo + 1 188 Line = Line.strip() 189 if (LineNo < len(FileLinesList) - 1): 190 NextLine = FileLinesList[LineNo].strip() 191 192 # 193 # blank line 194 # 195 if (Line == '' or not Line) and LineNo == len(FileLinesList): 196 LastSectionFalg = True 197 198 # 199 # check whether file header comment section started 200 # 201 if Line.startswith(DT.TAB_SPECIAL_COMMENT) and \ 202 (Line.find(DT.TAB_HEADER_COMMENT) > -1) and \ 203 not HeaderCommentStart and not HeaderCommentEnd: 204 205 CurrentSection = DT.MODEL_META_DATA_FILE_HEADER 206 # 207 # Append the first line to section lines. 208 # 209 HeaderStarLineNo = LineNo 210 SectionLines.append((Line, LineNo)) 211 HeaderCommentStart = True 212 continue 213 214 # 215 # Collect Header content. 216 # 217 if (Line.startswith(DT.TAB_COMMENT_SPLIT) and CurrentSection == DT.MODEL_META_DATA_FILE_HEADER) and\ 218 HeaderCommentStart and not Line.startswith(DT.TAB_SPECIAL_COMMENT) and not\ 219 HeaderCommentEnd and NextLine != '': 220 SectionLines.append((Line, LineNo)) 221 continue 222 # 223 # Header content end 224 # 225 if (Line.startswith(DT.TAB_SPECIAL_COMMENT) or not Line.strip().startswith("#")) and HeaderCommentStart \ 226 and not HeaderCommentEnd: 227 HeaderCommentEnd = True 228 BinaryHeaderCommentStart = False 229 BinaryHeaderCommentEnd = False 230 HeaderCommentStart = False 231 if Line.find(DT.TAB_BINARY_HEADER_COMMENT) > -1: 232 self.InfHeaderParser(SectionLines, self.InfHeader, self.FileName) 233 SectionLines = [] 234 else: 235 SectionLines.append((Line, LineNo)) 236 # 237 # Call Header comment parser. 238 # 239 self.InfHeaderParser(SectionLines, self.InfHeader, self.FileName) 240 SectionLines = [] 241 continue 242 243 # 244 # check whether binary header comment section started 245 # 246 if Line.startswith(DT.TAB_SPECIAL_COMMENT) and \ 247 (Line.find(DT.TAB_BINARY_HEADER_COMMENT) > -1) and \ 248 not BinaryHeaderCommentStart: 249 SectionLines = [] 250 CurrentSection = DT.MODEL_META_DATA_FILE_HEADER 251 # 252 # Append the first line to section lines. 253 # 254 BinaryHeaderStarLineNo = LineNo 255 SectionLines.append((Line, LineNo)) 256 BinaryHeaderCommentStart = True 257 HeaderCommentEnd = True 258 continue 259 260 # 261 # check whether there are more than one binary header exist 262 # 263 if Line.startswith(DT.TAB_SPECIAL_COMMENT) and BinaryHeaderCommentStart and \ 264 not BinaryHeaderCommentEnd and (Line.find(DT.TAB_BINARY_HEADER_COMMENT) > -1): 265 Logger.Error('Parser', 266 FORMAT_INVALID, 267 ST.ERR_MULTIPLE_BINARYHEADER_EXIST, 268 File=Filename) 269 270 # 271 # Collect Binary Header content. 272 # 273 if (Line.startswith(DT.TAB_COMMENT_SPLIT) and CurrentSection == DT.MODEL_META_DATA_FILE_HEADER) and\ 274 BinaryHeaderCommentStart and not Line.startswith(DT.TAB_SPECIAL_COMMENT) and not\ 275 BinaryHeaderCommentEnd and NextLine != '': 276 SectionLines.append((Line, LineNo)) 277 continue 278 # 279 # Binary Header content end 280 # 281 if (Line.startswith(DT.TAB_SPECIAL_COMMENT) or not Line.strip().startswith(DT.TAB_COMMENT_SPLIT)) and \ 282 BinaryHeaderCommentStart and not BinaryHeaderCommentEnd: 283 SectionLines.append((Line, LineNo)) 284 BinaryHeaderCommentStart = False 285 # 286 # Call Binary Header comment parser. 287 # 288 self.InfHeaderParser(SectionLines, self.InfBinaryHeader, self.FileName, True) 289 SectionLines = [] 290 BinaryHeaderCommentEnd = True 291 continue 292 # 293 # Find a new section tab 294 # Or at the last line of INF file, 295 # need to process the last section. 296 # 297 LastSectionFalg = False 298 if LineNo == len(FileLinesList): 299 LastSectionFalg = True 300 301 if Line.startswith(DT.TAB_COMMENT_SPLIT) and not Line.startswith(DT.TAB_SPECIAL_COMMENT): 302 SectionLines.append((Line, LineNo)) 303 if not LastSectionFalg: 304 continue 305 306 # 307 # Encountered a section. start with '[' and end with ']' 308 # 309 if (Line.startswith(DT.TAB_SECTION_START) and \ 310 Line.find(DT.TAB_SECTION_END) > -1) or LastSectionFalg: 311 312 HeaderCommentEnd = True 313 BinaryHeaderCommentEnd = True 314 315 if not LastSectionFalg: 316 # 317 # check to prevent '#' inside section header 318 # 319 HeaderContent = Line[1:Line.find(DT.TAB_SECTION_END)] 320 if HeaderContent.find(DT.TAB_COMMENT_SPLIT) != -1: 321 Logger.Error("InfParser", 322 FORMAT_INVALID, 323 ST.ERR_INF_PARSER_DEFINE_SECTION_HEADER_INVALID, 324 File=self.FullPath, 325 Line=LineNo, 326 ExtraData=Line) 327 328 # 329 # Keep last time section header content for section parser 330 # usage. 331 # 332 self.LastSectionHeaderContent = deepcopy(self.SectionHeaderContent) 333 334 # 335 # TailComments in section define. 336 # 337 TailComments = '' 338 CommentIndex = Line.find(DT.TAB_COMMENT_SPLIT) 339 if CommentIndex > -1: 340 TailComments = Line[CommentIndex:] 341 Line = Line[:CommentIndex] 342 343 InfSectionCommonDefObj = InfSectionCommonDef() 344 if TailComments != '': 345 InfSectionCommonDefObj.SetTailComments(TailComments) 346 if CommentBlock != '': 347 InfSectionCommonDefObj.SetHeaderComments(CommentBlock) 348 CommentBlock = [] 349 # 350 # Call section parser before section header parer to avoid encounter EDKI INF file 351 # 352 if CurrentSection == DT.MODEL_META_DATA_DEFINE: 353 DefineSectionParsedFlag = self._CallSectionParsers(CurrentSection, 354 DefineSectionParsedFlag, SectionLines, 355 InfSectionCommonDefObj, LineNo) 356 # 357 # Compare the new section name with current 358 # 359 self.SectionHeaderParser(Line, self.FileName, LineNo) 360 361 self._CheckSectionHeaders(Line, LineNo) 362 363 SectionType = _ConvertSecNameToType(self.SectionHeaderContent[0][0]) 364 365 if not FirstSectionStartFlag: 366 CurrentSection = SectionType 367 FirstSectionStartFlag = True 368 else: 369 NewSectionStartFlag = True 370 else: 371 SectionLines.append((Line, LineNo)) 372 continue 373 374 if LastSectionFalg: 375 SectionLines, CurrentSection = self._ProcessLastSection(SectionLines, Line, LineNo, CurrentSection) 376 377 # 378 # End of section content collect. 379 # Parser the section content collected previously. 380 # 381 if NewSectionStartFlag or LastSectionFalg: 382 if CurrentSection != DT.MODEL_META_DATA_DEFINE or \ 383 (LastSectionFalg and CurrentSection == DT.MODEL_META_DATA_DEFINE): 384 DefineSectionParsedFlag = self._CallSectionParsers(CurrentSection, 385 DefineSectionParsedFlag, SectionLines, 386 InfSectionCommonDefObj, LineNo) 387 388 CurrentSection = SectionType 389 # 390 # Clear section lines 391 # 392 SectionLines = [] 393 394 if HeaderStarLineNo == -1: 395 Logger.Error("InfParser", 396 FORMAT_INVALID, 397 ST.ERR_NO_SOURCE_HEADER, 398 File=self.FullPath) 399 if BinaryHeaderStarLineNo > -1 and HeaderStarLineNo > -1 and HeaderStarLineNo > BinaryHeaderStarLineNo: 400 Logger.Error("InfParser", 401 FORMAT_INVALID, 402 ST.ERR_BINARY_HEADER_ORDER, 403 File=self.FullPath) 404 # 405 # EDKII INF should not have EDKI style comment 406 # 407 if EdkCommentStartPos != -1: 408 Logger.Error("InfParser", 409 FORMAT_INVALID, 410 ST.ERR_INF_PARSER_EDKI_COMMENT_IN_EDKII, 411 File=self.FullPath, 412 Line=EdkCommentStartPos + 1, 413 ExtraData=OrigLines[EdkCommentStartPos]) 414 415 # 416 # extract [Event] [Hob] [BootMode] sections 417 # 418 self._ExtractEventHobBootMod(FileLinesList) 419 420 ## _CheckSectionHeaders 421 # 422 # 423 def _CheckSectionHeaders(self, Line, LineNo): 424 if len(self.SectionHeaderContent) == 0: 425 Logger.Error("InfParser", 426 FORMAT_INVALID, 427 ST.ERR_INF_PARSER_DEFINE_SECTION_HEADER_INVALID, 428 File=self.FullPath, 429 Line=LineNo, ExtraData=Line) 430 else: 431 for SectionItem in self.SectionHeaderContent: 432 ArchList = [] 433 # 434 # Not cover Depex/UserExtension section header 435 # check. 436 # 437 if SectionItem[0].strip().upper() == DT.TAB_INF_FIXED_PCD.upper() or \ 438 SectionItem[0].strip().upper() == DT.TAB_INF_PATCH_PCD.upper() or \ 439 SectionItem[0].strip().upper() == DT.TAB_INF_PCD_EX.upper() or \ 440 SectionItem[0].strip().upper() == DT.TAB_INF_PCD.upper() or \ 441 SectionItem[0].strip().upper() == DT.TAB_INF_FEATURE_PCD.upper(): 442 ArchList = GetSplitValueList(SectionItem[1].strip(), ' ') 443 else: 444 ArchList = [SectionItem[1].strip()] 445 446 for Arch in ArchList: 447 if (not IsValidArch(Arch)) and \ 448 (SectionItem[0].strip().upper() != DT.TAB_DEPEX.upper()) and \ 449 (SectionItem[0].strip().upper() != DT.TAB_USER_EXTENSIONS.upper()) and \ 450 (SectionItem[0].strip().upper() != DT.TAB_COMMON_DEFINES.upper()): 451 Logger.Error("InfParser", 452 FORMAT_INVALID, 453 ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(SectionItem[1]), 454 File=self.FullPath, 455 Line=LineNo, ExtraData=Line) 456 # 457 # Check if the ModuleType is valid 458 # 459 ChkModSectionList = ['LIBRARYCLASSES'] 460 if (self.SectionHeaderContent[0][0].upper() in ChkModSectionList): 461 if SectionItem[2].strip().upper(): 462 MoudleTypeList = GetSplitValueList( 463 SectionItem[2].strip().upper()) 464 if (not IsValidInfMoudleTypeList(MoudleTypeList)): 465 Logger.Error("InfParser", 466 FORMAT_INVALID, 467 ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(SectionItem[2]), 468 File=self.FullPath, Line=LineNo, 469 ExtraData=Line) 470 471 ## _CallSectionParsers 472 # 473 # 474 def _CallSectionParsers(self, CurrentSection, DefineSectionParsedFlag, 475 SectionLines, InfSectionCommonDefObj, LineNo): 476 if CurrentSection == DT.MODEL_META_DATA_DEFINE: 477 if not DefineSectionParsedFlag: 478 self.InfDefineParser(SectionLines, 479 self.InfDefSection, 480 self.FullPath, 481 InfSectionCommonDefObj) 482 DefineSectionParsedFlag = True 483 else: 484 Logger.Error("Parser", 485 PARSER_ERROR, 486 ST.ERR_INF_PARSER_MULTI_DEFINE_SECTION, 487 File=self.FullPath, 488 RaiseError = Logger.IS_RAISE_ERROR) 489 490 elif CurrentSection == DT.MODEL_META_DATA_BUILD_OPTION: 491 self.InfBuildOptionParser(SectionLines, 492 self.InfBuildOptionSection, 493 self.FullPath) 494 495 elif CurrentSection == DT.MODEL_EFI_LIBRARY_CLASS: 496 self.InfLibraryParser(SectionLines, 497 self.InfLibraryClassSection, 498 self.FullPath) 499 500 elif CurrentSection == DT.MODEL_META_DATA_PACKAGE: 501 self.InfPackageParser(SectionLines, 502 self.InfPackageSection, 503 self.FullPath) 504 # 505 # [Pcd] Sections, put it together 506 # 507 elif CurrentSection == DT.MODEL_PCD_FIXED_AT_BUILD or \ 508 CurrentSection == DT.MODEL_PCD_PATCHABLE_IN_MODULE or \ 509 CurrentSection == DT.MODEL_PCD_FEATURE_FLAG or \ 510 CurrentSection == DT.MODEL_PCD_DYNAMIC_EX or \ 511 CurrentSection == DT.MODEL_PCD_DYNAMIC: 512 self.InfPcdParser(SectionLines, 513 self.InfPcdSection, 514 self.FullPath) 515 516 elif CurrentSection == DT.MODEL_EFI_SOURCE_FILE: 517 self.InfSourceParser(SectionLines, 518 self.InfSourcesSection, 519 self.FullPath) 520 521 elif CurrentSection == DT.MODEL_META_DATA_USER_EXTENSION: 522 self.InfUserExtensionParser(SectionLines, 523 self.InfUserExtensionSection, 524 self.FullPath) 525 526 elif CurrentSection == DT.MODEL_EFI_PROTOCOL: 527 self.InfProtocolParser(SectionLines, 528 self.InfProtocolSection, 529 self.FullPath) 530 531 elif CurrentSection == DT.MODEL_EFI_PPI: 532 self.InfPpiParser(SectionLines, 533 self.InfPpiSection, 534 self.FullPath) 535 536 elif CurrentSection == DT.MODEL_EFI_GUID: 537 self.InfGuidParser(SectionLines, 538 self.InfGuidSection, 539 self.FullPath) 540 541 elif CurrentSection == DT.MODEL_EFI_DEPEX: 542 self.InfDepexParser(SectionLines, 543 self.InfDepexSection, 544 self.FullPath) 545 546 elif CurrentSection == DT.MODEL_EFI_BINARY_FILE: 547 self.InfBinaryParser(SectionLines, 548 self.InfBinariesSection, 549 self.FullPath) 550 # 551 # Unknown section type found, raise error. 552 # 553 else: 554 if len(self.SectionHeaderContent) >= 1: 555 Logger.Error("Parser", 556 PARSER_ERROR, 557 ST.ERR_INF_PARSER_UNKNOWN_SECTION, 558 File=self.FullPath, Line=LineNo, 559 RaiseError = Logger.IS_RAISE_ERROR) 560 else: 561 Logger.Error("Parser", 562 PARSER_ERROR, 563 ST.ERR_INF_PARSER_NO_SECTION_ERROR, 564 File=self.FullPath, Line=LineNo, 565 RaiseError = Logger.IS_RAISE_ERROR) 566 567 return DefineSectionParsedFlag 568 569 def _ExtractEventHobBootMod(self, FileLinesList): 570 SpecialSectionStart = False 571 CheckLocation = False 572 GFindSpecialCommentRe = \ 573 re.compile(r"""#(?:\s*)\[(.*?)\](?:.*)""", re.DOTALL) 574 GFindNewSectionRe2 = \ 575 re.compile(r"""#?(\s*)\[(.*?)\](.*)""", re.DOTALL) 576 LineNum = 0 577 Element = [] 578 for Line in FileLinesList: 579 Line = Line.strip() 580 LineNum += 1 581 MatchObject = GFindSpecialCommentRe.search(Line) 582 if MatchObject: 583 SpecialSectionStart = True 584 Element = [] 585 if MatchObject.group(1).upper().startswith("EVENT"): 586 List = self.EventList 587 elif MatchObject.group(1).upper().startswith("HOB"): 588 List = self.HobList 589 elif MatchObject.group(1).upper().startswith("BOOTMODE"): 590 List = self.BootModeList 591 else: 592 SpecialSectionStart = False 593 CheckLocation = False 594 if SpecialSectionStart: 595 Element.append([Line, LineNum]) 596 List.append(Element) 597 else: 598 # 599 # if currently in special section, try to detect end of current section 600 # 601 MatchObject = GFindNewSectionRe2.search(Line) 602 if SpecialSectionStart: 603 if MatchObject: 604 SpecialSectionStart = False 605 CheckLocation = False 606 Element = [] 607 elif not Line: 608 SpecialSectionStart = False 609 CheckLocation = True 610 Element = [] 611 else: 612 if not Line.startswith(DT.TAB_COMMENT_SPLIT): 613 Logger.Warn("Parser", 614 ST.WARN_SPECIAL_SECTION_LOCATION_WRONG, 615 File=self.FullPath, Line=LineNum) 616 SpecialSectionStart = False 617 CheckLocation = False 618 Element = [] 619 else: 620 Element.append([Line, LineNum]) 621 else: 622 if CheckLocation: 623 if MatchObject: 624 CheckLocation = False 625 elif Line: 626 Logger.Warn("Parser", 627 ST.WARN_SPECIAL_SECTION_LOCATION_WRONG, 628 File=self.FullPath, Line=LineNum) 629 CheckLocation = False 630 631 if len(self.BootModeList) >= 1: 632 self.InfSpecialCommentParser(self.BootModeList, 633 self.InfSpecialCommentSection, 634 self.FileName, 635 DT.TYPE_BOOTMODE_SECTION) 636 637 if len(self.EventList) >= 1: 638 self.InfSpecialCommentParser(self.EventList, 639 self.InfSpecialCommentSection, 640 self.FileName, 641 DT.TYPE_EVENT_SECTION) 642 643 if len(self.HobList) >= 1: 644 self.InfSpecialCommentParser(self.HobList, 645 self.InfSpecialCommentSection, 646 self.FileName, 647 DT.TYPE_HOB_SECTION) 648 ## _ProcessLastSection 649 # 650 # 651 def _ProcessLastSection(self, SectionLines, Line, LineNo, CurrentSection): 652 # 653 # The last line is a section header. will discard it. 654 # 655 if not (Line.startswith(DT.TAB_SECTION_START) and Line.find(DT.TAB_SECTION_END) > -1): 656 SectionLines.append((Line, LineNo)) 657 658 if len(self.SectionHeaderContent) >= 1: 659 TemSectionName = self.SectionHeaderContent[0][0].upper() 660 if TemSectionName.upper() not in gINF_SECTION_DEF.keys(): 661 Logger.Error("InfParser", 662 FORMAT_INVALID, 663 ST.ERR_INF_PARSER_UNKNOWN_SECTION, 664 File=self.FullPath, 665 Line=LineNo, 666 ExtraData=Line, 667 RaiseError = Logger.IS_RAISE_ERROR 668 ) 669 else: 670 CurrentSection = gINF_SECTION_DEF[TemSectionName] 671 self.LastSectionHeaderContent = self.SectionHeaderContent 672 673 return SectionLines, CurrentSection 674 675## _ConvertSecNameToType 676# 677# 678def _ConvertSecNameToType(SectionName): 679 SectionType = '' 680 if SectionName.upper() not in gINF_SECTION_DEF.keys(): 681 SectionType = DT.MODEL_UNKNOWN 682 else: 683 SectionType = gINF_SECTION_DEF[SectionName.upper()] 684 685 return SectionType 686 687