/*
 * ALDEFS.H
 *
 *  Header file for ArchiveLib 1.0
 *
 *  Copyright (c) 1994 Greenleaf Software, Inc.
 *  All Rights Reserved
 *
 * DESCRIPTION
 *
 *  This is the setup file for ArchiveLib.  Everyone else has to include
 *  it, because all of the macros defined in here help to control
 *  how the library operates.  Normally you will never have to include
 *  this header file, because it is included by ARCLIB.H, and consequently,
 *  everyone else.
 *
 * MACROS
 *
 * These are all calculated automatically for supported compilers.
 *
 *  AL_WINDOWS_GUI     : This library uses the Windows GUI API
 *  AL_WINDOWS_MEMORY  : This library uses the Windows Memory API
 *  AL_FLAT_MODEL      : This library uses 386 Flat Model
 *  AL_LARGE_DATA      : Data uses 16:16 data pointer
 *  AL_OS2             : Some day.
 *  AL_UNIX            : Some day.
 *
 *  AL_BUILDING_DLL    : Building the Windows DLL
 *  AL_USING_DLL       : Linking to the Windows DLL
 *
 *  AL_SYMANTEC        : Compiler selection
 *  AL_BORLAND         : Compiler selection
 *  AL_MICROSOFT       : Compiler selection
 *  AL_WATCOM          : Compiler selection
 *
 *  Based on those settings, we can set this:
 *
 *  AL_WIN32S          : This is NT or Win32s
 *
 *                     AL_WINDOWS_GUI  AL_WINDOWS_MEMORY  AL_FLAT_MODEL
 * Vanilla DOS              NO                NO               NO
 * Borland DPMI16           NO                YES              NO
 * Borland DPMI32           NO                YES              YES
 * Symantec DOSX            NO                NO               YES
 * Win32s                   YES               YES              YES
 * Vanilla Windows          YES               YES              NO
 * 
 *  Finally, we use those to create these things used in prototypes:
 *
 *  AL_CLASS_TYPE     : Sometimes "export", for classes in DLLs
 *  AL_PROTO          : Sometimes "export", for functions in DLLs
 *  AL_DLL_FAR        : Sometimes "far", for arguments being passed to DLLs
 *  AL_FUNCTION       : Vanilla exported functions are "_export pascal"
 *  AL_CFUNCTION      : Variable argument export functions are "_export cdecl"
 *
 * PROTOTYPES:
 *
 *
 * ENUMERATED TYPES:
 *
 *  ALMonitorType                  : Used to indicate whether a monitor
 *                                   is watching objects or an entire job.
 *
 *  ALWindowsMessageType           : To indicate whether an object of
 *                                   class ALMonitor is supposed to be
 *                                   sending total byte counts or
 *                                   percentage complete ratios.
 *
 *  ALErrors                       : The global list of errors.
 *
 *  ALCase                         : Used by ALName to indicate case
 *                                   sensitivity/handling
 *
 *  ALGreenleafCompressionLevels   : The five levels used by ALGreenleafEngine.
 *
 *  ALTraverseSetting              : Used to indicate whether class
 *                                   ALWildCardExpander will traverse
 *                                   subdirectories when searching.
 *
 *  ALStorageType                  : The type of a storage engine.
 *
 *  ALCompressionType              : The type of a compression engine.
 *
 * REVISION HISTORY
 *
 *  May 26, 1994  1.0A  : First release
 *
 */
#ifndef _ALDEFS_H
#define _ALDEFS_H
/*
 *  The next long set of definitions and tests are all here simply to
 *  determine which compiler we are using, and what sort of target
 *  configuration we are trying to build/use.
 */
