/* Copyright (C) Magna Carta Software, Inc. 1988-1991. All Rights Reserved C COMMUNICATIONS TOOLKIT AND C WINDOWS TOOLKIT COMPAT.H -- This file makes code campatible across Turbo C, Microsoft C 5.0+/Quick C, Mix Power C and Watcom C. NOTE: Include this file BEFORE the compiler header files. */ #if !defined(COMPAT_H_INCLUDED) #define COMPAT_H_INCLUDED /* THIS CODE DETECTS MSC, QUICK C, WATCOM C WATCOM C/386, INTEL CODE BUILDER AND NDP C-386. */ #if (!defined(__POWERC) && !defined(__TURBOC__) && !defined(MSC)) #if (!defined(_INTELC32_) && !defined(__HIGHC__)) #if !defined(__WATCOMC__) #if defined(M_I86) #define MSC #elif !defined(__NDPC__) #define __NDPC__ #endif #endif #endif #endif #if defined(__TURBOC__) #if (defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__)) #define CCT_SMALL_DATA #endif /* MS-WINDOWS COMPATIBILITY MACROS */ #if !defined(CCTW) #define DCB void #define COMSTAT void #include #endif /* ANSI COMPATIBILITY MACROS */ #define FCALL_ #define NEAR_ near #define FAR_ far #define HUGE_ huge #define CDECL_ cdecl #define INTERRUPT_ interrupt far /* MSC COMPATIBILITY MACROS */ #define _disable() disable() #define _enable() enable() /* SYSTEM COMPATIBILITY MACROS */ #define BIOS_SEG 0 #define memavail() coreleft() #define memcalloc(a, b) calloc((a), (b)) #define memfree(a) free(a) /* CCT/ED COMPATIBILITY MACROS */ #if defined(DOSX286) /* using Phar Lap 286|DOS Extender */ #include #else #define install_cas_isr #define get_vector(a) getvect((a)) #define set_vector(a, b) setvect((a), ((void interrupt (far *)())(b))) #endif /* SELF-COMPATIBILITY MACROS! */ #if (defined(__TURBOC__) && !defined(__BORLANDC__)) #define outpw(port, value) outport((port),(value)) #endif #endif #if defined(__POWERC) #if __POWERC < 200 #error Version 2.0.0 or later of Power C required #elif __POWERC >= 200 #pragma library "cctp20?.lib" #endif /* MS-WINDOWS COMPATIBILITY MACROS */ #if !defined(CCTW) #define DCB void #define COMSTAT void #include #endif #if (defined(__TINY__) || defined(__SMALL_) || defined(__MEDIUM__)) #define CCT_SMALL_DATA #endif #if defined(USE_PCTRACE) typedef void WINDOW; typedef void VSCREEN; typedef void BUFFER; /* popup_menu, tsr_clock, field, startup ? */ #endif /* ANSI COMPATIBILITY MACROS */ #define FCALL_ #define NEAR_ near #define FAR_ far #define HUGE_ huge #define CDECL_ #define INTERRUPT_ interrupt far /* MSC COMPATIBILITY MACROS */ #define _disable() disable() #define _enable() enable() /* SYSTEM COMPATIBILITY MACROS */ #define get_vector(a) getvect((a)) #define install_cas_isr #define memavail() coreleft() #define memcalloc(a, b) calloc((a), (b)) #define memfree(a) free(a) #define outpw(port, value) outport((port),(value)) #define set_vector(a, b) setvect((a), ((void interrupt (far *)())(b))) #endif #if defined(MSC) /* This identifier is defined under CCT/Windows */ #if (!defined(CCTW) && !defined(_WINDOWS)) #define DCB void #define COMSTAT void #endif /* The following macros make MS-DOS extensions more portable */ #if (defined(M_I86TM) || defined(M_I86SM) || defined(M_I86MM)) #define CCT_SMALL_DATA #endif #if defined(_MSC_VER) #if !defined(FCALL_) #define FCALL_ _fastcall #endif #define NEAR_ _near #define FAR_ _far #define HUGE_ _huge #define CDECL_ _cdecl #else #if !defined(FCALL_) #define FCALL_ #endif #define NEAR_ near #define FAR_ far #define HUGE_ huge #define CDECL_ cdecl #endif #define INTERRUPT_ CDECL_ interrupt FAR_ /* MEMORY-RELATED */ #if defined(CTC) #include #else #define memcalloc(a, b) calloc((a), (b)) #define memfree(a) free(a) #endif /* The following macro creates a far pointer at a user-specified address Under MSC 5.0 ONLY, put this macro in comments and follow the instructions below to use the equivalent function. */ #define MK_FP(seg,ofs) ((void far *)((((unsigned long)(seg)) << 16) | (ofs))) #if 0 /* MSC 5.0 ONLY! This function replaces the above macro due to a bug in the compiler. The function is in COMPAT.C and must be uncommented and compiled into the CWT library. */ void far *MK_FP(unsigned pseg, unsigned poff); #endif /* The following 4 macros emulate BASIC's "peek" and "poke" routines. They are used internally. */ #define poke(a,b,c) (*((int far*)MK_FP((a),(b))) = (int)(c)) #define pokeb(a,b,c) (*((char far*)MK_FP((a),(b))) = (char)(c)) #define peek(a,b) (*((int far*)MK_FP((a),(b)))) #define peekb(a,b) (*((char far*)MK_FP((a),(b)))) /* INTERRUPT-RELATED */ /* This function allows an interrupt call to access the BP register (e.g. ES:BP is used in several EGA+ BIOS calls). This function emulates the intr() function found in Turbo C, Power C and Watcom C. */ struct REGPACK { unsigned r_ax, r_bx, r_cx, r_dx; unsigned r_bp, r_si, r_di, r_ds, r_es, r_flags; }; void FCALL_ intr(int intno, struct REGPACK *preg); #if defined(DOSX286) #include #else #define get_vector(a) _dos_getvect(a) #define install_cas_isr #define set_vector(a, b) _dos_setvect((a), ((void (cdecl interrupt far *)())(b))) #endif #define FA_ARCH _A_ARCH /* MISCELLANEOUS */ unsigned long FCALL_ memavail(void); #define getdate(x) _dos_getdate(x) #if 0 #define findfirst(a, b, c) _dos_findfirst((a), (c), (struct find_t *)(b)) #define findnext(a) _dos_findnext ((struct find_t *)(a)) /* FILE-RELATED */ struct ffblk { char ff_reserved[21]; char ff_attrib; unsigned ff_ftime; unsigned ff_fdate; long ff_fsize; char ff_name[13]; }; /* BIOS CALLS */ long FCALL_ biostime(short service, long timeval); struct time { unsigned char ti_min; /* Minutes */ unsigned char ti_hour; /* Hours */ unsigned char ti_hund; /* Hundredths of seconds */ unsigned char ti_sec; /* Seconds */ }; struct date { int da_year; /* Year - 1980 */ char da_day; /* Day of the month */ char da_mon; /* Month (1 = Jan) */ }; #define harderr(a) _harderr(a) #define hardretn(a) _hardretn(a) #endif #endif /* WATCOM C */ #if defined(__WATCOMC__) #include /* WE HAVE TO DEFINE cdecl TO WATCOM C */ #if (defined(M_I86TM) || defined(M_I86SM) || defined(M_I86MM)) #define CCT_SMALL_DATA #endif #if defined(__386__) #include #else #if defined(VERSION70) /* define if using WC v7.0 */ #define NEAR_ near #define FAR_ far #define HUGE_ huge #define CDECL_ cdecl #define strcmpi(a, b) stricmp((a), (b)) #define fputchar(a) putchar(a) #else #define NEAR_ __near #define FAR_ __far #define HUGE_ __huge #define CDECL_ __cdecl #endif #if defined(CTF) #include #else #define memcalloc(a, b) calloc((a), (b)) #define memfree(a) free(a) #endif #endif #if !defined(CCTW) #define DCB void #define COMSTAT void #endif #define install_cas_isr #define FCALL_ #define INTERRUPT_ interrupt far /* The following 4 macros emulate BASIC's "peek" and "poke" routines. They are used internally. */ #define poke(a,b,c) (*((short FAR_ *)MK_FP((a),(b))) = (short)(c)) #define pokeb(a,b,c) (*((char FAR_ *)MK_FP((a),(b))) = (char)(c)) #define peek(a,b) (*((short FAR_ *)MK_FP((a),(b)))) #define peekb(a,b) (*((char FAR_ *)MK_FP((a),(b)))) #if 0 /* FILE I/O -- WATCOM uses POSIX rather than MSC conventions. These definitions allow code developed under a different compiler to run under Watcom C */ struct ffblk { char ff_reserved[21]; char ff_attrib; unsigned short ff_ftime; unsigned short ff_fdate; long ff_fsize; char ff_name[13]; }; #if defined(VERSION70) int findfirst(const char *pathname, struct ffblk *ffblk, int attrib); int findnext(struct ffblk *ffblk); #else #define findfirst(a, b, c) _dos_findfirst((a), (c), (struct find_t *)(b)) #define findnext(a) _dos_findnext ((struct find_t *)(a)) #endif /* TIME AND DATE STRUCTURES FOR TC COMPATIBILITY */ struct time { unsigned char ti_min; /* Minutes */ unsigned char ti_hour; /* Hours */ unsigned char ti_hund; /* Hundredths of seconds */ unsigned char ti_sec; /* Seconds */ }; struct date { int da_year; /* Year - 1980 */ char da_day; /* Day of the month */ char da_mon; /* Month (1 = Jan) */ }; #endif /* SOME MSC COMPATIBLITY MACROS, etc. */ #define get_vector(a) _dos_getvect(a) #define max(a,b) (((a) > (b)) ? (a) : (b)) #define min(a,b) (((a) < (b)) ? (a) : (b)) #define set_vector(a, b) _dos_setvect((a), (void (INTERRUPT_ *)())(b)) unsigned long memavail(void); #define FA_ARCH _A_ARCH #endif #if defined(_INTELC32_) #include #endif #if defined(__NDPC__) #include #endif #if defined(__HIGHC__) #include #endif #if defined(_PHARLAP) #define REAL_SEG 0X34 #else #define REAL_SEG 0X0 #endif /* 386 compatibility */ #if (!defined(__386__) && !defined(__NDPC__)) #define setwordreg(a) (regs.x.a) #define setbytereg(a) (regs.h.a) #endif #if !defined(EOF) && !defined(__POWERC) #define EOF (-1) #endif #endif