/* * Copyright (c) 2004, 2005 by * Ralf Corsepius, Ulm/Germany. All rights reserved. * * Permission to use, copy, modify, and distribute this software * is freely granted, provided that this notice is preserved. */ /* * @todo - Add fast_t types. * @todo - Add support for wint_t types. */ #ifndef _STDINT_H #define _STDINT_H #include #include #ifdef __cplusplus extern "C" { #endif #if defined(__GNUC__) && (__GNUC__ >= 3 ) \ && defined(__GNUC_MINOR__) && (__GNUC_MINOR__ > 2 ) #define __STDINT_EXP(x) __##x##__ #else #define __STDINT_EXP(x) x #include #endif #if __STDINT_EXP(SCHAR_MAX) == 0x7f #define __int8_t_defined 1 #endif #if __int8_t_defined typedef signed char int_least8_t; typedef unsigned char uint_least8_t; #define __int_least8_t_defined 1 #endif #if __STDINT_EXP(SHRT_MAX) == 0x7fff #define __int16_t_defined 1 #elif __STDINT_EXP(INT_MAX) == 0x7fff #define __int16_t_defined 1 #elif __STDINT_EXP(SCHAR_MAX) == 0x7fff #define __int16_t_defined 1 #endif #if __int16_t_defined typedef int16_t int_least16_t; typedef uint16_t uint_least16_t; #define __int_least16_t_defined 1 #ifndef __int_least8_t_defined typedef int16_t int_least8_t; typedef uint16_t uint_least8_t; #define __int_least8_t_defined 1 #endif #endif #if __STDINT_EXP(INT_MAX) == 0x7fffffffL #define __int32_t_defined 1 #elif __STDINT_EXP(LONG_MAX) == 0x7fffffffL #define __int32_t_defined 1 #define __have_long32 1 #elif __STDINT_EXP(SHRT_MAX) == 0x7fffffffL #define __int32_t_defined 1 #elif __STDINT_EXP(SCHAR_MAX) == 0x7fffffffL #define __int32_t_defined 1 #endif #if __int32_t_defined typedef int32_t int_least32_t; typedef uint32_t uint_least32_t; #define __int_least32_t_defined 1 #ifndef __int_least8_t_defined typedef int32_t int_least8_t; typedef uint32_t uint_least8_t; #define __int_least8_t_defined 1 #endif #ifndef __int_least16_t_defined typedef int32_t int_least16_t; typedef uint32_t uint_least16_t; #define __int_least16_t_defined 1 #endif #endif /* Fast types. */ /* Signed. */ typedef signed char int_fast8_t; #if __WORDSIZE == 64 typedef long int int_fast16_t; typedef long int int_fast32_t; typedef long int int_fast64_t; #else typedef int int_fast16_t; typedef int int_fast32_t; __extension__ typedef long long int int_fast64_t; #endif /* Unsigned. */ typedef unsigned char uint_fast8_t; #if __WORDSIZE == 64 typedef unsigned long int uint_fast16_t; typedef unsigned long int uint_fast32_t; typedef unsigned long int uint_fast64_t; #else typedef unsigned int uint_fast16_t; typedef unsigned int uint_fast32_t; __extension__ typedef unsigned long long int uint_fast64_t; #endif #if __STDINT_EXP(LONG_MAX) > 0x7fffffff #define __int64_t_defined 1 #define __have_long64 1 #elif defined(__LONG_LONG_MAX__) && (__LONG_LONG_MAX__ > 0x7fffffff) #define __int64_t_defined 1 #define __have_longlong64 1 #elif defined(LLONG_MAX) && (LLONG_MAX > 0x7fffffff) #define __int64_t_defined 1 #define __have_longlong64 1 #elif __STDINT_EXP(INT_MAX) > 0x7fffffff #define __int64_t_defined 1 #endif #if __int64_t_defined typedef int64_t int_least64_t; typedef uint64_t uint_least64_t; #define __int_least64_t_defined 1 #ifndef __int_least8_t_defined typedef int64_t int_least8_t; typedef uint64_t uint_least8_t; #define __int_least8_t_defined 1 #endif #ifndef __int_least16_t_defined typedef int64_t int_least16_t; typedef uint64_t uint_least16_t; #define __int_least16_t_defined 1 #endif #ifndef __int_least32_t_defined typedef int64_t int_least32_t; typedef uint64_t uint_least32_t; #define __int_least32_t_defined 1 #endif #endif /* Greatest-width integer types */ /* Modern GCCs provide __INTMAX_TYPE__ */ #if defined(__INTMAX_TYPE__) typedef __INTMAX_TYPE__ intmax_t; #elif __have_longlong64 typedef signed long long intmax_t; #else typedef signed long intmax_t; #endif /* Modern GCCs provide __UINTMAX_TYPE__ */ #if defined(__UINTMAX_TYPE__) typedef __UINTMAX_TYPE__ uintmax_t; #elif __have_longlong64 typedef unsigned long long uintmax_t; #else typedef unsigned long uintmax_t; #endif /* Limits of Specified-Width Integer Types */ #if __int8_t_defined #define INT8_MIN -128 #define INT8_MAX 127 #define UINT8_MAX 255 #endif #if __int_least8_t_defined #define INT_LEAST8_MIN -128 #define INT_LEAST8_MAX 127 #define UINT_LEAST8_MAX 255 #else #error required type int_least8_t missing #endif #if __int16_t_defined #define INT16_MIN -32768 #define INT16_MAX 32767 #define UINT16_MAX 65535 #endif #if __int_least16_t_defined #define INT_LEAST16_MIN -32768 #define INT_LEAST16_MAX 32767 #define UINT_LEAST16_MAX 65535 #else #error required type int_least16_t missing #endif #if __int32_t_defined #define INT32_MIN (-2147483647-1) #define INT32_MAX 2147483647 #define UINT32_MAX 4294967295U #endif #if __int_least32_t_defined #define INT_LEAST32_MIN (-2147483647-1) #define INT_LEAST32_MAX 2147483647 #define UINT_LEAST32_MAX 4294967295U #else #error required type int_least32_t missing #endif #if __int64_t_defined #ifdef __have_long64 #define INT64_MIN (-9223372036854775807L-1L) #define INT64_MAX 9223372036854775807L #define UINT64_MAX 18446744073709551615U #elif defined(__have_longlong64) #define INT64_MIN (-9223372036854775807LL-1LL) #define INT64_MAX 9223372036854775807LL #define UINT64_MAX 18446744073709551615ULL #endif #endif #if __int_least64_t_defined #ifdef __have_long64 #define INT_LEAST64_MIN (-9223372036854775807L-1L) #define INT_LEAST64_MAX 9223372036854775807L #define UINT_LEAST64_MAX 18446744073709551615U #elif defined(__have_longlong64) #define INT_LEAST64_MIN (-9223372036854775807LL-1LL) #define INT_LEAST64_MAX 9223372036854775807LL #define UINT_LEAST64_MAX 18446744073709551615ULL #endif #endif /* This must match size_t in stddef.h, currently long unsigned int */ #define SIZE_MAX (__STDINT_EXP(LONG_MAX) * 2UL + 1) /* This must match sig_atomic_t in (currently int) */ #define SIG_ATOMIC_MIN (-__STDINT_EXP(INT_MAX) - 1) #define SIG_ATOMIC_MAX __STDINT_EXP(INT_MAX) /* This must match ptrdiff_t in (currently long int) */ #define PTRDIFF_MIN (-__STDINT_EXP(LONG_MAX) - 1L) #define PTRDIFF_MAX __STDINT_EXP(LONG_MAX) /** Macros for minimum-width integer constant expressions */ #define INT8_C(x) x #define UINT8_C(x) x##U #define INT16_C(x) x #define UINT16_C(x) x##U #if __have_long32 #define INT32_C(x) x##L #define UINT32_C(x) x##UL #else #define INT32_C(x) x #define UINT32_C(x) x##U #endif #if __int64_t_defined #if __have_longlong64 #define INT64_C(x) x##LL #define UINT64_C(x) x##ULL #else #define INT64_C(x) x##L #define UINT64_C(x) x##UL #endif #endif /** Macros for greatest-width integer constant expression */ #if __have_longlong64 #define INTMAX_C(x) x##LL #define UINTMAX_C(x) x##ULL #else #define INTMAX_C(x) x##L #define UINTMAX_C(x) x##UL #endif #ifdef __cplusplus } #endif #endif /* _STDINT_H */