#if defined(__BORLANDC__) || defined(__TURBOC__)
  #if defined( __WIN32__ )
    #define AL_FLAT_MODEL
  #endif
  #if !defined( __BORLANDC__ )
      #define AL_BORLAND __TURBOC__
  #else
      #define AL_BORLAND __BORLANDC__
  #endif
  #if sizeof( void * ) == 4
    #define AL_LARGE_DATA
  #endif
  #if defined( _Windows )
    #define AL_WINDOWS_MEMORY
    #ifdef __DLL__
      #define AL_BUILDING_DLL
    #endif
    #if !defined( __DPMI16__ ) && !defined( __CONSOLE__ )
      #define AL_WINDOWS_GUI
    #endif
  #endif
#elif defined( __SC__ )
  #define AL_SYMANTEC _MSC_VER
  #if defined( __NT__ )
    #define AL_FLAT_MODEL
    #define AL_WINDOWS_MEMORY
    #define AL_WINDOWS_GUI
  #endif
  #if defined( _M_I86HM ) || defined( _M_I86CM ) || defined( _M_I86LM )
    #define AL_LARGE_DATA
  #endif
/*
 * The _WINDOWS and _WINDLL macros are only documented in LIBRARY.TXT
 */
  #ifdef _WINDOWS
    #define AL_WINDOWS_MEMORY
    #define AL_WINDOWS_GUI
    #ifdef _WINDLL
      #define AL_BUILDING_DLL
      #ifndef M_I86LM
        #error All DLLs must be built using Large Model!
      #endif
    #endif
  #endif
#elif defined( _MSC_VER )
  #define AL_MICROSOFT _MSC_VER
  #if defined( _M_I86HM ) || defined( _M_I86CM ) || defined( _M_I86LM )
    #define AL_LARGE_DATA
  #endif
  #if ( AL_MICROSOFT >= 800 )
/*
 * I really don't want MSC to tell me when it is using a precompiled
 * header file.  What is really dumb is that I probably do want it
 * to tell me when it is creating one, but they generate the same
 * warning!
 */
    #pragma warning( disable : 4699 )
/*
 * This error occurs if you have inline functions in a header file and
 * they don't get used in a particular file.  Bogus.
 */
    #pragma warning( disable : 4505 )
/*
 * This warning occurs if you are using assert() macros with NDEBUG and /Ox
 * it is bogus
 */
    #pragma warning( disable : 4705 )
/*
 * This gives a warning for cout << setw( x )
 */
    #pragma warning( disable : 4270 )
/*
 * This is informational, it tells me when a function has been
 * chosen for inlining.
 */
    #pragma warning( disable : 4711 )
/*
 * This is informational, it tells me when a function has been
 * rejected for inlining.  The funny part is that it gives
 * me this message even if I don't select inlining for that
 * particular function???
 */
    #pragma warning( disable : 4710 )
  #else  /*#if ( AL_MICROSOFT >= 800 ) */
/*
 * Microsoft C 7.0 has a major linker problems if a symbol exceeds
 * 64 characters.  Unfortunately, with full decoration, we have
 * a couple of functions that hit that wall.  So I have to redefine
 * a couple of innocuous class names. I am trying to use similar
 * names so that if you hit them in the debugger you will be able
 * to understand what they mean.
 *
 *  #if defined( _WINDLL )
 *     #define ALWindowsMessage ALWinMsg_
 *      #define ALCompressionEngine ALEngine_
 *  #endif  NOTE: Fixing problem with /H64 in BUILD.INI! */
  #endif /*#if ( AL_MICROSOFT >= 800 ) ... #else */
  #ifdef _WINDOWS
    #define AL_WINDOWS_MEMORY
    #define AL_WINDOWS_GUI
    #ifdef _WINDLL
      #define AL_BUILDING_DLL
      #ifndef M_I86LM
        #error All DLLs must be built using Large Model!
      #endif
    #endif
  #endif
#elif defined( __WATCOMC__ ) && defined( __386__ )
  #define AL_FLAT_MODEL
  #ifdef __WINDOWS__
    #define AL_WINDOWS_MEMORY
    #define AL_WINDOWS_GUI
  #endif
  #pragma warning 690 9 /*  Warning for AL_ASSERT() at /w3 */
  #pragma warning 549 9 /*  Warning for sizeof() on class */
