1193326Sed/*===---- limits.h - Standard header for integer sizes --------------------===*\
2193326Sed *
3193326Sed * Copyright (c) 2009 Chris Lattner
4193326Sed *
5193326Sed * Permission is hereby granted, free of charge, to any person obtaining a copy
6193326Sed * of this software and associated documentation files (the "Software"), to deal
7193326Sed * in the Software without restriction, including without limitation the rights
8193326Sed * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9193326Sed * copies of the Software, and to permit persons to whom the Software is
10193326Sed * furnished to do so, subject to the following conditions:
11193326Sed *
12193326Sed * The above copyright notice and this permission notice shall be included in
13193326Sed * all copies or substantial portions of the Software.
14193326Sed *
15193326Sed * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16193326Sed * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17193326Sed * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18193326Sed * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19193326Sed * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20193326Sed * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21193326Sed * THE SOFTWARE.
22193326Sed *
23193326Sed\*===----------------------------------------------------------------------===*/
24193326Sed
25193326Sed#ifndef __CLANG_LIMITS_H
26193326Sed#define __CLANG_LIMITS_H
27193326Sed
28193326Sed/* The system's limits.h may, in turn, try to #include_next GCC's limits.h.
29193326Sed   Avert this #include_next madness. */
30193326Sed#if defined __GNUC__ && !defined _GCC_LIMITS_H_
31193326Sed#define _GCC_LIMITS_H_
32193326Sed#endif
33193326Sed
34218893Sdim/* System headers include a number of constants from POSIX in <limits.h>.
35218893Sdim   Include it if we're hosted. */
36218893Sdim#if __STDC_HOSTED__ && \
37218893Sdim    defined(__has_include_next) && __has_include_next(<limits.h>)
38193326Sed#include_next <limits.h>
39218893Sdim#endif
40193326Sed
41193326Sed/* Many system headers try to "help us out" by defining these.  No really, we
42193326Sed   know how big each datatype is. */
43193326Sed#undef  SCHAR_MIN
44193326Sed#undef  SCHAR_MAX
45193326Sed#undef  UCHAR_MAX
46193326Sed#undef  SHRT_MIN
47193326Sed#undef  SHRT_MAX
48193326Sed#undef  USHRT_MAX
49193326Sed#undef  INT_MIN
50193326Sed#undef  INT_MAX
51193326Sed#undef  UINT_MAX
52193326Sed#undef  LONG_MIN
53193326Sed#undef  LONG_MAX
54193326Sed#undef  ULONG_MAX
55193326Sed
56193326Sed#undef  CHAR_BIT
57193326Sed#undef  CHAR_MIN
58193326Sed#undef  CHAR_MAX
59193326Sed
60193326Sed/* C90/99 5.2.4.2.1 */
61193326Sed#define SCHAR_MAX __SCHAR_MAX__
62193326Sed#define SHRT_MAX  __SHRT_MAX__
63193326Sed#define INT_MAX   __INT_MAX__
64193326Sed#define LONG_MAX  __LONG_MAX__
65193326Sed
66193326Sed#define SCHAR_MIN (-__SCHAR_MAX__-1)
67193326Sed#define SHRT_MIN  (-__SHRT_MAX__ -1)
68193326Sed#define INT_MIN   (-__INT_MAX__  -1)
69193326Sed#define LONG_MIN  (-__LONG_MAX__ -1L)
70193326Sed
71193326Sed#define UCHAR_MAX (__SCHAR_MAX__*2  +1)
72193326Sed#define USHRT_MAX (__SHRT_MAX__ *2  +1)
73193326Sed#define UINT_MAX  (__INT_MAX__  *2U +1U)
74193326Sed#define ULONG_MAX (__LONG_MAX__ *2UL+1UL)
75193326Sed
76193326Sed#ifndef MB_LEN_MAX
77193326Sed#define MB_LEN_MAX 1
78193326Sed#endif
79193326Sed
80193326Sed#define CHAR_BIT  __CHAR_BIT__
81193326Sed
82193326Sed#ifdef __CHAR_UNSIGNED__  /* -funsigned-char */
83193326Sed#define CHAR_MIN 0
84193326Sed#define CHAR_MAX UCHAR_MAX
85193326Sed#else
86193326Sed#define CHAR_MIN SCHAR_MIN
87193326Sed#define CHAR_MAX __SCHAR_MAX__
88193326Sed#endif
89193326Sed
90193326Sed/* C99 5.2.4.2.1: Added long long. */
91193326Sed#if __STDC_VERSION__ >= 199901
92193326Sed
93193326Sed#undef  LLONG_MIN
94193326Sed#undef  LLONG_MAX
95193326Sed#undef  ULLONG_MAX
96193326Sed
97193326Sed#define LLONG_MAX  __LONG_LONG_MAX__
98193326Sed#define LLONG_MIN  (-__LONG_LONG_MAX__-1LL)
99193326Sed#define ULLONG_MAX (__LONG_LONG_MAX__*2ULL+1ULL)
100193326Sed#endif
101193326Sed
102193326Sed/* LONG_LONG_MIN/LONG_LONG_MAX/ULONG_LONG_MAX are a GNU extension.  It's too bad
103193326Sed   that we don't have something like #pragma poison that could be used to
104193326Sed   deprecate a macro - the code should just use LLONG_MAX and friends.
105193326Sed */
106193326Sed#if defined(__GNU_LIBRARY__) ? defined(__USE_GNU) : !defined(__STRICT_ANSI__)
107193326Sed
108193326Sed#undef   LONG_LONG_MIN
109193326Sed#undef   LONG_LONG_MAX
110193326Sed#undef   ULONG_LONG_MAX
111193326Sed
112193326Sed#define LONG_LONG_MAX  __LONG_LONG_MAX__
113193326Sed#define LONG_LONG_MIN  (-__LONG_LONG_MAX__-1LL)
114193326Sed#define ULONG_LONG_MAX (__LONG_LONG_MAX__*2ULL+1ULL)
115193326Sed#endif
116193326Sed
117193326Sed#endif /* __CLANG_LIMITS_H */
118