/*************************************************/
/* Common Library Component private include file */
/*************************************************/



// ****************************************************************************
//
//  This file contains declarations that have to do  with INF contexts
//
//
//  For each INF file loaded, Setup maintains a permanent INF information
//  block and a temporary INF information block.
//
//  InfPermInfo:    The permanent information block contains the data
//                  that is kept throughout the life of Setup, even after an
//                  INF file has been discarded. This is reused if an INF
//                  is re-loaded.
//
//  InfTempInfo:    The temporary information block contains data that is
//                  kept only as long as the INF is loaded. This consists
//                  mainly of the preparsed INF and its symbol table.
//
//
//  An INF context consists of a line number ( which is the INF line being
//  executed), plus the temporary and permanent INF information.
//
//  INF contexts are entered with the SHELL command and exited with the
//  RETURN command.
//
// ****************************************************************************




//
//  Count of strings in each String-Table-Freeing node
//
#define  cszPerStf  (62)

//
//  String-Table-Free structure
//
typedef struct _STF *PSTF;
typedef  struct _STF {
    PSTF          pstfNext;
	SZ            rgsz[cszPerStf];
	USHORT        cszFree;
}  STF;
typedef  PSTF * PPSTF;



//
//  INF permanent information. This is kept throughout all of SETUP.
//
//  There is one if these for each INF file that has been used by SETUP.
//
typedef struct _INFPERMINFO *PINFPERMINFO;
typedef struct _INFPERMINFO {
    PINFPERMINFO    pNext;      // Next in List
    SZ              szName;     // INF name
    UINT            InfId;      // INF Id
    PSDLE           psdleHead;  // Source media description list head
    PSDLE           psdleCur;   // Current source media description
    PCLN            pclnHead;   // Head of copy list
    PPCLN           ppclnTail;  // Tail of copy list
    PSTF            pstfHead;   // Head of free string table
} INFPERMINFO;


//
//  Parsed INF info. There is one of these per active INF plus a few
//  cached ones for previously used INFs.
//
typedef struct _PARSED_INF *PPARSED_INF;
typedef struct _PARSED_INF {
    PPARSED_INF     pPrev;
    PPARSED_INF     pNext;
    PINFPERMINFO    pInfPermInfo;
    PINFLINE        MasterLineArray;
    UINT            MasterLineCount;
    PUCHAR          MasterFile;
    UINT            MasterFileSize;
} PARSED_INF;



//
//  INF temporary information. This goes away when no context
//  references the INF.
//
typedef struct _INFTEMPINFO *PINFTEMPINFO;
typedef struct _INFTEMPINFO {
    PINFTEMPINFO    pPrev;                      //  Previous in chain
    PINFTEMPINFO    pNext;                      //  Next in chain
    PINFPERMINFO    pInfPermInfo;               //  INF permanent information
    PPARSED_INF     pParsedInf;                 //  Parsed INF
    DWORD           cRef;                       //  Reference count
    PSYMTAB         SymTab;                     //  Static symbol table
} INFTEMPINFO;


//
//  Context entry in context stack. There is one of these for
//  each context entered.
//
typedef struct _INFCONTEXT *PINFCONTEXT;
typedef struct _INFCONTEXT {
    PINFCONTEXT     pNext;                  //  Next context in chain
    PINFTEMPINFO    pInfTempInfo;           //  INF temporary info
    INT             CurrentLine;            //  Current line being executed
    PSEFL           pseflHead;              //  Flow statement block
    PSYMTAB         SymTab;                 //  Local symtol table
    SZ              szShlScriptSection;     //  Shell script section
    SZ              szHelpFile;             //  Help file
    DWORD           dwLowContext;           //  Help context low
    DWORD           dwHighContext;          //  Help context high
    DWORD           dwHelpIndex;            //  Help index.
    BOOL            bHelpIsIndexed;         //  Whether help is indexed
} INFCONTEXT;







//
//  Global variables
//
extern PINFCONTEXT     pContextBottom;     // The global (SETUP) context
extern PINFCONTEXT     pContextTop;        // Top of context stack
extern PINFPERMINFO    pInfPermInfoHead;   // Head of InfPermInfo list
extern PINFPERMINFO    pInfPermInfoTail;   // Tail of InfPermInfo list






//
//  Some macros for accessing contexts and INF information
//
#define pLocalContext()             pContextTop
#define pGlobalContext()            pContextBottom
#define pInfTempInfo( Context )     ((Context)->pInfTempInfo)
#define pInfPermInfo( Context )     (pInfTempInfo( Context )->pInfPermInfo)
#define pParsedInf( Context )       (pInfTempInfo( Context )->pParsedInf)
#define pLocalInfTempInfo()         pInfTempInfo( pLocalContext() )
#define pLocalInfPermInfo()         pInfPermInfo( pLocalContext() )

#define PpclnHeadList( pPermInfo )  &(pPermInfo->pclnHead)
#define PppclnTailList( pPermInfo ) &(pPermInfo->ppclnTail)



#define PreCondSymTabInit(r) PreCondition( (pLocalContext() != NULL), r )






//
//  Function Prototypes
//
extern BOOL         APIENTRY PushContext( PINFCONTEXT pContext );
extern PINFCONTEXT  APIENTRY PopContext( VOID );
extern VOID         APIENTRY FreeContext( PINFCONTEXT pContext );
extern PINFPERMINFO APIENTRY NameToInfPermInfo( SZ szName , BOOL AllocIfNotPresent);
extern PINFPERMINFO APIENTRY AddInfPermInfo( SZ szName );
extern BOOL         APIENTRY PathToInfName( SZ szPath, SZ szName );
extern PSYMTAB      APIENTRY PInfSymTabFind( SZ szSymbol, SZ *szNewSymbol );

extern PINFTEMPINFO APIENTRY CreateInfTempInfo( PINFPERMINFO );

extern BOOL         APIENTRY FFreeSrcDescrList(PINFPERMINFO);
extern PSDLE        APIENTRY PsdleFromDid(DID, PINFPERMINFO);

extern BOOL         APIENTRY FFreeCopyList(PINFPERMINFO);
#if DBG
extern BOOL         APIENTRY FValidCopyList(PINFPERMINFO);
#endif

extern BOOL         APIENTRY FInitFreeTable(PINFPERMINFO);
extern BOOL         APIENTRY FAddSzToFreeTable(SZ, PINFPERMINFO);
extern BOOL         APIENTRY FAddNewSzsInPoerToFreeTable(POER, POER, PINFPERMINFO);
extern BOOL         APIENTRY FFreeFreeTable(PINFPERMINFO);
extern PPARSED_INF  APIENTRY ParsedInfAlloc(PINFPERMINFO);
extern BOOL         APIENTRY FFreeParsedInf( PPARSED_INF);
extern BOOL         APIENTRY FlushInfParsedInfo(SZ szInfName);