/* d4defs.h   (c)Copyright Sequiter Software Inc., 1988-1996. All rights reserved. */

#ifndef D4DEFS_INC
#define D4DEFS_INC

#ifdef __cplusplus
   /* only use CodeBase++ ::true() functions on older compilers
      otherwise use ::isTrue() replacment */

   #ifdef __BORLANDC__
      #if __BORLANDC__ < 0x500
         #define S4USE_TRUE
      #endif
   #endif

   #ifdef _MSC_VER
      #if _MSC_VER < 1010
         #define S4USE_TRUE
      #endif
   #endif
#endif

/*
#ifdef _MSC_VER
   #if _MSC_VER > 999
      #define S4USE_INT_DELAY
   #endif
#endif
*/

#ifndef S4DLL_BUILD
   #ifndef S4LIB_BUILD
      #define S4EXE_BUILD
   #endif
#endif

#ifndef S4INLINE
   #define S4INLINE
#endif

#ifdef S4WINTEL
   #ifndef S4OS2
      #ifndef _MSC_VER
         #define P4ARGS_USED
      #endif
   #endif
#endif

#ifdef S4SERVER
   #ifdef S4CB51
      #error - CodeBase Server cannot be built with S4CB51. Comment the S4CB51 switch.
   #endif

   /* for 5.1 version, ... */
   #define S4OFF_REPORT
#endif

/* catalog files not supported in version 6.0 */
#define S4OFF_CATALOG
#define S4OFF_SECURITY

#ifdef S4CB51
   #ifndef S4API_51_ONLY
      #ifndef S4OFF_TRAN
         #define S4OFF_TRAN
      #endif
      #ifndef S4OFF_CATALOG
         #define S4OFF_CATALOG
      #endif
      #ifndef S4OFF_SECURITY
         #define S4OFF_SECURITY
      #endif
      #ifndef S4OFF_ENFORCE_LOCK
         #define S4OFF_ENFORCE_LOCK
      #endif
   #endif
#endif

#ifdef S4UTILS
   #ifndef S4OFF_ENFORCE_LOCK
      #define S4OFF_ENFORCE_LOCK
   #endif
#endif

#ifdef S4UNIX
   #define S4DIR '/'
   #define S4DIR1 '\\'
#else
/* */
/* */
/* */
      #define S4DIR '\\'
      #define S4DIR1 '/'
/* */
#endif



/* equivalency defines should go first... */

#ifdef S4OFF_INDEX
   #ifndef S4INDEX_OFF
      #define S4INDEX_OFF
   #endif
#endif

#ifdef S4INDEX_OFF
   #ifndef S4OFF_INDEX
      #define S4OFF_INDEX
   #endif
#endif

#ifdef S4OPTIMIZE_OFF
   #ifndef S4OFF_OPTIMIZE
      #define S4OFF_OPTIMIZE
   #endif
#endif

#ifdef S4OFF_OPTIMIZE
   #ifndef S4OPTIMIZE_OFF
      #define S4OPTIMIZE_OFF
   #endif
#endif

#ifdef S4OFF_MEMO
   #ifndef S4MEMO_OFF
      #define S4MEMO_OFF
   #endif
#endif

#ifdef S4MEMO_OFF
   #ifndef S4OFF_MEMO
      #define S4OFF_MEMO
   #endif
#endif

#ifdef S4OFF_MULTI
   #ifndef S4SINGLE
      #define S4SINGLE
   #endif
#endif

#ifdef S4SINGLE
   #ifndef S4OFF_MULTI
      #define S4OFF_MULTI
   #endif
#endif

/* end of equivalency defines */

#ifndef S4SERVER
   #ifndef S4OFF_CATALOG
      #define S4OFF_CATALOG
   #endif
   #ifndef S4OFF_SECURITY
      #define S4OFF_SECURITY
   #endif
#endif

#ifdef S4OFF_CATALOG
   #ifndef S4OFF_SECURITY
      #error - Must define S4OFF_SECURITY if defining S4OFF_CATALOG
   #endif
#endif

#ifdef S4OFF_WRITE
   #ifndef S4OFF_TRAN
      #define S4OFF_TRAN
   #endif
#endif

#ifdef S4SPX
   #ifdef S4WINSOCK
      #error - Library compiled with BOTH S4WINSOCK and S4SPX.  Remove one
   #endif
#endif

#ifdef S4FOX
   #ifndef S4CLIENT_OR_FOX
      #define S4CLIENT_OR_FOX
   #endif
#endif

#ifdef S4CLIENT
   #ifndef S4OFF_WRITE_DELAY
      #define S4OFF_WRITE_DELAY
   #endif
   #ifndef S4OFF_READ_ADVANCE
      #define S4OFF_READ_ADVANCE
   #endif
   #ifndef S4CLIENT_OR_FOX
      #define S4CLIENT_OR_FOX
   #endif
   #ifndef S4OFF_OPTIMIZE
      #define S4OFF_OPTIMIZE
   #endif
   #ifndef S4OPTIMIZE_OFF
      #define S4OPTIMIZE_OFF
   #endif
   #ifdef S4OFF_INDEX
      #undef S4OFF_INDEX
   #endif
   #ifdef S4INDEX_OFF
      #undef S4INDEX_OFF
   #endif
   #ifdef S4OFF_MEMO
      #undef S4OFF_MEMO
   #endif
   #ifdef S4MEMO_OFF
      #undef S4MEMO_OFF
   #endif
   #ifdef S4OFF_MULTI
      #undef S4OFF_MULTI
   #endif
   #ifdef S4SINGLE
      #undef S4SINGLE
   #endif
   #ifndef S4SPX
      #ifndef S4WINSOCK
         #ifndef S4EXE_BUILD
            #ifdef S4CB51
               #error - Must compile with a default communication protocol (S4SPX OR S4WINSOCK)
            #else
               #ifdef S4LIB_BUILD
                  #error - Must compile with a default communication protocol (S4SPX OR S4WINSOCK)
               #endif
            #endif
         #endif
      #endif
   #endif
