165 lines
5.0 KiB
C++
165 lines
5.0 KiB
C++
|
|
// Sets up common environment for Shay Green's libraries.
|
|
//
|
|
// To change configuration options, modify blargg_config.h, not this file.
|
|
|
|
#ifndef BLARGG_COMMON_H
|
|
#define BLARGG_COMMON_H
|
|
|
|
#include <stddef.h>
|
|
#include <stdlib.h>
|
|
#include <assert.h>
|
|
#include <limits.h>
|
|
|
|
// User configuration (allow it to #include "blargg_common.h" normally)
|
|
#undef BLARGG_COMMON_H
|
|
#include "blargg_config.h"
|
|
#define BLARGG_COMMON_H
|
|
|
|
/* BLARGG_COMPILER_HAS_BOOL: If 0, provides bool support for old compiler. If 1,
|
|
compiler is assumed to support bool. If undefined, availability is determined.
|
|
If errors occur here, add the following line to your config.h file:
|
|
#define BLARGG_COMPILER_HAS_BOOL 1
|
|
*/
|
|
#ifndef BLARGG_COMPILER_HAS_BOOL
|
|
#if defined (__MWERKS__)
|
|
#if !__option(bool)
|
|
#define BLARGG_COMPILER_HAS_BOOL 0
|
|
#endif
|
|
#elif defined (_MSC_VER)
|
|
#if _MSC_VER < 1100
|
|
#define BLARGG_COMPILER_HAS_BOOL 0
|
|
#endif
|
|
#elif defined (__GNUC__)
|
|
// supports bool
|
|
#elif __cplusplus < 199711
|
|
#define BLARGG_COMPILER_HAS_BOOL 0
|
|
#endif
|
|
#endif
|
|
#if defined (BLARGG_COMPILER_HAS_BOOL) && !BLARGG_COMPILER_HAS_BOOL
|
|
typedef int bool;
|
|
const bool true = 1;
|
|
const bool false = 0;
|
|
#endif
|
|
|
|
// BLARGG_NEW is used in place of 'new' to create objects. By default, plain new is used.
|
|
// To prevent an exception if out of memory, #define BLARGG_NEW new (std::nothrow)
|
|
#ifndef BLARGG_NEW
|
|
#define BLARGG_NEW new
|
|
#endif
|
|
|
|
// BOOST::int8_t etc.
|
|
|
|
// HAVE_STDINT_H: If defined, use <stdint.h> for int8_t etc.
|
|
#if defined (HAVE_STDINT_H)
|
|
#include <stdint.h>
|
|
#define BOOST
|
|
|
|
// HAVE_INTTYPES_H: If defined, use <stdint.h> for int8_t etc.
|
|
#elif defined (HAVE_INTTYPES_H)
|
|
#include <inttypes.h>
|
|
#define BOOST
|
|
|
|
#else
|
|
struct BOOST
|
|
{
|
|
#if UCHAR_MAX == 0xFF && SCHAR_MAX == 0x7F
|
|
typedef signed char int8_t;
|
|
typedef unsigned char uint8_t;
|
|
#else
|
|
// No suitable 8-bit type available
|
|
typedef struct see_blargg_common_h int8_t;
|
|
typedef struct see_blargg_common_h uint8_t;
|
|
#endif
|
|
|
|
#if USHRT_MAX == 0xFFFF
|
|
typedef short int16_t;
|
|
typedef unsigned short uint16_t;
|
|
#else
|
|
// No suitable 16-bit type available
|
|
typedef struct see_blargg_common_h int16_t;
|
|
typedef struct see_blargg_common_h uint16_t;
|
|
#endif
|
|
|
|
#if ULONG_MAX == 0xFFFFFFFF
|
|
typedef long int32_t;
|
|
typedef unsigned long uint32_t;
|
|
#elif UINT_MAX == 0xFFFFFFFF
|
|
typedef int int32_t;
|
|
typedef unsigned int uint32_t;
|
|
#else
|
|
// No suitable 32-bit type available
|
|
typedef struct see_blargg_common_h int32_t;
|
|
typedef struct see_blargg_common_h uint32_t;
|
|
#endif
|
|
};
|
|
#endif
|
|
|
|
#ifdef _WIN32
|
|
typedef wchar_t blargg_wchar_t;
|
|
#else
|
|
#include <stdint.h>
|
|
typedef uint16_t blargg_wchar_t;
|
|
#endif
|
|
|
|
// BOOST_STATIC_ASSERT( expr ): Generates compile error if expr is 0.
|
|
#ifndef BOOST_STATIC_ASSERT
|
|
#ifdef _MSC_VER
|
|
// MSVC6 (_MSC_VER < 1300) fails for use of __LINE__ when /Zl is specified
|
|
#define BOOST_STATIC_ASSERT( expr ) \
|
|
void blargg_failed_( int (*arg) [2 / !!(expr) - 1] )
|
|
#else
|
|
// Some other compilers fail when declaring same function multiple times in class,
|
|
// so differentiate them by line
|
|
#define BOOST_STATIC_ASSERT( expr ) \
|
|
void blargg_failed_( int (*arg) [2 / !!(expr) - 1] [__LINE__] )
|
|
#endif
|
|
#endif
|
|
|
|
// In case compiler doesn't support these properly. Used rarely.
|
|
#define STATIC_CAST(T,expr) static_cast<T> (expr)
|
|
#define CONST_CAST( T,expr) const_cast<T> (expr)
|
|
|
|
// blargg_err_t (0 on success, otherwise error string)
|
|
#ifndef blargg_err_t
|
|
typedef const char* blargg_err_t;
|
|
#endif
|
|
|
|
// Success; no error
|
|
blargg_err_t const blargg_ok = 0;
|
|
|
|
/* Pure virtual functions cause a vtable entry to a "called pure virtual"
|
|
error handler, requiring linkage to the C++ runtime library. This macro is
|
|
used in place of the "= 0", and simply expands to its argument. During
|
|
development, it expands to "= 0", allowing detection of missing overrides. */
|
|
#define BLARGG_PURE( def ) def
|
|
|
|
/* My code is not written with exceptions in mind, so either uses new (nothrow)
|
|
OR overrides operator new in my classes. The former is best since clients
|
|
creating objects will get standard exceptions on failure, but that causes it
|
|
to require the standard C++ library. So, when the client is using the C
|
|
interface, I override operator new to use malloc. */
|
|
|
|
// BLARGG_DISABLE_NOTHROW is put inside classes
|
|
#ifndef BLARGG_DISABLE_NOTHROW
|
|
// throw spec mandatory in ISO C++ if NULL can be returned
|
|
#if __cplusplus >= 199711 || __GNUC__ >= 3 || _MSC_VER >= 1300
|
|
#define BLARGG_THROWS_NOTHING throw ()
|
|
#else
|
|
#define BLARGG_THROWS_NOTHING
|
|
#endif
|
|
|
|
#define BLARGG_DISABLE_NOTHROW \
|
|
void* operator new ( size_t s ) BLARGG_THROWS_NOTHING { return malloc( s ); }\
|
|
void operator delete( void* p ) BLARGG_THROWS_NOTHING { free( p ); }
|
|
|
|
#define BLARGG_NEW new
|
|
#else
|
|
// BLARGG_NEW is used in place of new in library code
|
|
#include <new>
|
|
#define BLARGG_NEW new (std::nothrow)
|
|
#endif
|
|
|
|
#endif
|
|
|