1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
/* sophist.h - 0.3 - public domain - Sean Barrett 2010
** Knowledge drawn from Brian Hook's posh.h and http://predef.sourceforge.net
** Sophist provides portable types; you typedef/#define them to your own names
**
** defines:
** - SOPHIST_endian - either SOPHIST_little_endian or SOPHIST_big_endian
** - SOPHIST_has_64 - either 0 or 1; if 0, int64 types aren't defined
** - SOPHIST_pointer64 - either 0 or 1; if 1, pointer is 64-bit
**
** - SOPHIST_intptr, SOPHIST_uintptr - integer same size as pointer
** - SOPHIST_int8, SOPHIST_uint8, SOPHIST_int16, SOPHIST_uint16
** - SOPHIST_int32, SOPHIST_uint32, SOPHIST_int64, SOPHIST_uint64
** - SOPHIST_int64_constant(number) - macros for creating 64-bit
** - SOPHIST_uint64_constant(number) integer constants
** - SOPHIST_printf_format64 - string for printf format for int64
*/
#ifndef __INCLUDE_SOPHIST_H__
#define __INCLUDE_SOPHIST_H__
#define SOPHIST_compiletime_assert(name,val) \
typedef int SOPHIST__assert##name[(val) ? 1 : -1]
/* define a couple synthetic rules to make code more readable */
#if (defined(__sparc__) || defined(__sparc)) && \
(defined(__arch64__) || defined(__sparcv9) || defined(__sparc_v9__))
#define SOPHIST_sparc64
#endif
#if (defined(linux) || defined(__linux__)) && \
(defined(__alpha)||defined(__alpha__)||defined(__x86_64__)||defined(_M_X64))
#define SOPHIST_linux64
#endif
/* basic types */
typedef signed char SOPHIST_int8;
typedef unsigned char SOPHIST_uint8;
typedef signed short SOPHIST_int16;
typedef unsigned short SOPHIST_uint16;
#ifdef __palmos__
typedef signed long SOPHIST_int32;
typedef unsigned long SOPHIST_uint32;
#else
typedef signed int SOPHIST_int32;
typedef unsigned int SOPHIST_uint32;
#endif
#ifndef SOPHIST_NO_64
#if defined(_MSC_VER) || defined(__WATCOMC__) || defined(__BORLANDC__) \
|| (defined(__alpha) && defined(__DECC))
typedef signed __int64 SOPHIST_int64;
typedef unsigned __int64 SOPHIST_uint64;
#define SOPHIST_has_64 1
#define SOPHIST_int64_constant(x) (x##i64)
#define SOPHIST_uint64_constant(x) (x##ui64)
#define SOPHIST_printf_format64 "I64"
#elif defined(__LP64__) || defined(__powerpc64__) || defined(SOPHIST_sparc64)
typedef signed long SOPHIST_int64;
typedef unsigned long SOPHIST_uint64;
#define SOPHIST_has_64 1
#define SOPHIST_int64_constant(x) ((SOPHIST_int64) x)
#define SOPHIST_uint64_constant(x) ((SOPHIST_uint64) x)
#define SOPHIST_printf_format64 "l"
#elif defined(_LONG_LONG) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) \
|| defined(__GNUC__) || defined(__MWERKS__) || defined(__APPLE_CC__) \
|| defined(sgi) || defined (__sgi) || defined(__sgi__) \
|| defined(_CRAYC)
typedef signed long long SOPHIST_int64;
typedef unsigned long long SOPHIST_uint64;
#define SOPHIST_has_64 1
#define SOPHIST_int64_constant(x) (x##LL)
#define SOPHIST_uint64_constant(x) (x##ULL)
#define SOPHIST_printf_format64 "ll"
#endif
#endif
#ifndef SOPHIST_has_64
#define SOPHIST_has_64 0
#endif
SOPHIST_compiletime_assert( int8 , sizeof(SOPHIST_int8 ) == 1);
SOPHIST_compiletime_assert(uint16, sizeof(SOPHIST_int16) == 2);
SOPHIST_compiletime_assert( int32, sizeof(SOPHIST_int32 ) == 4);
SOPHIST_compiletime_assert(uint32, sizeof(SOPHIST_uint32) == 4);
#if SOPHIST_has_64
SOPHIST_compiletime_assert( int64, sizeof(SOPHIST_int64 ) == 8);
SOPHIST_compiletime_assert(uint64, sizeof(SOPHIST_uint64) == 8);
#endif
/* determine whether pointers are 64-bit */
#if defined(SOPHIST_linux64) || defined(SOPHIST_sparc64) \
|| defined(__osf__) || (defined(_WIN64) && !defined(_XBOX)) \
|| defined(__64BIT__) \
|| defined(__LP64) || defined(__LP64__) || defined(_LP64) \
|| defined(_ADDR64) || defined(_CRAYC) \
#define SOPHIST_pointer64 1
SOPHIST_compiletime_assert(pointer64, sizeof(void*) == 8);
typedef SOPHIST_int64 SOPHIST_intptr;
typedef SOPHIST_uint64 SOPHIST_uintptr;
#else
#define SOPHIST_pointer64 0
SOPHIST_compiletime_assert(pointer64, sizeof(void*) <= 4);
/* do we care about pointers that are only 16-bit? */
typedef SOPHIST_int32 SOPHIST_intptr;
typedef SOPHIST_uint32 SOPHIST_uintptr;
#endif
SOPHIST_compiletime_assert(intptr, sizeof(SOPHIST_intptr) == sizeof(char *));
/* enumerate known little endian cases; fallback to big-endian */
#define SOPHIST_little_endian 1
#define SOPHIST_big_endian 2
#if defined(__386__) || defined(i386) || defined(__i386__) \
|| defined(__X86) || defined(_M_IX86) \
|| defined(_M_X64) || defined(__x86_64__) \
|| defined(alpha) || defined(__alpha) || defined(__alpha__) \
|| defined(_M_ALPHA) \
|| defined(ARM) || defined(_ARM) || defined(__arm__) \
|| defined(WIN32) || defined(_WIN32) || defined(__WIN32__) \
|| defined(_WIN32_WCE) || defined(__NT__) \
|| defined(__MIPSEL__)
#define SOPHIST_endian SOPHIST_little_endian
#else
#define SOPHIST_endian SOPHIST_big_endian
#endif
#endif /* __INCLUDE_SOPHIST_H__ */
|