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