11bb92983SJerome Forissier /* SPDX-License-Identifier: BSD-2-Clause */ 2b0104773SPascal Brand /* 3b0104773SPascal Brand * Copyright (c) 2014, STMicroelectronics International N.V. 4b0104773SPascal Brand */ 5b0104773SPascal Brand 6*9668cb1eSJens Wiklander #include <limits.h> 7*9668cb1eSJens 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 13b0104773SPascal Brand #ifndef STDINT_H 14b0104773SPascal Brand #define STDINT_H 15b0104773SPascal Brand #define _STDINT_H 16b0104773SPascal Brand 171f60363aSJens Wiklander /* 181f60363aSJens Wiklander * If compiler supplies neither __ILP32__ or __LP64__, try to figure it out 191f60363aSJens Wiklander * here. 201f60363aSJens Wiklander */ 211f60363aSJens Wiklander #if !defined(__ILP32__) && !defined(__LP64__) 221f60363aSJens Wiklander #if defined(__SIZEOF_INT__) && defined(__SIZEOF_POINTER__) && \ 231f60363aSJens Wiklander defined(__SIZEOF_LONG__) 241f60363aSJens Wiklander #if __SIZEOF_INT__ == 4 && __SIZEOF_POINTER__ == 4 && __SIZEOF_LONG__ == 4 251f60363aSJens Wiklander #define __ILP32__ 1 261f60363aSJens Wiklander #endif 271f60363aSJens Wiklander #if __SIZEOF_INT__ == 4 && __SIZEOF_POINTER__ == 8 && __SIZEOF_LONG__ == 8 281f60363aSJens Wiklander #define __LP64__ 1 291f60363aSJens Wiklander #endif 301f60363aSJens Wiklander #endif 311f60363aSJens Wiklander #endif /* !defined(__ILP32__) && !defined(__LP64__) */ 321f60363aSJens Wiklander 331f60363aSJens Wiklander #if !defined(__ILP32__) && !defined(__LP64__) 341f60363aSJens Wiklander #error Neither __ILP32__ nor __LP64__ is defined 351f60363aSJens Wiklander #endif 361f60363aSJens Wiklander 37385e3901SJens Wiklander #ifndef ASM 38385e3901SJens Wiklander 39b0104773SPascal Brand /* 7.18.1.1 Exact-width interger types */ 40b0104773SPascal Brand #ifndef __int8_t_defined 41b0104773SPascal Brand # define __int8_t_defined 42b0104773SPascal Brand typedef signed char int8_t; 43b0104773SPascal Brand typedef short int int16_t; 44b0104773SPascal Brand typedef int int32_t; 451f60363aSJens Wiklander #ifdef __ILP32__ 46b0104773SPascal Brand __extension__ 47b0104773SPascal Brand typedef long long int int64_t; 481f60363aSJens Wiklander #endif /*__ILP32__*/ 491f60363aSJens Wiklander #ifdef __LP64__ 501f60363aSJens Wiklander typedef long int int64_t; 511f60363aSJens Wiklander #endif /*__LP64__*/ 52b0104773SPascal Brand #endif 53b0104773SPascal Brand 54b0104773SPascal Brand /* Unsigned. */ 55b0104773SPascal Brand typedef unsigned char uint8_t; 56b0104773SPascal Brand typedef unsigned short int uint16_t; 57b0104773SPascal Brand #ifndef __uint32_t_defined 58b0104773SPascal Brand typedef unsigned int uint32_t; 59b0104773SPascal Brand # define __uint32_t_defined 60b0104773SPascal Brand #endif 611f60363aSJens Wiklander #ifdef __ILP32__ 62b0104773SPascal Brand __extension__ 63b0104773SPascal Brand typedef unsigned long long int uint64_t; 641f60363aSJens Wiklander #endif /*__ILP32__*/ 651f60363aSJens Wiklander #ifdef __LP64__ 661f60363aSJens Wiklander typedef unsigned long int uint64_t; 671f60363aSJens Wiklander #endif /*__LP64__*/ 68b0104773SPascal Brand 694c1908d3SJens Wiklander /* 7.18.1.2 Minimum-width integer types */ 704c1908d3SJens Wiklander typedef int8_t int_least8_t; 714c1908d3SJens Wiklander typedef int16_t int_least16_t; 724c1908d3SJens Wiklander typedef int32_t int_least32_t; 734c1908d3SJens Wiklander typedef int64_t int_least64_t; 744c1908d3SJens Wiklander typedef uint8_t uint_least8_t; 754c1908d3SJens Wiklander typedef uint16_t uint_least16_t; 764c1908d3SJens Wiklander typedef uint32_t uint_least32_t; 774c1908d3SJens Wiklander typedef uint64_t uint_least64_t; 784c1908d3SJens Wiklander 794c1908d3SJens Wiklander /* 7.18.1.3 Fastest minimum-width integer types */ 804c1908d3SJens Wiklander typedef int8_t int_fast8_t; 814c1908d3SJens Wiklander typedef int16_t int_fast16_t; 824c1908d3SJens Wiklander typedef int32_t int_fast32_t; 834c1908d3SJens Wiklander typedef int64_t int_fast64_t; 844c1908d3SJens Wiklander typedef uint8_t uint_fast8_t; 854c1908d3SJens Wiklander typedef uint16_t uint_fast16_t; 864c1908d3SJens Wiklander typedef uint32_t uint_fast32_t; 874c1908d3SJens Wiklander typedef uint64_t uint_fast64_t; 884c1908d3SJens Wiklander 89b0104773SPascal Brand /* 7.18.1.4 Integer types capable of holding object pointers */ 901f60363aSJens Wiklander typedef long intptr_t; 911f60363aSJens Wiklander typedef unsigned long uintptr_t; 92b0104773SPascal Brand 931f60363aSJens Wiklander typedef int64_t intmax_t; 941f60363aSJens Wiklander typedef uint64_t uintmax_t; 95b0104773SPascal Brand 96385e3901SJens Wiklander #endif /*ASM*/ 97385e3901SJens Wiklander 98b0104773SPascal Brand /* 99b0104773SPascal Brand * 7.18.2 Limits of specified-width integer types 100b0104773SPascal Brand */ 101b0104773SPascal Brand 102b0104773SPascal Brand /* 7.18.2.1 Limits of exact-width interger types */ 103b0104773SPascal Brand 104b0104773SPascal Brand #define INT8_MIN (-0x7f-1) 105b0104773SPascal Brand #define INT16_MIN (-0x7fff-1) 106b0104773SPascal Brand #define INT32_MIN (-0x7fffffff-1) 107b0104773SPascal Brand #define INT64_MIN (-0x7fffffffffffffffL-1) 108b0104773SPascal Brand 109b0104773SPascal Brand #define INT8_MAX 0x7f 110b0104773SPascal Brand #define INT16_MAX 0x7fff 111b0104773SPascal Brand #define INT32_MAX 0x7fffffff 112b0104773SPascal Brand #define INT64_MAX 0x7fffffffffffffffL 113b0104773SPascal Brand 114b0104773SPascal Brand #define UINT8_MAX 0xff 115b0104773SPascal Brand #define UINT16_MAX 0xffff 116b0104773SPascal Brand #define UINT32_MAX 0xffffffffU 117b0104773SPascal Brand #define UINT64_MAX 0xffffffffffffffffUL 118b0104773SPascal Brand 1194c1908d3SJens Wiklander /* 7.18.2.2 Limits of minimum-width integer types */ 1204c1908d3SJens Wiklander 1214c1908d3SJens Wiklander #define INT_LEAST8_MIN INT8_MIN 1224c1908d3SJens Wiklander #define INT_LEAST16_MIN INT16_MIN 1234c1908d3SJens Wiklander #define INT_LEAST32_MIN INT32_MIN 1244c1908d3SJens Wiklander #define INT_LEAST64_MIN INT64_MIN 1254c1908d3SJens Wiklander 1264c1908d3SJens Wiklander #define INT_LEAST8_MAX INT8_MAX 1274c1908d3SJens Wiklander #define INT_LEAST16_MAX INT16_MAX 1284c1908d3SJens Wiklander #define INT_LEAST32_MAX INT32_MAX 1294c1908d3SJens Wiklander #define INT_LEAST64_MAX INT64_MAX 1304c1908d3SJens Wiklander 1314c1908d3SJens Wiklander #define UINT_LEAST8_MAX UINT8_MAX 1324c1908d3SJens Wiklander #define UINT_LEAST16_MAX UINT16_MAX 1334c1908d3SJens Wiklander #define UINT_LEAST32_MAX UINT32_MAX 1344c1908d3SJens Wiklander #define UINT_LEAST64_MAX UINT64_MAX 1354c1908d3SJens Wiklander 1364c1908d3SJens Wiklander /* 7.18.2.3 Limits of fastest minimum-width integer types */ 1374c1908d3SJens Wiklander 1384c1908d3SJens Wiklander #define INT_FAST8_MIN INT8_MIN 1394c1908d3SJens Wiklander #define INT_FAST16_MIN INT16_MIN 1404c1908d3SJens Wiklander #define INT_FAST32_MIN INT32_MIN 1414c1908d3SJens Wiklander #define INT_FAST64_MIN INT64_MIN 1424c1908d3SJens Wiklander 1434c1908d3SJens Wiklander #define INT_FAST8_MAX INT8_MAX 1444c1908d3SJens Wiklander #define INT_FAST16_MAX INT16_MAX 1454c1908d3SJens Wiklander #define INT_FAST32_MAX INT32_MAX 1464c1908d3SJens Wiklander #define INT_FAST64_MAX INT64_MAX 1474c1908d3SJens Wiklander 1484c1908d3SJens Wiklander #define UINT_FAST8_MAX UINT8_MAX 1494c1908d3SJens Wiklander #define UINT_FAST16_MAX UINT16_MAX 1504c1908d3SJens Wiklander #define UINT_FAST32_MAX UINT32_MAX 1514c1908d3SJens Wiklander #define UINT_FAST64_MAX UINT64_MAX 1524c1908d3SJens Wiklander 153b0104773SPascal Brand /* 7.18.2.4 Limits of integer types capable of holding object pointers */ 154b0104773SPascal Brand 1551f60363aSJens Wiklander #define INTPTR_MIN LONG_MIN 1561f60363aSJens Wiklander #define INTPTR_MAX LONG_MAX 1571f60363aSJens Wiklander #define UINTPTR_MAX ULONG_MAX 1581f60363aSJens Wiklander 15939a6336dSJason Lin /* 7.18.2.5 Limits of greatest-width integer types */ 1601f60363aSJens Wiklander #define INTMAX_MAX INT64_MAX 1611f60363aSJens Wiklander #define INTMAX_MIN INT64_MIN 1621f60363aSJens Wiklander #define UINTMAX_MAX UINT64_MAX 163b0104773SPascal Brand 16439a6336dSJason Lin /* 7.18.3 Limits of other integer types */ 16539a6336dSJason Lin #define SIZE_MAX ULONG_MAX 16639a6336dSJason Lin 1674c1908d3SJens Wiklander /* 1684c1908d3SJens Wiklander * 7.18.4 Macros for integer constants 1694c1908d3SJens Wiklander */ 1704c1908d3SJens Wiklander 1714c1908d3SJens Wiklander /* 7.18.4.1 Macros for minimum-width integer constants */ 1724c1908d3SJens Wiklander 1734c1908d3SJens Wiklander #define INT8_C(v) v 1744c1908d3SJens Wiklander #define UINT8_C(v) v 1754c1908d3SJens Wiklander #define INT16_C(v) v 1764c1908d3SJens Wiklander #define UINT16_C(v) v 1774c1908d3SJens Wiklander #define INT32_C(v) v 1784c1908d3SJens Wiklander #define UINT32_C(v) v ## U 1794c1908d3SJens Wiklander #ifdef __ILP32__ 1804c1908d3SJens Wiklander #define INT64_C(v) v ## LL 1814c1908d3SJens Wiklander #define UINT64_C(v) v ## ULL 1824c1908d3SJens Wiklander #endif 1834c1908d3SJens Wiklander #ifdef __LP64__ 1844c1908d3SJens Wiklander #define INT64_C(v) v ## L 1854c1908d3SJens Wiklander #define UINT64_C(v) v ## UL 1864c1908d3SJens Wiklander #endif 1874c1908d3SJens Wiklander 188c8abbbdbSVolodymyr Babchuk #ifdef ASM 189c8abbbdbSVolodymyr Babchuk #define UINTPTR_C(v) v 190c8abbbdbSVolodymyr Babchuk #else 191c8abbbdbSVolodymyr Babchuk #define UINTPTR_C(v) v ## LU 192c8abbbdbSVolodymyr Babchuk #endif 193c8abbbdbSVolodymyr Babchuk 1944c1908d3SJens Wiklander /* 7.18.4.2 Macros for greatest-width integer constants */ 1954c1908d3SJens Wiklander 1964c1908d3SJens Wiklander #define INTMAX_C(v) INT64_C(v) 1974c1908d3SJens Wiklander #define UINTMAX_C(v) UINT64_C(v) 1984c1908d3SJens Wiklander 1994c1908d3SJens Wiklander 200b0104773SPascal Brand #endif /* STDINT_H */ 201