text: /*++
  
  Copyright (c) 1999 Microsoft Corporation
  
  Module Name:
  
      ini.h
  
  Abstract:
  
      Declares interface for INI wrapper routines. These routines simplify
      access of INIs by wrapping the Win32 APIs with routines that use pools.
  
  Author:
  
      04-Nov-1999 Ovidiu Temereanca (ovidiut) - File creation.
  
  Revision History:
  
      <alias> <date> <comments>
  
  --*/
  
  //
  // Types
  //
  
  typedef struct {
      PCSTR   IniFilePath;
      DWORD   OriginalAttributes;
  } INIFILEA, *PINIFILEA;
  
  typedef struct {
      PCWSTR  IniFilePath;
      DWORD   OriginalAttributes;
  } INIFILEW, *PINIFILEW;
  
  
  typedef struct {
      PCSTR   CurrentSection;
      PCSTR   Sections;
  } INISECT_ENUMA, *PINISECT_ENUMA;
  
  typedef struct {
      PCWSTR  CurrentSection;
      PCWSTR  Sections;
  } INISECT_ENUMW, *PINISECT_ENUMW;
  
  
  typedef struct {
      PCSTR   CurrentKeyValuePair;
      PCSTR   KeyValuePairs;
      PCSTR   CurrentKey;
      PCSTR   CurrentValue;
      PSTR    Private;
  } INIKEYVALUE_ENUMA, *PINIKEYVALUE_ENUMA;
  
  typedef struct {
      PCWSTR  CurrentKeyValuePair;
      PCWSTR  KeyValuePairs;
      PCWSTR  CurrentKey;
      PCWSTR  CurrentValue;
      PWSTR   Private;
  } INIKEYVALUE_ENUMW, *PINIKEYVALUE_ENUMW;
  
  //
  // Public function prototypes
  //
  
  BOOL
  Ini_Init (
      VOID
      );
  
  VOID
  Ini_Exit (
      VOID
      );
  
  
  BOOL
  RealIniFileOpenA (
      OUT     PINIFILEA IniFile,
      IN      PCSTR IniFileSpec,
      IN      BOOL FileMustExist /*,*/
      ALLOCATION_TRACKING_DEF   /* , PCSTR File, UINT Line */
      );
  
  #define IniFileOpenA(i,path,b)  TRACK_BEGIN(BOOL, IniFileOpenA)\
                                  RealIniFileOpenA((i),(path),(b)/*,*/ ALLOCATION_TRACKING_CALL)\
                                  TRACK_END()
  
  BOOL
  RealIniFileOpenW (
      OUT     PINIFILEW IniFile,
      IN      PCWSTR IniFileSpec,
      IN      BOOL FileMustExist /*,*/
      ALLOCATION_TRACKING_DEF   /* , PCSTR File, UINT Line */
      );
  
  #define IniFileOpenW(i,path,b)  TRACK_BEGIN(BOOL, IniFileOpenW)\
                                  RealIniFileOpenW((i),(path),(b)/*,*/ ALLOCATION_TRACKING_CALL)\
                                  TRACK_END()
  
  
  VOID
  IniFileCloseA (
      IN      PINIFILEA IniFile
      );
  
  VOID
  IniFileCloseW (
      IN      PINIFILEW IniFile
      );
  
  BOOL
  EnumFirstIniSectionA (
      OUT     PINISECT_ENUMA IniSectEnum,
      IN      PINIFILEA IniFile
      );
  
  BOOL
  EnumFirstIniSectionW (
      OUT     PINISECT_ENUMW IniSectEnum,
      IN      PINIFILEW IniFile
      );
  
  BOOL
  EnumNextIniSectionA (
      IN OUT  PINISECT_ENUMA IniSectEnum
      );
  
  BOOL
  EnumNextIniSectionW (
      IN OUT  PINISECT_ENUMW IniSectEnum
      );
  
  VOID
  AbortIniSectionEnumA (
      IN OUT  PINISECT_ENUMA IniSectEnum
      );
  
  VOID
  AbortIniSectionEnumW (
      IN OUT  PINISECT_ENUMW IniSectEnum
      );
  
  BOOL
  EnumFirstIniKeyValueA (
      OUT     PINIKEYVALUE_ENUMA IniKeyValueEnum,
      IN      PINIFILEA IniFile,
      IN      PCSTR Section
      );
  
  BOOL
  EnumFirstIniKeyValueW (
      OUT     PINIKEYVALUE_ENUMW IniKeyValueEnum,
      IN      PINIFILEW IniFile,
      IN      PCWSTR Section
      );
  
  BOOL
  EnumNextIniKeyValueA (
      IN OUT  PINIKEYVALUE_ENUMA IniKeyValueEnum
      );
  
  BOOL
  EnumNextIniKeyValueW (
      IN OUT  PINIKEYVALUE_ENUMW IniKeyValueEnum
      );
  
  VOID
  AbortIniKeyValueEnumA (
      IN OUT  PINIKEYVALUE_ENUMA IniKeyValueEnum
      );
  
  VOID
  AbortIniKeyValueEnumW (
      IN OUT  PINIKEYVALUE_ENUMW IniKeyValueEnum
      );
  
  BOOL
  IniReadValueA (
      IN      PINIFILEA IniFile,
      IN      PCSTR Section,
      IN      PCSTR Key,
      OUT     PSTR* Value,            OPTIONAL
      OUT     PDWORD Chars            OPTIONAL
      );
  
  BOOL
  IniReadValueW (
      IN      PINIFILEW IniFile,
      IN      PCWSTR Section,
      IN      PCWSTR Key,
      OUT     PWSTR* Value,           OPTIONAL
      OUT     PDWORD Chars            OPTIONAL
      );
  
  VOID
  IniFreeReadValueA (
      IN      PCSTR Value
      );
  
  VOID
  IniFreeReadValueW (
      IN      PCWSTR Value
      );
  
  BOOL
  IniWriteValueA (
      IN      PINIFILEA IniFile,
      IN      PCSTR Section,
      IN      PCSTR Key,
      IN      PCSTR Value
      );
  
  BOOL
  IniWriteValueW (
      IN      PINIFILEW IniFile,
      IN      PCWSTR Section,
      IN      PCWSTR Key,
      IN      PCWSTR Value
      );
  
  
  //
  // ANSI/UNICODE mappings.
  //
  #ifdef UNICODE
  
  #define INIFILE                         INIFILEW
  #define INISECT_ENUM                    INISECT_ENUMW
  #define INIKEYVALUE_ENUM                INIKEYVALUE_ENUMW
  
  #define IniFileOpen                     IniFileOpenW
  #define IniFileClose                    IniFileCloseW
  #define EnumFirstIniSection             EnumFirstIniSectionW
  #define EnumNextIniSection              EnumNextIniSectionW
  #define AbortIniSectionEnum             AbortIniSectionEnumW
  #define EnumFirstIniKeyValue            EnumFirstIniKeyValueW
  #define EnumNextIniKeyValue             EnumNextIniKeyValueW
  #define AbortIniKeyValueEnum            AbortIniKeyValueEnumW
  #define IniReadValue                    IniReadValueW
  #define IniFreeReadValue                IniFreeReadValueW
  #define IniWriteValue                   IniWriteValueW
  
  #else
  
  #define INIFILE                         INIFILEA
  #define INISECT_ENUM                    INISECT_ENUMA
  #define INIKEYVALUE_ENUM                INIKEYVALUE_ENUMA
  
  #define IniFileOpen                     IniFileOpenA
  #define IniFileClose                    IniFileCloseA
  #define EnumFirstIniSection             EnumFirstIniSectionA
  #define EnumNextIniSection              EnumNextIniSectionA
  #define AbortIniSectionEnum             AbortIniSectionEnumA
  #define EnumFirstIniKeyValue            EnumFirstIniKeyValueA
  #define EnumNextIniKeyValue             EnumNextIniKeyValueA
  #define AbortIniKeyValueEnum            AbortIniKeyValueEnumA
  #define IniReadValue                    IniReadValueA
  #define IniFreeReadValue                IniFreeReadValueA
  #define IniWriteValue                   IniWriteValueA
  
  #endif
  
  