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

source code of libc/include/llvm-libc-macros/limits-macros.h