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