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 146typedef 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