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