#elif defined( __GNUC__ )
  #define AL_FLAT_MODEL
  #ifdef __WINDOWS__
    #define AL_WINDOWS_MEMORY
    #define AL_WINDOWS_GUI
  #endif
#elif defined( __WATCOMC__ ) && !defined( __386__ )
  #define AL_WATCOM
  #ifdef __WINDOWS__
    #define AL_WINDOWS_MEMORY
    #define AL_WINDOWS_GUI
    #ifdef __SW_ZU
      #define AL_BUILDING_DLL
      #ifndef M_I86LM
        #error All DLLs must be built using Large Model!
      #endif
    #endif
  #endif
  #if defined( _M_I86HM ) || defined( _M_I86CM ) || defined( _M_I86LM )
    #define AL_LARGE_DATA
  #endif
  #pragma warning 549 9 /*  Warning for sizeof() on class */
#elif defined( __IBMC__ ) || defined( __IBMCPP__ )
  #define AL_IBM
  #define AL_OS2
  #define AL_FLAT_MODEL
#else
  #error "Unknown compiler!"
#endif

#if defined( AL_WINDOWS_MEMORY ) || defined( AL_WINDOWS_GUI )
  #define STRICT
  #include <windows.h>
  #ifdef AL_FLAT_MODEL
    #define AL_HUGE
  #else
    #define AL_HUGE _huge
  #endif
#else
  #define WORD unsigned int
  #define DWORD unsigned long
#endif

#if defined( AL_WINDOWS_GUI ) && defined( AL_WINDOWS_MEMORY ) && defined( AL_FLAT_MODEL )
  #define AL_WIN32S
#endif

#if defined( AL_BUILDING_DLL )
  #if defined( AL_FLAT_MODEL )
    #define AL_CLASS_TYPE     _export
    #define AL_PROTO          _export
    #define AL_DLL_FAR
    #define AL_FUNCTION       _export pascal
    #define AL_CFUNCTION      _export cdecl
  #elif defined( AL_WATCOM )
    #define AL_CLASS_TYPE
    #define AL_PROTO          _export
    #define AL_DLL_FAR
    #define AL_FUNCTION       _export _far pascal
    #define AL_CFUNCTION      _export _far cdecl
  #else
    #define AL_CLASS_TYPE     _export
    #define AL_PROTO          _far
    #define AL_DLL_FAR        _far
    #define AL_FUNCTION       _export _far pascal
    #define AL_CFUNCTION      _export _far cdecl
  #endif
#elif defined( AL_USING_DLL )
  #if defined( AL_FLAT_MODEL ) && defined( AL_BORLAND )
    #define AL_CLASS_TYPE     _import
    #define AL_PROTO          _import
    #define AL_DLL_FAR
    #define AL_FUNCTION       _import pascal
    #define AL_CFUNCTION      _import cdecl
  #elif defined( AL_FLAT_MODEL ) && defined( AL_SYMANTEC )
    #define AL_CLASS_TYPE     _export
    #define AL_PROTO          _export
    #define AL_DLL_FAR
    #define AL_FUNCTION       _export pascal
    #define AL_CFUNCTION      _export cdecl
  #elif defined( AL_WATCOM )
    #define AL_PROTO
    #define AL_DLL_FAR
    #define AL_CLASS_TYPE
    #define AL_FUNCTION       _far _pascal
    #define AL_CFUNCTION      _far cdecl
  #else
    #define AL_PROTO          _far
    #define AL_DLL_FAR        _far
    #ifdef AL_BORLAND
      #if ( AL_BORLAND >= 0x450 )
        #define AL_CLASS_TYPE _import
      #else
        #define AL_CLASS_TYPE   _huge
      #endif
    #else
      #define AL_CLASS_TYPE   _export
    #endif
    #define AL_FUNCTION       _export _far _pascal
    #define AL_CFUNCTION      _export _far cdecl
  #endif
