summaryrefslogtreecommitdiff
path: root/include/limits.h
diff options
context:
space:
mode:
authorRasmus Villemoes <ravi@prevas.dk>2025-07-07 22:36:53 +0200
committerTom Rini <trini@konsulko.com>2025-07-14 12:43:28 -0600
commitdc323f3bee318514af9d7c6fed1e01c712bc71ae (patch)
tree2f552b86cd2e9a650ea33ebed0ce32cecbbdd78f /include/limits.h
parente37de002fac3895e8d0b60ae2015e17bb33e2b5b (diff)
move more limits from kernel.h to limits.h and standardize their definitions
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>
Diffstat (limited to 'include/limits.h')
-rw-r--r--include/limits.h30
1 files changed, 28 insertions, 2 deletions
diff --git a/include/limits.h b/include/limits.h
index 1d0bbf69be7..4dcfbe9b156 100644
--- a/include/limits.h
+++ b/include/limits.h
@@ -3,8 +3,34 @@
#ifndef _LIMITS_H
#define _LIMITS_H
-#define INT_MAX 0x7fffffff
-#define UINT_MAX 0xffffffffU
+#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