/**************************************************************************** * * SciTech Multi-platform Graphics Library * * ======================================================================== * * The contents of this file are subject to the SciTech MGL Public * License Version 1.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.scitechsoft.com/mgl-license.txt * * Software distributed under the License is distributed on an * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc. * * The Initial Developer of the Original Code is SciTech Software, Inc. * All Rights Reserved. * * ======================================================================== * * Language: ANSI C * Environment: any * * Description: General header file for operating system portable code. * ****************************************************************************/ #ifndef __SCITECH_H #define __SCITECH_H /* We have the following defines to identify the compilation environment: * * __16BIT__ Compiling for 16 bit code (any environment) * __32BIT__ Compiling for 32 bit code (any environment) * __MSDOS__ Compiling for MS-DOS (includes __WINDOWS16__, __WIN386__) * __REALDOS__ Compiling for MS-DOS (excludes __WINDOWS16__) * __MSDOS16__ Compiling for 16 bit MS-DOS * __MSDOS32__ Compiling for 32 bit MS-DOS * __WINDOWS__ Compiling for Windows * __WINDOWS16__ Compiling for 16 bit Windows (__MSDOS__ also defined) * __WINDOWS32__ Compiling for 32 bit Windows * __WIN32_VXD__ Compiling for a 32-bit C based VxD * __NT_DRIVER__ Compiling for a 32-bit C based NT device driver * __OS2__ Compiling for OS/2 * __OS2_16__ Compiling for 16 bit OS/2 * __OS2_32__ Compiling for 32 bit OS/2 * __UNIX__ Compiling for Unix * __QNX__ Compiling for the QNX realtime OS (Unix compatible) * __LINUX__ Compiling for the Linux OS (Unix compatible) * __FREEBSD__ Compiling for the FreeBSD OS (Unix compatible) * __BEOS__ Compiling for the BeOS (Unix compatible) * __SMX32__ Compiling for the SMX 32-bit Real Time OS * __ENEA_OSE__ Compiling for the OSE embedded OS * __RTTARGET__ Compiling for the RTTarget 32-bit embedded OS * __MACOS__ Compiling for the MacOS platform (PowerPC) * __DRIVER__ Compiling for a 32-bit binary compatible driver * __CONSOLE__ Compiling for a fullscreen OS console mode * __SNAP__ Compiling as a Snap executeable or dynamic library * * __INTEL__ Compiling for Intel CPU's * __ALPHA__ Compiling for DEC Alpha CPU's * __MIPS__ Compiling for MIPS CPU's * __PPC__ Compiling for PowerPC CPU's * __MC68K__ Compiling for Motorola 680x0 * * __BIG_ENDIAN__ Compiling for a big endian processor * */ #ifdef __SC__ #if __INTSIZE == 4 #define __SC386__ #endif #endif /* Determine some things that are compiler specific */ #ifdef __GNUC__ #ifdef __cplusplus /* G++ currently fucks this up! */ #define __cdecl #define __stdcall #else #undef __cdecl #undef __stdcall #define __cdecl __attribute__ ((cdecl)) #define __stdcall __attribute__ ((stdcall)) #endif #define __FLAT__ /* GCC is always 32 bit flat model */ #define __HAS_BOOL__ /* Latest GNU C++ has ibool type */ #define __HAS_LONG_LONG__ /* GNU C supports long long type */ #include /* Bring in for definition of NULL */ #endif #ifdef __BORLANDC__ #if (__BORLANDC__ >= 0x500) || defined(CLASSLIB_DEFS_H) #define __HAS_BOOL__ /* Borland C++ 5.0 defines ibool type */ #endif #if (__BORLANDC__ >= 0x502) && !defined(VTOOLSD) && !defined(__SMX32__) #define __HAS_INT64__ /* Borland C++ 5.02 supports __int64 type */ #endif #endif #if defined(_MSC_VER) && !defined(__SC__) && !defined(VTOOLSD) && !defined(__SMX32__) #define __HAS_INT64__ /* Visual C++ supports __int64 type */ #endif #if defined(__WATCOMC__) && (__WATCOMC__ >= 1100) && !defined(VTOOLSD) && !defined(__SMX32__) #define __HAS_INT64__ /* Watcom C++ 11.0 supports __int64 type */ #endif /*--------------------------------------------------------------------------- * Determine the compile time environment. This must be done for each * supported platform so that we can determine at compile time the target * environment, hopefully without requiring #define's from the user. *-------------------------------------------------------------------------*/ /* 32-bit binary compatible driver. Compiled as Win32, but as OS neutral */ #ifdef __DRIVER__ #ifndef __32BIT__ #define __32BIT__ #endif #undef __WINDOWS__ #undef _WIN32 #undef __WIN32__ #undef __NT__ /* 32-bit Snap exe or dll. Compiled as Win32, but as OS neutral */ #elif defined(__SNAP__) #ifndef __32BIT__ #define __32BIT__ #endif #undef __WINDOWS__ #undef _WIN32 #undef __WIN32__ #undef __NT__ /* 32-bit Windows VxD compile environment */ #elif defined(__vtoolsd_h_) || defined(VTOOLSD) #include #define __WIN32_VXD__ #ifndef __32BIT__ #define __32BIT__ #endif #define _MAX_PATH 256 #undef __WINDOWS32__ /* 32-bit Windows NT driver compile environment: TODO!! */ #elif defined(__NT_DRIVER__) #include "ntdriver.h" #ifndef __32BIT__ #define __32BIT__ #endif #define _MAX_PATH 256 #undef __WINDOWS32__ /* 32-bit SMX compile environment */ #elif defined(__SMX32__) #ifndef __MSDOS__ #define __MSDOS__ #endif #ifndef __32BIT__ #define __32BIT__ #endif #ifndef __CONSOLE__ #define __CONSOLE__ #endif /* 32-bit Enea OSE environment */ #elif defined(__ENEA_OSE__) #ifndef __32BIT__ #define __32BIT__ #endif #ifndef __CONSOLE__ #define __CONSOLE__ #endif /* 32-bit RTTarget-32 environment */ #elif defined(__RTTARGET__) #ifndef __32BIT__ #define __32BIT__ #endif #ifndef __CONSOLE__ #define __CONSOLE__ #endif /* 32-bit extended DOS compile environment */ #elif defined(__MSDOS__) || defined(__MSDOS32__) || defined(__DOS__) || defined(__DPMI32__) || (defined(M_I86) && (!defined(__SC386__) && !defined(M_I386))) || defined(TNT) #ifndef __MSDOS__ #define __MSDOS__ #endif #if defined(__MSDOS32__) || defined(__386__) || defined(__FLAT__) || defined(__NT__) || defined(__SC386__) #ifndef __MSDOS32__ #define __MSDOS32__ #endif #ifndef __32BIT__ #define __32BIT__ #endif #ifndef __REALDOS__ #define __REALDOS__ #endif #ifndef __CONSOLE__ #define __CONSOLE__ #endif /* 16-bit Windows compile environment */ #elif (defined(_Windows) || defined(_WINDOWS)) && !defined(__DPMI16__) #ifndef __16BIT__ #define __16BIT__ #endif #ifndef __WINDOWS16__ #define __WINDOWS16__ #endif #ifndef __WINDOWS__ #define __WINDOWS__ #endif #ifndef __MSDOS__ #define __MSDOS__ #endif /* 16-bit DOS compile environment */ #else #ifndef __16BIT__ #define __16BIT__ #endif #ifndef __MSDOS16__ #define __MSDOS16__ #endif #ifndef __REALDOS__ #define __REALDOS__ #endif #ifndef __CONSOLE__ #define __CONSOLE__ #endif #endif /* 32-bit Windows compile environment */ #elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) #ifndef __32BIT__ #define __32BIT__ #endif #ifndef __WINDOWS32__ #define __WINDOWS32__ #endif #ifndef _WIN32 #define _WIN32 /* Microsoft Win32 SDK headers use _WIN32 */ #endif #ifndef WIN32 #define WIN32 /* OpenGL headers use WIN32 */ #endif #ifndef __WINDOWS__ #define __WINDOWS__ #endif /* 32-bit OS/2 VDD compile environment */ /* We're assuming (for now) that CL386 must be used */ #elif defined(MSDOS) && defined(M_I386) /* fixes necessary to compile with CL386 */ #define __cdecl _cdecl typedef unsigned int size_t; #include /* This should probably be somewhere else... */ /* Inline eligible functions (we have no CRT libs for CL386) */ #pragma intrinsic (strcpy, strcmp, strlen, strcat) #pragma intrinsic (memcmp, memcpy, memset) #define __OS2_VDD__ #ifndef __32BIT__ #define __32BIT__ #endif #define CCHMAXPATH 256 #define _MAX_PATH 256 #ifndef __OS2__ #define __OS2__ #endif #ifndef __OS2_32__ #define __OS2_32__ #endif /* 16-bit OS/2 compile environment */ #elif defined(__OS2_16__) #ifndef __OS2__ #define __OS2__ #endif #ifndef __16BIT__ #define __16BIT__ #endif #ifndef __OS2_PM__ #ifndef __CONSOLE__ #define __CONSOLE__ #endif #endif /* 32-bit OS/2 compile environment */ #elif defined(__OS2__) || defined(__OS2_32__) #ifndef __OS2__ #define __OS2__ #endif #ifndef __OS2_32__ #define __OS2_32__ #endif #ifndef __32BIT__ #define __32BIT__ #endif #ifndef __OS2_PM__ #ifndef __CONSOLE__ #define __CONSOLE__ #endif #endif /* 32-bit QNX compile environment */ #elif defined(__QNX__) #ifndef __32BIT__ #define __32BIT__ #endif #ifndef __UNIX__ #define __UNIX__ #endif #ifdef __GNUC__ #define stricmp strcasecmp #endif #if !defined(__PHOTON__) && !defined(__X11__) #ifndef __CONSOLE__ #define __CONSOLE__ #endif #endif /* 32-bit Linux compile environment */ #elif defined(__LINUX__) || defined(linux) #ifndef __LINUX__ #define __LINUX__ #endif #ifndef __32BIT__ #define __32BIT__ #endif #ifndef __UNIX__ #define __UNIX__ #endif #ifdef __GNUC__ #define stricmp strcasecmp #endif #ifndef __X11__ #ifndef __CONSOLE__ #define __CONSOLE__ #endif #endif /* 32-bit FreeBSD compile environment */ #elif defined(__FREEBSD__) #ifndef __FREEBSD__ #define __FREEBSD__ #endif #ifndef __32BIT__ #define __32BIT__ #endif #ifndef __UNIX__ #define __UNIX__ #endif #ifdef __GNUC__ #define stricmp strcasecmp #endif #ifndef __X11__ #ifndef __CONSOLE__ #define __CONSOLE__ #endif #endif /* 32-bit BeOS compile environment */ #elif defined(__BEOS__) #ifndef __32BIT__ #define __32BIT__ #endif #ifndef __UNIX__ #define __UNIX__ #endif #ifdef __GNUC__ #define stricmp strcasecmp #endif /* Unsupported OS! */ #else #error This platform is not currently supported! #endif /* Determine the CPU type that we are compiling for */ #if defined(__M_ALPHA) || defined(__ALPHA_) || defined(__ALPHA) || defined(__alpha) #ifndef __ALPHA__ #define __ALPHA__ #endif #elif defined(__M_PPC) || defined(__POWERC) #ifndef __PPC__ #define __PPC__ #endif #elif defined(__M_MRX000) #ifndef __MIPS__ #define __MIPS__ #endif #else #ifndef __INTEL__ #define __INTEL__ /* Assume Intel if nothing found */ #endif #endif /* We have the following defines to define the calling conventions for * publicly accesible functions: * * _PUBAPI - Compiler default calling conventions for all public 'C' functions * _ASMAPI - Calling conventions for all public assembler functions * _VARAPI - Modifiers for variables; Watcom C++ mangles C++ globals * _STDCALL - Win32 __stdcall where possible, __cdecl if not supported */ #if defined(_MSC_VER) && defined(_WIN32) && !defined(__SC__) #define __PASCAL __stdcall #else #define __PASCAL __pascal #endif #if defined(NO_STDCALL) #define _STDCALL __cdecl #else #define _STDCALL __stdcall #endif #ifdef __WATCOMC__ #if (__WATCOMC__ >= 1050) #define _VARAPI __cdecl #else #define _VARAPI #endif #else #define _VARAPI #endif #if defined(__IBMC__) || defined(__IBMCPP__) #define PTR_DECL_IN_FRONT #endif /* Define the calling conventions for all public functions. For simplicity * we define all public functions as __cdecl calling conventions, so that * they are the same across all compilers and runtime DLL's. */ #define _PUBAPI __cdecl #define _ASMAPI __cdecl /* Determine the syntax for declaring a function pointer with a * calling conventions override. Most compilers require the calling * convention to be declared in front of the '*', but others require * it to be declared after the '*'. We handle both in here depending * on what the compiler requires. */ #ifdef PTR_DECL_IN_FRONT #define _PUBAPIP * _PUBAPI #define _ASMAPIP * _ASMAPI #else #define _PUBAPIP _PUBAPI * #define _ASMAPIP _ASMAPI * #endif /* Useful macros */ #define PRIVATE static #define PUBLIC /* This HAS to be 0L for 16-bit real mode code to work!!! */ #ifndef NULL # define _NULL 0L # define NULL _NULL #endif #ifndef MAX # define MAX(a,b) ( ((a) > (b)) ? (a) : (b)) #endif #ifndef MIN # define MIN(a,b) ( ((a) < (b)) ? (a) : (b)) #endif #ifndef ABS # define ABS(a) ((a) >= 0 ? (a) : -(a)) #endif #ifndef SIGN # define SIGN(a) ((a) > 0 ? 1 : -1) #endif /* General typedefs */ #ifndef __GENDEFS #define __GENDEFS #if defined(__BEOS__) #include #else #ifdef __LINUX__ #include #ifdef __STRICT_ANSI__ typedef unsigned short ushort; typedef unsigned long ulong; typedef unsigned int uint; #endif #ifdef __KERNEL__ #define __GENDEFS_2 #endif #else #if !(defined(__QNXNTO__) && defined(GENERAL_STRUCT)) typedef unsigned short ushort; typedef unsigned long ulong; #endif typedef unsigned int uint; #endif typedef unsigned char uchar; #endif typedef int ibool; /* Integer boolean type */ #ifdef USE_BOOL /* Only for older code */ #ifndef __cplusplus #define bool ibool /* Standard C */ #else #ifndef __HAS_BOOL__ #define bool ibool /* Older C++ compilers */ #endif #endif /* __cplusplus */ #endif /* USE_BOOL */ #endif /* __GENDEFS */ /* More general typedefs compatible with Linux kernel code */ #ifndef __GENDEFS_2 #define __GENDEFS_2 typedef char s8; typedef unsigned char u8; typedef short s16; typedef unsigned short u16; #ifdef __16BIT__ typedef long s32; typedef unsigned long u32; #else typedef int s32; typedef unsigned int u32; #endif typedef struct { u32 low; s32 high; } __i64; #ifdef __HAS_LONG_LONG__ #define __NATIVE_INT64__ typedef long long s64; typedef unsigned long long u64; #elif defined(__HAS_INT64__) && !defined(__16BIT__) #define __NATIVE_INT64__ typedef __int64 s64; typedef unsigned __int64 u64; #else typedef __i64 s64; typedef __i64 u64; #endif #endif /* Boolean truth values */ #undef false #undef true #undef NO #undef YES #undef FALSE #undef TRUE #define false 0 #define true 1 #define NO 0 #define YES 1 #define FALSE 0 #define TRUE 1 /* Inline debugger interrupts for Watcom C++ and Borland C++ */ #ifdef __WATCOMC__ void DebugInt(void); #pragma aux DebugInt = \ "int 3"; void DebugVxD(void); #pragma aux DebugVxD = \ "int 1"; #elif defined(__BORLANDC__) #define DebugInt() __emit__(0xCC) #define DebugVxD() {__emit__(0xCD); __emit__(0x01);} #elif defined(_MSC_VER) #define DebugInt() _asm int 0x3 #define DebugVxD() _asm int 0x1 #elif defined(__GNUC__) #define DebugInt() asm volatile ("int $0x3") #define DebugVxD() asm volatile ("int $0x1") #else void _ASMAPI DebugInt(void); void _ASMAPI DebugVxD(void); #endif /* Macros to break once and never break again */ #define DebugIntOnce() \ { \ static ibool firstTime = true; \ if (firstTime) { \ firstTime = false; \ DebugInt(); \ } \ } #define DebugVxDOnce() \ { \ static ibool firstTime = true; \ if (firstTime) { \ firstTime = false; \ DebugVxD(); \ } \ } /* Macros for linux string compatibility functions */ #ifdef __LINUX__ #define stricmp strcasecmp #define strnicmp strncasecmp #endif /* Macros for NT driver string compatibility functions */ #ifdef __NT_DRIVER__ #define stricmp _stricmp #define strnicmp _strnicmp #endif /* Get rid of some helaciously annoying Visual C++ warnings! */ #if defined(_MSC_VER) && !defined(__MWERKS__) && !defined(__SC__) #pragma warning(disable:4761) /* integral size mismatch in argument; conversion supplied */ #pragma warning(disable:4244) /* conversion from 'unsigned short ' to 'unsigned char ', possible loss of data */ #pragma warning(disable:4018) /* '<' : signed/unsigned mismatch */ #pragma warning(disable:4305) /* 'initializing' : truncation from 'const double' to 'float' */ #endif /*--------------------------------------------------------------------------- * Set of debugging macros used by the libraries. If the debug flag is * set, they are turned on depending on the setting of the flag. User code * can override the default functions called when a check fails, and the * MGL does this so it can restore the system from graphics mode to display * an error message. These functions also log information to the * scitech.log file in the root directory of the hard drive when problems * show up. * * If you set the value of CHECKED to be 2, it will also enable code to * insert hard coded debugger interrupt into the source code at the line of * code where the check fail. This is useful if you run the code under a * debugger as it will break inside the debugger before exiting with a * failure condition. * * Also for code compiled to run under Windows, we also call the * OutputDebugString function to send the message to the system debugger * such as Soft-ICE or WDEB386. Hence if you get any non-fatal warnings you * will see those on the debugger terminal as well as in the log file. *-------------------------------------------------------------------------*/ #ifdef __cplusplus extern "C" { /* Use "C" linkage when in C++ mode */ #endif extern void (*_CHK_fail)(int fatal,const char *msg,const char *cond,const char *file,int line); void _CHK_defaultFail(int fatal,const char *msg,const char *cond,const char *file,int line); #ifdef CHECKED # define CHK(x) x #if CHECKED > 1 # define CHECK(p) \ ((p) ? (void)0 : DebugInt(), \ _CHK_fail(1,"Check failed: '%s', file %s, line %d\n", \ #p, __FILE__, __LINE__)) # define WARN(p) \ ((p) ? (void)0 : DebugInt(), \ _CHK_fail(0,"Warning: '%s', file %s, line %d\n", \ #p, __FILE__, __LINE__)) #else # define CHECK(p) \ ((p) ? (void)0 : \ _CHK_fail(1,"Check failed: '%s', file %s, line %d\n", \ #p, __FILE__, __LINE__)) # define WARN(p) \ ((p) ? (void)0 : \ _CHK_fail(0,"Warning: '%s', file %s, line %d\n", \ #p, __FILE__, __LINE__)) #endif # define LOGFATAL(msg) \ _CHK_fail(1,"Fatal error: '%s', file %s, line %d\n", \ msg, __FILE__, __LINE__) # define LOGWARN(msg) \ _CHK_fail(0,"Warning: '%s', file %s, line %d\n", \ msg, __FILE__, __LINE__) #else # define CHK(x) # define CHECK(p) ((void)0) # define WARN(p) ((void)0) # define LOGFATAL(msg) ((void)0) # define LOGWARN(msg) ((void)0) #endif #ifdef __cplusplus } /* End of "C" linkage for C++ */ #endif #endif /* __SCITECH_H */