1 //===-- Definition of macros from limits.h --------------------------------===// 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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_LIBC_MACROS_LIMITS_MACROS_H 10 #define LLVM_LIBC_MACROS_LIMITS_MACROS_H 11 12 // Define all C23 macro constants of limits.h 13 14 #ifndef CHAR_BIT 15 #ifdef __CHAR_BIT__ 16 #define CHAR_BIT __CHAR_BIT__ 17 #else 18 #define CHAR_BIT 8 19 #endif // __CHAR_BIT__ 20 #endif // CHAR_BIT 21 22 #ifndef MB_LEN_MAX 23 // Represents a single UTF-32 wide character in the default locale. 24 #define MB_LEN_MAX 4 25 #endif // MB_LEN_MAX 26 27 // *_WIDTH macros 28 29 #ifndef CHAR_WIDTH 30 #define CHAR_WIDTH CHAR_BIT 31 #endif // CHAR_WIDTH 32 33 #ifndef SCHAR_WIDTH 34 #define SCHAR_WIDTH CHAR_BIT 35 #endif // SCHAR_WIDTH 36 37 #ifndef UCHAR_WIDTH 38 #define UCHAR_WIDTH CHAR_BIT 39 #endif // UCHAR_WIDTH 40 41 #ifndef SHRT_WIDTH 42 #ifdef __SHRT_WIDTH__ 43 #define SHRT_WIDTH __SHRT_WIDTH__ 44 #else 45 #define SHRT_WIDTH 16 46 #endif // __SHRT_WIDTH__ 47 #endif // SHRT_WIDTH 48 49 #ifndef USHRT_WIDTH 50 #define USHRT_WIDTH SHRT_WIDTH 51 #endif // USHRT_WIDTH 52 53 #ifndef INT_WIDTH 54 #ifdef __INT_WIDTH__ 55 #define INT_WIDTH __INT_WIDTH__ 56 #else 57 #define INT_WIDTH 32 58 #endif // __INT_WIDTH__ 59 #endif // INT_WIDTH 60 61 #ifndef UINT_WIDTH 62 #define UINT_WIDTH INT_WIDTH 63 #endif // UINT_WIDTH 64 65 #ifndef LONG_WIDTH 66 #ifdef __LONG_WIDTH__ 67 #define LONG_WIDTH __LONG_WIDTH__ 68 #elif defined(__WORDSIZE) 69 #define LONG_WIDTH __WORDSIZE 70 #else 71 // Use __SIZEOF_LONG__ * CHAR_BIT as backup. This is needed for clang-13 or 72 // before. 73 #define LONG_WIDTH (__SIZEOF_LONG__ * CHAR_BIT) 74 #endif // __LONG_WIDTH__ 75 #endif // LONG_WIDTH 76 77 #ifndef ULONG_WIDTH 78 #define ULONG_WIDTH LONG_WIDTH 79 #endif // ULONG_WIDTH 80 81 #ifndef LLONG_WIDTH 82 #ifdef __LLONG_WIDTH__ 83 #define LLONG_WIDTH __LLONG_WIDTH__ 84 #else 85 #define LLONG_WIDTH 64 86 #endif // __LLONG_WIDTH__ 87 #endif // LLONG_WIDTH 88 89 #ifndef ULLONG_WIDTH 90 #define ULLONG_WIDTH LLONG_WIDTH 91 #endif // ULLONG_WIDTH 92 93 #ifndef BOOL_WIDTH 94 #ifdef __BOOL_WIDTH__ 95 #define BOOL_WIDTH __BOOL_WIDTH__ 96 #else 97 #define BOOL_WIDTH 1 98 #endif // __BOOL_WIDTH__ 99 #endif // BOOL_WIDTH 100 101 // *_MAX macros 102 103 #ifndef SCHAR_MAX 104 #ifdef __SCHAR_MAX__ 105 #define SCHAR_MAX __SCHAR_MAX__ 106 #else 107 #define SCHAR_MAX 0x7f 108 #endif // __SCHAR_MAX__ 109 #endif // SCHAR_MAX 110 111 #ifndef UCHAR_MAX 112 #define UCHAR_MAX (SCHAR_MAX * 2 + 1) 113 #endif // UCHAR_MAX 114 115 // Check if char is unsigned. 116 #if !defined(__CHAR_UNSIGNED__) && ('\xff' > 0) 117 #define __CHAR_UNSIGNED__ 118 #endif 119 120 #ifndef CHAR_MAX 121 #ifdef __CHAR_UNSIGNED__ 122 #define CHAR_MAX UCHAR_MAX 123 #else 124 #define CHAR_MAX SCHAR_MAX 125 #endif // __CHAR_UNSIGNED__ 126 #endif // CHAR_MAX 127 128 #ifndef SHRT_MAX 129 #ifdef __SHRT_MAX__ 130 #define SHRT_MAX __SHRT_MAX__ 131 #else 132 #define SHRT_MAX 0x7fff 133 #endif // __SHRT_MAX__ 134 #endif // SHRT_MAX 135 136 #ifndef USHRT_MAX 137 #define USHRT_MAX (SHRT_MAX * 2U + 1U) 138 #endif // USHRT_MAX 139 140 #ifndef INT_MAX 141 #ifdef __INT_MAX__ 142 #define INT_MAX __INT_MAX__ 143 #else 144 #define INT_MAX (0 ^ (1 << (INT_WIDTH - 1))) 145 #endif // __INT_MAX__ 146 #endif // INT_MAX 147 148 #ifndef UINT_MAX 149 #define UINT_MAX (INT_MAX * 2U + 1U) 150 #endif // UINT_MAX 151 152 #ifndef LONG_MAX 153 #ifdef __LONG_MAX__ 154 #define LONG_MAX __LONG_MAX__ 155 #else 156 #define LONG_MAX (0L ^ (1L << (LONG_WIDTH - 1))) 157 #endif // __LONG_MAX__ 158 #endif // LONG_MAX 159 160 #ifndef ULONG_MAX 161 #define ULONG_MAX (LONG_MAX * 2UL + 1UL) 162 #endif // ULONG_MAX 163 164 #ifndef LLONG_MAX 165 #ifdef __LONG_LONG_MAX__ 166 #define LLONG_MAX __LONG_LONG_MAX__ 167 #else 168 #define LLONG_MAX (0LL ^ (1LL << (LLONG_WIDTH - 1))) 169 #endif // __LONG_LONG_MAX__ 170 #endif // LLONG_MAX 171 172 #ifndef ULLONG_MAX 173 #define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) 174 #endif // ULLONG_MAX 175 176 // *_MIN macros 177 178 #ifndef SCHAR_MIN 179 #define SCHAR_MIN (-SCHAR_MAX - 1) 180 #endif // SCHAR_MIN 181 182 #ifndef UCHAR_MIN 183 #define UCHAR_MIN 0 184 #endif // UCHAR_MIN 185 186 #ifndef CHAR_MIN 187 #ifdef __CHAR_UNSIGNED__ 188 #define CHAR_MIN UCHAR_MIN 189 #else 190 #define CHAR_MIN SCHAR_MIN 191 #endif // __CHAR_UNSIGNED__ 192 #endif // CHAR_MIN 193 194 #ifndef SHRT_MIN 195 #define SHRT_MIN (-SHRT_MAX - 1) 196 #endif // SHRT_MIN 197 198 #ifndef USHRT_MIN 199 #define USHRT_MIN 0U 200 #endif // USHRT_MIN 201 202 #ifndef INT_MIN 203 #define INT_MIN (-INT_MAX - 1) 204 #endif // INT_MIN 205 206 #ifndef UINT_MIN 207 #define UINT_MIN 0U 208 #endif // UINT_MIN 209 210 #ifndef LONG_MIN 211 #define LONG_MIN (-LONG_MAX - 1L) 212 #endif // LONG_MIN 213 214 #ifndef ULONG_MIN 215 #define ULONG_MIN 0UL 216 #endif // ULONG_MIN 217 218 #ifndef LLONG_MIN 219 #define LLONG_MIN (-LLONG_MAX - 1LL) 220 #endif // LLONG_MIN 221 222 #ifndef ULLONG_MIN 223 #define ULLONG_MIN 0ULL 224 #endif // ULLONG_MIN 225 226 #ifndef _POSIX_MAX_CANON 227 #define _POSIX_MAX_CANON 255 228 #endif 229 230 #ifndef _POSIX_MAX_INPUT 231 #define _POSIX_MAX_INPUT 255 232 #endif 233 234 #ifndef _POSIX_NAME_MAX 235 #define _POSIX_PATH_MAX 256 236 #endif 237 238 #endif // LLVM_LIBC_MACROS_LIMITS_MACROS_H 239