/*++

Copyright (c) 2004, Intel Corporation                                                         
All rights reserved. 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.             

Module Name:  

  DscFile.h
  
Abstract:

  Defines and function prototypes for the ProcessDsc utility.
  
--*/

#ifndef _DSC_FILE_H_
#define _DSC_FILE_H_

typedef struct _SECTION_LINE {
  struct _SECTION_LINE  *Next;
  char                  *Line;
  char                  *FileName;
  UINT32                LineNum;
} SECTION_LINE;

//
// Use this structure to keep track of parsed file names. Then
// if we get a parse error we can figure out the file/line of
// the error and print a useful message.
//
typedef struct _DSC_FILE_NAME {
  struct _DSC_FILE_NAME *Next;
  char                  *FileName;
} DSC_FILE_NAME;

//
// We create a list of section names when we pre-parse a description file.
// Use this structure.
//
typedef struct _SECTION {
  struct _SECTION *Next;
  char            *Name;
  SECTION_LINE    *FirstLine;
} SECTION;

#define MAX_SAVES 4

typedef struct {
  SECTION_LINE  *SavedPosition[MAX_SAVES];
  int           SavedPositionIndex;
  SECTION       *Sections;
  SECTION_LINE  *Lines;
  SECTION       *LastSection;
  SECTION_LINE  *LastLine;
  SECTION_LINE  *CurrentLine;
  DSC_FILE_NAME *FileName;
  DSC_FILE_NAME *LastFileName;
} DSC_FILE;

//
// Function prototypes
//
int
DSCFileSetFile (
  DSC_FILE *DSC,
  char     *FileName
  );
SECTION *
DSCFileFindSection (
  DSC_FILE *DSC,
  char     *Name
  );
int
DSCFileSavePosition (
  DSC_FILE *DSC
  );
int
DSCFileRestorePosition (
  DSC_FILE *DSC
  );
char    *
DSCFileGetLine (
  DSC_FILE *DSC,
  char     *Line,
  int      LineLen
  );
int
DSCFileInit (
  DSC_FILE *DSC
  );
int
DSCFileDestroy (
  DSC_FILE *DSC
  );

#endif // ifndef _DSC_FILE_H_
