mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2025-12-24 10:52:13 +01:00
In a customer project that was building a stand-alone application, I
hit a problem related to the fact that our LONG_MAX and friends are
not standards-compliant, in that they are not "suitable for use in #if
preprocessing directives"
... /toolchain_none/arm-cortexa8-eabi/sys-include/machine/_default_types.h:25:31: error: missing binary operator before token "long"
25 | || ( defined(LLONG_MAX) && (LLONG_MAX > 0x7fffffff) )
| ^~~~~~~~~
So following up on commit 13de8483388 ("mbedtls: add mbedtls into the
build system"), move the rest of the macros associated to the standard
C types {signed,unsigned} {char, short, int, long, long long} (and of
course bare 'char') to limits.h.
Make use of the fact that both gcc and clang provide suitable
predefined __FOO_MAX__ macros for the signed types, and use a standard
scheme for defining the FOO_MIN and UFOO_MAX macros in terms of
FOO_MAX.
Note that suffixes like L and ULL are allowed for preprocessor
integers; it is (casts) which are not. And using appropriate suffixes,
we can arrange for the type of e.g. UINT_MAX to be "unsigned int" due
to integer promotion rules.
Signed-off-by: Rasmus Villemoes <ravi@prevas.dk>
53 lines
1.2 KiB
C
53 lines
1.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0+ */
|
|
|
|
#ifndef _LIMITS_H
|
|
#define _LIMITS_H
|
|
|
|
#define SCHAR_MAX __SCHAR_MAX__
|
|
#define SCHAR_MIN (-SCHAR_MAX - 1)
|
|
#define UCHAR_MAX (SCHAR_MAX * 2 + 1)
|
|
|
|
#ifdef __CHAR_UNSIGNED__
|
|
#define CHAR_MAX UCHAR_MAX
|
|
#define CHAR_MIN 0
|
|
#else
|
|
#define CHAR_MAX SCHAR_MAX
|
|
#define CHAR_MIN SCHAR_MIN
|
|
#endif
|
|
|
|
#define SHRT_MAX __SHRT_MAX__
|
|
#define SHRT_MIN (-SHRT_MAX - 1)
|
|
#define USHRT_MAX (SHRT_MAX * 2 + 1)
|
|
|
|
#define INT_MAX __INT_MAX__
|
|
#define INT_MIN (-INT_MAX - 1)
|
|
#define UINT_MAX (INT_MAX * 2U + 1U)
|
|
|
|
#define LONG_MAX __LONG_MAX__
|
|
#define LONG_MIN (-LONG_MAX - 1L)
|
|
#define ULONG_MAX (LONG_MAX * 2UL + 1UL)
|
|
|
|
#define LLONG_MAX __LONG_LONG_MAX__
|
|
#define LLONG_MIN (-LLONG_MAX - 1LL)
|
|
#define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL)
|
|
|
|
#define CHAR_BIT 8
|
|
#define UINT32_MAX 0xffffffffU
|
|
#define UINT64_MAX 0xffffffffffffffffULL
|
|
|
|
#if (defined(CONFIG_64BIT) && !defined(CONFIG_SPL_BUILD)) || \
|
|
(defined(CONFIG_SPL_64BIT) && defined(CONFIG_SPL_BUILD))
|
|
#define UINTPTR_MAX UINT64_MAX
|
|
#else
|
|
#define UINTPTR_MAX UINT32_MAX
|
|
#endif
|
|
|
|
#ifndef SIZE_MAX
|
|
#define SIZE_MAX UINTPTR_MAX
|
|
#endif
|
|
#ifndef SSIZE_MAX
|
|
#define SSIZE_MAX ((ssize_t)(SIZE_MAX >> 1))
|
|
#endif
|
|
|
|
#endif /* _LIMITS_H */
|