#else
   #ifndef S4MDX
      #ifndef S4FOX
         #ifndef S4CLIPPER
            #ifndef S4NDX
               #error - Must compile with one of the indexing options (S4MDX, S4FOX, S4CLIPPER, OR S4NDX)
            #endif
         #endif
      #endif
   #endif

   #ifndef S4SERVER
      #ifndef S4STAND_ALONE
         #error - Must compile with one of the configuration options (S4SERVER, S4CLIENT, S4STAND_ALONE)
      #endif
   #endif
#endif

#ifndef S4WIN16
   #ifndef S4WIN32
      #ifndef S4OS2
         #ifndef S4UNIX
/* */
               #ifndef S4PASCAL_WIN
                  #ifndef S4DOS
                     #error NO OPERATING SYSTEM SELECTED (S4WIN16/S4WIN32/S4DOS/S4UNIX/...)
                  #endif
               #endif
/* */
         #endif
      #endif
   #endif
#endif

#ifdef S4WIN16
   #ifndef S4WINDOWS
      #define S4WINDOWS
   #endif
#endif

#ifdef S4WIN32
   #ifndef S4CONSOLE
      #ifndef S4WINDOWS
         #define S4WINDOWS
      #endif
   #endif
   #ifdef __BORLANDC__
      /* borland's atof() causes problems... */
      #define S4NO_ATOF
   #endif
   #ifndef S4SEMAPHORE
      #define S4SEMAPHORE
   #endif
   #ifdef S4WINDOWS
      #ifndef S4OFF_THREAD
         #ifndef S4OFF_WRITE_DELAY
            #ifndef S4WRITE_DELAY
               #define S4WRITE_DELAY
            #endif
         #endif
         #ifndef S4OFF_READ_ADVANCE
            #ifndef S4READ_ADVANCE
               #define S4READ_ADVANCE
            #endif
         #endif
      #endif
   #endif
#endif

#ifdef S4OFF_WRITE_DELAY
   #ifdef S4WRITE_DELAY
      #undef S4WRITE_DELAY
   #endif
#endif

#ifdef S4OFF_READ_ADVANCE
   #ifdef S4READ_ADVANCE
      #undef S4READ_ADVANCE
   #endif
#endif

#ifdef S4READ_ADVANCE
   #ifndef S4ADVANCE_READ
      #define S4ADVANCE_READ
   #endif
#endif

#ifdef S4WRITE_DELAY
   #define S4MULTI_THREAD
#else
   #ifdef S4READ_ADVANCE
      #define S4MULTI_THREAD
   #endif
#endif


#ifdef S4OS2
   #ifndef S4CONSOLE
      #ifndef S4OS2PM
         #ifndef S4WINDOWS
            #define S4WINDOWS
         #endif
      #endif
   #endif
#endif

#ifdef S4DOS
   #ifndef S4CONSOLE
      #define S4CONSOLE
   #endif
#endif

#ifdef S4UNIX
   #ifndef S4CONSOLE
      #define S4CONSOLE
   #endif
#endif

#ifdef S4STAND_ALONE
   #ifdef S4UNIX
      #define S4OFF_COMMUNICATIONS
   #endif
   #ifdef S4OS2
      #define S4OFF_COMMUNICATIONS
   #endif
   #ifndef S4UTILS
      #ifndef S4OFF_COMMUNICATIONS
         #define S4OFF_COMMUNICATIONS
      #endif
   #endif
#endif

#ifdef S4NWSDK
   #ifndef S4SPX
      #define S4SPX
   #endif
#endif

#ifdef S4SPX
   #ifndef S4NWSDK
      #ifdef S4WINDOWS
         #define S4NWSDK
      #else
         #define S4REGISTERS
      #endif
   #endif
#endif

#ifndef S4WINDOWS
   #ifndef S4OS2PM
      #ifndef S4CODE_SCREENS
         #ifndef S4CONSOLE
            #error - Must compile with an output option( S4WINDOWS, S4OS2PM, S4CODE_SCREENS or S4CONSOLE )
         #endif
      #endif
   #endif
#endif

#ifdef S4WINDOWS
#ifdef S4CONSOLE
   #error - Both S4WINDOWS and S4CONSOLE switches set - only one is allowed.
#endif
#ifdef S4OS2PM
   #error - Both S4WINDOWS and S4OS2PM switches set - only one is allowed.
#endif
#endif

#ifdef S4CONSOLE
#ifdef S4OS2PM
   #error - Both S4CONSOLE and S4OS2PM switches set - only one is allowed.
#endif
#endif

#ifdef S4MDX
   #ifdef S4FOX
     #error - Both S4MDX and S4FOX switches set - only one is allowed.
   #endif
   #ifdef S4CLIPPER
     #error - Both S4MDX and S4CLIPPER switches set - only one is allowed.
   #endif
   #ifdef S4NDX
     #error - Both S4MDX and S4NDX switches set - only one is allowed.
   #endif
