diff options
Diffstat (limited to 'src/port.h')
-rw-r--r-- | src/port.h | 554 |
1 files changed, 554 insertions, 0 deletions
diff --git a/src/port.h b/src/port.h new file mode 100644 index 0000000..4dc56ee --- /dev/null +++ b/src/port.h @@ -0,0 +1,554 @@ +#ifndef PORT_H_ +#define PORT_H_ + +#include "config.h" + +#ifdef __MINGW32__ +// Microsoft Windows headers expect this to be set. The MSVC compiler sets +// it, but MinGW doesn't. +# if defined(_X86_) +# define _M_IX86 +# elif defined(_IA64_) +# define _M_IA64 +# elif defined(__amd64__) +# define _M_AMD64 +# define _M_X64 +# elif defined(__m68k__) +# define _68K_ +# elif defined(__ppc__) +# define _M_PPC +# endif +#endif + + +// Compilation related +#ifdef _MSC_VER +# define inline __inline +#elif defined(__SYMBIAN32__) +#else +# define inline __inline__ +# ifdef __MINGW32__ + // For when including Microsoft Windows header files. +# define _inline inline +# endif +#endif + + +// Compilation warnings: +#ifdef _MSC_VER + // UQM uses a lot of functions that can be used unsafely, but it uses them + // in a safe way. The warnings about these functions however may drown out + // serious warnings, so we turn them off. +# define _CRT_SECURE_NO_DEPRECATE + + // Escalate some warnings we consider important + // "'operator' : 'identifier1' indirection to slightly different base + // types from 'identifier2' +# pragma warning( 3 : 4057 ) + // "unreferenced formal parameter" +# pragma warning( 3 : 4100 ) + // "'function' : unreferenced local function has been removed" +# pragma warning( 3 : 4505 ) + // "local variable 'name' may be used without having been initialized" +# pragma warning( 3 : 4701 ) + + // Downgrade some warnings we consider unimportant + // "'operator' conversion from 'type1' to 'type2', possible loss of data" +# pragma warning( 4 : 4244) +#endif + + +#ifdef _MSC_VER +# include <io.h> +#else +# include <unistd.h> +#endif + +// Using "HAVE_STRCASECMP_UQM" instead of "HAVE_STRCASECMP" as the latter +// conflicts with SDL. +#if !defined(HAVE_STRICMP) && !defined(HAVE_STRCASECMP_UQM) +# error Neither stricmp() nor strcasecmp() is available. +#elif !defined(HAVE_STRICMP) +# define stricmp strcasecmp +#elif !defined(HAVE_STRCASECMP_UQM) +# define strcasecmp stricmp +#else + // We should take care not to define anything if both strcasecmp() and + // stricmp() are defined, as one might exist as a macro to the other. +#endif + + +#ifndef HAVE_STRUPR +#if defined(__cplusplus) +extern "C" { +#endif +char *strupr (char *str); +#if defined(__cplusplus) +} +#endif +#endif + +#if !defined (_MSC_VER) && !defined (HAVE_READDIR_R) +# include <dirent.h> +#if defined(__cplusplus) +extern "C" { +#endif +int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result); +#if defined(__cplusplus) +} +#endif +#endif + +// Directories +#ifdef WIN32 +# include <stdlib.h> +# define PATH_MAX _MAX_PATH +# define NAME_MAX _MAX_FNAME + // _MAX_DIR and FILENAME_MAX could also be candidates. + // If anyone can tell me which one matches NAME_MAX, please + // let me know. - SvdB +#elif defined(_WIN32_WCE) +# include <sys/syslimits.h> +#else +# include <limits.h> + /* PATH_MAX is per POSIX defined in <limits.h>, but: + * "A definition of one of the values from Table 2.6 shall bea + * omitted from <limits.h> on specific implementations where the + * corresponding value is equal to or greater than the + * stated minimum, but where the value can vary depending + * on the file to which it is applied. The actual value supported + * for a specific pathname shall be provided by the pathconf() + * function." + * _POSIX_NAME_MAX will provide a minimum (14). + * This is relevant (at least) for Solaris. + */ +# ifndef NAME_MAX +# define NAME_MAX _POSIX_NAME_MAX +# endif +#endif + +// Some types +#ifdef _MSC_VER +typedef int ssize_t; +typedef unsigned short mode_t; +#endif + +// Directories +#include <sys/stat.h> +#ifdef _MSC_VER +# define MKDIR(name, mode) ((void) mode, _mkdir(name)) +#elif defined(__MINGW32__) +# define MKDIR(name, mode) ((void) mode, mkdir(name)) +#else +# define MKDIR mkdir +#endif +#ifdef _MSC_VER +# include <direct.h> +# define chdir _chdir +# define getcwd _getcwd +# define access _access +# define F_OK 0 +# define W_OK 2 +# define R_OK 4 +# define open _open +# define read _read +//# define fstat _fstat +# define write _write +//# define stat _stat +# define unlink _unlink +#endif + +// Memory +#ifdef WIN32 +# ifdef __MINGW32__ +# include <malloc.h> +# elif defined (_MSC_VER) +# define alloca _alloca +# endif +#elif defined(__linux__) || defined(__svr4__) +# include <alloca.h> +#endif + +// String formatting +#ifdef _MSC_VER +# include <stdarg.h> +// Defined in port.c +#if defined(__cplusplus) +extern "C" { +#endif +int snprintf(char *str, size_t size, const char *format, ...); +int vsnprintf(char *str, size_t size, const char *format, va_list args); +#if defined(__cplusplus) +} +#endif + +#endif /* _MSC_VER */ + +#if defined(__cplusplus) +extern "C" { +#endif + +// setenv() +#ifndef HAVE_SETENV +int setenv (const char *name, const char *value, int overwrite); +#endif + +#ifndef HAVE_WCHAR_T +typedef unsigned short wchar_t; +#endif + +#ifndef HAVE_WINT_T +typedef unsigned int wint_t; +#endif + +#if defined(__cplusplus) +} +#endif + +#if defined (_MSC_VER) || defined(__MINGW32__) +# define USE_WINSOCK +#endif + +// errno error numbers. The values used don't matter, as long as they +// don't conflict with existing errno error numbers. +#ifdef PORT_WANT_ERRNO +# ifdef USE_WINSOCK +# include <errno.h> +# ifndef E2BIG +# define E2BIG 0x01000001 +# endif +# ifndef EACCES +# define EACCES 0x01000002 +# endif +# ifndef EADDRINUSE +# define EADDRINUSE 0x01000003 +# endif +# ifndef EADDRNOTAVAIL +# define EADDRNOTAVAIL 0x01000004 +# endif +# ifndef EAFNOSUPPORT +# define EAFNOSUPPORT 0x01000005 +# endif +# ifndef EAGAIN +# ifdef EWOULDBLOCK +# define EAGAIN EWOULDBLOCK +# else +# define EAGAIN 0x01000006 +# endif +# endif +# ifndef EALREADY +# define EALREADY 0x01000007 +# endif +# ifndef EBADF +# define EBADF 0x01000008 +# endif +# ifndef EBADMSG +# define EBADMSG 0x01000009 +# endif +# ifndef EBUSY +# define EBUSY 0x0100000a +# endif +# ifndef ECANCELED +# define ECANCELED 0x0100000b +# endif +# ifndef ECHILD +# define ECHILD 0x0100000c +# endif +# ifndef ECONNABORTED +# define ECONNABORTED 0x0100000d +# endif +# ifndef ECONNREFUSED +# define ECONNREFUSED 0x0100000e +# endif +# ifndef ECONNRESET +# define ECONNRESET 0x0100000f +# endif +# ifndef EDEADLK +# define EDEADLK 0x01000010 +# endif +# ifndef EDESTADDRREQ +# define EDESTADDRREQ 0x01000011 +# endif +# ifndef EDOM +# define EDOM 0x01000012 +# endif +// Reserved in POSIX +//# ifndef //EDQUOT +//# define //EDQUOT 0x01000013 +//# endif +# ifndef EEXIST +# define EEXIST 0x01000014 +# endif +# ifndef EFAULT +# define EFAULT 0x01000015 +# endif +# ifndef EFBIG +# define EFBIG 0x01000016 +# endif +# ifndef EHOSTUNREACH +# define EHOSTUNREACH 0x01000017 +# endif +# ifndef EIDRM +# define EIDRM 0x01000018 +# endif +# ifndef EILSEQ +# define EILSEQ 0x01000019 +# endif +# ifndef EINPROGRESS +# define EINPROGRESS 0x0100001a +# endif +# ifndef EINTR +# define EINTR 0x0100001b +# endif +# ifndef EINVAL +# define EINVAL 0x0100001c +# endif +# ifndef EIO +# define EIO 0x0100001d +# endif +# ifndef EISCONN +# define EISCONN 0x0100001e +# endif +# ifndef EISDIR +# define EISDIR 0x0100001f +# endif +# ifndef ELOOP +# define ELOOP 0x01000020 +# endif +# ifndef EMFILE +# define EMFILE 0x01000021 +# endif +# ifndef EMLINK +# define EMLINK 0x01000022 +# endif +# ifndef EMSGSIZE +# define EMSGSIZE 0x01000023 +# endif +// Reserved in POSIX +//# ifndef //EMULTIHOP +//# define //EMULTIHOP 0x01000024 +//# endif +# ifndef ENAMETOOLONG +# define ENAMETOOLONG 0x01000025 +# endif +# ifndef ENETDOWN +# define ENETDOWN 0x01000026 +# endif +# ifndef ENETRESET +# define ENETRESET 0x01000027 +# endif +# ifndef ENETUNREACH +# define ENETUNREACH 0x01000028 +# endif +# ifndef ENFILE +# define ENFILE 0x01000029 +# endif +# ifndef ENOBUFS +# define ENOBUFS 0x0100002a +# endif +# ifndef ENODATA +# define ENODATA 0x0100002b +# endif +# ifndef ENODEV +# define ENODEV 0x0100002c +# endif +# ifndef ENOENT +# define ENOENT 0x0100002d +# endif +# ifndef ENOEXEC +# define ENOEXEC 0x0100002e +# endif +# ifndef ENOLCK +# define ENOLCK 0x0100002f +# endif +// Reserved in POSIX +//# ifndef ENOLINK +//# define ENOLINK 0x01000030 +//# endif +# ifndef ENOMEM +# define ENOMEM 0x01000031 +# endif +# ifndef ENOMSG +# define ENOMSG 0x01000032 +# endif +# ifndef ENOPROTOOPT +# define ENOPROTOOPT 0x01000033 +# endif +# ifndef ENOSPC +# define ENOSPC 0x01000034 +# endif +# ifndef ENOSR +# define ENOSR 0x01000035 +# endif +# ifndef ENOSTR +# define ENOSTR 0x01000036 +# endif +# ifndef ENOSYS +# define ENOSYS 0x01000037 +# endif +# ifndef ENOTCONN +# define ENOTCONN 0x01000038 +# endif +# ifndef ENOTDIR +# define ENOTDIR 0x01000039 +# endif +# ifndef ENOTEMPTY +# define ENOTEMPTY 0x0100003a +# endif +# ifndef ENOTSOCK +# define ENOTSOCK 0x0100003b +# endif +# ifndef ENOTSUP +# define ENOTSUP 0x0100003c +# endif +# ifndef ENOTTY +# define ENOTTY 0x0100003d +# endif +# ifndef ENXIO +# define ENXIO 0x0100003e +# endif +# ifndef EOPNOTSUPP +# define EOPNOTSUPP 0x0100003f +# endif +# ifndef EOVERFLOW +# define EOVERFLOW 0x01000040 +# endif +# ifndef EPERM +# define EPERM 0x01000041 +# endif +# ifndef EPIPE +# define EPIPE 0x01000042 +# endif +# ifndef EPROTO +# define EPROTO 0x01000043 +# endif +# ifndef EPROTONOSUPPORT +# define EPROTONOSUPPORT 0x01000044 +# endif +# ifndef EPROTOTYPE +# define EPROTOTYPE 0x01000045 +# endif +# ifndef ERANGE +# define ERANGE 0x01000046 +# endif +# ifndef EROFS +# define EROFS 0x01000047 +# endif +# ifndef ESPIPE +# define ESPIPE 0x01000048 +# endif +# ifndef ESRCH +# define ESRCH 0x01000049 +# endif +// Reserved in POSIX +//# ifndef //ESTALE +//# define //ESTALE 0x0100004a +//# endif +# ifndef ETIME +# define ETIME 0x0100004b +# endif +# ifndef ETIMEDOUT +# define ETIMEDOUT 0x0100004c +# endif +# ifndef ETXTBSY +# define ETXTBSY 0x0100004d +# endif +# ifndef EWOULDBLOCK +# ifdef EAGAIN +# define EWOULDBLOCK EAGAIN +# else +# define EWOULDBLOCK 0x0100004e +# endif +# endif +# ifndef EXDEV +# define EXDEV 0x0100004f +# endif + +// Non-POSIX: +# ifndef EHOSTDOWN +# define EHOSTDOWN 0x01100001 +# endif +# ifndef EPFNOSUPPORT +# define EPFNOSUPPORT 0x01100002 +# endif +# ifndef EPROCLIM +# define EPROCLIM 0x01100003 +# endif +# ifndef ESHUTDOWN +# define ESHUTDOWN 0x01100004 +# endif +# ifndef ESOCKTNOSUPPORT +# define ESOCKTNOSUPPORT 0x01100005 +# endif +# elif defined (__FreeBSD__) || defined (__OpenBSD__) +# ifndef EBADMSG +# define EBADMSG EIO +# endif +# endif /* defined (__FreeBSD__) || defined (__OpenBSD__) */ +#endif /* defined (PORT_WANT_ERRNO) */ + +// Use SDL_INCLUDE to portably include the SDL files from the right location. +// The SDL_DIR definition is provided by the build configuration. +#define SDL_INCLUDE(file) #file + +// Mark a function as using printf-style function arguments, so that +// extra consistency checks can be made by the compiler. +// The first argument to PRINTF_FUNCTION and VPRINTF_FUNCTION is the +// index of the format string argument, the second is the index of +// the first argument which is specified in the format string (in the +// case of PRINTF_FUNCTION) or of the va_list argument (in the case of +// VPRINTF_FUNCTION). +#ifdef __GNUC__ +# define PRINTF_FUNCTION(formatArg, firstArg) \ + __attribute__((format(printf, formatArg, firstArg))) +# define VPRINTF_FUNCTION(formatArg) \ + __attribute__((format(printf, formatArg, 0))) +#else +# define PRINTF_FUNCTION(formatArg, firstArg) +# define VPRINTF_FUNCTION(formatArg) +#endif + +#if defined(__GNUC__) +# define _NORETURN __attribute__((noreturn)) +#else +# define _NORETURN +#endif + +// Buffered vs. unbuffered logfile +// stderr is normally unbuffered when connected to a terminal, but it +// will be buffered when connected to a file, when a --logfile argument +// is passed to uqm. +// Unbuffered output is slower, which can be significant if much debug output +// is requested, but after a crash occurs the logfile will still be up to +// date. +// On platforms where there is no console, having up-to-date log files +// after a crash is valuable enough to make the logfile unbuffered by +// default there. +#if defined(_WIN32_WCE) +# define UNBUFFERED_LOGFILE +#endif + +// Variations in path handling +#if defined(WIN32) || defined(__SYMBIAN32__) + // HAVE_DRIVE_LETTERS is defined to signify that DOS/Windows style drive + // letters are to be recognised on this platform. +# define HAVE_DRIVE_LETTERS + // BACKSLASH_IS_PATH_SEPARATOR is defined to signify that the backslash + // character is to be recognised as a path separator on this platform. + // This does not affect the acceptance of forward slashes as path + // separators. +# define BACKSLASH_IS_PATH_SEPARATOR +#endif +#if defined(WIN32) + // HAVE_UNC_PATHS is defined to signify that Universal Naming Convention + // style paths are to be recognised on this platform. +# define HAVE_UNC_PATHS + // HAVE_CWD_PER_DRIVE is defined to signify that every drive has its own + // current working directory. +# define HAVE_CWD_PER_DRIVE +#endif +// REJECT_DRIVE_PATH_WITHOUT_SLASH can also be defined, if paths of the form +// "d:foo/bar" (without a slash after the drive letter) are to be rejected. + +#endif /* PORT_H_ */ + |