xref: /aosp_15_r20/external/llvm-libc/include/llvm-libc-macros/limits-macros.h (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
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