#/*
* 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 <direct.h>
#include <io.h>
#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 <conio.h> */
#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 <share.h>
#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 <io.h>
#include <dos.h>
#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 <unistd.h>
#include <io.h>
#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 <direct.h>
#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
syntax highlighted by Code2HTML, v. 0.9.1