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