11bb92983SJerome Forissier /* SPDX-License-Identifier: BSD-2-Clause */ 2b0104773SPascal Brand /* 3b0104773SPascal Brand * Copyright (c) 2014, STMicroelectronics International N.V. 4b0104773SPascal Brand */ 5b0104773SPascal Brand 69668cb1eSJens Wiklander #include <limits.h> 79668cb1eSJens Wiklander 8b0104773SPascal Brand /* 9b0104773SPascal Brand * This file provides what C99 standard requires in 10b0104773SPascal Brand * 7.18 interger types <stdint.h> 11b0104773SPascal Brand */ 12b0104773SPascal Brand 13*7eaed3a3SEtienne Carriere #ifndef __STDINT_H 14*7eaed3a3SEtienne Carriere #define __STDINT_H 15b0104773SPascal Brand 161f60363aSJens Wiklander /* 171f60363aSJens Wiklander * If compiler supplies neither __ILP32__ or __LP64__, try to figure it out 181f60363aSJens Wiklander * here. 191f60363aSJens Wiklander */ 201f60363aSJens Wiklander #if !defined(__ILP32__) && !defined(__LP64__) 211f60363aSJens Wiklander #if defined(__SIZEOF_INT__) && defined(__SIZEOF_POINTER__) && \ 221f60363aSJens Wiklander defined(__SIZEOF_LONG__) 231f60363aSJens Wiklander #if __SIZEOF_INT__ == 4 && __SIZEOF_POINTER__ == 4 && __SIZEOF_LONG__ == 4 241f60363aSJens Wiklander #define __ILP32__ 1 251f60363aSJens Wiklander #endif 261f60363aSJens Wiklander #if __SIZEOF_INT__ == 4 && __SIZEOF_POINTER__ == 8 && __SIZEOF_LONG__ == 8 271f60363aSJens Wiklander #define __LP64__ 1 281f60363aSJens Wiklander #endif 291f60363aSJens Wiklander #endif 301f60363aSJens Wiklander #endif /* !defined(__ILP32__) && !defined(__LP64__) */ 311f60363aSJens Wiklander 321f60363aSJens Wiklander #if !defined(__ILP32__) && !defined(__LP64__) 331f60363aSJens Wiklander #error Neither __ILP32__ nor __LP64__ is defined 341f60363aSJens Wiklander #endif 351f60363aSJens Wiklander 36757331fcSJens Wiklander #ifndef __ASSEMBLER__ 37385e3901SJens Wiklander 38b0104773SPascal Brand /* 7.18.1.1 Exact-width interger types */ 39b0104773SPascal Brand #ifndef __int8_t_defined 40b0104773SPascal Brand # define __int8_t_defined 41b0104773SPascal Brand typedef signed char int8_t; 42b0104773SPascal Brand typedef short int int16_t; 43b0104773SPascal Brand typedef int int32_t; 441f60363aSJens Wiklander #ifdef __ILP32__ 45b0104773SPascal Brand __extension__ 46b0104773SPascal Brand typedef long long int int64_t; 471f60363aSJens Wiklander #endif /*__ILP32__*/ 481f60363aSJens Wiklander #ifdef __LP64__ 491f60363aSJens Wiklander typedef long int int64_t; 501f60363aSJens Wiklander #endif /*__LP64__*/ 51b0104773SPascal Brand #endif 52b0104773SPascal Brand 53b0104773SPascal Brand /* Unsigned. */ 54b0104773SPascal Brand typedef unsigned char uint8_t; 55b0104773SPascal Brand typedef unsigned short int uint16_t; 56b0104773SPascal Brand #ifndef __uint32_t_defined 57b0104773SPascal Brand typedef unsigned int uint32_t; 58b0104773SPascal Brand # define __uint32_t_defined 59b0104773SPascal Brand #endif 601f60363aSJens Wiklander #ifdef __ILP32__ 61b0104773SPascal Brand __extension__ 62b0104773SPascal Brand typedef unsigned long long int uint64_t; 631f60363aSJens Wiklander #endif /*__ILP32__*/ 641f60363aSJens Wiklander #ifdef __LP64__ 651f60363aSJens Wiklander typedef unsigned long int uint64_t; 661f60363aSJens Wiklander #endif /*__LP64__*/ 67b0104773SPascal Brand 684c1908d3SJens Wiklander /* 7.18.1.2 Minimum-width integer types */ 694c1908d3SJens Wiklander typedef int8_t int_least8_t; 704c1908d3SJens Wiklander typedef int16_t int_least16_t; 714c1908d3SJens Wiklander typedef int32_t int_least32_t; 724c1908d3SJens Wiklander typedef int64_t int_least64_t; 734c1908d3SJens Wiklander typedef uint8_t uint_least8_t; 744c1908d3SJens Wiklander typedef uint16_t uint_least16_t; 754c1908d3SJens Wiklander typedef uint32_t uint_least32_t; 764c1908d3SJens Wiklander typedef uint64_t uint_least64_t; 774c1908d3SJens Wiklander 784c1908d3SJens Wiklander /* 7.18.1.3 Fastest minimum-width integer types */ 794c1908d3SJens Wiklander typedef int8_t int_fast8_t; 804c1908d3SJens Wiklander typedef int16_t int_fast16_t; 814c1908d3SJens Wiklander typedef int32_t int_fast32_t; 824c1908d3SJens Wiklander typedef int64_t int_fast64_t; 834c1908d3SJens Wiklander typedef uint8_t uint_fast8_t; 844c1908d3SJens Wiklander typedef uint16_t uint_fast16_t; 854c1908d3SJens Wiklander typedef uint32_t uint_fast32_t; 864c1908d3SJens Wiklander typedef uint64_t uint_fast64_t; 874c1908d3SJens Wiklander 88b0104773SPascal Brand /* 7.18.1.4 Integer types capable of holding object pointers */ 891f60363aSJens Wiklander typedef long intptr_t; 901f60363aSJens Wiklander typedef unsigned long uintptr_t; 91b0104773SPascal Brand 921f60363aSJens Wiklander typedef int64_t intmax_t; 931f60363aSJens Wiklander typedef uint64_t uintmax_t; 94b0104773SPascal Brand 95757331fcSJens Wiklander #endif /*__ASSEMBLER__*/ 96385e3901SJens Wiklander 97b0104773SPascal Brand /* 98b0104773SPascal Brand * 7.18.2 Limits of specified-width integer types 99b0104773SPascal Brand */ 100b0104773SPascal Brand 101b0104773SPascal Brand /* 7.18.2.1 Limits of exact-width interger types */ 102b0104773SPascal Brand 103b0104773SPascal Brand #define INT8_MIN (-0x7f-1) 104b0104773SPascal Brand #define INT16_MIN (-0x7fff-1) 105b0104773SPascal Brand #define INT32_MIN (-0x7fffffff-1) 106b0104773SPascal Brand #define INT64_MIN (-0x7fffffffffffffffL-1) 107b0104773SPascal Brand 108b0104773SPascal Brand #define INT8_MAX 0x7f 109b0104773SPascal Brand #define INT16_MAX 0x7fff 110b0104773SPascal Brand #define INT32_MAX 0x7fffffff 111b0104773SPascal Brand #define INT64_MAX 0x7fffffffffffffffL 112b0104773SPascal Brand 113b0104773SPascal Brand #define UINT8_MAX 0xff 114b0104773SPascal Brand #define UINT16_MAX 0xffff 115b0104773SPascal Brand #define UINT32_MAX 0xffffffffU 116b0104773SPascal Brand #define UINT64_MAX 0xffffffffffffffffUL 117b0104773SPascal Brand 1184c1908d3SJens Wiklander /* 7.18.2.2 Limits of minimum-width integer types */ 1194c1908d3SJens Wiklander 1204c1908d3SJens Wiklander #define INT_LEAST8_MIN INT8_MIN 1214c1908d3SJens Wiklander #define INT_LEAST16_MIN INT16_MIN 1224c1908d3SJens Wiklander #define INT_LEAST32_MIN INT32_MIN 1234c1908d3SJens Wiklander #define INT_LEAST64_MIN INT64_MIN 1244c1908d3SJens Wiklander 1254c1908d3SJens Wiklander #define INT_LEAST8_MAX INT8_MAX 1264c1908d3SJens Wiklander #define INT_LEAST16_MAX INT16_MAX 1274c1908d3SJens Wiklander #define INT_LEAST32_MAX INT32_MAX 1284c1908d3SJens Wiklander #define INT_LEAST64_MAX INT64_MAX 1294c1908d3SJens Wiklander 1304c1908d3SJens Wiklander #define UINT_LEAST8_MAX UINT8_MAX 1314c1908d3SJens Wiklander #define UINT_LEAST16_MAX UINT16_MAX 1324c1908d3SJens Wiklander #define UINT_LEAST32_MAX UINT32_MAX 1334c1908d3SJens Wiklander #define UINT_LEAST64_MAX UINT64_MAX 1344c1908d3SJens Wiklander 1354c1908d3SJens Wiklander /* 7.18.2.3 Limits of fastest minimum-width integer types */ 1364c1908d3SJens Wiklander 1374c1908d3SJens Wiklander #define INT_FAST8_MIN INT8_MIN 1384c1908d3SJens Wiklander #define INT_FAST16_MIN INT16_MIN 1394c1908d3SJens Wiklander #define INT_FAST32_MIN INT32_MIN 1404c1908d3SJens Wiklander #define INT_FAST64_MIN INT64_MIN 1414c1908d3SJens Wiklander 1424c1908d3SJens Wiklander #define INT_FAST8_MAX INT8_MAX 1434c1908d3SJens Wiklander #define INT_FAST16_MAX INT16_MAX 1444c1908d3SJens Wiklander #define INT_FAST32_MAX INT32_MAX 1454c1908d3SJens Wiklander #define INT_FAST64_MAX INT64_MAX 1464c1908d3SJens Wiklander 1474c1908d3SJens Wiklander #define UINT_FAST8_MAX UINT8_MAX 1484c1908d3SJens Wiklander #define UINT_FAST16_MAX UINT16_MAX 1494c1908d3SJens Wiklander #define UINT_FAST32_MAX UINT32_MAX 1504c1908d3SJens Wiklander #define UINT_FAST64_MAX UINT64_MAX 1514c1908d3SJens Wiklander 152b0104773SPascal Brand /* 7.18.2.4 Limits of integer types capable of holding object pointers */ 153b0104773SPascal Brand 1541f60363aSJens Wiklander #define INTPTR_MIN LONG_MIN 1551f60363aSJens Wiklander #define INTPTR_MAX LONG_MAX 1561f60363aSJens Wiklander #define UINTPTR_MAX ULONG_MAX 1571f60363aSJens Wiklander 15839a6336dSJason Lin /* 7.18.2.5 Limits of greatest-width integer types */ 1591f60363aSJens Wiklander #define INTMAX_MAX INT64_MAX 1601f60363aSJens Wiklander #define INTMAX_MIN INT64_MIN 1611f60363aSJens Wiklander #define UINTMAX_MAX UINT64_MAX 162b0104773SPascal Brand 16339a6336dSJason Lin /* 7.18.3 Limits of other integer types */ 16439a6336dSJason Lin #define SIZE_MAX ULONG_MAX 16539a6336dSJason Lin 1664c1908d3SJens Wiklander /* 1674c1908d3SJens Wiklander * 7.18.4 Macros for integer constants 1684c1908d3SJens Wiklander */ 1694c1908d3SJens Wiklander 170378e007dSJens Wiklander #ifdef __ASSEMBLER__ 171378e007dSJens Wiklander #define U(v) v 172378e007dSJens Wiklander #define UL(v) v 173378e007dSJens Wiklander #define ULL(v) v 174378e007dSJens Wiklander #define L(v) v 175378e007dSJens Wiklander #define LL(v) v 176378e007dSJens Wiklander #else 177378e007dSJens Wiklander #define U(v) v ## U 178378e007dSJens Wiklander #define UL(v) v ## UL 179378e007dSJens Wiklander #define ULL(v) v ## ULL 180378e007dSJens Wiklander #define L(v) v ## L 181378e007dSJens Wiklander #define LL(v) v ## LL 182378e007dSJens Wiklander #endif 183378e007dSJens Wiklander 1844c1908d3SJens Wiklander /* 7.18.4.1 Macros for minimum-width integer constants */ 1854c1908d3SJens Wiklander 1864c1908d3SJens Wiklander #define INT8_C(v) v 1874c1908d3SJens Wiklander #define UINT8_C(v) v 1884c1908d3SJens Wiklander #define INT16_C(v) v 1894c1908d3SJens Wiklander #define UINT16_C(v) v 1904c1908d3SJens Wiklander #define INT32_C(v) v 191378e007dSJens Wiklander #define UINT32_C(v) U(v) 1924c1908d3SJens Wiklander #ifdef __ILP32__ 193378e007dSJens Wiklander #define INT64_C(v) LL(v) 194378e007dSJens Wiklander #define UINT64_C(v) ULL(v) 1954c1908d3SJens Wiklander #endif 1964c1908d3SJens Wiklander #ifdef __LP64__ 197378e007dSJens Wiklander #define INT64_C(v) L(v) 198378e007dSJens Wiklander #define UINT64_C(v) UL(v) 1994c1908d3SJens Wiklander #endif 2004c1908d3SJens Wiklander 201378e007dSJens Wiklander #define UINTPTR_C(v) UL(v) 202c8abbbdbSVolodymyr Babchuk 2034c1908d3SJens Wiklander /* 7.18.4.2 Macros for greatest-width integer constants */ 2044c1908d3SJens Wiklander 2054c1908d3SJens Wiklander #define INTMAX_C(v) INT64_C(v) 2064c1908d3SJens Wiklander #define UINTMAX_C(v) UINT64_C(v) 2074c1908d3SJens Wiklander 208*7eaed3a3SEtienne Carriere #endif /* __STDINT_H */ 209