1193326Sed/*===---- limits.h - Standard header for integer sizes --------------------===*\
2193326Sed *
3353358Sdim * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim * See https://llvm.org/LICENSE.txt for license information.
5353358Sdim * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6193326Sed *
7193326Sed\*===----------------------------------------------------------------------===*/
8193326Sed
9193326Sed#ifndef __CLANG_LIMITS_H
10193326Sed#define __CLANG_LIMITS_H
11193326Sed
12193326Sed/* The system's limits.h may, in turn, try to #include_next GCC's limits.h.
13193326Sed   Avert this #include_next madness. */
14193326Sed#if defined __GNUC__ && !defined _GCC_LIMITS_H_
15193326Sed#define _GCC_LIMITS_H_
16193326Sed#endif
17193326Sed
18218893Sdim/* System headers include a number of constants from POSIX in <limits.h>.
19218893Sdim   Include it if we're hosted. */
20276479Sdim#if __STDC_HOSTED__ && __has_include_next(<limits.h>)
21193326Sed#include_next <limits.h>
22218893Sdim#endif
23193326Sed
24193326Sed/* Many system headers try to "help us out" by defining these.  No really, we
25193326Sed   know how big each datatype is. */
26193326Sed#undef  SCHAR_MIN
27193326Sed#undef  SCHAR_MAX
28193326Sed#undef  UCHAR_MAX
29193326Sed#undef  SHRT_MIN
30193326Sed#undef  SHRT_MAX
31193326Sed#undef  USHRT_MAX
32193326Sed#undef  INT_MIN
33193326Sed#undef  INT_MAX
34193326Sed#undef  UINT_MAX
35193326Sed#undef  LONG_MIN
36193326Sed#undef  LONG_MAX
37193326Sed#undef  ULONG_MAX
38193326Sed
39193326Sed#undef  CHAR_BIT
40193326Sed#undef  CHAR_MIN
41193326Sed#undef  CHAR_MAX
42193326Sed
43193326Sed/* C90/99 5.2.4.2.1 */
44193326Sed#define SCHAR_MAX __SCHAR_MAX__
45193326Sed#define SHRT_MAX  __SHRT_MAX__
46193326Sed#define INT_MAX   __INT_MAX__
47193326Sed#define LONG_MAX  __LONG_MAX__
48193326Sed
49193326Sed#define SCHAR_MIN (-__SCHAR_MAX__-1)
50193326Sed#define SHRT_MIN  (-__SHRT_MAX__ -1)
51193326Sed#define INT_MIN   (-__INT_MAX__  -1)
52193326Sed#define LONG_MIN  (-__LONG_MAX__ -1L)
53193326Sed
54193326Sed#define UCHAR_MAX (__SCHAR_MAX__*2  +1)
55193326Sed#define USHRT_MAX (__SHRT_MAX__ *2  +1)
56193326Sed#define UINT_MAX  (__INT_MAX__  *2U +1U)
57193326Sed#define ULONG_MAX (__LONG_MAX__ *2UL+1UL)
58193326Sed
59193326Sed#ifndef MB_LEN_MAX
60193326Sed#define MB_LEN_MAX 1
61193326Sed#endif
62193326Sed
63193326Sed#define CHAR_BIT  __CHAR_BIT__
64193326Sed
65193326Sed#ifdef __CHAR_UNSIGNED__  /* -funsigned-char */
66193326Sed#define CHAR_MIN 0
67193326Sed#define CHAR_MAX UCHAR_MAX
68193326Sed#else
69193326Sed#define CHAR_MIN SCHAR_MIN
70193326Sed#define CHAR_MAX __SCHAR_MAX__
71193326Sed#endif
72193326Sed
73261991Sdim/* C99 5.2.4.2.1: Added long long.
74261991Sdim   C++11 18.3.3.2: same contents as the Standard C Library header <limits.h>.
75261991Sdim */
76276479Sdim#if __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L
77193326Sed
78193326Sed#undef  LLONG_MIN
79193326Sed#undef  LLONG_MAX
80193326Sed#undef  ULLONG_MAX
81193326Sed
82193326Sed#define LLONG_MAX  __LONG_LONG_MAX__
83193326Sed#define LLONG_MIN  (-__LONG_LONG_MAX__-1LL)
84193326Sed#define ULLONG_MAX (__LONG_LONG_MAX__*2ULL+1ULL)
85193326Sed#endif
86193326Sed
87193326Sed/* LONG_LONG_MIN/LONG_LONG_MAX/ULONG_LONG_MAX are a GNU extension.  It's too bad
88193326Sed   that we don't have something like #pragma poison that could be used to
89193326Sed   deprecate a macro - the code should just use LLONG_MAX and friends.
90193326Sed */
91193326Sed#if defined(__GNU_LIBRARY__) ? defined(__USE_GNU) : !defined(__STRICT_ANSI__)
92193326Sed
93193326Sed#undef   LONG_LONG_MIN
94193326Sed#undef   LONG_LONG_MAX
95193326Sed#undef   ULONG_LONG_MAX
96193326Sed
97193326Sed#define LONG_LONG_MAX  __LONG_LONG_MAX__
98193326Sed#define LONG_LONG_MIN  (-__LONG_LONG_MAX__-1LL)
99193326Sed#define ULONG_LONG_MAX (__LONG_LONG_MAX__*2ULL+1ULL)
100193326Sed#endif
101193326Sed
102193326Sed#endif /* __CLANG_LIMITS_H */
103