123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- /*
- * nasmint.h
- *
- * Small ersatz subset of <inttypes.h>, deriving the types from
- * <limits.h>.
- *
- * 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 <limits.h>
- /*** 64-bit type: __int64, long or long long ***/
- /* Some old versions of gcc <limits.h> 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 */
|