xref: /freebsd/contrib/xz/src/common/sysdefs.h (revision 2f9cd13d)
181ad8388SMartin Matuska ///////////////////////////////////////////////////////////////////////////////
281ad8388SMartin Matuska //
381ad8388SMartin Matuska /// \file       sysdefs.h
481ad8388SMartin Matuska /// \brief      Common includes, definitions, system-specific things etc.
581ad8388SMartin Matuska ///
681ad8388SMartin Matuska /// This file is used also by the lzma command line tool, that's why this
781ad8388SMartin Matuska /// file is separate from common.h.
881ad8388SMartin Matuska //
981ad8388SMartin Matuska //  Author:     Lasse Collin
1081ad8388SMartin Matuska //
112f9cd13dSXin LI //  This file has been put into the public domain.
122f9cd13dSXin LI //  You can do whatever you want with this file.
132f9cd13dSXin LI //
1481ad8388SMartin Matuska ///////////////////////////////////////////////////////////////////////////////
1581ad8388SMartin Matuska 
1681ad8388SMartin Matuska #ifndef LZMA_SYSDEFS_H
1781ad8388SMartin Matuska #define LZMA_SYSDEFS_H
1881ad8388SMartin Matuska 
1981ad8388SMartin Matuska //////////////
2081ad8388SMartin Matuska // Includes //
2181ad8388SMartin Matuska //////////////
2281ad8388SMartin Matuska 
2381ad8388SMartin Matuska #ifdef HAVE_CONFIG_H
2481ad8388SMartin Matuska #	include <config.h>
2581ad8388SMartin Matuska #endif
2681ad8388SMartin Matuska 
27ca6a6373SXin LI // This #define ensures that C99 and POSIX compliant stdio functions are
28ca6a6373SXin LI // available with MinGW-w64 (both 32-bit and 64-bit). Modern MinGW-w64 adds
29ca6a6373SXin LI // this automatically, for example, when the compiler is in C99 (or later)
30ca6a6373SXin LI // mode when building against msvcrt.dll. It still doesn't hurt to be explicit
31ca6a6373SXin LI // that we always want this and #define this unconditionally.
32ca6a6373SXin LI //
33ca6a6373SXin LI // With Universal CRT (UCRT) this is less important because UCRT contains
34ca6a6373SXin LI // C99-compatible stdio functions. It's still nice to #define this as UCRT
35ca6a6373SXin LI // doesn't support the POSIX thousand separator flag in printf (like "%'u").
36542aef48SMartin Matuska #ifdef __MINGW32__
37542aef48SMartin Matuska #	define __USE_MINGW_ANSI_STDIO 1
38542aef48SMartin Matuska #endif
39542aef48SMartin Matuska 
4081ad8388SMartin Matuska // size_t and NULL
4181ad8388SMartin Matuska #include <stddef.h>
4281ad8388SMartin Matuska 
4381ad8388SMartin Matuska #ifdef HAVE_INTTYPES_H
4481ad8388SMartin Matuska #	include <inttypes.h>
4581ad8388SMartin Matuska #endif
4681ad8388SMartin Matuska 
4781ad8388SMartin Matuska // C99 says that inttypes.h always includes stdint.h, but some systems
4881ad8388SMartin Matuska // don't do that, and require including stdint.h separately.
4981ad8388SMartin Matuska #ifdef HAVE_STDINT_H
5081ad8388SMartin Matuska #	include <stdint.h>
5181ad8388SMartin Matuska #endif
5281ad8388SMartin Matuska 
5381ad8388SMartin Matuska // Some pre-C99 systems have SIZE_MAX in limits.h instead of stdint.h. The
5481ad8388SMartin Matuska // limits are also used to figure out some macros missing from pre-C99 systems.
5581ad8388SMartin Matuska #include <limits.h>
5681ad8388SMartin Matuska 
5781ad8388SMartin Matuska // Be more compatible with systems that have non-conforming inttypes.h.
5881ad8388SMartin Matuska // We assume that int is 32-bit and that long is either 32-bit or 64-bit.
5981ad8388SMartin Matuska // Full Autoconf test could be more correct, but this should work well enough.
6081ad8388SMartin Matuska // Note that this duplicates some code from lzma.h, but this is better since
6181ad8388SMartin Matuska // we can work without inttypes.h thanks to Autoconf tests.
6281ad8388SMartin Matuska #ifndef UINT32_C
6381ad8388SMartin Matuska #	if UINT_MAX != 4294967295U
6481ad8388SMartin Matuska #		error UINT32_C is not defined and unsigned int is not 32-bit.
6581ad8388SMartin Matuska #	endif
6681ad8388SMartin Matuska #	define UINT32_C(n) n ## U
6781ad8388SMartin Matuska #endif
6881ad8388SMartin Matuska #ifndef UINT32_MAX
6981ad8388SMartin Matuska #	define UINT32_MAX UINT32_C(4294967295)
7081ad8388SMartin Matuska #endif
7181ad8388SMartin Matuska #ifndef PRIu32
7281ad8388SMartin Matuska #	define PRIu32 "u"
7381ad8388SMartin Matuska #endif
74124ddf3eSMartin Matuska #ifndef PRIx32
75124ddf3eSMartin Matuska #	define PRIx32 "x"
76124ddf3eSMartin Matuska #endif
7781ad8388SMartin Matuska #ifndef PRIX32
7881ad8388SMartin Matuska #	define PRIX32 "X"
7981ad8388SMartin Matuska #endif
8081ad8388SMartin Matuska 
8181ad8388SMartin Matuska #if ULONG_MAX == 4294967295UL
8281ad8388SMartin Matuska #	ifndef UINT64_C
8381ad8388SMartin Matuska #		define UINT64_C(n) n ## ULL
8481ad8388SMartin Matuska #	endif
8581ad8388SMartin Matuska #	ifndef PRIu64
8681ad8388SMartin Matuska #		define PRIu64 "llu"
8781ad8388SMartin Matuska #	endif
88124ddf3eSMartin Matuska #	ifndef PRIx64
89124ddf3eSMartin Matuska #		define PRIx64 "llx"
90124ddf3eSMartin Matuska #	endif
9181ad8388SMartin Matuska #	ifndef PRIX64
9281ad8388SMartin Matuska #		define PRIX64 "llX"
9381ad8388SMartin Matuska #	endif
9481ad8388SMartin Matuska #else
9581ad8388SMartin Matuska #	ifndef UINT64_C
9681ad8388SMartin Matuska #		define UINT64_C(n) n ## UL
9781ad8388SMartin Matuska #	endif
9881ad8388SMartin Matuska #	ifndef PRIu64
9981ad8388SMartin Matuska #		define PRIu64 "lu"
10081ad8388SMartin Matuska #	endif
101124ddf3eSMartin Matuska #	ifndef PRIx64
102124ddf3eSMartin Matuska #		define PRIx64 "lx"
103124ddf3eSMartin Matuska #	endif
10481ad8388SMartin Matuska #	ifndef PRIX64
10581ad8388SMartin Matuska #		define PRIX64 "lX"
10681ad8388SMartin Matuska #	endif
10781ad8388SMartin Matuska #endif
10881ad8388SMartin Matuska #ifndef UINT64_MAX
10981ad8388SMartin Matuska #	define UINT64_MAX UINT64_C(18446744073709551615)
11081ad8388SMartin Matuska #endif
11181ad8388SMartin Matuska 
1123632bc4cSMartin Matuska // Incorrect(?) SIZE_MAX:
1133632bc4cSMartin Matuska //   - Interix headers typedef size_t to unsigned long,
11481ad8388SMartin Matuska //     but a few lines later define SIZE_MAX to INT32_MAX.
1153632bc4cSMartin Matuska //   - SCO OpenServer (x86) headers typedef size_t to unsigned int
1163632bc4cSMartin Matuska //     but define SIZE_MAX to INT32_MAX.
1173632bc4cSMartin Matuska #if defined(__INTERIX) || defined(_SCO_DS)
11881ad8388SMartin Matuska #	undef SIZE_MAX
11981ad8388SMartin Matuska #endif
12081ad8388SMartin Matuska 
12181ad8388SMartin Matuska // The code currently assumes that size_t is either 32-bit or 64-bit.
12281ad8388SMartin Matuska #ifndef SIZE_MAX
12381ad8388SMartin Matuska #	if SIZEOF_SIZE_T == 4
12481ad8388SMartin Matuska #		define SIZE_MAX UINT32_MAX
12581ad8388SMartin Matuska #	elif SIZEOF_SIZE_T == 8
12681ad8388SMartin Matuska #		define SIZE_MAX UINT64_MAX
12781ad8388SMartin Matuska #	else
128e0f0e66dSMartin Matuska #		error size_t is not 32-bit or 64-bit
12981ad8388SMartin Matuska #	endif
13081ad8388SMartin Matuska #endif
13181ad8388SMartin Matuska #if SIZE_MAX != UINT32_MAX && SIZE_MAX != UINT64_MAX
132e0f0e66dSMartin Matuska #	error size_t is not 32-bit or 64-bit
13381ad8388SMartin Matuska #endif
13481ad8388SMartin Matuska 
13581ad8388SMartin Matuska #include <stdlib.h>
13681ad8388SMartin Matuska #include <assert.h>
13781ad8388SMartin Matuska 
138047153b4SXin LI // Pre-C99 systems lack stdbool.h. All the code in XZ Utils must be written
13981ad8388SMartin Matuska // so that it works with fake bool type, for example:
14081ad8388SMartin Matuska //
14181ad8388SMartin Matuska //    bool foo = (flags & 0x100) != 0;
14281ad8388SMartin Matuska //    bool bar = !!(flags & 0x100);
14381ad8388SMartin Matuska //
14481ad8388SMartin Matuska // This works with the real C99 bool but breaks with fake bool:
14581ad8388SMartin Matuska //
14681ad8388SMartin Matuska //    bool baz = (flags & 0x100);
14781ad8388SMartin Matuska //
14881ad8388SMartin Matuska #ifdef HAVE_STDBOOL_H
14981ad8388SMartin Matuska #	include <stdbool.h>
15081ad8388SMartin Matuska #else
15181ad8388SMartin Matuska #	if ! HAVE__BOOL
15281ad8388SMartin Matuska typedef unsigned char _Bool;
15381ad8388SMartin Matuska #	endif
15481ad8388SMartin Matuska #	define bool _Bool
15581ad8388SMartin Matuska #	define false 0
15681ad8388SMartin Matuska #	define true 1
15781ad8388SMartin Matuska #	define __bool_true_false_are_defined 1
15881ad8388SMartin Matuska #endif
15981ad8388SMartin Matuska 
16081ad8388SMartin Matuska #include <string.h>
16181ad8388SMartin Matuska 
1622f9cd13dSXin LI // As of MSVC 2013, inline and restrict are supported with
1632f9cd13dSXin LI // non-standard keywords.
1642f9cd13dSXin LI #if defined(_WIN32) && defined(_MSC_VER)
1652f9cd13dSXin LI #	ifndef inline
16653200025SRui Paulo #		define inline __inline
16753200025SRui Paulo #	endif
1682f9cd13dSXin LI #	ifndef restrict
16953200025SRui Paulo #		define restrict __restrict
17053200025SRui Paulo #	endif
17153200025SRui Paulo #endif
17281ad8388SMartin Matuska 
17381ad8388SMartin Matuska ////////////
17481ad8388SMartin Matuska // Macros //
17581ad8388SMartin Matuska ////////////
17681ad8388SMartin Matuska 
17781ad8388SMartin Matuska #undef memzero
17881ad8388SMartin Matuska #define memzero(s, n) memset(s, 0, n)
17981ad8388SMartin Matuska 
180e0f0e66dSMartin Matuska // NOTE: Avoid using MIN() and MAX(), because even conditionally defining
181e0f0e66dSMartin Matuska // those macros can cause some portability trouble, since on some systems
182e0f0e66dSMartin Matuska // the system headers insist defining their own versions.
183e0f0e66dSMartin Matuska #define my_min(x, y) ((x) < (y) ? (x) : (y))
184e0f0e66dSMartin Matuska #define my_max(x, y) ((x) > (y) ? (x) : (y))
18581ad8388SMartin Matuska 
18681ad8388SMartin Matuska #ifndef ARRAY_SIZE
18781ad8388SMartin Matuska #	define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
18881ad8388SMartin Matuska #endif
18981ad8388SMartin Matuska 
190a8675d92SXin LI #if defined(__GNUC__) \
191a8675d92SXin LI 		&& ((__GNUC__ == 4 && __GNUC_MINOR__ >= 3) || __GNUC__ > 4)
192124ddf3eSMartin Matuska #	define lzma_attr_alloc_size(x) __attribute__((__alloc_size__(x)))
193124ddf3eSMartin Matuska #else
194124ddf3eSMartin Matuska #	define lzma_attr_alloc_size(x)
195124ddf3eSMartin Matuska #endif
196124ddf3eSMartin Matuska 
19781ad8388SMartin Matuska #endif
198