#endif

#ifdef S4FOX
   #ifdef S4CLIPPER
     #error - Both S4FOX and S4CLIPPER switches set - only one is allowed.
   #endif
   #ifdef S4NDX
     #error - Both S4FOX and S4NDX switches set - only one is allowed.
   #endif
#endif

#ifdef S4CLIPPER
   #ifdef S4NDX
     #error - Both S4CLIPPER and S4NDX switches set - only one is allowed.
   #endif
#endif
/*   OS2 2.0 SUPPORT */
#ifdef __OS2__       /* Watcom 386, Borland C++ for OS/2 */
   #define S4OS2
#endif
#ifdef __IBMC__  /* IBM C SET/2 */
   #define S4OS2
   #define S4IBMOS2
#endif
#ifdef __IBMCPP__  /* IBM C++ SET/2 */
   #define S4OS2
   #define S4IBMOS2
#endif

#ifdef __OS2__
   #ifndef S4OS2
      #define S4OS2
   #endif
   typedef unsigned HANDLE;
   #ifdef __BORLANDC__
      #if __BORLANDC__ == 0x400
         #define S4MEMCMP
      #endif
   #endif
#endif

#ifdef S4OS2
   #ifndef __WATCOMC__
      #define INCL_DOSSEMAPHORES
      #ifndef S4OS2PM
         #define INCL_NOPMAPI    /* don't include PM.H */
      #endif
      #include <os2.h>
   #endif
#endif

#ifndef S4OS2
   #ifdef S4WINTEL
      #ifndef _SIZE_T_DEFINED_     /* Watcom */
         #ifndef _SIZE_T_DEFINED      /* Microsoft, Metaware */
            #ifndef _SIZE_T              /* Borland  */
               typedef unsigned size_t ;
               #define _SIZE_T_DEFINED_           /* Used to resolve Watcom 386 warning */
               #define _SIZE_T
            #endif
         #endif
      #endif
   #endif
#endif

#ifndef _A_RDONLY
   #define _A_RDONLY 0x01                  /* Read-only attribute  */
#endif

#ifdef __HIGHC__           /* align structures to word alignment, Metaware */
  #pragma Align_members(1)
  #pragma Off(Char_default_unsigned)
#endif

#ifdef __SC__
   #pragma SC align 1      /* align structures to word alignment, Symantec */
#endif

#ifdef __WATCOMC__
   #pragma off(unreferenced)
#endif

                           /* Visual FoxPro Support */
#ifdef S4FOX
   #ifdef S4GENERAL
      #ifndef S4VFP_KEY
         #define S4VFP_KEY
      #endif
   #endif
   #ifdef S4LANGUAGE
      #error - International Language Support is done via Collating Sequences
   #endif
#else
   #ifdef S4GENERAL
      #error - S4GENERAL switch should only be set with S4FOX.
   #endif
   #ifdef S4CODEPAGE_437
      #error - CodePage Support is only compatible with S4FOX.
   #endif
   #ifdef S4CODEPAGE_1252
      #error - CodePage Support is only compatible with S4FOX.
   #endif
#endif

                           /* Foreign language support */
#ifndef S4FOX   /* VFP uses codepages and collating sequences */
   #ifdef S4GERMAN
      #define S4LANGUAGE
   #endif

   #ifdef S4FRENCH
      #define S4LANGUAGE
      #define S4VMAP
   #endif

   #ifdef S4SWEDISH
      #define S4LANGUAGE
      #define S4VMAP
   #endif

   #ifdef S4FINNISH
      #define S4LANGUAGE
      #define S4VMAP
   #endif

   #ifdef S4ANSI
      #define S4VMAP
   #endif
#endif


#ifdef S4MEMCMP
   #ifdef __cplusplus
      extern "C" {
   #endif
      int c4memcmp(const void *, const void *, size_t) ;
   #ifdef __cplusplus
   }
   #endif
   #define u4memcmp c4memcmp
#else
   #define c4memcmp memcmp
   #ifndef S4LANGUAGE
      #define u4memcmp memcmp
   #endif
#endif

#ifdef S4NO_MEMMOVE
   #ifdef __cplusplus
      extern "C" {
   #endif
   void *c4memmove(void *, const void *, size_t) ;
   #ifdef __cplusplus
      }
   #endif
#else
   #define c4memmove memmove
#endif

#ifdef S4DLL_BUILD
   #define __DLL__ 1
#endif

#ifdef S4WIN32
   #define S4NO_FILELENGTH
#else
   #ifdef __TURBOC__
      #ifndef __DLL__
         #ifdef S4DLL
            #ifdef S4CBPP
               #define S4CLASS huge
            #endif
            #define S4FUNCTION far pascal
         #endif
      #endif
   #endif

   #ifdef _MSC_VER
      #if _MSC_VER == 600
         #define S4NO_NEGATIVE_LOCK
      #endif
      #ifndef __DLL__
         #ifdef S4DLL
            #ifdef S4CBPP
               #define S4CLASS
            #endif
            #define S4FUNCTION far pascal
         #endif
      #endif
   #endif

   #ifdef __ZTC__
      #ifdef S4DLL
         #ifndef __DLL__
            #ifdef S4CBPP
               #define S4CLASS
            #endif
            #define S4FUNCTION far pascal
         #endif
      #endif
   #endif
