134 lines · c
1/*===---- limits.h - Standard header for integer sizes --------------------===*\2 *3 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4 * See https://llvm.org/LICENSE.txt for license information.5 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6 *7\*===----------------------------------------------------------------------===*/8 9#ifndef __CLANG_LIMITS_H10#define __CLANG_LIMITS_H11 12#if defined(__MVS__) && __has_include_next(<limits.h>)13#include_next <limits.h>14#else15 16/* The system's limits.h may, in turn, try to #include_next GCC's limits.h.17 Avert this #include_next madness. */18#if defined __GNUC__ && !defined _GCC_LIMITS_H_19#define _GCC_LIMITS_H_20#endif21 22/* System headers include a number of constants from POSIX in <limits.h>.23 Include it if we're hosted. */24#if __STDC_HOSTED__ && __has_include_next(<limits.h>)25#include_next <limits.h>26#endif27 28/* Many system headers try to "help us out" by defining these. No really, we29 know how big each datatype is. */30#undef SCHAR_MIN31#undef SCHAR_MAX32#undef UCHAR_MAX33#undef SHRT_MIN34#undef SHRT_MAX35#undef USHRT_MAX36#undef INT_MIN37#undef INT_MAX38#undef UINT_MAX39#undef LONG_MIN40#undef LONG_MAX41#undef ULONG_MAX42 43#undef CHAR_BIT44#undef CHAR_MIN45#undef CHAR_MAX46 47/* C90/99 5.2.4.2.1 */48#define SCHAR_MAX __SCHAR_MAX__49#define SHRT_MAX __SHRT_MAX__50#define INT_MAX __INT_MAX__51#define LONG_MAX __LONG_MAX__52 53#define SCHAR_MIN (-__SCHAR_MAX__-1)54#define SHRT_MIN (-__SHRT_MAX__ -1)55#define INT_MIN (-__INT_MAX__ -1)56#define LONG_MIN (-__LONG_MAX__ -1L)57 58#define UCHAR_MAX (__SCHAR_MAX__*2 +1)59#if __SHRT_WIDTH__ < __INT_WIDTH__60#define USHRT_MAX (__SHRT_MAX__ * 2 + 1)61#else62#define USHRT_MAX (__SHRT_MAX__ * 2U + 1U)63#endif64#define UINT_MAX (__INT_MAX__ *2U +1U)65#define ULONG_MAX (__LONG_MAX__ *2UL+1UL)66 67#ifndef MB_LEN_MAX68#define MB_LEN_MAX 169#endif70 71#define CHAR_BIT __CHAR_BIT__72 73/* C23 5.2.4.2.1 */74#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L75#define BOOL_WIDTH __BOOL_WIDTH__76#define CHAR_WIDTH CHAR_BIT77#define SCHAR_WIDTH CHAR_BIT78#define UCHAR_WIDTH CHAR_BIT79#define USHRT_WIDTH __SHRT_WIDTH__80#define SHRT_WIDTH __SHRT_WIDTH__81#define UINT_WIDTH __INT_WIDTH__82#define INT_WIDTH __INT_WIDTH__83#define ULONG_WIDTH __LONG_WIDTH__84#define LONG_WIDTH __LONG_WIDTH__85#define ULLONG_WIDTH __LLONG_WIDTH__86#define LLONG_WIDTH __LLONG_WIDTH__87 88#define BITINT_MAXWIDTH __BITINT_MAXWIDTH__89#endif90 91#ifdef __CHAR_UNSIGNED__ /* -funsigned-char */92#define CHAR_MIN 093#define CHAR_MAX UCHAR_MAX94#else95#define CHAR_MIN SCHAR_MIN96#define CHAR_MAX __SCHAR_MAX__97#endif98 99/* C99 5.2.4.2.1: Added long long.100 C++11 18.3.3.2: same contents as the Standard C Library header <limits.h>.101 */102#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \103 (defined(__cplusplus) && __cplusplus >= 201103L)104 105#undef LLONG_MIN106#undef LLONG_MAX107#undef ULLONG_MAX108 109#define LLONG_MAX __LONG_LONG_MAX__110#define LLONG_MIN (-__LONG_LONG_MAX__-1LL)111#define ULLONG_MAX (__LONG_LONG_MAX__*2ULL+1ULL)112#endif113 114/* LONG_LONG_MIN/LONG_LONG_MAX/ULONG_LONG_MAX are a GNU extension. Android's115 bionic also defines them. It's too bad that we don't have something like116 #pragma poison that could be used to deprecate a macro - the code should just117 use LLONG_MAX and friends.118 */119#if (defined(__GNU_LIBRARY__) ? defined(__USE_GNU) \120 : !defined(__STRICT_ANSI__)) || \121 defined(__BIONIC__)122 123#undef LONG_LONG_MIN124#undef LONG_LONG_MAX125#undef ULONG_LONG_MAX126 127#define LONG_LONG_MAX __LONG_LONG_MAX__128#define LONG_LONG_MIN (-__LONG_LONG_MAX__-1LL)129#define ULONG_LONG_MAX (__LONG_LONG_MAX__*2ULL+1ULL)130#endif131 132#endif /* __MVS__ */133#endif /* __CLANG_LIMITS_H */134