#else
  #define AL_PROTO
  #define AL_CLASS_TYPE
  #define AL_DLL_FAR
  #define AL_FUNCTION
  #define AL_CFUNCTION
#endif

/*
 * All objects of type ALMonitor are set up to monitor jobs or objects.
 * This enum is passed to the constructor to select which one is desired.
 */
enum ALMonitorType {
    AL_MONITOR_OBJECTS,
    AL_MONITOR_JOB
};

/*
 * An ALMonitor object can either send out byte counts or percentage
 * complete ratios.  When constructing the object, this enum indicates
 * which strategy is going to be used.
 */
enum ALWindowsMessageType {
    AL_SEND_BYTE_COUNT,
    AL_SEND_RATIO,
};

/*
 * Global enumerated error codes
 */
enum ALErrors {  
        AL_CANT_OPEN_BUFFER = -1200,
        AL_CANT_ALLOCATE_MEMORY,
        AL_CANT_CREATE_ENGINE,
        AL_CANT_CREATE_STORAGE_OBJECT,
        AL_RENAME_ERROR,
        AL_CANT_OPEN_FILE,
        AL_SEEK_ERROR,
        AL_READ_ERROR,
        AL_WRITE_ERROR,
        AL_DELETE_ERROR,
        AL_ILLEGAL_PARAMETER,
        AL_INTERNAL_ERROR,
        AL_USER_ABORT,
        AL_SERVER_NOT_PRESENT,
        AL_COMPRESSION_TYPE_MISMATCH,
        AL_NEED_LENGTH,
        AL_CRC_ERROR,
        AL_COMPARE_ERROR,
        AL_UNKNOWN_COMPRESSION_TYPE,
        AL_UNKNOWN_STORAGE_OBJECT,
        AL_INVALID_ARCHIVE,
        AL_LOGIC_ERROR,
        AL_BACKUP_FAILURE,
        AL_GETSEL_ERROR,
        AL_DUPLICATE_ENTRY,
        AL_END_OF_FILE = -1,
        AL_SUCCESS = 0
};

/*
 * Enum used by ALName guys.  Names can either be forced to upper
 * or lower case, or support normal mixed case representations.  Objects
 * like MS-DOS file names should be forced to upper or lower, since the
 * O/S keeps the names as case insensitive.
 */

enum ALCase {
    AL_UPPER,
    AL_LOWER,
    AL_MIXED
};

/*
 * Compressing levels used by the Greenleaf Engine.  In the archive, this
 * ratio is stored in the engine private data.
 */
enum ALGreenleafCompressionLevels {
    AL_GREENLEAF_COPY    = -1,
    AL_GREENLEAF_LEVEL_0 = 0,
    AL_GREENLEAF_LEVEL_1,
    AL_GREENLEAF_LEVEL_2,
    AL_GREENLEAF_LEVEL_3,
    AL_GREENLEAF_LEVEL_4,
};

/*
 * Used when constructing ALWildCardExpander objects.  It decides whether
 * the expander will traverse the entire subdirectory tree, or just stay
 * on the current level.
 */

enum ALTraverseSetting {
    AL_TRAVERSE = 1,
    AL_DONT_TRAVERSE = 0,
};

/*
 * The type of storage object.  This is stored in the base class, ALStorage,
 * and is initialized in the constructor.
 */
enum ALStorageType {
    AL_UNDEFINED     = -1,
    AL_MEMORY_OBJECT = 0,
    AL_FILE_OBJECT   = 1 };

/*
 * The type of compression engine.  This is stored in the base class,
 * ALEngine, and is initialized in the constructor.
 */
enum ALCompressionType {
    AL_COMPRESSION_COPY = 0,
    AL_COMPRESSION_GREENLEAF = 1
};

#endif