#endif

#ifdef S4PASCAL_DOS
   #define S4PASCAL
#endif

#ifdef S4PASCAL_WIN
   #define S4PASCAL
#endif

#ifdef __DLL__
   #ifdef S4WIN32
      #define S4DLL
      #ifdef _MSC_VER
         #ifdef S4CBPP
            #define S4CLASS __declspec(dllexport)
         #endif
         #define S4EXPORT __declspec(dllexport)
         #define S4FUNCTION __stdcall
      #else
         #ifdef S4CBPP
            #define S4CLASS _export
         #endif
         #define S4FUNCTION __stdcall _export
      #endif
   #else
      #ifdef S4OS2
         #ifdef S4CBPP
            #define S4CLASS _export
         #endif
         #define S4FUNCTION _export
      #else
         #define S4DLL
         #ifdef S4CBPP
            #define S4CLASS _export
         #endif
         #define S4FUNCTION far pascal _export
      #endif
   #endif
#endif

#ifndef S4DLL_BUILD
   #ifdef S4DLL
      #ifdef S4WIN32
         #ifdef _MSC_VER
            #define S4FUNCTION __stdcall
         #endif
         #ifdef __BORLANDC__
            #define S4FUNCTION __stdcall _export
         #endif
      #endif
   #endif
#endif

#ifndef S4FUNCTION
   #define S4FUNCTION
#endif

#ifndef S4CLASS
   #define S4CLASS
#endif

#ifndef S4EXPORT
   #define S4EXPORT
#endif

#ifdef S4DLL
   #ifdef S4WIN32
      #define S4CALL _cdecl
   #else
      #ifdef S4OS2
         #define S4CALL
      #else
         #define S4CALL far _cdecl _export
      #endif
   #endif
#else
   #ifdef _MSC_VER
      #define S4CALL _cdecl S4FUNCTION
   #else
      #ifdef __ZTC__
         #define S4CALL _cdecl S4FUNCTION
      #else
         #define S4CALL S4FUNCTION
      #endif
   #endif
#endif

#ifdef S4WIN32
   #define S4NO_FILELENGTH
   #define INVALID_HANDLE_VALUE (HANDLE)-1    /* for Windows NT CreateFile */
#endif

#ifdef S4WINDOWS
   typedef unsigned int UINT ;
#endif

#ifndef TRUE
   #define TRUE 1
#endif
#ifndef FALSE
   #define FALSE 0
#endif

#ifdef S4WINDOWS
   #ifdef __TURBOC__
      #if __TURBOC__ == 0x297         /* Borland C++ 2.0 */
         #define M4PRINT sprintf
      #else
         #define M4PRINT wsprintf
      #endif
   #else
      #define M4PRINT wsprintf
   #endif
#else
   #define M4PRINT sprintf            /* DOS */
#endif

#ifndef S4WIN32
   #ifdef S4DLL
      #ifndef S4OS2
         #define S4PTR far
      #endif
   #endif
#endif

#ifndef S4PTR
   #define S4PTR
#endif

#ifdef S4NDX
   #define N4OTHER
   /* default is to use dBASE III+/Clipper memo file formats if using .NDX index file formats */
   #define S4MNDX
#endif

#ifdef S4CLIPPER
   #define N4OTHER
   /* default is to use dBASE III+/Clipper memo file formats if using .NTX index file formats */
   #define S4MNDX
   #define S4HAS_DESCENDING
#endif

#ifdef S4FOX
   /* default is to use foxpro memo file formats if using foxpro index file formats */
   #define S4MFOX
   #define S4HAS_DESCENDING
#endif

#ifdef S4UNIX
   #ifdef N4OTHER
      #error:  Clipper or dBase III support not allowed.
   #endif
#endif

#ifdef S4MDX
   #define S4MMDX
#endif

#ifdef S4MNDX
   #define   MEMO4SIZE   0x200
#endif

#ifdef S4WINTEL
   typedef  const void S4PTR *  S4CMP_PARM ;
#endif

#ifdef S4SERVER
   #ifndef S4OFF_REPORT
      #define S4OFF_REPORT
   #endif
#endif

#ifdef S4DOS
   #ifndef S4LOW_MEMORY
      #define S4LOW_MEMORY
   #endif
#endif

#ifdef S4OFF_MULTI
   #ifndef S4OFF_ENFORCE_LOCK
      #define S4OFF_ENFORCE_LOCK
   #endif
#endif

#ifdef S4TEST
   #ifndef S4TESTING
      #define S4TESTING
   #endif
   #ifndef E4HOOK
      #define E4HOOK
   #endif
   #ifndef S4NO_OUT
      #define S4NO_OUT
   #endif
#endif

/*
#ifdef S4TESTING
   #ifndef S4COMPILE_TEST
      #define S4COMPILE_TEST
   #endif
#endif
*/

#ifdef S4COMPILE_TEST
   #ifdef S4OFF_MULTI
      #define S4COMP_OFF_MULTI
   #endif
   #ifdef S4OFF_MEMO
      #define S4COMP_OFF_MEMO
   #endif
   #ifdef S4OFF_INDEX
      #define S4COMP_OFF_INDEX
   #endif
#endif

