xref: /optee_os/lib/libutils/isoc/include/stdint.h (revision 39a6336d8f7647cb2ed723e9e050c2b4c4a98db8)
1b0104773SPascal Brand /*
2b0104773SPascal Brand  * Copyright (c) 2014, STMicroelectronics International N.V.
3b0104773SPascal Brand  * All rights reserved.
4b0104773SPascal Brand  *
5b0104773SPascal Brand  * Redistribution and use in source and binary forms, with or without
6b0104773SPascal Brand  * modification, are permitted provided that the following conditions are met:
7b0104773SPascal Brand  *
8b0104773SPascal Brand  * 1. Redistributions of source code must retain the above copyright notice,
9b0104773SPascal Brand  * this list of conditions and the following disclaimer.
10b0104773SPascal Brand  *
11b0104773SPascal Brand  * 2. Redistributions in binary form must reproduce the above copyright notice,
12b0104773SPascal Brand  * this list of conditions and the following disclaimer in the documentation
13b0104773SPascal Brand  * and/or other materials provided with the distribution.
14b0104773SPascal Brand  *
15b0104773SPascal Brand  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16b0104773SPascal Brand  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17b0104773SPascal Brand  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18b0104773SPascal Brand  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
19b0104773SPascal Brand  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20b0104773SPascal Brand  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21b0104773SPascal Brand  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22b0104773SPascal Brand  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23b0104773SPascal Brand  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24b0104773SPascal Brand  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25b0104773SPascal Brand  * POSSIBILITY OF SUCH DAMAGE.
26b0104773SPascal Brand  */
27b0104773SPascal Brand 
28b0104773SPascal Brand /*
29b0104773SPascal Brand  * This file provides what C99 standard requires in
30b0104773SPascal Brand  * 7.18 interger types <stdint.h>
31b0104773SPascal Brand  */
32b0104773SPascal Brand 
33b0104773SPascal Brand #ifndef STDINT_H
34b0104773SPascal Brand #define STDINT_H
35b0104773SPascal Brand #define _STDINT_H
36b0104773SPascal Brand 
371f60363aSJens Wiklander /*
381f60363aSJens Wiklander  * If compiler supplies neither __ILP32__ or __LP64__, try to figure it out
391f60363aSJens Wiklander  * here.
401f60363aSJens Wiklander  */
411f60363aSJens Wiklander #if !defined(__ILP32__) && !defined(__LP64__)
421f60363aSJens Wiklander #if defined(__SIZEOF_INT__) && defined(__SIZEOF_POINTER__) && \
431f60363aSJens Wiklander 	defined(__SIZEOF_LONG__)
441f60363aSJens Wiklander #if __SIZEOF_INT__ == 4 && __SIZEOF_POINTER__ == 4 && __SIZEOF_LONG__ == 4
451f60363aSJens Wiklander #define __ILP32__ 1
461f60363aSJens Wiklander #endif
471f60363aSJens Wiklander #if __SIZEOF_INT__ == 4 && __SIZEOF_POINTER__ == 8 && __SIZEOF_LONG__ == 8
481f60363aSJens Wiklander #define __LP64__ 1
491f60363aSJens Wiklander #endif
501f60363aSJens Wiklander #endif
511f60363aSJens Wiklander #endif /* !defined(__ILP32__) && !defined(__LP64__) */
521f60363aSJens Wiklander 
531f60363aSJens Wiklander #if !defined(__ILP32__) && !defined(__LP64__)
541f60363aSJens Wiklander #error Neither __ILP32__ nor __LP64__ is defined
551f60363aSJens Wiklander #endif
561f60363aSJens Wiklander 
57b0104773SPascal Brand /* 7.18.1.1 Exact-width interger types */
58b0104773SPascal Brand #ifndef __int8_t_defined
59b0104773SPascal Brand # define __int8_t_defined
60b0104773SPascal Brand typedef signed char             int8_t;
61b0104773SPascal Brand typedef short int               int16_t;
62b0104773SPascal Brand typedef int                     int32_t;
631f60363aSJens Wiklander #ifdef __ILP32__
64b0104773SPascal Brand __extension__
65b0104773SPascal Brand typedef long long int           int64_t;
661f60363aSJens Wiklander #endif /*__ILP32__*/
671f60363aSJens Wiklander #ifdef __LP64__
681f60363aSJens Wiklander typedef long int		int64_t;
691f60363aSJens Wiklander #endif /*__LP64__*/
70b0104773SPascal Brand #endif
71b0104773SPascal Brand 
72b0104773SPascal Brand /* Unsigned.  */
73b0104773SPascal Brand typedef unsigned char           uint8_t;
74b0104773SPascal Brand typedef unsigned short int      uint16_t;
75b0104773SPascal Brand #ifndef __uint32_t_defined
76b0104773SPascal Brand typedef unsigned int            uint32_t;
77b0104773SPascal Brand # define __uint32_t_defined
78b0104773SPascal Brand #endif
791f60363aSJens Wiklander #ifdef __ILP32__
80b0104773SPascal Brand __extension__
81b0104773SPascal Brand typedef unsigned long long int  uint64_t;
821f60363aSJens Wiklander #endif /*__ILP32__*/
831f60363aSJens Wiklander #ifdef __LP64__
841f60363aSJens Wiklander typedef unsigned long int	uint64_t;
851f60363aSJens Wiklander #endif /*__LP64__*/
86b0104773SPascal Brand 
874c1908d3SJens Wiklander /* 7.18.1.2 Minimum-width integer types */
884c1908d3SJens Wiklander typedef int8_t int_least8_t;
894c1908d3SJens Wiklander typedef int16_t int_least16_t;
904c1908d3SJens Wiklander typedef int32_t int_least32_t;
914c1908d3SJens Wiklander typedef int64_t int_least64_t;
924c1908d3SJens Wiklander typedef uint8_t uint_least8_t;
934c1908d3SJens Wiklander typedef uint16_t uint_least16_t;
944c1908d3SJens Wiklander typedef uint32_t uint_least32_t;
954c1908d3SJens Wiklander typedef uint64_t uint_least64_t;
964c1908d3SJens Wiklander 
974c1908d3SJens Wiklander /* 7.18.1.3 Fastest minimum-width integer types */
984c1908d3SJens Wiklander typedef int8_t int_fast8_t;
994c1908d3SJens Wiklander typedef int16_t int_fast16_t;
1004c1908d3SJens Wiklander typedef int32_t int_fast32_t;
1014c1908d3SJens Wiklander typedef int64_t int_fast64_t;
1024c1908d3SJens Wiklander typedef uint8_t uint_fast8_t;
1034c1908d3SJens Wiklander typedef uint16_t uint_fast16_t;
1044c1908d3SJens Wiklander typedef uint32_t uint_fast32_t;
1054c1908d3SJens Wiklander typedef uint64_t uint_fast64_t;
1064c1908d3SJens Wiklander 
107b0104773SPascal Brand /* 7.18.1.4 Integer types capable of holding object pointers */
1081f60363aSJens Wiklander typedef long intptr_t;
1091f60363aSJens Wiklander typedef unsigned long uintptr_t;
110b0104773SPascal Brand 
1111f60363aSJens Wiklander typedef int64_t intmax_t;
1121f60363aSJens Wiklander typedef uint64_t uintmax_t;
113b0104773SPascal Brand 
114b0104773SPascal Brand /*
115b0104773SPascal Brand  * 7.18.2 Limits of specified-width integer types
116b0104773SPascal Brand  */
117b0104773SPascal Brand 
118b0104773SPascal Brand /* 7.18.2.1 Limits of exact-width interger types */
119b0104773SPascal Brand 
120b0104773SPascal Brand #define INT8_MIN    (-0x7f-1)
121b0104773SPascal Brand #define INT16_MIN   (-0x7fff-1)
122b0104773SPascal Brand #define INT32_MIN   (-0x7fffffff-1)
123b0104773SPascal Brand #define INT64_MIN   (-0x7fffffffffffffffL-1)
124b0104773SPascal Brand 
125b0104773SPascal Brand #define INT8_MAX    0x7f
126b0104773SPascal Brand #define INT16_MAX   0x7fff
127b0104773SPascal Brand #define INT32_MAX   0x7fffffff
128b0104773SPascal Brand #define INT64_MAX   0x7fffffffffffffffL
129b0104773SPascal Brand 
130b0104773SPascal Brand #define UINT8_MAX    0xff
131b0104773SPascal Brand #define UINT16_MAX   0xffff
132b0104773SPascal Brand #define UINT32_MAX   0xffffffffU
133b0104773SPascal Brand #define UINT64_MAX   0xffffffffffffffffUL
134b0104773SPascal Brand 
1354c1908d3SJens Wiklander /* 7.18.2.2 Limits of minimum-width integer types */
1364c1908d3SJens Wiklander 
1374c1908d3SJens Wiklander #define INT_LEAST8_MIN		INT8_MIN
1384c1908d3SJens Wiklander #define INT_LEAST16_MIN		INT16_MIN
1394c1908d3SJens Wiklander #define INT_LEAST32_MIN		INT32_MIN
1404c1908d3SJens Wiklander #define INT_LEAST64_MIN		INT64_MIN
1414c1908d3SJens Wiklander 
1424c1908d3SJens Wiklander #define INT_LEAST8_MAX		INT8_MAX
1434c1908d3SJens Wiklander #define INT_LEAST16_MAX		INT16_MAX
1444c1908d3SJens Wiklander #define INT_LEAST32_MAX		INT32_MAX
1454c1908d3SJens Wiklander #define INT_LEAST64_MAX		INT64_MAX
1464c1908d3SJens Wiklander 
1474c1908d3SJens Wiklander #define UINT_LEAST8_MAX		UINT8_MAX
1484c1908d3SJens Wiklander #define UINT_LEAST16_MAX	UINT16_MAX
1494c1908d3SJens Wiklander #define UINT_LEAST32_MAX	UINT32_MAX
1504c1908d3SJens Wiklander #define UINT_LEAST64_MAX	UINT64_MAX
1514c1908d3SJens Wiklander 
1524c1908d3SJens Wiklander /* 7.18.2.3 Limits of fastest minimum-width integer types */
1534c1908d3SJens Wiklander 
1544c1908d3SJens Wiklander #define INT_FAST8_MIN		INT8_MIN
1554c1908d3SJens Wiklander #define INT_FAST16_MIN		INT16_MIN
1564c1908d3SJens Wiklander #define INT_FAST32_MIN		INT32_MIN
1574c1908d3SJens Wiklander #define INT_FAST64_MIN		INT64_MIN
1584c1908d3SJens Wiklander 
1594c1908d3SJens Wiklander #define INT_FAST8_MAX		INT8_MAX
1604c1908d3SJens Wiklander #define INT_FAST16_MAX		INT16_MAX
1614c1908d3SJens Wiklander #define INT_FAST32_MAX		INT32_MAX
1624c1908d3SJens Wiklander #define INT_FAST64_MAX		INT64_MAX
1634c1908d3SJens Wiklander 
1644c1908d3SJens Wiklander #define UINT_FAST8_MAX		UINT8_MAX
1654c1908d3SJens Wiklander #define UINT_FAST16_MAX		UINT16_MAX
1664c1908d3SJens Wiklander #define UINT_FAST32_MAX		UINT32_MAX
1674c1908d3SJens Wiklander #define UINT_FAST64_MAX		UINT64_MAX
1684c1908d3SJens Wiklander 
169b0104773SPascal Brand /* 7.18.2.4 Limits of integer types capable of holding object pointers */
170b0104773SPascal Brand 
1711f60363aSJens Wiklander #define INTPTR_MIN  LONG_MIN
1721f60363aSJens Wiklander #define INTPTR_MAX  LONG_MAX
1731f60363aSJens Wiklander #define UINTPTR_MAX ULONG_MAX
1741f60363aSJens Wiklander 
175*39a6336dSJason Lin /* 7.18.2.5  Limits of greatest-width integer types */
1761f60363aSJens Wiklander #define INTMAX_MAX  INT64_MAX
1771f60363aSJens Wiklander #define INTMAX_MIN  INT64_MIN
1781f60363aSJens Wiklander #define UINTMAX_MAX UINT64_MAX
179b0104773SPascal Brand 
180*39a6336dSJason Lin /* 7.18.3  Limits of other integer types */
181*39a6336dSJason Lin #define SIZE_MAX	ULONG_MAX
182*39a6336dSJason Lin 
1834c1908d3SJens Wiklander /*
1844c1908d3SJens Wiklander  * 7.18.4 Macros for integer constants
1854c1908d3SJens Wiklander  */
1864c1908d3SJens Wiklander 
1874c1908d3SJens Wiklander /* 7.18.4.1 Macros for minimum-width integer constants */
1884c1908d3SJens Wiklander 
1894c1908d3SJens Wiklander #define INT8_C(v)	v
1904c1908d3SJens Wiklander #define UINT8_C(v)	v
1914c1908d3SJens Wiklander #define INT16_C(v)	v
1924c1908d3SJens Wiklander #define UINT16_C(v)	v
1934c1908d3SJens Wiklander #define INT32_C(v)	v
1944c1908d3SJens Wiklander #define UINT32_C(v)	v ## U
1954c1908d3SJens Wiklander #ifdef __ILP32__
1964c1908d3SJens Wiklander #define INT64_C(v)	v ## LL
1974c1908d3SJens Wiklander #define UINT64_C(v)	v ## ULL
1984c1908d3SJens Wiklander #endif
1994c1908d3SJens Wiklander #ifdef __LP64__
2004c1908d3SJens Wiklander #define INT64_C(v)	v ## L
2014c1908d3SJens Wiklander #define UINT64_C(v)	v ## UL
2024c1908d3SJens Wiklander #endif
2034c1908d3SJens Wiklander 
2044c1908d3SJens Wiklander /* 7.18.4.2 Macros for greatest-width integer constants */
2054c1908d3SJens Wiklander 
2064c1908d3SJens Wiklander #define INTMAX_C(v)	INT64_C(v)
2074c1908d3SJens Wiklander #define UINTMAX_C(v)	UINT64_C(v)
2084c1908d3SJens Wiklander 
2094c1908d3SJens Wiklander 
210b0104773SPascal Brand #endif /* STDINT_H */
211