/*++

Copyright (c) 1992  Microsoft Corporation

Module Name:

    parseini.h

Abstract:

    Common header file for parsing .ini files

Author:

    John Vert (jvert) 6-Oct-1993

Environment:

    ARC environment

Revision History:

--*/
#include "bldr.h"
#include "setupblk.h"
#include "stdio.h"
#include "stdarg.h"


//
// Defines for *externally* fulfilled error handling routines.  setupldr and osloader each
// have different versions of these routines.
//

#if DEVL

#define SlError(x) SlErrorBox(x , __LINE__, __FILE__ )

#else

#define SlError(x)

#endif

#define SlNoMemoryError() SlNoMemError(__LINE__, __FILE__ )

VOID
SlNoMemError(
    IN ULONG Line,
    IN PCHAR File
    );

VOID
SlBadInfLineError(
    IN ULONG Line,
    IN PCHAR INFFile
    );

VOID
SlErrorBox(
    IN ULONG MessageId,
    IN ULONG Line,
    IN PCHAR File
    );

VOID
SlFatalError(
    IN ULONG MessageId,
    ...
    );

VOID
SlFriendlyError(
    IN ULONG uStatus,
    IN PCHAR pchBadFile,
    IN ULONG uLine,
    IN PCHAR pchCodeFile
    );



//
// Routines for parsing the setupldr.ini file
//

#define SIF_FILENAME_INDEX 0

extern PVOID InfFile;
extern PVOID WinntSifHandle;

ARC_STATUS
SlInitIniFile(
   IN  PCHAR   DevicePath,
   IN  ULONG   DeviceId,
   IN  PCHAR   INFFile,
   OUT PVOID  *pINFHandle,
   OUT PVOID  *pINFBuffer OPTIONAL,
   OUT PULONG  INFBufferSize OPTIONAL,
   OUT PULONG  ErrorLine
   );

PCHAR
SlGetIniValue(
    IN PVOID InfHandle,
    IN PCHAR SectionName,
    IN PCHAR KeyName,
    IN PCHAR Default
    );

#ifdef UNICODE
PWCHAR
SlGetIniValueW(
    IN PVOID InfHandle,
    IN PCHAR SectionName,
    IN PCHAR KeyName,
    IN PWCHAR Default
    );
#endif


PCHAR
SlGetKeyName(
    IN PVOID INFHandle,
    IN PCHAR SectionName,
    IN ULONG LineIndex
    );

#ifdef UNICODE
PWCHAR
SlGetKeyNameW(
    IN PVOID INFHandle,
    IN PCHAR SectionName,
    IN ULONG LineIndex
    );
#endif

ULONG
SlGetSectionKeyOrdinal(
    IN  PVOID INFHandle,
    IN  PCHAR SectionName,
    IN  PCHAR Key
    );

PCHAR
SlGetSectionKeyIndex (
   IN PVOID INFHandle,
   IN PCHAR SectionName,
   IN PCHAR Key,
   IN ULONG ValueIndex
   );

#ifdef UNICODE
PWCHAR
SlGetSectionKeyIndexW (
   IN PVOID INFHandle,
   IN PCHAR SectionName,
   IN PCHAR Key,
   IN ULONG ValueIndex
   );
#endif

PTCHAR
SlCopyString(
    IN PTCHAR String
    );

PCHAR
SlCopyStringA(
    IN PCSTR String
    );

PWCHAR
SlCopyStringAW(
    IN PCHAR String
    );

#ifdef UNICODE
#define SlCopyStringAT  SlCopyStringAW
#else
#define SlCopyStringAT  SlCopyStringA
#endif

PCHAR
SlGetSectionLineIndex (
   IN PVOID INFHandle,
   IN PCHAR SectionName,
   IN ULONG LineIndex,
   IN ULONG ValueIndex
   );

#ifdef UNICODE
PWCHAR
SlGetSectionLineIndexW (
   IN PVOID INFHandle,
   IN PCHAR SectionName,
   IN ULONG LineIndex,
   IN ULONG ValueIndex
   );
#endif


ULONG
SlCountLinesInSection(
    IN PVOID INFHandle,
    IN PCHAR SectionName
    );

BOOLEAN
SpSearchINFSection (
   IN PVOID INFHandle,
   IN PCHAR SectionName
   );

PCHAR
SlSearchSection(
    IN PCHAR SectionName,
    IN PCHAR TargetName
    );

ARC_STATUS
SpFreeINFBuffer (
   IN PVOID INFHandle
   );