#ifdef E4DEBUG
   #ifndef E4ANALYZE
      #define E4ANALYZE
   #endif
   #ifndef E4PARM_HIGH
      #define E4PARM_HIGH
   #endif
   #ifndef E4MISC
      #define E4MISC
   #endif
   #ifndef S4TESTING
      #ifndef E4STOP_CRITICAL
         #define E4STOP_CRITICAL
      #endif
   #endif
#endif

#ifdef E4OFF
   #ifndef E4OFF_ERROR
      #define E4OFF_ERROR
   #endif
   #ifndef E4ERROR_OFF
      #define E4ERROR_OFF
   #endif
   #ifndef E4OFF_STRING
      #define E4OFF_STRING
   #endif
#endif

#ifdef E4ANALYZE_ALL
   #ifndef E4ANALYZE
      #define E4ANALYZE
   #endif
   #ifndef E4INDEX_VERIFY
      #define E4INDEX_VERIFY
   #endif
   #ifndef E4LOCK
      #define E4LOCK
   #endif
#endif

#ifdef E4ANALYZE
   #ifndef E4LINK
      #define E4LINK
   #endif
   #ifndef E4PARM_LOW
      #define E4PARM_LOW
   #endif
#endif

#ifdef S4OFF_INLINE
   #undef S4OFF_INLINE
#endif

#define WAIT4EVER -1

#ifndef S4SERVER
   #ifdef S4TESTING
      #define ATS_FILENAME_REC "RECINFO.ATS"
      #define ATS_FILENAME_CS "CSINFO.ATS"
   #endif
#endif

#ifdef S4DLL
   #define sort4assignCmp(s4,f)  (s4)->cmp = (S4CMP_FUNCTION S4PTR *) MakeProcInstance((FARPROC) f, (HINSTANCE)(s4)->codeBase->hInst)
#else
   #define sort4assignCmp(s4,f)  (s4)->cmp = (S4CMP_FUNCTION S4PTR *) (f)
#endif

/*#define TRAN4INACTIVE  110*/
/*#define TRAN4ACTIVE    120*/
/*#ifdef S4DISTRIBUTED*/
/*   #define TRAN4PARTIAL  130*/
/*#endif*/
/* #define TRAN4ROLLBACK  7 -- defined in c4trans.h */

#define S4NUM_STRING_TYPES 16

#ifndef S4SINGLE
   #define CON4LOCK            100
   #define CON4UNLOCK          200
#endif
#define CON4WRITE           300
#define CON4GO              400
#define CON4SKIP            500
#define CON4SEEK            600
#define CON4SEEK_DBL        650
#define CON4START           700
#define CON4COMMIT          800
#define CON4COMPLETE        900
#define CON4ROLLBACK       1000
#define CON4OPEN           1100
#define CON4CLOSE          1200
#define CON4RECCOUNT       1300
#ifndef S4SINGLE
   #define CON4LOCK_CONFIRM   1400
   #define CON4LOCK_GROUP        1500
#endif
/* #define CON4ABORT          1600 */
#define CON4CONNECT        1700
#define CON4DISCONNECT     1800
/* #define CON4DISCONNECTED   1900*/
#define CON4PACK           2000
#define CON4ZAP            2100
#define CON4CREATE         2200
#define CON4CANCEL         2300
#define CON4RELATE_INIT    2400
#define CON4RELATE_TOP     2500
#define CON4RELATE_BOTTOM  2600
#define CON4RELATE_DO      2700
#define CON4RELATE_DO_ONE  2800
#define CON4RELATE_FREE    2900
/* #define CON4RELATE_CHANGED 2950 */
#ifndef S4SINGLE
   #define CON4RELATE_LOCK    3000
   #define CON4RELATE_UNLOCK  3100
#endif
#define CON4RELATE_SKIP    3200
#define CON4INDEX_CREATE   3300
#define CON4INDEX_OPEN     3400
#define CON4INDEX_CLOSE    3500
#define CON4POSITION       3600
#define CON4POSITION_SET   3700
#define CON4REINDEX        3800
#define CON4CHECK          3900
#define CON4TOP            4000
#define CON4BOTTOM         4100
#define CON4APPEND         4200
#define CON4MEMO_COMPRESS  4300
#define CON4MEMO           4400
#define CON4INFO           4500
#define CON4UNIQUE_SET     4600
/*#define CON4PASSWORD       4700*/
#define CON4TRANS_INIT     4800
#define CON4RELATE_OPT     4900
#define CON4SYSTEM         5000
#define CON4TAG_SYNCH      5100
#define CON4DATE_FORMAT    5200
#define CON4TRAN_EOF       5300
#define CON4TRAN_EOF_HALT  5400
#define CON4TRAN_RESTART   5500
#define CON4INDEX_FORMAT   5600
#define CON4INDEX_INFO     5700
#define CON4INDEX_REINDEX  5800
#define CON4ACK            5900
#define CON4INDEX_FNAME    6000
#define CON4DATA_FNAME     6100
#define CON4ADD_TAG        6200
#define CON4CATALOG        6300
#define CON4REMOVE         6400
#define CON4PASSWORD_SET   6500
#define CON4RESTART        6600
#define CON4CALC_CREATE    6700
#define CON4CALC_RESET     6800
#define CON4TAG_OPEN       6900
#define CON4CRASH          7000

#define TIME4OUT 5

#ifndef S4SINGLE
   #define LOCK4OFF       0
   #define LOCK4ALL       1
   #define LOCK4DATA      2
   #define LOCK4APPEND   10
   #define LOCK4FILE     20
   #define LOCK4RECORD   30
