Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
RishiRecon
GitHub Repository: RishiRecon/exploits
Path: blob/main/misc/emulator/xnes/snes9x/apu/blargg_common.h
28798 views
1
// Sets up common environment for Shay Green's libraries.
2
// To change configuration options, modify blargg_config.h, not this file.
3
4
// snes_spc 0.9.0
5
#ifndef BLARGG_COMMON_H
6
#define BLARGG_COMMON_H
7
8
#include <stddef.h>
9
#include <stdlib.h>
10
#include <assert.h>
11
#include <limits.h>
12
13
#undef BLARGG_COMMON_H
14
// allow blargg_config.h to #include blargg_common.h
15
#include "blargg_config.h"
16
#ifndef BLARGG_COMMON_H
17
#define BLARGG_COMMON_H
18
19
// BLARGG_RESTRICT: equivalent to restrict, where supported
20
#if defined (__GNUC__) || _MSC_VER >= 1100
21
#define BLARGG_RESTRICT __restrict
22
#else
23
#define BLARGG_RESTRICT
24
#endif
25
26
// STATIC_CAST(T,expr): Used in place of static_cast<T> (expr)
27
#ifndef STATIC_CAST
28
#define STATIC_CAST(T,expr) ((T) (expr))
29
#endif
30
31
// blargg_err_t (0 on success, otherwise error string)
32
#ifndef blargg_err_t
33
typedef const char* blargg_err_t;
34
#endif
35
36
// blargg_vector - very lightweight vector of POD types (no constructor/destructor)
37
template<class T>
38
class blargg_vector {
39
T* begin_;
40
size_t size_;
41
public:
42
blargg_vector() : begin_( 0 ), size_( 0 ) { }
43
~blargg_vector() { free( begin_ ); }
44
size_t size() const { return size_; }
45
T* begin() const { return begin_; }
46
T* end() const { return begin_ + size_; }
47
blargg_err_t resize( size_t n )
48
{
49
// TODO: blargg_common.cpp to hold this as an outline function, ugh
50
void* p = realloc( begin_, n * sizeof (T) );
51
if ( p )
52
begin_ = (T*) p;
53
else if ( n > size_ ) // realloc failure only a problem if expanding
54
return "Out of memory";
55
size_ = n;
56
return 0;
57
}
58
void clear() { void* p = begin_; begin_ = 0; size_ = 0; free( p ); }
59
T& operator [] ( size_t n ) const
60
{
61
assert( n <= size_ ); // <= to allow past-the-end value
62
return begin_ [n];
63
}
64
};
65
66
#ifndef BLARGG_DISABLE_NOTHROW
67
// throw spec mandatory in ISO C++ if operator new can return NULL
68
#if __cplusplus >= 199711 || defined (__GNUC__)
69
#define BLARGG_THROWS( spec ) throw spec
70
#else
71
#define BLARGG_THROWS( spec )
72
#endif
73
#define BLARGG_DISABLE_NOTHROW \
74
void* operator new ( size_t s ) BLARGG_THROWS(()) { return malloc( s ); }\
75
void operator delete ( void* p ) { free( p ); }
76
#define BLARGG_NEW new
77
#else
78
#include <new>
79
#define BLARGG_NEW new (std::nothrow)
80
#endif
81
82
// BLARGG_4CHAR('a','b','c','d') = 'abcd' (four character integer constant)
83
#define BLARGG_4CHAR( a, b, c, d ) \
84
((a&0xFF)*0x1000000L + (b&0xFF)*0x10000L + (c&0xFF)*0x100L + (d&0xFF))
85
86
// BOOST_STATIC_ASSERT( expr ): Generates compile error if expr is 0.
87
#ifndef BOOST_STATIC_ASSERT
88
#ifdef _MSC_VER
89
// MSVC6 (_MSC_VER < 1300) fails for use of __LINE__ when /Zl is specified
90
#define BOOST_STATIC_ASSERT( expr ) \
91
void blargg_failed_( int (*arg) [2 / (int) !!(expr) - 1] )
92
#else
93
// Some other compilers fail when declaring same function multiple times in class,
94
// so differentiate them by line
95
#define BOOST_STATIC_ASSERT( expr ) \
96
void blargg_failed_( int (*arg) [2 / !!(expr) - 1] [__LINE__] )
97
#endif
98
#endif
99
100
// BLARGG_COMPILER_HAS_BOOL: If 0, provides bool support for old compiler. If 1,
101
// compiler is assumed to support bool. If undefined, availability is determined.
102
#ifndef BLARGG_COMPILER_HAS_BOOL
103
#if defined (__MWERKS__)
104
#if !__option(bool)
105
#define BLARGG_COMPILER_HAS_BOOL 0
106
#endif
107
#elif defined (_MSC_VER)
108
#if _MSC_VER < 1100
109
#define BLARGG_COMPILER_HAS_BOOL 0
110
#endif
111
#elif defined (__GNUC__)
112
// supports bool
113
#elif __cplusplus < 199711
114
#define BLARGG_COMPILER_HAS_BOOL 0
115
#endif
116
#endif
117
#if defined (BLARGG_COMPILER_HAS_BOOL) && !BLARGG_COMPILER_HAS_BOOL
118
// If you get errors here, modify your blargg_config.h file
119
typedef int bool;
120
const bool true = 1;
121
const bool false = 0;
122
#endif
123
124
// blargg_long/blargg_ulong = at least 32 bits, int if it's big enough
125
126
#if INT_MAX < 0x7FFFFFFF || LONG_MAX == 0x7FFFFFFF
127
typedef long blargg_long;
128
#else
129
typedef int blargg_long;
130
#endif
131
132
#if UINT_MAX < 0xFFFFFFFF || ULONG_MAX == 0xFFFFFFFF
133
typedef unsigned long blargg_ulong;
134
#else
135
typedef unsigned blargg_ulong;
136
#endif
137
138
// BOOST::int8_t etc.
139
140
// HAVE_STDINT_H: If defined, use <stdint.h> for int8_t etc.
141
#if defined (HAVE_STDINT_H)
142
#include <stdint.h>
143
#define BOOST
144
145
// HAVE_INTTYPES_H: If defined, use <stdint.h> for int8_t etc.
146
#elif defined (HAVE_INTTYPES_H)
147
#include <inttypes.h>
148
#define BOOST
149
150
#else
151
struct BOOST
152
{
153
#if UCHAR_MAX == 0xFF && SCHAR_MAX == 0x7F
154
typedef signed char int8_t;
155
typedef unsigned char uint8_t;
156
#else
157
// No suitable 8-bit type available
158
typedef struct see_blargg_common_h int8_t;
159
typedef struct see_blargg_common_h uint8_t;
160
#endif
161
162
#if USHRT_MAX == 0xFFFF
163
typedef short int16_t;
164
typedef unsigned short uint16_t;
165
#else
166
// No suitable 16-bit type available
167
typedef struct see_blargg_common_h int16_t;
168
typedef struct see_blargg_common_h uint16_t;
169
#endif
170
171
#if ULONG_MAX == 0xFFFFFFFF
172
typedef long int32_t;
173
typedef unsigned long uint32_t;
174
#elif UINT_MAX == 0xFFFFFFFF
175
typedef int int32_t;
176
typedef unsigned int uint32_t;
177
#else
178
// No suitable 32-bit type available
179
typedef struct see_blargg_common_h int32_t;
180
typedef struct see_blargg_common_h uint32_t;
181
#endif
182
};
183
#endif
184
185
#endif
186
#endif
187
188