/* 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__ */