#endif

#ifndef S4STAND_ALONE
   #ifdef S4SPX
      #ifdef S4SERVER
         #define DEF4PROTOCOL "S4SPX.DLL"
      #else
         #define DEF4PROTOCOL "C4SPX.DLL"
      #endif
   #endif
   #ifdef S4WINSOCK
      #ifdef S4SERVER
         #define DEF4PROTOCOL "S4SOCK.DLL"
      #else
         #define DEF4PROTOCOL "C4SOCK.DLL"
      #endif
   #endif
#endif

#define LEN4PASSWORD     10
#define LEN4GARBAGE     518
#define LEN4DATA_ALIAS   32
#define LEN4TAG_ALIAS    10
#define LEN4PATH        250
#define LEN4DATE_FORMAT  20
#define LEN4PROTOCOL    128
#define LEN4USER_ID      32

#define LEN4USERID       10
#define LEN4NETID        20

#define LOG4ALWAYS 2
#define LOG4ON     1
#define LOG4TRANS  0

#ifdef S4FOX
#define LEN4HEADER_WR 0x10
#endif

#define OPEN4DENY_NONE  0
#define OPEN4DENY_RW    1
#define OPEN4DENY_WRITE 2
#define OPEN4SPECIAL    3    /* for internal use only */

#define OPT4EXCLUSIVE  -1
#define OPT4OFF         0
#define OPT4ALL         1

/* used for the # of lists in the priority chain */
#define OPT4NUM_LISTS       5

#define AUTH4ALLOW 'Y'
#define AUTH4DISALLOW ' '

#define PROT4DEFAULT 0

#ifdef S4MULTI_THREAD
   #define r4queued 1
   #define r4inUse  2
   #define r4finished 3
   #define r4canceled 4
#endif

#define r4quit   9
#define r4done   1

#define r4complete 2
#define r4down 1
#define r4same 0

/* Integer Return Codes */
#define r4off         -2
#define r4success      0
#define r4found        1     /* Primary Key Match */
#define r4after        2
#define r4eof          3
#define r4bof          4
#define r4entry        5     /* No index file entry or no record (go) */
#define r4noRecords    6
#define r4descending  10
#define r4candidate   15
#define r4unique      20     /* Key is not unique, do not write/append */
#define r4uniqueContinue  25 /* Key is not unique, write/append anyway */
/* #define r4keep        30 no longer used */
/* #define r4ignore      40 no longer used */
#define r4locked      50
#define r4noCreate    60     /* Could not create file */
#define r4noOpen      70     /* Could not open file */
#define r4noTag       80     /* DataIndex::seek, with no default tag */
#define r4terminate   90     /* no relation match with terminate set */
#define r4exit       100     /* a function is requesting program termination */
#define r4inactive   110     /* transactional state */
#define r4active     120     /* transactional state */
#define r4rollback   130     /* transactional state */
#define r4authorize  140     /* lacks authorization rights to perform action */
#define r4connected  150
#define r4logOn      160
#define r4logOpen    170
#define r4logOff     180
#define r4null       190
#define r4cdx        200
#define r4mdx        201
#define r4ntx        202
#define r4ndx        203
#define r4unknown    204
/* backward compatibility redefinitions */
#define r4no_records      r4noRecords
#define r4unique_continue r4uniqueContinue
#define r4no_create       r4noCreate
#define r4no_open         r4noOpen
#define r4no_tag          r4noTag


/* collating sequence support */
#define sort4machine 0
#define sort4general 1

/* codepage support */
#define cp0      0
#define cp437    1
#define cp850    2
#define cp1252   3


/* General Disk Access Errors */
#define e4close    -10
#define e4create   -20
#define e4len      -30
#define e4lenSet   -40
#define e4lock     -50
#define e4open     -60
#define e4permiss  -61
#define e4access   -62
#define e4numFiles -63
#define e4fileFind -64
#define e4instance -69
#define e4read     -70
#define e4remove   -80
#define e4rename   -90
#define e4unlock  -110
#define e4write   -120

/* Database Specific Errors */
#define e4data      -200
#define e4fieldName -210     /* Invalid field name */
#define e4fieldType -220
#define e4recordLen -230
#define e4append    -240
#define e4seek      -250

/* Index File Specific Errors */
#define e4entry      -300     /* Tag entry not located */
#define e4index      -310
#define e4tagName    -330
#define e4unique     -340     /* Key is not unique */
#define e4tagInfo    -350     /* tag information is invalid */
#define e4candidate  -360     /* key is not unique/non-null */

/* Expression Errors */
#define e4commaExpected  -400
#define e4complete       -410
#define e4dataName       -420
#define e4lengthErr      -422
#define e4notConstant    -425
#define e4numParms       -430
#define e4overflow       -440 /* Overflow while evaluating expression */
#define e4rightMissing   -450
#define e4typeSub        -460
#define e4unrecFunction  -470
#define e4unrecOperator  -480
#define e4unrecValue     -490
#define e4unterminated   -500
#define e4tagExpr        -510 /* Expression is invalid for use in a tag - eg. DAT4 pointers */

/* Optimization Errors */
#define e4opt         -610
#define e4optSuspend  -620
#define e4optFlush    -630

/* Relation Errors */
#define e4lookupErr   -710
#define e4relate      -720
#define e4relateRefer -730   /* relation referred to does not exist or not initialized */

