2007-05-30 21:56:52 +00:00
|
|
|
/* ScummVM - Graphic Adventure Engine
|
|
|
|
*
|
|
|
|
* ScummVM is the legal property of its developers, whose names
|
|
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
|
|
* file distributed with this source distribution.
|
2001-10-09 14:30:12 +00:00
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
2005-10-18 01:30:26 +00:00
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2001-10-09 14:30:12 +00:00
|
|
|
*
|
|
|
|
*/
|
2006-04-02 00:08:22 +00:00
|
|
|
|
2005-06-23 14:15:49 +00:00
|
|
|
#ifndef COMMON_SCUMMSYS_H
|
|
|
|
#define COMMON_SCUMMSYS_H
|
2001-10-09 14:30:12 +00:00
|
|
|
|
2007-10-13 15:44:56 +00:00
|
|
|
|
2007-09-19 08:40:12 +00:00
|
|
|
#if defined(_WIN32_WCE) && _WIN32_WCE < 300
|
|
|
|
#define NONSTANDARD_PORT
|
2003-12-21 16:45:16 +00:00
|
|
|
#endif
|
|
|
|
|
2007-09-19 08:40:12 +00:00
|
|
|
#if defined(NONSTANDARD_PORT)
|
|
|
|
|
|
|
|
// Ports which need to perform #includes and #defines visible in
|
|
|
|
// virtually all the source of ScummVM should do so by providing a
|
|
|
|
// "portdefs.h" header file (and not by directly modifying this
|
|
|
|
// header file).
|
|
|
|
#include <portdefs.h>
|
|
|
|
#else // defined(NONSTANDARD_PORT)
|
|
|
|
|
|
|
|
#if defined(WIN32)
|
|
|
|
|
|
|
|
#ifdef _MSC_VER
|
2011-06-01 20:04:31 +00:00
|
|
|
|
|
|
|
// FIXME: The placement of the workaround functions for MSVC below
|
|
|
|
// require us to include stdio.h and stdarg.h for MSVC here. This
|
|
|
|
// is not exactly nice...
|
|
|
|
// We should think of a better way of doing this.
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdarg.h>
|
|
|
|
|
|
|
|
// MSVC's vsnprintf is either non-existant (2003) or bugged since it
|
|
|
|
// does not always include a terminating NULL (2005+). To work around
|
|
|
|
// that we fix up the _vsnprintf included. Note that the return value
|
|
|
|
// will still not match C99's specs!
|
|
|
|
inline int vsnprintf_msvc(char *str, size_t size, const char *format, va_list args) {
|
|
|
|
// We do not pass size - 1 here, to ensure we would get the same
|
|
|
|
// return value as when we would use _vsnprintf directly, since
|
|
|
|
// for example Common::String::format relies on this.
|
|
|
|
int retValue = _vsnprintf(str, size, format, args);
|
|
|
|
str[size - 1] = 0;
|
|
|
|
return retValue;
|
|
|
|
}
|
|
|
|
|
|
|
|
#define vsnprintf vsnprintf_msvc
|
|
|
|
|
2011-06-01 15:28:59 +00:00
|
|
|
// Visual Studio does not include snprintf in its standard C library.
|
|
|
|
// Instead it includes a function called _snprintf with somewhat
|
|
|
|
// similar semantics. The minor difference is that the return value in
|
|
|
|
// case the formatted string exceeds the buffer size is different.
|
|
|
|
// A much more dangerous one is that _snprintf does not always include
|
2011-06-01 20:04:31 +00:00
|
|
|
// a terminating null (Whoops!). Instead we map to our fixed vsnprintf.
|
|
|
|
inline int snprintf(char *str, size_t size, const char *format, ...) {
|
|
|
|
va_list args;
|
|
|
|
va_start(args, format);
|
|
|
|
int len = vsnprintf(str, size, format, args);
|
|
|
|
va_end(args);
|
|
|
|
return len;
|
|
|
|
}
|
2007-09-19 08:40:12 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#if !defined(_WIN32_WCE)
|
|
|
|
|
|
|
|
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
|
|
|
#define NOGDICAPMASKS
|
|
|
|
#define OEMRESOURCE
|
|
|
|
#define NONLS
|
|
|
|
#define NOICONS
|
|
|
|
#define NOMCX
|
|
|
|
#define NOPROFILER
|
|
|
|
#define NOKANJI
|
|
|
|
#define NOSERVICE
|
|
|
|
#define NOMETAFILE
|
|
|
|
#define NOCOMM
|
|
|
|
#define NOCRYPT
|
|
|
|
#define NOIME
|
|
|
|
#define NOATOM
|
|
|
|
#define NOCTLMGR
|
|
|
|
#define NOCLIPBOARD
|
|
|
|
#define NOMEMMGR
|
|
|
|
#define NOSYSMETRICS
|
|
|
|
#define NOMENUS
|
|
|
|
#define NOOPENFILE
|
|
|
|
#define NOWH
|
|
|
|
#define NOSOUND
|
|
|
|
#define NODRAWTEXT
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined(ARRAYSIZE)
|
|
|
|
// VS2005beta2 introduces new stuff in winnt.h
|
|
|
|
#undef ARRAYSIZE
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined(__QNXNTO__)
|
|
|
|
#include <strings.h> /* For strcasecmp */
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <stdarg.h>
|
|
|
|
#include <assert.h>
|
|
|
|
#include <ctype.h>
|
2011-03-18 23:56:10 +00:00
|
|
|
// MSVC does not define M_PI, M_SQRT2 and other math defines by default.
|
|
|
|
// _USE_MATH_DEFINES must be defined in order to have these defined, thus
|
|
|
|
// we enable it here. For more information, check:
|
|
|
|
// http://msdn.microsoft.com/en-us/library/4hwaceh6(v=VS.100).aspx
|
|
|
|
#define _USE_MATH_DEFINES
|
2007-09-19 08:40:12 +00:00
|
|
|
#include <math.h>
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
2003-09-18 02:07:18 +00:00
|
|
|
// Use config.h, generated by configure
|
2003-05-18 13:39:02 +00:00
|
|
|
#if defined(HAVE_CONFIG_H)
|
|
|
|
#include "config.h"
|
|
|
|
#endif
|
2002-10-23 14:02:46 +00:00
|
|
|
|
2011-05-05 14:47:22 +00:00
|
|
|
|
2006-03-29 12:47:35 +00:00
|
|
|
// In the following we configure various targets, in particular those
|
|
|
|
// which can't use our "configure" tool and hence don't use config.h.
|
|
|
|
//
|
|
|
|
// Some #defines that occur here frequently:
|
|
|
|
// SCUMM_LITTLE_ENDIAN
|
|
|
|
// - Define this on a little endian target
|
|
|
|
// SCUMM_BIG_ENDIAN
|
|
|
|
// - Define this on a big endian target
|
|
|
|
// SCUMM_NEED_ALIGNMENT
|
|
|
|
// - Define this if your system has problems reading e.g. an int32 from an odd address
|
|
|
|
// SMALL_SCREEN_DEVICE
|
|
|
|
// - ...
|
|
|
|
// ...
|
|
|
|
|
2006-04-05 00:54:10 +00:00
|
|
|
|
2006-07-09 13:01:15 +00:00
|
|
|
//
|
|
|
|
// By default we try to use pragma push/pop to ensure various structs we use
|
2007-09-19 08:40:12 +00:00
|
|
|
// are "packed". If your compiler doesn't support this pragma, you are in for
|
2006-07-22 17:28:48 +00:00
|
|
|
// a problem. If you are lucky, there is a compiler switch, or another pragma,
|
|
|
|
// doing the same thing -- in that case, try to modify common/pack-begin.h and
|
|
|
|
// common/pack-end.h accordingly. Or maybe your port simply *always* packs
|
|
|
|
// everything, in which case you could #undefine SCUMMVM_USE_PRAGMA_PACK.
|
2006-07-09 13:01:15 +00:00
|
|
|
//
|
|
|
|
// If neither is possible, tough luck. Try to contact the team, maybe we can
|
|
|
|
// come up with a solution, though I wouldn't hold my breath on it :-/.
|
|
|
|
//
|
2006-07-22 17:28:48 +00:00
|
|
|
#define SCUMMVM_USE_PRAGMA_PACK
|
2006-07-09 13:01:15 +00:00
|
|
|
|
2011-05-31 12:05:37 +00:00
|
|
|
//
|
|
|
|
// Determine the host endianess and whether memory alignment is required.
|
|
|
|
//
|
|
|
|
#if !defined(HAVE_CONFIG_H)
|
2006-07-09 13:01:15 +00:00
|
|
|
|
2011-06-01 08:43:02 +00:00
|
|
|
#if defined(__DC__) || \
|
2011-05-31 12:05:37 +00:00
|
|
|
defined(__DS__) || \
|
|
|
|
defined(__GP32__) || \
|
|
|
|
defined(IPHONE) || \
|
|
|
|
defined(__PLAYSTATION2__) || \
|
|
|
|
defined(__PSP__) || \
|
|
|
|
defined(__SYMBIAN32__)
|
2006-09-23 11:44:05 +00:00
|
|
|
|
2011-05-31 12:05:37 +00:00
|
|
|
#define SCUMM_LITTLE_ENDIAN
|
|
|
|
#define SCUMM_NEED_ALIGNMENT
|
2003-03-06 16:27:06 +00:00
|
|
|
|
2011-05-31 12:05:37 +00:00
|
|
|
#elif defined(_WIN32_WCE) || defined(_MSC_VER) || defined(__MINGW32__)
|
2006-03-29 12:47:35 +00:00
|
|
|
|
2011-05-31 12:05:37 +00:00
|
|
|
#define SCUMM_LITTLE_ENDIAN
|
2003-03-06 16:27:06 +00:00
|
|
|
|
2011-05-31 12:05:37 +00:00
|
|
|
#elif defined(__amigaos4__) || defined(__N64__) || defined(__WII__)
|
2003-03-06 16:27:06 +00:00
|
|
|
|
2011-05-31 12:05:37 +00:00
|
|
|
#define SCUMM_BIG_ENDIAN
|
|
|
|
#define SCUMM_NEED_ALIGNMENT
|
2007-09-19 08:40:12 +00:00
|
|
|
|
2011-06-01 08:43:02 +00:00
|
|
|
#elif defined(SDL_BACKEND)
|
|
|
|
// On SDL based ports, we try to use SDL_BYTEORDER to determine the
|
|
|
|
// endianess. We explicitly do this as the *last* thing we try, so that
|
|
|
|
// platform specific settings have precedence.
|
|
|
|
#include <SDL_endian.h>
|
|
|
|
|
|
|
|
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
|
|
|
|
#define SCUMM_LITTLE_ENDIAN
|
|
|
|
#elif SDL_BYTEORDER == SDL_BIG_ENDIAN
|
|
|
|
#define SCUMM_BIG_ENDIAN
|
|
|
|
#else
|
|
|
|
#error Neither SDL_BIG_ENDIAN nor SDL_LIL_ENDIAN is set.
|
|
|
|
#endif
|
|
|
|
|
2011-05-10 09:02:08 +00:00
|
|
|
#else
|
2006-03-29 12:09:15 +00:00
|
|
|
|
2011-05-31 12:05:37 +00:00
|
|
|
#error No system type defined, host endianess unknown.
|
2006-03-29 12:09:15 +00:00
|
|
|
|
2011-05-31 12:05:37 +00:00
|
|
|
#endif
|
2001-10-09 14:30:12 +00:00
|
|
|
#endif
|
|
|
|
|
2005-05-14 15:53:37 +00:00
|
|
|
|
|
|
|
//
|
2011-05-05 14:56:23 +00:00
|
|
|
// Some more system specific settings.
|
|
|
|
// TODO/FIXME: All of these should be moved to backend specific files (such as portdefs.h)
|
2005-05-14 15:53:37 +00:00
|
|
|
//
|
2011-05-31 11:56:28 +00:00
|
|
|
#if defined(DINGUX)
|
2011-05-05 14:56:23 +00:00
|
|
|
|
|
|
|
// Very BAD hack following, used to avoid triggering an assert in uClibc dingux library
|
|
|
|
// "toupper" when pressing keyboard function keys.
|
|
|
|
#undef toupper
|
|
|
|
#define toupper(c) (((c & 0xFF) >= 97) && ((c & 0xFF) <= 122) ? ((c & 0xFF) - 32) : (c & 0xFF))
|
|
|
|
|
|
|
|
#elif defined(__PSP__)
|
|
|
|
|
|
|
|
#include <malloc.h>
|
|
|
|
#include "backends/platform/psp/memory.h"
|
|
|
|
|
|
|
|
/* to make an efficient, inlined memcpy implementation */
|
|
|
|
#define memcpy(dst, src, size) psp_memcpy(dst, src, size)
|
|
|
|
|
2005-05-14 15:53:37 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
// Fallbacks / default values for various special macros
|
|
|
|
//
|
2011-05-05 14:56:23 +00:00
|
|
|
#ifndef GCC_PRINTF
|
|
|
|
#if defined(__GNUC__) || defined(__INTEL_COMPILER)
|
|
|
|
#define GCC_PRINTF(x,y) __attribute__((__format__(__printf__, x, y)))
|
|
|
|
#else
|
|
|
|
#define GCC_PRINTF(x,y)
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef PACKED_STRUCT
|
|
|
|
#if defined(__GNUC__) || defined(__INTEL_COMPILER)
|
|
|
|
#define PACKED_STRUCT __attribute__((__packed__))
|
|
|
|
#else
|
|
|
|
#define PACKED_STRUCT
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
2005-05-14 15:53:37 +00:00
|
|
|
#ifndef FORCEINLINE
|
2011-05-05 14:56:23 +00:00
|
|
|
#if defined(_MSC_VER)
|
|
|
|
#define FORCEINLINE __forceinline
|
|
|
|
#elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
|
|
|
|
#define FORCEINLINE inline __attribute__((__always_inline__))
|
|
|
|
#else
|
|
|
|
#define FORCEINLINE inline
|
|
|
|
#endif
|
2005-05-14 15:53:37 +00:00
|
|
|
#endif
|
|
|
|
|
2005-06-05 12:55:33 +00:00
|
|
|
#ifndef PLUGIN_EXPORT
|
2011-05-05 14:56:23 +00:00
|
|
|
#if defined(_MSC_VER) || defined(_WIN32_WCE) || defined(__MINGW32__)
|
|
|
|
#define PLUGIN_EXPORT __declspec(dllexport)
|
|
|
|
#else
|
|
|
|
#define PLUGIN_EXPORT
|
|
|
|
#endif
|
2005-06-05 12:55:33 +00:00
|
|
|
#endif
|
|
|
|
|
2009-11-29 21:56:10 +00:00
|
|
|
#ifndef NORETURN_PRE
|
2011-05-05 14:56:23 +00:00
|
|
|
#if defined(_MSC_VER)
|
|
|
|
#define NORETURN_PRE __declspec(noreturn)
|
|
|
|
#else
|
2011-05-31 12:05:37 +00:00
|
|
|
#define NORETURN_PRE
|
2011-05-05 14:56:23 +00:00
|
|
|
#endif
|
2009-11-29 21:56:10 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef NORETURN_POST
|
2011-05-05 14:56:23 +00:00
|
|
|
#if defined(__GNUC__) || defined(__INTEL_COMPILER)
|
|
|
|
#define NORETURN_POST __attribute__((__noreturn__))
|
|
|
|
#else
|
2011-05-31 12:05:37 +00:00
|
|
|
#define NORETURN_POST
|
2011-05-05 14:56:23 +00:00
|
|
|
#endif
|
2005-05-14 15:53:37 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef STRINGBUFLEN
|
2011-05-05 14:56:23 +00:00
|
|
|
#if defined(__N64__) || defined(__DS__)
|
|
|
|
#define STRINGBUFLEN 256
|
|
|
|
#else
|
|
|
|
#define STRINGBUFLEN 1024
|
|
|
|
#endif
|
2005-05-14 15:53:37 +00:00
|
|
|
#endif
|
|
|
|
|
2007-03-08 21:40:21 +00:00
|
|
|
#ifndef MAXPATHLEN
|
|
|
|
#define MAXPATHLEN 256
|
|
|
|
#endif
|
|
|
|
|
2005-05-14 15:53:37 +00:00
|
|
|
|
2006-03-29 12:47:35 +00:00
|
|
|
//
|
2011-05-31 11:48:03 +00:00
|
|
|
// Typedef our system types unless they have already been defined by config.h,
|
|
|
|
// or SCUMMVM_DONT_DEFINE_TYPES is set.
|
2006-03-29 12:47:35 +00:00
|
|
|
//
|
2011-05-31 11:48:03 +00:00
|
|
|
#if !defined(HAVE_CONFIG_H) && !defined(SCUMMVM_DONT_DEFINE_TYPES)
|
|
|
|
typedef unsigned char byte;
|
|
|
|
typedef unsigned char uint8;
|
|
|
|
typedef signed char int8;
|
|
|
|
typedef unsigned short uint16;
|
|
|
|
typedef signed short int16;
|
|
|
|
typedef unsigned int uint32;
|
|
|
|
typedef signed int int32;
|
|
|
|
typedef unsigned int uint;
|
2006-03-29 12:47:35 +00:00
|
|
|
#endif
|
|
|
|
|
2011-05-31 11:48:03 +00:00
|
|
|
|
2005-05-14 15:53:37 +00:00
|
|
|
//
|
|
|
|
// Overlay color type (FIXME: shouldn't be declared here)
|
|
|
|
//
|
2011-05-31 12:22:19 +00:00
|
|
|
typedef uint16 OverlayColor;
|
2005-05-14 15:53:37 +00:00
|
|
|
|
2011-05-14 08:41:17 +00:00
|
|
|
#include "common/forbidden.h"
|
2006-04-02 00:08:22 +00:00
|
|
|
|
2006-04-11 18:16:53 +00:00
|
|
|
#endif
|