xref: /freebsd-src/contrib/xz/src/common/sysdefs.h (revision 3b35e7ee8de9b0260149a2b77e87a2b9c7a36244)
1*3b35e7eeSXin LI // SPDX-License-Identifier: 0BSD
2*3b35e7eeSXin LI 
381ad8388SMartin Matuska ///////////////////////////////////////////////////////////////////////////////
481ad8388SMartin Matuska //
581ad8388SMartin Matuska /// \file       sysdefs.h
681ad8388SMartin Matuska /// \brief      Common includes, definitions, system-specific things etc.
781ad8388SMartin Matuska ///
881ad8388SMartin Matuska /// This file is used also by the lzma command line tool, that's why this
981ad8388SMartin Matuska /// file is separate from common.h.
1081ad8388SMartin Matuska //
1181ad8388SMartin Matuska //  Author:     Lasse Collin
1281ad8388SMartin Matuska //
1381ad8388SMartin Matuska ///////////////////////////////////////////////////////////////////////////////
1481ad8388SMartin Matuska 
1581ad8388SMartin Matuska #ifndef LZMA_SYSDEFS_H
1681ad8388SMartin Matuska #define LZMA_SYSDEFS_H
1781ad8388SMartin Matuska 
1881ad8388SMartin Matuska //////////////
1981ad8388SMartin Matuska // Includes //
2081ad8388SMartin Matuska //////////////
2181ad8388SMartin Matuska 
2281ad8388SMartin Matuska #ifdef HAVE_CONFIG_H
2381ad8388SMartin Matuska #	include <config.h>
2481ad8388SMartin Matuska #endif
2581ad8388SMartin Matuska 
26ca6a6373SXin LI // This #define ensures that C99 and POSIX compliant stdio functions are
27ca6a6373SXin LI // available with MinGW-w64 (both 32-bit and 64-bit). Modern MinGW-w64 adds
28ca6a6373SXin LI // this automatically, for example, when the compiler is in C99 (or later)
29ca6a6373SXin LI // mode when building against msvcrt.dll. It still doesn't hurt to be explicit
30ca6a6373SXin LI // that we always want this and #define this unconditionally.
31ca6a6373SXin LI //
32ca6a6373SXin LI // With Universal CRT (UCRT) this is less important because UCRT contains
33ca6a6373SXin LI // C99-compatible stdio functions. It's still nice to #define this as UCRT
34ca6a6373SXin LI // doesn't support the POSIX thousand separator flag in printf (like "%'u").
35542aef48SMartin Matuska #ifdef __MINGW32__
36542aef48SMartin Matuska #	define __USE_MINGW_ANSI_STDIO 1
37542aef48SMartin Matuska #endif
38542aef48SMartin Matuska 
3981ad8388SMartin Matuska // size_t and NULL
4081ad8388SMartin Matuska #include <stddef.h>
4181ad8388SMartin Matuska 
4281ad8388SMartin Matuska #ifdef HAVE_INTTYPES_H
4381ad8388SMartin Matuska #	include <inttypes.h>
4481ad8388SMartin Matuska #endif
4581ad8388SMartin Matuska 
4681ad8388SMartin Matuska // C99 says that inttypes.h always includes stdint.h, but some systems
4781ad8388SMartin Matuska // don't do that, and require including stdint.h separately.
4881ad8388SMartin Matuska #ifdef HAVE_STDINT_H
4981ad8388SMartin Matuska #	include <stdint.h>
5081ad8388SMartin Matuska #endif
5181ad8388SMartin Matuska 
5281ad8388SMartin Matuska // Some pre-C99 systems have SIZE_MAX in limits.h instead of stdint.h. The
5381ad8388SMartin Matuska // limits are also used to figure out some macros missing from pre-C99 systems.
5481ad8388SMartin Matuska #include <limits.h>
5581ad8388SMartin Matuska 
5681ad8388SMartin Matuska // Be more compatible with systems that have non-conforming inttypes.h.
5781ad8388SMartin Matuska // We assume that int is 32-bit and that long is either 32-bit or 64-bit.
5881ad8388SMartin Matuska // Full Autoconf test could be more correct, but this should work well enough.
5981ad8388SMartin Matuska // Note that this duplicates some code from lzma.h, but this is better since
6081ad8388SMartin Matuska // we can work without inttypes.h thanks to Autoconf tests.
6181ad8388SMartin Matuska #ifndef UINT32_C
6281ad8388SMartin Matuska #	if UINT_MAX != 4294967295U
6381ad8388SMartin Matuska #		error UINT32_C is not defined and unsigned int is not 32-bit.
6481ad8388SMartin Matuska #	endif
6581ad8388SMartin Matuska #	define UINT32_C(n) n ## U
6681ad8388SMartin Matuska #endif
6781ad8388SMartin Matuska #ifndef UINT32_MAX
6881ad8388SMartin Matuska #	define UINT32_MAX UINT32_C(4294967295)
6981ad8388SMartin Matuska #endif
7081ad8388SMartin Matuska #ifndef PRIu32
7181ad8388SMartin Matuska #	define PRIu32 "u"
7281ad8388SMartin Matuska #endif
73124ddf3eSMartin Matuska #ifndef PRIx32
74124ddf3eSMartin Matuska #	define PRIx32 "x"
75124ddf3eSMartin Matuska #endif
7681ad8388SMartin Matuska #ifndef PRIX32
7781ad8388SMartin Matuska #	define PRIX32 "X"
7881ad8388SMartin Matuska #endif
7981ad8388SMartin Matuska 
8081ad8388SMartin Matuska #if ULONG_MAX == 4294967295UL
8181ad8388SMartin Matuska #	ifndef UINT64_C
8281ad8388SMartin Matuska #		define UINT64_C(n) n ## ULL
8381ad8388SMartin Matuska #	endif
8481ad8388SMartin Matuska #	ifndef PRIu64
8581ad8388SMartin Matuska #		define PRIu64 "llu"
8681ad8388SMartin Matuska #	endif
87124ddf3eSMartin Matuska #	ifndef PRIx64
88124ddf3eSMartin Matuska #		define PRIx64 "llx"
89124ddf3eSMartin Matuska #	endif
9081ad8388SMartin Matuska #	ifndef PRIX64
9181ad8388SMartin Matuska #		define PRIX64 "llX"
9281ad8388SMartin Matuska #	endif
9381ad8388SMartin Matuska #else
9481ad8388SMartin Matuska #	ifndef UINT64_C
9581ad8388SMartin Matuska #		define UINT64_C(n) n ## UL
9681ad8388SMartin Matuska #	endif
9781ad8388SMartin Matuska #	ifndef PRIu64
9881ad8388SMartin Matuska #		define PRIu64 "lu"
9981ad8388SMartin Matuska #	endif
100124ddf3eSMartin Matuska #	ifndef PRIx64
101124ddf3eSMartin Matuska #		define PRIx64 "lx"
102124ddf3eSMartin Matuska #	endif
10381ad8388SMartin Matuska #	ifndef PRIX64
10481ad8388SMartin Matuska #		define PRIX64 "lX"
10581ad8388SMartin Matuska #	endif
10681ad8388SMartin Matuska #endif
10781ad8388SMartin Matuska #ifndef UINT64_MAX
10881ad8388SMartin Matuska #	define UINT64_MAX UINT64_C(18446744073709551615)
10981ad8388SMartin Matuska #endif
11081ad8388SMartin Matuska 
1113632bc4cSMartin Matuska // Incorrect(?) SIZE_MAX:
1123632bc4cSMartin Matuska //   - Interix headers typedef size_t to unsigned long,
11381ad8388SMartin Matuska //     but a few lines later define SIZE_MAX to INT32_MAX.
1143632bc4cSMartin Matuska //   - SCO OpenServer (x86) headers typedef size_t to unsigned int
1153632bc4cSMartin Matuska //     but define SIZE_MAX to INT32_MAX.
1163632bc4cSMartin Matuska #if defined(__INTERIX) || defined(_SCO_DS)
11781ad8388SMartin Matuska #	undef SIZE_MAX
11881ad8388SMartin Matuska #endif
11981ad8388SMartin Matuska 
12081ad8388SMartin Matuska // The code currently assumes that size_t is either 32-bit or 64-bit.
12181ad8388SMartin Matuska #ifndef SIZE_MAX
12281ad8388SMartin Matuska #	if SIZEOF_SIZE_T == 4
12381ad8388SMartin Matuska #		define SIZE_MAX UINT32_MAX
12481ad8388SMartin Matuska #	elif SIZEOF_SIZE_T == 8
12581ad8388SMartin Matuska #		define SIZE_MAX UINT64_MAX
12681ad8388SMartin Matuska #	else
127e0f0e66dSMartin Matuska #		error size_t is not 32-bit or 64-bit
12881ad8388SMartin Matuska #	endif
12981ad8388SMartin Matuska #endif
13081ad8388SMartin Matuska #if SIZE_MAX != UINT32_MAX && SIZE_MAX != UINT64_MAX
131e0f0e66dSMartin Matuska #	error size_t is not 32-bit or 64-bit
13281ad8388SMartin Matuska #endif
13381ad8388SMartin Matuska 
13481ad8388SMartin Matuska #include <stdlib.h>
13581ad8388SMartin Matuska #include <assert.h>
13681ad8388SMartin Matuska 
137047153b4SXin LI // Pre-C99 systems lack stdbool.h. All the code in XZ Utils must be written
13881ad8388SMartin Matuska // so that it works with fake bool type, for example:
13981ad8388SMartin Matuska //
14081ad8388SMartin Matuska //    bool foo = (flags & 0x100) != 0;
14181ad8388SMartin Matuska //    bool bar = !!(flags & 0x100);
14281ad8388SMartin Matuska //
14381ad8388SMartin Matuska // This works with the real C99 bool but breaks with fake bool:
14481ad8388SMartin Matuska //
14581ad8388SMartin Matuska //    bool baz = (flags & 0x100);
14681ad8388SMartin Matuska //
14781ad8388SMartin Matuska #ifdef HAVE_STDBOOL_H
14881ad8388SMartin Matuska #	include <stdbool.h>
14981ad8388SMartin Matuska #else
15081ad8388SMartin Matuska #	if ! HAVE__BOOL
15181ad8388SMartin Matuska typedef unsigned char _Bool;
15281ad8388SMartin Matuska #	endif
15381ad8388SMartin Matuska #	define bool _Bool
15481ad8388SMartin Matuska #	define false 0
15581ad8388SMartin Matuska #	define true 1
15681ad8388SMartin Matuska #	define __bool_true_false_are_defined 1
15781ad8388SMartin Matuska #endif
15881ad8388SMartin Matuska 
15981ad8388SMartin Matuska #include <string.h>
16081ad8388SMartin Matuska 
161*3b35e7eeSXin LI // Visual Studio 2013 update 2 supports only __inline, not inline.
162*3b35e7eeSXin LI // MSVC v19.0 / VS 2015 and newer support both.
163*3b35e7eeSXin LI //
164*3b35e7eeSXin LI // MSVC v19.27 (VS 2019 version 16.7) added support for restrict.
165*3b35e7eeSXin LI // Older ones support only __restrict.
166*3b35e7eeSXin LI #ifdef _MSC_VER
167*3b35e7eeSXin LI #	if _MSC_VER < 1900 && !defined(inline)
16853200025SRui Paulo #		define inline __inline
16953200025SRui Paulo #	endif
170*3b35e7eeSXin LI #	if _MSC_VER < 1927 && !defined(restrict)
17153200025SRui Paulo #		define restrict __restrict
17253200025SRui Paulo #	endif
17353200025SRui Paulo #endif
17481ad8388SMartin Matuska 
17581ad8388SMartin Matuska ////////////
17681ad8388SMartin Matuska // Macros //
17781ad8388SMartin Matuska ////////////
17881ad8388SMartin Matuska 
17981ad8388SMartin Matuska #undef memzero
18081ad8388SMartin Matuska #define memzero(s, n) memset(s, 0, n)
18181ad8388SMartin Matuska 
182e0f0e66dSMartin Matuska // NOTE: Avoid using MIN() and MAX(), because even conditionally defining
183e0f0e66dSMartin Matuska // those macros can cause some portability trouble, since on some systems
184e0f0e66dSMartin Matuska // the system headers insist defining their own versions.
185e0f0e66dSMartin Matuska #define my_min(x, y) ((x) < (y) ? (x) : (y))
186e0f0e66dSMartin Matuska #define my_max(x, y) ((x) > (y) ? (x) : (y))
18781ad8388SMartin Matuska 
18881ad8388SMartin Matuska #ifndef ARRAY_SIZE
18981ad8388SMartin Matuska #	define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
19081ad8388SMartin Matuska #endif
19181ad8388SMartin Matuska 
192a8675d92SXin LI #if defined(__GNUC__) \
193a8675d92SXin LI 		&& ((__GNUC__ == 4 && __GNUC_MINOR__ >= 3) || __GNUC__ > 4)
194124ddf3eSMartin Matuska #	define lzma_attr_alloc_size(x) __attribute__((__alloc_size__(x)))
195124ddf3eSMartin Matuska #else
196124ddf3eSMartin Matuska #	define lzma_attr_alloc_size(x)
197124ddf3eSMartin Matuska #endif
198124ddf3eSMartin Matuska 
19981ad8388SMartin Matuska #endif
200