/* Report Errors */
#define e4report           -810
#define e4styleCreate      -811
#define e4styleSelect      -812
#define e4styleIndex       -813
#define e4areaCreate       -814
#define e4groupCreate      -815
#define e4groupExpr        -816
#define e4totalCreate      -817
#define e4objCreate        -818
#define e4repWin           -819
#define e4repOut           -820
#define e4repSave          -821
#define e4repRet           -822
#define e4repData          -823
/* backward compatibility redefinitions */
#define e4style_create     e4styleCreate
#define e4style_select     e4styleSelect
#define e4style_Index      e4styleIndex
#define e4area_create      e4areaCreate
#define e4group_create     e4groupCreate
#define e4group_expr       e4groupExpr
#define e4total_create     e4totalCreate
#define e4obj_create       e4objCreate
#define e4rep_win          e4repWin
#define e4rep_out          e4repOut
#define e4rep_save         e4repSave
#define e4rep_ret          e4repRet
#define e4rep_data         e4repData

/* Critical Errors */
#define e4info      -910  /* Unexpected information in internal variable */
#define e4memory    -920  /* Out of memory */
#define e4parm      -930  /* Unexpected parameter */
#define e4parm_null -935  /* Unexpected parameter - null input */
#define e4demo      -940  /* Exceeded maximum record number for demo */
#define e4result    -950  /* Unexpected result */
#define e4verify    -960
#define e4struct    -970

/* Library Errors */
/* call to library function calls not supported */
#define e4notIndex     -1010  /* S4OFF_INDEX */
#define e4notMemo      -1020  /* S4OFF_MEMO */
#define e4notRename    -1030  /* S4NO_RENAME */
#define e4notWrite     -1040  /* S4OFF_WRITE */
#define e4notClipper   -1050  /* S4CLIPPER */
#define e4notLock      -1060  /* S4LOCK_HOOK */
/* #define e4notHook      -1070  E4HOOK */
#define e4notSupported -1090  /* generally not supported (maybe due to server set-up) */
#define e4version      -1095  /* version mismatch */

/* MEMO errors */
#define e4memoCorrupt -1110
#define e4memoCreate  -1120

/* transaction errors */
#define e4transViolation -1200
#define e4trans       -1210
#define e4rollback    -1220
#define e4commit      -1230
#define e4transAppend -1240

/* communications errors */
#define e4corrupt     -1300
#define e4connection  -1310
#define e4socket      -1320
#define e4net         -1330
#define e4loadlib     -1340
#define e4timeOut     -1350
#define e4message     -1360
#define e4packetLen   -1370
#define e4packet      -1380

/* miscellaneous errors */
#define e4max         -1400
#define e4codeBase    -1410
#define e4name        -1420
#define e4authorize   -1430

/* e4packet means the packet is corrupted */

/* all server-specific error >2100, not only e4server returned to client */

#define e4server      -2100
#define e4config      -2110
#define e4cat         -2120

#define E4DEMO_MAX 200

/* garbage between expression and filter is length: */
#ifdef  S4FOX
   #define I4MULTIPLY       1
   #define B4DO_BACK_LEVEL  3
   #define I4MAX_KEY_SIZE 240
   #define F4MAX_NUMERIC   20
   #define F4MAX_DECIMAL   19
   #define F4DECIMAL_OFFSET 1
#else
   #ifdef N4OTHER
      #define F4MAX_NUMERIC   19
      #define F4MAX_DECIMAL   15
      #define F4DECIMAL_OFFSET 2
   #endif
   #ifdef S4MDX
      #define F4MAX_NUMERIC   20
      #define F4MAX_DECIMAL   18
      #define F4DECIMAL_OFFSET 2
   #endif

   #define I4MULTIPLY     512

   #ifdef S4NDX
      #define I4MAX_KEY_SIZE 100
   #else
      #ifdef S4CLIPPER
         #define I4MAX_KEY_SIZE 338
      #else
         #define I4MAX_KEY_SIZE 102
      #endif
   #endif
#endif

#define E4ACCURACY     1.0e-13
#define E4ACCURACY_DIGITS  15

/* if S4NO_NEGATIVE_LOCK is defined, there is no dBASE IV compatibility */

#ifdef S4CLIENT
   #define L4LOCK_POS     1000000000L
#else
   #ifndef S4SINGLE
      #ifdef N4OTHER
         #define L4LOCK_POS     1000000000L
      #endif
      #ifdef S4FOX
         #define L4LOCK_POS_OLD 0x40000000L
         #define L4LOCK_POS     0x7FFFFFFEL
      #endif
      #ifdef S4MDX
         #ifdef S4NO_NEGATIVE_LOCK
            #define L4LOCK_POS_OLD 1000000000L
            #define L4LOCK_POS     2000000000L
         #else
            #define L4LOCK_POS_OLD 0x40000000L
            #define L4LOCK_POS     0xEFFFFFFFL
         #endif
      #endif
   #endif
#endif

#ifdef S4MDX
   #define I4MAX_EXPR_SIZE 220
#endif
#ifdef S4NDX
   #define I4MAX_EXPR_SIZE 220
#endif
#ifdef S4FOX
   #define I4MAX_EXPR_SIZE 255
#endif
#ifdef S4CLIPPER
   #define I4MAX_EXPR_SIZE 255
#endif

