xref: /freebsd/contrib/xz/src/common/sysdefs.h (revision 542aef48)
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 //
1181ad8388SMartin Matuska //  This file has been put into the public domain.
1281ad8388SMartin Matuska //  You can do whatever you want with this file.
1381ad8388SMartin Matuska //
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 
27542aef48SMartin Matuska // Get standard-compliant stdio functions under MinGW and MinGW-w64.
28542aef48SMartin Matuska #ifdef __MINGW32__
29542aef48SMartin Matuska #	define __USE_MINGW_ANSI_STDIO 1
30542aef48SMartin Matuska #endif
31542aef48SMartin Matuska 
3281ad8388SMartin Matuska // size_t and NULL
3381ad8388SMartin Matuska #include <stddef.h>
3481ad8388SMartin Matuska 
3581ad8388SMartin Matuska #ifdef HAVE_INTTYPES_H
3681ad8388SMartin Matuska #	include <inttypes.h>
3781ad8388SMartin Matuska #endif
3881ad8388SMartin Matuska 
3981ad8388SMartin Matuska // C99 says that inttypes.h always includes stdint.h, but some systems
4081ad8388SMartin Matuska // don't do that, and require including stdint.h separately.
4181ad8388SMartin Matuska #ifdef HAVE_STDINT_H
4281ad8388SMartin Matuska #	include <stdint.h>
4381ad8388SMartin Matuska #endif
4481ad8388SMartin Matuska 
4581ad8388SMartin Matuska // Some pre-C99 systems have SIZE_MAX in limits.h instead of stdint.h. The
4681ad8388SMartin Matuska // limits are also used to figure out some macros missing from pre-C99 systems.
4781ad8388SMartin Matuska #ifdef HAVE_LIMITS_H
4881ad8388SMartin Matuska #	include <limits.h>
4981ad8388SMartin Matuska #endif
5081ad8388SMartin Matuska 
5181ad8388SMartin Matuska // Be more compatible with systems that have non-conforming inttypes.h.
5281ad8388SMartin Matuska // We assume that int is 32-bit and that long is either 32-bit or 64-bit.
5381ad8388SMartin Matuska // Full Autoconf test could be more correct, but this should work well enough.
5481ad8388SMartin Matuska // Note that this duplicates some code from lzma.h, but this is better since
5581ad8388SMartin Matuska // we can work without inttypes.h thanks to Autoconf tests.
5681ad8388SMartin Matuska #ifndef UINT32_C
5781ad8388SMartin Matuska #	if UINT_MAX != 4294967295U
5881ad8388SMartin Matuska #		error UINT32_C is not defined and unsigned int is not 32-bit.
5981ad8388SMartin Matuska #	endif
6081ad8388SMartin Matuska #	define UINT32_C(n) n ## U
6181ad8388SMartin Matuska #endif
6281ad8388SMartin Matuska #ifndef UINT32_MAX
6381ad8388SMartin Matuska #	define UINT32_MAX UINT32_C(4294967295)
6481ad8388SMartin Matuska #endif
6581ad8388SMartin Matuska #ifndef PRIu32
6681ad8388SMartin Matuska #	define PRIu32 "u"
6781ad8388SMartin Matuska #endif
6881ad8388SMartin Matuska #ifndef PRIX32
6981ad8388SMartin Matuska #	define PRIX32 "X"
7081ad8388SMartin Matuska #endif
7181ad8388SMartin Matuska 
7281ad8388SMartin Matuska #if ULONG_MAX == 4294967295UL
7381ad8388SMartin Matuska #	ifndef UINT64_C
7481ad8388SMartin Matuska #		define UINT64_C(n) n ## ULL
7581ad8388SMartin Matuska #	endif
7681ad8388SMartin Matuska #	ifndef PRIu64
7781ad8388SMartin Matuska #		define PRIu64 "llu"
7881ad8388SMartin Matuska #	endif
7981ad8388SMartin Matuska #	ifndef PRIX64
8081ad8388SMartin Matuska #		define PRIX64 "llX"
8181ad8388SMartin Matuska #	endif
8281ad8388SMartin Matuska #else
8381ad8388SMartin Matuska #	ifndef UINT64_C
8481ad8388SMartin Matuska #		define UINT64_C(n) n ## UL
8581ad8388SMartin Matuska #	endif
8681ad8388SMartin Matuska #	ifndef PRIu64
8781ad8388SMartin Matuska #		define PRIu64 "lu"
8881ad8388SMartin Matuska #	endif
8981ad8388SMartin Matuska #	ifndef PRIX64
9081ad8388SMartin Matuska #		define PRIX64 "lX"
9181ad8388SMartin Matuska #	endif
9281ad8388SMartin Matuska #endif
9381ad8388SMartin Matuska #ifndef UINT64_MAX
9481ad8388SMartin Matuska #	define UINT64_MAX UINT64_C(18446744073709551615)
9581ad8388SMartin Matuska #endif
9681ad8388SMartin Matuska 
9781ad8388SMartin Matuska // Interix has broken header files, which typedef size_t to unsigned long,
9881ad8388SMartin Matuska // but a few lines later define SIZE_MAX to INT32_MAX.
9981ad8388SMartin Matuska #ifdef __INTERIX
10081ad8388SMartin Matuska #	undef SIZE_MAX
10181ad8388SMartin Matuska #endif
10281ad8388SMartin Matuska 
10381ad8388SMartin Matuska // The code currently assumes that size_t is either 32-bit or 64-bit.
10481ad8388SMartin Matuska #ifndef SIZE_MAX
10581ad8388SMartin Matuska #	if SIZEOF_SIZE_T == 4
10681ad8388SMartin Matuska #		define SIZE_MAX UINT32_MAX
10781ad8388SMartin Matuska #	elif SIZEOF_SIZE_T == 8
10881ad8388SMartin Matuska #		define SIZE_MAX UINT64_MAX
10981ad8388SMartin Matuska #	else
110e0f0e66dSMartin Matuska #		error size_t is not 32-bit or 64-bit
11181ad8388SMartin Matuska #	endif
11281ad8388SMartin Matuska #endif
11381ad8388SMartin Matuska #if SIZE_MAX != UINT32_MAX && SIZE_MAX != UINT64_MAX
114e0f0e66dSMartin Matuska #	error size_t is not 32-bit or 64-bit
11581ad8388SMartin Matuska #endif
11681ad8388SMartin Matuska 
11781ad8388SMartin Matuska #include <stdlib.h>
11881ad8388SMartin Matuska #include <assert.h>
11981ad8388SMartin Matuska 
12081ad8388SMartin Matuska // Pre-C99 systems lack stdbool.h. All the code in LZMA Utils must be written
12181ad8388SMartin Matuska // so that it works with fake bool type, for example:
12281ad8388SMartin Matuska //
12381ad8388SMartin Matuska //    bool foo = (flags & 0x100) != 0;
12481ad8388SMartin Matuska //    bool bar = !!(flags & 0x100);
12581ad8388SMartin Matuska //
12681ad8388SMartin Matuska // This works with the real C99 bool but breaks with fake bool:
12781ad8388SMartin Matuska //
12881ad8388SMartin Matuska //    bool baz = (flags & 0x100);
12981ad8388SMartin Matuska //
13081ad8388SMartin Matuska #ifdef HAVE_STDBOOL_H
13181ad8388SMartin Matuska #	include <stdbool.h>
13281ad8388SMartin Matuska #else
13381ad8388SMartin Matuska #	if ! HAVE__BOOL
13481ad8388SMartin Matuska typedef unsigned char _Bool;
13581ad8388SMartin Matuska #	endif
13681ad8388SMartin Matuska #	define bool _Bool
13781ad8388SMartin Matuska #	define false 0
13881ad8388SMartin Matuska #	define true 1
13981ad8388SMartin Matuska #	define __bool_true_false_are_defined 1
14081ad8388SMartin Matuska #endif
14181ad8388SMartin Matuska 
14281ad8388SMartin Matuska // string.h should be enough but let's include strings.h and memory.h too if
14381ad8388SMartin Matuska // they exists, since that shouldn't do any harm, but may improve portability.
14481ad8388SMartin Matuska #ifdef HAVE_STRING_H
14581ad8388SMartin Matuska #	include <string.h>
14681ad8388SMartin Matuska #endif
14781ad8388SMartin Matuska 
14881ad8388SMartin Matuska #ifdef HAVE_STRINGS_H
14981ad8388SMartin Matuska #	include <strings.h>
15081ad8388SMartin Matuska #endif
15181ad8388SMartin Matuska 
15281ad8388SMartin Matuska #ifdef HAVE_MEMORY_H
15381ad8388SMartin Matuska #	include <memory.h>
15481ad8388SMartin Matuska #endif
15581ad8388SMartin Matuska 
15681ad8388SMartin Matuska 
15781ad8388SMartin Matuska ////////////
15881ad8388SMartin Matuska // Macros //
15981ad8388SMartin Matuska ////////////
16081ad8388SMartin Matuska 
16181ad8388SMartin Matuska #undef memzero
16281ad8388SMartin Matuska #define memzero(s, n) memset(s, 0, n)
16381ad8388SMartin Matuska 
164e0f0e66dSMartin Matuska // NOTE: Avoid using MIN() and MAX(), because even conditionally defining
165e0f0e66dSMartin Matuska // those macros can cause some portability trouble, since on some systems
166e0f0e66dSMartin Matuska // the system headers insist defining their own versions.
167e0f0e66dSMartin Matuska #define my_min(x, y) ((x) < (y) ? (x) : (y))
168e0f0e66dSMartin Matuska #define my_max(x, y) ((x) > (y) ? (x) : (y))
16981ad8388SMartin Matuska 
17081ad8388SMartin Matuska #ifndef ARRAY_SIZE
17181ad8388SMartin Matuska #	define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
17281ad8388SMartin Matuska #endif
17381ad8388SMartin Matuska 
17481ad8388SMartin Matuska #endif
175