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