#ifdef N4OTHER
   #ifdef S4NDX
      #define B4BLOCK_SIZE 512
   #else
      #ifdef S4CLIPPER
         #define B4BLOCK_SIZE 1024
      #endif
   #endif
#endif

#ifdef S4FOX
#define B4BLOCK_SIZE 512
#endif

#define E4DEBUG_INT 0x5281

#ifdef S4SPX
   #define S4SERVER_NAME_SIZE 47
   #define S4MAX_PACKET_SIZE 534
#endif

#ifdef S4COMNB
   #define S4SERVER_NAME_SIZE 16
#endif

#ifdef S4COMFILE
   #define S4SERVER_NAME_SIZE 80
#endif

#define S4MAX_SERVER_NAME_SIZE 80

#ifdef S4WINDOWS
   #ifdef S4SPX
      #ifndef S4NWSDK
         #define S4USE_LOW_MEMORY
      #endif
   #endif
#endif

#ifdef S4SPX
   #define S4REVERSE_FUNC
#endif

#ifndef S4CB51
   #define S4CONST const
#else
   #ifndef S4CONST
      #define S4CONST
   #endif
#endif

#ifdef S4SERVER
   #ifdef S4OFF_MEMO
      #error - CodeBase Server incorrectly built with S4OFF_MEMO
   #endif
   #ifdef S4OFF_INDEX
      #error - CodeBase Server incorrectly built with S4OFF_INDEX
   #endif
   #ifdef S4OFF_WRITE
      #error - CodeBase Server incorrectly built with S4OFF_WRITE
   #endif
   #ifdef S4OFF_MULTI
      #error - CodeBase Server incorrectly built with S4OFF_MULTI
   #endif
   #ifdef S4OFF_TRAN
      #error - CodeBase Server incorrectly built with S4OFF_TRAN
   #endif
   #ifdef S4OS2
      #error - CodeBase Server incorrectly built with S4OS2
   #endif
   #ifdef S4CONTROLS
      #error - CodeBase Server incorrectly built with S4CONTROLS
   #endif
   #ifdef S4VB_DOS
      #error - CodeBase Server incorrectly built with S4VB_DOS
   #endif
   #ifdef S4NETBIOS
      #error - CodeBase Server incorrectly built with S4NETBIOS
   #endif
   #ifdef S4COMFILE
      #error - CodeBase Server incorrectly built with S4COMFILE
   #endif
   #ifndef E4HOOK
      #error - CodeBase Server incorrectly built without E4HOOK
   #endif
   #ifdef S4VBX
      #error - CodeBase Server incorrectly built with S4VBX
   #endif
   #ifdef S4SQL
      #error - CodeBase Server incorrectly built with S4SQL
   #endif
   #ifdef S4OS2DLL
      #error - CodeBase Server incorrectly built with S4OS2DLL
   #endif
   #ifdef S4OS2PM
      #error - CodeBase Server incorrectly built with S4OS2PM
   #endif
   #ifdef S4UNIX
      #error - CodeBase Server incorrectly built with S4UNIX
   #endif
/* */
/* */
/* */
   #ifdef S4CODE_SCREENS
      #error - CodeBase Server incorrectly built with S4CODE_SCREENS
   #endif
   #ifdef S4PASCAL_DOS
      #error - CodeBase Server incorrectly built with S4PASCAL_DOS
   #endif
   #ifdef S4PASCAL_WIN
      #error - CodeBase Server incorrectly built with S4PASCAL_WIN
   #endif
   #ifdef S4OFF_COMMUNICATIONS
      #error - CodeBase Server incorrectly built with S4OFF_COMMUNICATIONS
   #endif
   #ifdef S4NT_DOS
      #error - CodeBase Server incorrectly built with S4NT_DOS
   #endif
   #ifdef S4DEBUG_LOG
      #error - CodeBase Server incorrectly built with S4DEBUG_LOG
   #endif
#endif

#ifdef S4NWSDK
   #ifdef S4DOS
      #error S4NWSDK unsupported in DOS configuration
   #endif
#endif

#define even4up( a ) ( a + ( ( a / 2 ) * 2 != a ) )

#ifndef S4CONV_REP  /* required for building crep2.exe */
#ifdef S4CB51
   #ifndef S4DLL_BUILD
      #ifndef S4LIB_BUILD
         #ifndef S4CBPP
            #define S4CONV( a, b )  b    /* arguement 'b' is the old naming convention*/
         #else
            #define S4CONV( a, b )  union { a ; b ; }  /* creating union declaration*/
         #endif
      #endif
   #endif
#endif
#endif

#ifndef S4CONV
   #define S4CONV( a, b )  a
#endif

#ifdef S4CONV
   #ifdef S4CB51
      #ifndef S4CBPP
         #define lastNode  last_node
         #define errorCode error_code
      #else
         #define createError        create_error
         #define defaultUniqueError default_unique_error
         #define exprError          expr_error
         #define fieldNameError     field_name_error
         #define goError            go_error
         #define offError           off_error
         #define openError          open_error
         #define relateError        relate_error
         #define skipError          skip_error
         #define tagNameError       tag_name_error
      #endif
   #endif
#endif

#ifdef S464BIT
   #define S4LONG int
#else
   #define S4LONG long
#endif

#ifdef S4READ_ADVANCE
   #define AR4EMPTY  1
   #define AR4SET    2
   #define AR4FULL   3
#endif

#endif /* D4DEFS_INC */