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