xref: /llvm-project/libc/include/llvm-libc-macros/limits-macros.h (revision b209eda621bc53e58509d05fa392cb724fa6bd6e)
172ce6294Slntue //===-- Definition of macros from limits.h --------------------------------===//
272ce6294Slntue //
372ce6294Slntue // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
472ce6294Slntue // See https://llvm.org/LICENSE.txt for license information.
572ce6294Slntue // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
672ce6294Slntue //
772ce6294Slntue //===----------------------------------------------------------------------===//
872ce6294Slntue 
9330793c9SNick Desaulniers #ifndef LLVM_LIBC_MACROS_LIMITS_MACROS_H
10330793c9SNick Desaulniers #define LLVM_LIBC_MACROS_LIMITS_MACROS_H
1172ce6294Slntue 
1272ce6294Slntue // Define all C23 macro constants of limits.h
1372ce6294Slntue 
1472ce6294Slntue #ifndef CHAR_BIT
1572ce6294Slntue #ifdef __CHAR_BIT__
1672ce6294Slntue #define CHAR_BIT __CHAR_BIT__
1772ce6294Slntue #else
1872ce6294Slntue #define CHAR_BIT 8
1972ce6294Slntue #endif // __CHAR_BIT__
2072ce6294Slntue #endif // CHAR_BIT
2172ce6294Slntue 
22*b209eda6SJoseph Huber #ifndef MB_LEN_MAX
23*b209eda6SJoseph Huber // Represents a single UTF-32 wide character in the default locale.
24*b209eda6SJoseph Huber #define MB_LEN_MAX 4
25*b209eda6SJoseph Huber #endif // MB_LEN_MAX
2672ce6294Slntue 
2772ce6294Slntue // *_WIDTH macros
2872ce6294Slntue 
2972ce6294Slntue #ifndef CHAR_WIDTH
3072ce6294Slntue #define CHAR_WIDTH CHAR_BIT
3172ce6294Slntue #endif // CHAR_WIDTH
3272ce6294Slntue 
3372ce6294Slntue #ifndef SCHAR_WIDTH
3472ce6294Slntue #define SCHAR_WIDTH CHAR_BIT
3572ce6294Slntue #endif // SCHAR_WIDTH
3672ce6294Slntue 
3772ce6294Slntue #ifndef UCHAR_WIDTH
3872ce6294Slntue #define UCHAR_WIDTH CHAR_BIT
3972ce6294Slntue #endif // UCHAR_WIDTH
4072ce6294Slntue 
4172ce6294Slntue #ifndef SHRT_WIDTH
4272ce6294Slntue #ifdef __SHRT_WIDTH__
4372ce6294Slntue #define SHRT_WIDTH __SHRT_WIDTH__
4472ce6294Slntue #else
4572ce6294Slntue #define SHRT_WIDTH 16
4672ce6294Slntue #endif // __SHRT_WIDTH__
4772ce6294Slntue #endif // SHRT_WIDTH
4872ce6294Slntue 
4972ce6294Slntue #ifndef USHRT_WIDTH
5072ce6294Slntue #define USHRT_WIDTH SHRT_WIDTH
5172ce6294Slntue #endif // USHRT_WIDTH
5272ce6294Slntue 
5372ce6294Slntue #ifndef INT_WIDTH
5472ce6294Slntue #ifdef __INT_WIDTH__
5572ce6294Slntue #define INT_WIDTH __INT_WIDTH__
5672ce6294Slntue #else
5772ce6294Slntue #define INT_WIDTH 32
5872ce6294Slntue #endif // __INT_WIDTH__
5972ce6294Slntue #endif // INT_WIDTH
6072ce6294Slntue 
6172ce6294Slntue #ifndef UINT_WIDTH
6272ce6294Slntue #define UINT_WIDTH INT_WIDTH
6372ce6294Slntue #endif // UINT_WIDTH
6472ce6294Slntue 
6572ce6294Slntue #ifndef LONG_WIDTH
6672ce6294Slntue #ifdef __LONG_WIDTH__
6772ce6294Slntue #define LONG_WIDTH __LONG_WIDTH__
6872ce6294Slntue #elif defined(__WORDSIZE)
6972ce6294Slntue #define LONG_WIDTH __WORDSIZE
7072ce6294Slntue #else
71e9355b1bSlntue // Use __SIZEOF_LONG__ * CHAR_BIT as backup.  This is needed for clang-13 or
72e9355b1bSlntue // before.
73e9355b1bSlntue #define LONG_WIDTH (__SIZEOF_LONG__ * CHAR_BIT)
7472ce6294Slntue #endif // __LONG_WIDTH__
7572ce6294Slntue #endif // LONG_WIDTH
7672ce6294Slntue 
7772ce6294Slntue #ifndef ULONG_WIDTH
7872ce6294Slntue #define ULONG_WIDTH LONG_WIDTH
7972ce6294Slntue #endif // ULONG_WIDTH
8072ce6294Slntue 
8172ce6294Slntue #ifndef LLONG_WIDTH
8272ce6294Slntue #ifdef __LLONG_WIDTH__
8372ce6294Slntue #define LLONG_WIDTH __LLONG_WIDTH__
8472ce6294Slntue #else
8572ce6294Slntue #define LLONG_WIDTH 64
8672ce6294Slntue #endif // __LLONG_WIDTH__
8772ce6294Slntue #endif // LLONG_WIDTH
8872ce6294Slntue 
8972ce6294Slntue #ifndef ULLONG_WIDTH
9072ce6294Slntue #define ULLONG_WIDTH LLONG_WIDTH
9172ce6294Slntue #endif // ULLONG_WIDTH
9272ce6294Slntue 
9372ce6294Slntue #ifndef BOOL_WIDTH
9472ce6294Slntue #ifdef __BOOL_WIDTH__
9572ce6294Slntue #define BOOL_WIDTH __BOOL_WIDTH__
9672ce6294Slntue #else
9772ce6294Slntue #define BOOL_WIDTH 1
9872ce6294Slntue #endif // __BOOL_WIDTH__
9972ce6294Slntue #endif // BOOL_WIDTH
10072ce6294Slntue 
10172ce6294Slntue // *_MAX macros
10272ce6294Slntue 
10372ce6294Slntue #ifndef SCHAR_MAX
10472ce6294Slntue #ifdef __SCHAR_MAX__
10572ce6294Slntue #define SCHAR_MAX __SCHAR_MAX__
10672ce6294Slntue #else
10772ce6294Slntue #define SCHAR_MAX 0x7f
10872ce6294Slntue #endif // __SCHAR_MAX__
10972ce6294Slntue #endif // SCHAR_MAX
11072ce6294Slntue 
11172ce6294Slntue #ifndef UCHAR_MAX
11272ce6294Slntue #define UCHAR_MAX (SCHAR_MAX * 2 + 1)
11372ce6294Slntue #endif // UCHAR_MAX
11472ce6294Slntue 
11572ce6294Slntue // Check if char is unsigned.
11672ce6294Slntue #if !defined(__CHAR_UNSIGNED__) && ('\xff' > 0)
11772ce6294Slntue #define __CHAR_UNSIGNED__
11872ce6294Slntue #endif
11972ce6294Slntue 
12072ce6294Slntue #ifndef CHAR_MAX
12172ce6294Slntue #ifdef __CHAR_UNSIGNED__
12272ce6294Slntue #define CHAR_MAX UCHAR_MAX
12372ce6294Slntue #else
12472ce6294Slntue #define CHAR_MAX SCHAR_MAX
12572ce6294Slntue #endif // __CHAR_UNSIGNED__
12672ce6294Slntue #endif // CHAR_MAX
12772ce6294Slntue 
12872ce6294Slntue #ifndef SHRT_MAX
12972ce6294Slntue #ifdef __SHRT_MAX__
13072ce6294Slntue #define SHRT_MAX __SHRT_MAX__
13172ce6294Slntue #else
13272ce6294Slntue #define SHRT_MAX 0x7fff
13372ce6294Slntue #endif // __SHRT_MAX__
13472ce6294Slntue #endif // SHRT_MAX
13572ce6294Slntue 
13672ce6294Slntue #ifndef USHRT_MAX
13772ce6294Slntue #define USHRT_MAX (SHRT_MAX * 2U + 1U)
13872ce6294Slntue #endif // USHRT_MAX
13972ce6294Slntue 
14072ce6294Slntue #ifndef INT_MAX
14172ce6294Slntue #ifdef __INT_MAX__
14272ce6294Slntue #define INT_MAX __INT_MAX__
14372ce6294Slntue #else
14472ce6294Slntue #define INT_MAX (0 ^ (1 << (INT_WIDTH - 1)))
14572ce6294Slntue #endif // __INT_MAX__
14672ce6294Slntue #endif // INT_MAX
14772ce6294Slntue 
14872ce6294Slntue #ifndef UINT_MAX
149d6bbe2e2SJoseph Huber #define UINT_MAX (INT_MAX * 2U + 1U)
15072ce6294Slntue #endif // UINT_MAX
15172ce6294Slntue 
15272ce6294Slntue #ifndef LONG_MAX
15372ce6294Slntue #ifdef __LONG_MAX__
15472ce6294Slntue #define LONG_MAX __LONG_MAX__
15572ce6294Slntue #else
15672ce6294Slntue #define LONG_MAX (0L ^ (1L << (LONG_WIDTH - 1)))
15772ce6294Slntue #endif // __LONG_MAX__
15872ce6294Slntue #endif // LONG_MAX
15972ce6294Slntue 
16072ce6294Slntue #ifndef ULONG_MAX
161d6bbe2e2SJoseph Huber #define ULONG_MAX (LONG_MAX * 2UL + 1UL)
16272ce6294Slntue #endif // ULONG_MAX
16372ce6294Slntue 
16472ce6294Slntue #ifndef LLONG_MAX
16572ce6294Slntue #ifdef __LONG_LONG_MAX__
16672ce6294Slntue #define LLONG_MAX __LONG_LONG_MAX__
16772ce6294Slntue #else
16872ce6294Slntue #define LLONG_MAX (0LL ^ (1LL << (LLONG_WIDTH - 1)))
16972ce6294Slntue #endif // __LONG_LONG_MAX__
17072ce6294Slntue #endif // LLONG_MAX
17172ce6294Slntue 
17272ce6294Slntue #ifndef ULLONG_MAX
173d6bbe2e2SJoseph Huber #define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL)
17472ce6294Slntue #endif // ULLONG_MAX
17572ce6294Slntue 
17672ce6294Slntue // *_MIN macros
17772ce6294Slntue 
17872ce6294Slntue #ifndef SCHAR_MIN
17972ce6294Slntue #define SCHAR_MIN (-SCHAR_MAX - 1)
18072ce6294Slntue #endif // SCHAR_MIN
18172ce6294Slntue 
18272ce6294Slntue #ifndef UCHAR_MIN
18372ce6294Slntue #define UCHAR_MIN 0
18472ce6294Slntue #endif // UCHAR_MIN
18572ce6294Slntue 
18672ce6294Slntue #ifndef CHAR_MIN
18772ce6294Slntue #ifdef __CHAR_UNSIGNED__
18872ce6294Slntue #define CHAR_MIN UCHAR_MIN
18972ce6294Slntue #else
19072ce6294Slntue #define CHAR_MIN SCHAR_MIN
19172ce6294Slntue #endif // __CHAR_UNSIGNED__
19272ce6294Slntue #endif // CHAR_MIN
19372ce6294Slntue 
19472ce6294Slntue #ifndef SHRT_MIN
19572ce6294Slntue #define SHRT_MIN (-SHRT_MAX - 1)
19672ce6294Slntue #endif // SHRT_MIN
19772ce6294Slntue 
19872ce6294Slntue #ifndef USHRT_MIN
19972ce6294Slntue #define USHRT_MIN 0U
20072ce6294Slntue #endif // USHRT_MIN
20172ce6294Slntue 
20272ce6294Slntue #ifndef INT_MIN
20372ce6294Slntue #define INT_MIN (-INT_MAX - 1)
20472ce6294Slntue #endif // INT_MIN
20572ce6294Slntue 
20672ce6294Slntue #ifndef UINT_MIN
20772ce6294Slntue #define UINT_MIN 0U
20872ce6294Slntue #endif // UINT_MIN
20972ce6294Slntue 
21072ce6294Slntue #ifndef LONG_MIN
21172ce6294Slntue #define LONG_MIN (-LONG_MAX - 1L)
21272ce6294Slntue #endif // LONG_MIN
21372ce6294Slntue 
21472ce6294Slntue #ifndef ULONG_MIN
21572ce6294Slntue #define ULONG_MIN 0UL
21672ce6294Slntue #endif // ULONG_MIN
21772ce6294Slntue 
21872ce6294Slntue #ifndef LLONG_MIN
21972ce6294Slntue #define LLONG_MIN (-LLONG_MAX - 1LL)
22072ce6294Slntue #endif // LLONG_MIN
22172ce6294Slntue 
22272ce6294Slntue #ifndef ULLONG_MIN
22372ce6294Slntue #define ULLONG_MIN 0ULL
22472ce6294Slntue #endif // ULLONG_MIN
22572ce6294Slntue 
2267f3c40a6SNhat Nguyen #ifndef _POSIX_MAX_CANON
2277f3c40a6SNhat Nguyen #define _POSIX_MAX_CANON 255
2287f3c40a6SNhat Nguyen #endif
2297f3c40a6SNhat Nguyen 
2307f3c40a6SNhat Nguyen #ifndef _POSIX_MAX_INPUT
2317f3c40a6SNhat Nguyen #define _POSIX_MAX_INPUT 255
2327f3c40a6SNhat Nguyen #endif
2337f3c40a6SNhat Nguyen 
2347f3c40a6SNhat Nguyen #ifndef _POSIX_NAME_MAX
2357f3c40a6SNhat Nguyen #define _POSIX_PATH_MAX 256
2367f3c40a6SNhat Nguyen #endif
2377f3c40a6SNhat Nguyen 
238330793c9SNick Desaulniers #endif // LLVM_LIBC_MACROS_LIMITS_MACROS_H
239