1 /////////////////////////////////////////////////////////////////////////////// 2 // 3 /// \file sysdefs.h 4 /// \brief Common includes, definitions, system-specific things etc. 5 /// 6 /// This file is used also by the lzma command line tool, that's why this 7 /// file is separate from common.h. 8 // 9 // Author: Lasse Collin 10 // 11 // This file has been put into the public domain. 12 // You can do whatever you want with this file. 13 // 14 /////////////////////////////////////////////////////////////////////////////// 15 16 #ifndef LZMA_SYSDEFS_H 17 #define LZMA_SYSDEFS_H 18 19 ////////////// 20 // Includes // 21 ////////////// 22 23 #ifdef HAVE_CONFIG_H 24 # include <config.h> 25 #endif 26 27 // Get standard-compliant stdio functions under MinGW and MinGW-w64. 28 #ifdef __MINGW32__ 29 # define __USE_MINGW_ANSI_STDIO 1 30 #endif 31 32 // size_t and NULL 33 #include <stddef.h> 34 35 #ifdef HAVE_INTTYPES_H 36 # include <inttypes.h> 37 #endif 38 39 // C99 says that inttypes.h always includes stdint.h, but some systems 40 // don't do that, and require including stdint.h separately. 41 #ifdef HAVE_STDINT_H 42 # include <stdint.h> 43 #endif 44 45 // Some pre-C99 systems have SIZE_MAX in limits.h instead of stdint.h. The 46 // limits are also used to figure out some macros missing from pre-C99 systems. 47 #ifdef HAVE_LIMITS_H 48 # include <limits.h> 49 #endif 50 51 // Be more compatible with systems that have non-conforming inttypes.h. 52 // We assume that int is 32-bit and that long is either 32-bit or 64-bit. 53 // Full Autoconf test could be more correct, but this should work well enough. 54 // Note that this duplicates some code from lzma.h, but this is better since 55 // we can work without inttypes.h thanks to Autoconf tests. 56 #ifndef UINT32_C 57 # if UINT_MAX != 4294967295U 58 # error UINT32_C is not defined and unsigned int is not 32-bit. 59 # endif 60 # define UINT32_C(n) n ## U 61 #endif 62 #ifndef UINT32_MAX 63 # define UINT32_MAX UINT32_C(4294967295) 64 #endif 65 #ifndef PRIu32 66 # define PRIu32 "u" 67 #endif 68 #ifndef PRIx32 69 # define PRIx32 "x" 70 #endif 71 #ifndef PRIX32 72 # define PRIX32 "X" 73 #endif 74 75 #if ULONG_MAX == 4294967295UL 76 # ifndef UINT64_C 77 # define UINT64_C(n) n ## ULL 78 # endif 79 # ifndef PRIu64 80 # define PRIu64 "llu" 81 # endif 82 # ifndef PRIx64 83 # define PRIx64 "llx" 84 # endif 85 # ifndef PRIX64 86 # define PRIX64 "llX" 87 # endif 88 #else 89 # ifndef UINT64_C 90 # define UINT64_C(n) n ## UL 91 # endif 92 # ifndef PRIu64 93 # define PRIu64 "lu" 94 # endif 95 # ifndef PRIx64 96 # define PRIx64 "lx" 97 # endif 98 # ifndef PRIX64 99 # define PRIX64 "lX" 100 # endif 101 #endif 102 #ifndef UINT64_MAX 103 # define UINT64_MAX UINT64_C(18446744073709551615) 104 #endif 105 106 // Incorrect(?) SIZE_MAX: 107 // - Interix headers typedef size_t to unsigned long, 108 // but a few lines later define SIZE_MAX to INT32_MAX. 109 // - SCO OpenServer (x86) headers typedef size_t to unsigned int 110 // but define SIZE_MAX to INT32_MAX. 111 #if defined(__INTERIX) || defined(_SCO_DS) 112 # undef SIZE_MAX 113 #endif 114 115 // The code currently assumes that size_t is either 32-bit or 64-bit. 116 #ifndef SIZE_MAX 117 # if SIZEOF_SIZE_T == 4 118 # define SIZE_MAX UINT32_MAX 119 # elif SIZEOF_SIZE_T == 8 120 # define SIZE_MAX UINT64_MAX 121 # else 122 # error size_t is not 32-bit or 64-bit 123 # endif 124 #endif 125 #if SIZE_MAX != UINT32_MAX && SIZE_MAX != UINT64_MAX 126 # error size_t is not 32-bit or 64-bit 127 #endif 128 129 #include <stdlib.h> 130 #include <assert.h> 131 132 // Pre-C99 systems lack stdbool.h. All the code in LZMA Utils must be written 133 // so that it works with fake bool type, for example: 134 // 135 // bool foo = (flags & 0x100) != 0; 136 // bool bar = !!(flags & 0x100); 137 // 138 // This works with the real C99 bool but breaks with fake bool: 139 // 140 // bool baz = (flags & 0x100); 141 // 142 #ifdef HAVE_STDBOOL_H 143 # include <stdbool.h> 144 #else 145 # if ! HAVE__BOOL 146 typedef unsigned char _Bool; 147 # endif 148 # define bool _Bool 149 # define false 0 150 # define true 1 151 # define __bool_true_false_are_defined 1 152 #endif 153 154 // string.h should be enough but let's include strings.h and memory.h too if 155 // they exists, since that shouldn't do any harm, but may improve portability. 156 #ifdef HAVE_STRING_H 157 # include <string.h> 158 #endif 159 160 #ifdef HAVE_STRINGS_H 161 # include <strings.h> 162 #endif 163 164 #ifdef HAVE_MEMORY_H 165 # include <memory.h> 166 #endif 167 168 // As of MSVC 2013, inline and restrict are supported with 169 // non-standard keywords. 170 #if defined(_WIN32) && defined(_MSC_VER) 171 # ifndef inline 172 # define inline __inline 173 # endif 174 # ifndef restrict 175 # define restrict __restrict 176 # endif 177 #endif 178 179 //////////// 180 // Macros // 181 //////////// 182 183 #undef memzero 184 #define memzero(s, n) memset(s, 0, n) 185 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)) 191 192 #ifndef ARRAY_SIZE 193 # define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0])) 194 #endif 195 196 #if (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) || __GNUC__ > 4 197 # define lzma_attr_alloc_size(x) __attribute__((__alloc_size__(x))) 198 #else 199 # define lzma_attr_alloc_size(x) 200 #endif 201 202 #endif 203