/* * nasmint.h * * Small ersatz subset of , deriving the types from * . * * Important: the preprocessor may truncate numbers too large for it. * Therefore, test the signed types only ... truncation won't generate * a 01111111... bit pattern. */ #ifndef NASM_NASMINT_H #define NASM_NASMINT_H #include /*** 64-bit type: __int64, long or long long ***/ /* Some old versions of gcc omit LLONG_MAX */ #ifndef LLONG_MAX # ifdef __LONG_LONG_MAX__ # define LLONG_MAX __LONG_LONG_MAX__ # else # define LLONG_MAX 0 /* Assume long long is unusable */ # endif #endif #ifndef _I64_MAX # ifdef _MSC_VER # define _I64_MAX 9223372036854775807 # else # define _I64_MAX 0 # endif #endif #if _I64_MAX == 9223372036854775807 /* Windows-based compiler: use __int64 */ typedef signed __int64 int64_t; typedef unsigned __int64 uint64_t; #define _scn64 "I64" #define _pri64 "I64" #define INT64_C(x) x ## i64 #define UINT64_C(x) x ## ui64 #elif LONG_MAX == 9223372036854775807L /* long is 64 bits */ typedef signed long int64_t; typedef unsigned long uint64_t; #define _scn64 "l" #define _pri64 "l" #define INT64_C(x) x ## L #define UINT64_C(x) x ## UL #elif LLONG_MAX == 9223372036854775807LL /* long long is 64 bits */ typedef signed long long int64_t; typedef unsigned long long uint64_t; #define _scn64 "ll" #define _pri64 "ll" #define INT64_C(x) x ## LL #define UINT64_C(x) x ## ULL #else #error "Neither long nor long long is 64 bits in size" #endif /*** 32-bit type: int or long ***/ #if INT_MAX == 2147483647 /* int is 32 bits */ typedef signed int int32_t; typedef unsigned int uint32_t; #define _scn32 "" #define _pri32 "" #define INT32_C(x) x #define UINT32_C(x) x ## U #elif LONG_MAX == 2147483647L /* long is 32 bits */ typedef signed long int32_t; typedef unsigned long uint32_t; #define _scn32 "l" #define _pri32 "l" #define INT32_C(x) x ## L #define UINT32_C(x) x ## UL #else #error "Neither int nor long is 32 bits in size" #endif /*** 16-bit size: int or short ***/ #if INT_MAX == 32767 /* int is 16 bits */ typedef signed int int16_t; typedef unsigned int uint16_t; #define _scn16 "" #define _pri16 "" #define INT16_C(x) x #define UINT16_C(x) x ## U #elif SHRT_MAX == 32767 /* short is 16 bits */ typedef signed short int16_t; typedef unsigned short uint16_t; #define _scn16 "h" #define _pri16 "" #define INT16_C(x) x #define UINT16_C(x) x ## U #else #error "Neither short nor int is 16 bits in size" #endif /*** 8-bit size: char ***/ #if SCHAR_MAX == 127 /* char is 8 bits */ typedef signed char int8_t; typedef unsigned char uint8_t; #define _scn8 "hh" #define _pri8 "" #define INT8_C(x) x #define UINT8_C(x) x ## U #else #error "char is not 8 bits in size" #endif /* The rest of this is common to all models */ #define PRId8 _pri8 "d" #define PRId16 _pri16 "d" #define PRId32 _pri32 "d" #define PRId64 _pri64 "d" #define PRIi8 _pri8 "i" #define PRIi16 _pri16 "i" #define PRIi32 _pri32 "i" #define PRIi64 _pri64 "i" #define PRIo8 _pri8 "o" #define PRIo16 _pri16 "o" #define PRIo32 _pri32 "o" #define PRIo64 _pri64 "o" #define PRIu8 _pri8 "u" #define PRIu16 _pri16 "u" #define PRIu32 _pri32 "u" #define PRIu64 _pri64 "u" #define PRIx8 _pri8 "x" #define PRIx16 _pri16 "x" #define PRIx32 _pri32 "x" #define PRIx64 _pri64 "x" #define PRIX8 _pri8 "X" #define PRIX16 _pri16 "X" #define PRIX32 _pri32 "X" #define PRIX64 _pri64 "X" #define SCNd8 _scn8 "d" #define SCNd16 _scn16 "d" #define SCNd32 _scn32 "d" #define SCNd64 _scn64 "d" #define SCNi8 _scn8 "i" #define SCNi16 _scn16 "i" #define SCNi32 _scn32 "i" #define SCNi64 _scn64 "i" #define SCNo8 _scn8 "o" #define SCNo16 _scn16 "o" #define SCNo32 _scn32 "o" #define SCNo64 _scn64 "o" #define SCNu8 _scn8 "u" #define SCNu16 _scn16 "u" #define SCNu32 _scn32 "u" #define SCNu64 _scn64 "u" #define SCNx8 _scn8 "x" #define SCNx16 _scn16 "x" #define SCNx32 _scn32 "x" #define SCNx64 _scn64 "x" #define INT8_MIN INT8_C(-128) #define INT8_MAX INT8_C(127) #define UINT8_MAX UINT8_C(255) #define INT16_MIN INT16_C(-32768) #define INT16_MAX INT16_C(32767) #define UINT16_MAX UINT16_C(65535) #define INT32_MIN INT32_C(-2147483648) #define INT32_MAX INT32_C(2147483647) #define UINT32_MAX UINT32_C(4294967295) #define INT64_MIN INT64_C(-9223372036854775808) #define INT64_MAX INT64_C(9223372036854775807) #define UINT64_MAX UINT64_C(18446744073709551615) #endif /* NASM_NASMINT_H */