#/* * SMAPI; Modified Squish MSGAPI * * Squish MSGAPI0 is copyright 1991 by Scott J. Dudley. All rights reserved. * Modifications released to the public domain. * * Use of this file is subject to the restrictions contain in the Squish * MSGAPI0 licence agreement. Please refer to licence.txt for complete * details of the licencing restrictions. If you do not find the text * of this agreement in licence.txt, or if you do not have this file, * you should contact Scott Dudley at FidoNet node 1:249/106 or Internet * e-mail Scott.Dudley@f106.n249.z1.fidonet.org. * * In no event should you proceed to use any of the source files in this * archive without having accepted the terms of the MSGAPI0 licensing * agreement, or such other agreement as you are able to reach with the * author. */ #ifndef __COMPILER_H__ #define __COMPILER_H__ #if defined(__GNUC__) && (__GNUC__==2) && (__GNUC_MINOR__>95) #warning Latest GNU C branch 2 is 2.95.*. Your version is not GNU C and not supported. You may use it for your risk. #warning Download and install GNU C release from www.gnu.org only, please. #endif #define SMAPI_EXT /* BeOS is NOT Unix, but sometime it seem's to Be ... ;) */ #if defined (__BEOS__) #ifndef UNIX #define UNIX #endif #endif /* defined in MINGW32 & cygwin's gcc with '-mno_cygwin' option * * This is NOT needed for pure Cygwin builds, Cygwin == UNIX !! */ #if !defined(__NT__) && defined(__MINGW32__) # define __NT__ #endif #if defined ( __WATCOMC__ ) #include #include #endif #if defined(OS2) && !defined(_MSC_VER) #ifndef __386__ #define __386__ #endif #ifndef __FLAT__ #define __FLAT__ #endif #endif #if defined(MSDOS) #define EXPENTRY pascal /* WATCOM has both M_I86xxx and __modeltype__ macros */ #ifdef M_I86SM #ifndef __SMALL__ #define __SMALL__ #endif #endif #ifdef M_I86MM #ifndef __MEDIUM__ #define __MEDIUM__ #endif #endif #ifdef M_I86CM #ifndef __COMPACT__ #define __COMPACT__ #endif #endif #ifdef M_I86LM #ifndef __LARGE__ #define __LARGE__ #endif #endif #ifdef M_I86HM #ifndef __HUGE__ #define __HUGE__ #endif #endif #endif /* Handle 386 "flat" memory model */ #ifdef __FLAT__ /* Other macros may get defined by braindead compilers */ #ifdef __SMALL__ #undef __SMALL__ #endif #ifdef __TINY__ #undef __TINY__ #endif #ifdef __MEDIUM__ #undef __MEDIUM__ #endif #ifdef __COMPACT__ #undef __COMPACT__ #endif #ifdef __LARGE__ #undef __LARGE__ #endif #ifdef __HUGE__ #undef __HUGE__ #endif /* * Code is really "near", but "far" in this context means that we * want a 32-bit pointer (vice 16-bit). */ #define __FARCODE__ #define __FARDATA__ /* Everything should be "near" in the flat model */ #ifdef near #undef near #define near #endif #ifdef far #undef far #define far near #endif #ifdef huge #undef huge #define huge near #endif #endif #if defined(__SMALL__) || defined(__TINY__) #define __NEARCODE__ #define __NEARDATA__ #endif #ifdef __MEDIUM__ #define __FARCODE__ #define __NEARDATA__ #endif #ifdef __COMPACT__ #define __NEARCODE__ #define __FARDATA__ #endif #if defined(__LARGE__) || defined(__HUGE__) #define __FARCODE__ #define __FARDATA__ #endif /* * Compiler-specific stuff: * * _stdc - Standard calling sequence. This should be the type of function * required for function pointers for qsort() et al. * * _fast - Fastest calling sequence supported. If the default calling * sequence is the fastest, or if your compiler only has one, * define this to nothing. * * _intr - For defining interrupt functions. For some idiotic reason, MSC * requires that interrupt routines be declared as "cdecl interrupt", * instead of just "interrupt". */ #if defined(__TURBOC__) && defined(__MSDOS__) /* Borland Turbo C/C++ for MS-DOS */ /* for BC++ 3.1 */ #define strcasecmp stricmp #define strncasecmp strncmpi #define _stdc cdecl #define _intr interrupt far #define _intcast void (_intr *)() #define _veccast _intcast #define _fast _fastcall #define _loadds /* #include */ #define mysleep(x) delay(x); #ifndef EXPENTRY #define EXPENTRY #endif #define mode_t int #elif defined(__WATCOMC__) && defined(MSDOS) /* WATCOM C/C++ for MS-DOS */ #define _stdc cdecl #define _intr interrupt far #define _intcast void (_intr *)() #define _veccase _intcast #define _fast pascal #ifdef __FLAT__ #define farread read #define farwrite write #endif #define strcasecmp stricmp #define strncasecmp strnicmp #define mode_t int #elif (defined(_MSC_VER) && (_MSC_VER < 1200)) /* Microsoft C or Microsoft QuickC for MS-DOS or OS/2 */ #define _stdc cdecl #define _intr cdecl interrupt far #define _intcast void (_intr *)() #define _veccast _intcast #if _MSC_VER >= 600 #define _fast _fastcall #else #define _fast pascal #endif int unlock(int handle, long ofs, long length); int lock(int handle, long ofs, long length); #ifdef OS2 /* just don't use 16 bit OS/2, we doubt that it still works */ #define farread read #define farwrite write #define EXPENTRY pascal far #define mysleep(x) DosSleep(1000L*(x)) #endif #elif defined(__WATCOMC__) && (defined(__OS2__) || defined(OS2)) /* WATCOM C/C++ for OS/2 */ #define _stdc #define _intr #define _intcast #define _veccast #define _fast #define farread read #define farwrite write #define strcasecmp stricmp #define strncasecmp strnicmp #define EXPENTRY _System #define mysleep(x) sleep(x) #define mode_t int #define HAS_SNPRINTF 1 #define HAS_VSNPRINTF 1 #define snprintf _snprintf #define vsnprintf _vsnprintf #elif defined(__WATCOMC__) && defined(__NT__) /* WATCOM C/C++ for Windows NT */ #define _stdc #define _intr #define _intcast #define _veccast #define _fast #define farread read #define farwrite write #define strcasecmp stricmp #define strncasecmp strnicmp #define EXPENTRY pascal #define mode_t int #elif defined(__HIGHC__) /* MetaWare High C/C++ for OS/2 */ #define _stdc #define _intr #define _intcast #define _veccast #define _fast #define pascal #define near #define far #define farread read #define farwrite write #define mysleep(x) DosSlep(1000L*(x)) #define unlock(a,b,c) unused(a) #define lock(a,b,c) 0 #error "Don't know how to implement record locking." /* Using an executable that does no support record locking is discouraged in a multitasking environment. If you want to do it anyway, you may uncomment this line. Record lokcing is used to obtain a lock on the very first byte of a SQD file which indicates that no other program should use the message area now. */ #define EXPENTRY #elif defined(__MINGW32__) /* MINGW32 for 32-bit Windows NT on Intel and AXP */ #define _stdc #define _intr #define _intcast #define _veccast #define _fast #define _loadds #define cdecl #define pascal __stdcall #define near #define far #define farread _read #define farwrite _write #define mymkdir _mkdir #define fdopen _fdopen #define close _close #define open _open #define lseek _lseek #define tell _tell #define sleep(sec) _sleep((sec)*1000l) #define write _write #define read _read #if !defined(__CYGWIN__) && !defined(__MINGW32__) #define stat _stat #define fstat _fstat #define chsize _chsize #define stricmp _strcmpi #define strcmpi _strcmpi #endif /*extern int __mkdir (__const__ char *name);*/ int unlock(int handle, long ofs, long length); int lock(int handle, long ofs, long length); #define sopen _sopen /* older mingw headers are too lazy ... */ #include #ifndef SH_DENYRW #define SH_DENYRW 0x10 #endif #ifndef SH_DENYWR #define SH_DENYWR 0x20 #endif #ifndef SH_DENYRD #define SH_DENYRD 0x30 #endif #ifndef SH_DENYNO #define SH_DENYNO 0x40 #endif #ifndef EXPENTRY #define EXPENTRY #endif #elif defined(__TURBOC__) && (defined(WINNT) || defined(__WIN32)) /* Borland C/C++ for Win32 */ #define _stdc cdecl #define _intr #define _intcast #define _veccast #define _fast _fastcall #define _loadds #define near #define far #define farread read #define farwrite write #define EXPENTRY #define strcasecmp stricmp #define strncasecmp strncmpi #elif defined(__EMX__) /* EMX for 32-bit OS/2 and RSX for Windows NT */ #define _stdc #define _intr #define _intcast #define _veccast #define _fast #define _loadds #define cdecl #define pascal #define near #define far #define farread read #define farwrite write #define mymkdir(a) mkdir((a), 0) int unlock(int handle, long ofs, long length); int lock(int handle, long ofs, long length); #define strcasecmp stricmp #define strncasecmp strnicmp #define EXPENTRY #define HAS_SNPRINTF 1 #define HAS_VSNPRINTF 1 #elif defined(__TURBOC__) && (defined(WINNT) || defined(__WIN32__)) /* Borland C/C++ for Win32 */ #define _stdc cdecl #define _intr #define _intcast #define _veccast #define _fast _fastcall #define _loadds #define near #define far #define farread read #define farwrite write #define EXPENTRY #elif defined(__TURBOC__) && defined(__OS2__) /* Borland C/C++ for OS/2 */ #define _stdc cdecl #define _intr #define _intcast #define _veccast #define _fast _fastcall #define _loadds #define near #define far #define farread read #define farwrite write #ifndef EXPENTRY #define EXPENTRY __syscall #endif #define mysleep(x) sleep(x); #include #include #define strcasecmp stricmp #define strncasecmp strncmpi #elif defined(__IBMC__) && !defined(UNIX) /* IBM C/Set++ for OS/2 */ #define _stdc #define _intr #define _intcast #define _veccast #define _fast #define _loadds #define cdecl #define pascal #define near #define far #define farread read #define farwrite write #define mysleep(x) DosSleep(1000L*(x)) #define EXPENTRY pascal far #elif defined(UNIX) /* Linux, FreeBSD, etc. */ #define _stdc #define _intr #define _intcast #define _veccast #define _fast #define _loadds #define cdecl #define pascal #define near #define far #define farread read #define farwrite write #if (defined(__APPLE__) && defined(__MACH__)) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(_AIX) || defined(__sun__) || defined(__linux__) || defined(__osf__) || defined(__hpux) || defined(__BEOS__) || defined(__OpenBSD__) || defined(__CYGWIN__) #define mymkdir(a) mkdir((a), S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) #else #define mymkdir(a) __mkdir((a), S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) #endif int lock(int handle, long ofs, long length); /* in locking.c */ int unlock(int handle, long ofs, long length); int sopen(const char *name, int oflag, int ishared, int mode); #ifndef __sun__ #define tell(a) lseek((a),0,SEEK_CUR) #endif #ifndef stricmp #define stricmp strcasecmp #endif /* Cygwin defines O_BINARY in sys/fcntl.h. Why different from other UNIXES? */ #if !defined(__BEOS__) && !defined(__CYGWIN__) #define O_BINARY 0 #endif #define SH_DENYNONE 0 #define SH_DENYNO 0 #define SH_DENYALL 1 #ifndef EXPENTRY /* workaround for redefine this for DJGPP */ #define EXPENTRY #endif /* Other OS's may sleep with other functions */ #ifdef __BEOS__ #define mysleep(x) snooze(x*1000000l) #elif defined(__linux__) || defined(__sun__) #define mysleep(x) usleep(x*1000000l) #endif #if defined(__GNUC__) && !defined(VSPRINTF_ONLY) /* Use -DVSPRINTF_ONLY on systems without vsnprintf() and snprintf() Expample: sunOs 2.5.1 (Thanks to Serguei Revtov) */ #define HAS_SNPRINTF 1 #define HAS_VSNPRINTF 1 #endif #elif defined(__DJGPP__) /* DJGPP for MS-DOS */ #define _stdc #define _intr #define _intcast #define _veccast #define _fast #define _loadds #define cdecl #define pascal #define near #define far #define farread read #define farwrite write #define mymkdir(a) mkdir((a), 0) #define stricmp strcasecmp #define SH_DENYNONE 0 #include #include #define mysleep(x) sleep(x) #elif defined(SASC) /* SAS C for AmigaDOS */ #define _stdc #define _intr #define _intcast #define _veccast #define _fast #define _loadds #define cdecl #define pascal #define near #define far #define farread read #define farwrite write #define mymkdir(a) mkdir((a)) #define unlock(a,b,c) unused(a) #define lock(a,b,c) 0 #define mysleep(x) unused(x) #error "Don't know how to implement record locking." /* Using an executable that does no support record locking is discouraged in a multitasking environment. If you want to do it anyway, you may uncomment this line. Record locking is used to obtain a lock on the very first byte of a SQD file which indicates that no other program should use the message area now. */ #define SH_DENYNONE 0 #define sopen(a,b,c,d) open((a),(b),(d)) #define EXPENTRY #elif defined(_MSC_VER) && (_MSC_VER >= 1200) #undef SMAPI_EXT #ifdef _MAKE_DLL # define _MAKE_DLL_MVC_ # ifndef _SMAPI_EXT # define SMAPI_EXT __declspec(dllimport) # else # define SMAPI_EXT __declspec(dllexport) # endif //_SMAPI_EXT #else # define SMAPI_EXT #endif #define _stdc #ifdef pascal #undef pascal #endif #define pascal #define far #define _fast #define near #define EXPENTRY #define strcasecmp stricmp #define strncasecmp strnicmp #define sleep(x) Sleep(1000L*(x)) #define farread read #define farwrite write #ifndef S_ISDIR #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) #endif #ifndef S_ISREG #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) #endif #define mode_t int SMAPI_EXT int unlock(int handle, long ofs, long length); SMAPI_EXT int lock(int handle, long ofs, long length); #include #define mymkdir _mkdir #else #error compiler.h: Unknown compiler! #endif #ifndef mymkdir #define mymkdir mkdir #endif #define NO_MKTIME #define NO_STRFTIME /* waitlock works like lock, but blocks until the lock can be * performed. * waitlock2 works like a timed waitlock. */ #ifndef mysleep #define mysleep(x) #endif #ifdef _MAKE_DLL_MVC_ #define __STDC__ 1 #define fileno _fileno #define read _read #define lseek _lseek #define sopen _sopen #define write _write #define tell _tell #define close _close #define unlink _unlink #define tzset _tzset #define stricmp _stricmp #define strnicmp _strnicmp #define rmdir _rmdir #define fstat _fstat #define strdup _strdup #define stat _stat #define getpid _getpid #define chsize _chsize #define open _open #define access _access #define snprintf _snprintf #define spawnvp _spawnvp #define dup _dup #define mktemp _mktemp #define fdopen _fdopen #if !defined(O_BINARY) && defined(_O_BINARY) #define O_BINARY _O_BINARY #endif #if !defined(O_RDWR) && defined(_O_RDWR) #define O_RDWR _O_RDWR #endif #if !defined(S_IFMT) && defined(_S_IFMT) #define S_IFMT _S_IFMT #endif #if !defined(S_IFDIR) && defined(_S_IFDIR) #define S_IFDIR _S_IFDIR #endif #endif extern int waitlock(int, long, long); extern int waitlock2(int, long, long, long); #endif