1
///////////////////////////////////////////////////////////////////////////////
4
/// \brief Common includes, definitions, system-specific things etc.
6
/// This file is used also by the lzma command line tool, that's why this
7
/// file is separate from common.h.
9
// Author: Lasse Collin
11
// This file has been put into the public domain.
12
// You can do whatever you want with this file.
14
///////////////////////////////////////////////////////////////////////////////
16
#ifndef LZMA_SYSDEFS_H
17
#define LZMA_SYSDEFS_H
20
# pragma warning(push,1)
21
# pragma warning(disable: 4142) /* benign redefinition of type */
22
# pragma warning(disable: 4761) /* integral size mismatch in argument */
31
// Get standard-compliant stdio functions under MinGW and MinGW-w64.
33
# define __USE_MINGW_ANSI_STDIO 1
39
#ifdef HAVE_INTTYPES_H
40
# include <inttypes.h>
43
// C99 says that inttypes.h always includes stdint.h, but some systems
44
// don't do that, and require including stdint.h separately.
49
// Some pre-C99 systems have SIZE_MAX in limits.h instead of stdint.h. The
50
// limits are also used to figure out some macros missing from pre-C99 systems.
56
#if defined(_MSC_VER) && (_MSC_VER < 1310)
57
# define UINT64_C(n) n ## ui64
61
// Be more compatible with systems that have non-conforming inttypes.h.
62
// We assume that int is 32-bit and that long is either 32-bit or 64-bit.
63
// Full Autoconf test could be more correct, but this should work well enough.
64
// Note that this duplicates some code from lzma.h, but this is better since
65
// we can work without inttypes.h thanks to Autoconf tests.
67
# if UINT_MAX != 4294967295U
68
# error UINT32_C is not defined and unsigned int is not 32-bit.
70
# define UINT32_C(n) n ## U
73
# define UINT32_MAX UINT32_C(4294967295)
85
#if ULONG_MAX == 4294967295UL
87
# define UINT64_C(n) n ## ULL
100
# define UINT64_C(n) n ## UL
113
# define UINT64_MAX UINT64_C(18446744073709551615)
116
// Incorrect(?) SIZE_MAX:
117
// - Interix headers typedef size_t to unsigned long,
118
// but a few lines later define SIZE_MAX to INT32_MAX.
119
// - SCO OpenServer (x86) headers typedef size_t to unsigned int
120
// but define SIZE_MAX to INT32_MAX.
121
#if defined(__INTERIX) || defined(_SCO_DS)
125
// The code currently assumes that size_t is either 32-bit or 64-bit.
127
# if SIZE_OF_SIZE_T == 4
128
# define SIZE_MAX UINT32_MAX
129
# elif SIZE_OF_SIZE_T == 8
130
# define SIZE_MAX UINT64_MAX
132
# error size_t is not 32-bit or 64-bit
135
#if SIZE_MAX != UINT32_MAX && SIZE_MAX != UINT64_MAX
136
# error size_t is not 32-bit or 64-bit
142
// Pre-C99 systems lack stdbool.h. All the code in LZMA Utils must be written
143
// so that it works with fake bool type, for example:
145
// bool foo = (flags & 0x100) != 0;
146
// bool bar = !!(flags & 0x100);
148
// This works with the real C99 bool but breaks with fake bool:
150
// bool baz = (flags & 0x100);
152
#ifdef HAVE_STDBOOL_H
153
# include <stdbool.h>
156
typedef unsigned char _Bool;
161
# define __bool_true_false_are_defined 1
164
// string.h should be enough but let's include strings.h and memory.h too if
165
// they exists, since that shouldn't do any harm, but may improve portability.
170
#ifdef HAVE_STRINGS_H
171
# include <strings.h>
184
#define memzero(s, n) memset(s, 0, n)
186
// NOTE: Avoid using MIN() and MAX(), because even conditionally defining
187
// those macros can cause some portability trouble, since on some systems
188
// the system headers insist defining their own versions.
189
#define my_min(x, y) ((x) < (y) ? (x) : (y))
190
#define my_max(x, y) ((x) > (y) ? (x) : (y))
193
# define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
196
#if (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) || __GNUC__ > 4
197
# define lzma_attr_alloc_size(x) __attribute__((__alloc_size__(x)))
199
# define lzma_attr_alloc_size(x)