The R Project SVN R

Rev

Rev 53508 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

///////////////////////////////////////////////////////////////////////////////
//
/// \file       sysdefs.h
/// \brief      Common includes, definitions, system-specific things etc.
///
/// This file is used also by the lzma command line tool, that's why this
/// file is separate from common.h.
//
//  Author:     Lasse Collin
//
//  This file has been put into the public domain.
//  You can do whatever you want with this file.
//
///////////////////////////////////////////////////////////////////////////////

#ifndef LZMA_SYSDEFS_H
#define LZMA_SYSDEFS_H

//////////////
// Includes //
//////////////

#ifdef HAVE_CONFIG_H
#   include <config.h>
#endif

// R change
#include "local.h"

// size_t and NULL
#include <stddef.h>

#ifdef HAVE_INTTYPES_H
#   include <inttypes.h>
#endif

// C99 says that inttypes.h always includes stdint.h, but some systems
// don't do that, and require including stdint.h separately.
#ifdef HAVE_STDINT_H
#   include <stdint.h>
#endif

// Some pre-C99 systems have SIZE_MAX in limits.h instead of stdint.h. The
// limits are also used to figure out some macros missing from pre-C99 systems.
#ifdef HAVE_LIMITS_H
#   include <limits.h>
#endif

// Be more compatible with systems that have non-conforming inttypes.h.
// We assume that int is 32-bit and that long is either 32-bit or 64-bit.
// Full Autoconf test could be more correct, but this should work well enough.
// Note that this duplicates some code from lzma.h, but this is better since
// we can work without inttypes.h thanks to Autoconf tests.
#ifndef UINT32_C
#   if UINT_MAX != 4294967295U
#       error UINT32_C is not defined and unsigned int is not 32-bit.
#   endif
#   define UINT32_C(n) n ## U
#endif
#ifndef UINT32_MAX
#   define UINT32_MAX UINT32_C(4294967295)
#endif
#ifndef PRIu32
#   define PRIu32 "u"
#endif
#ifndef PRIX32
#   define PRIX32 "X"
#endif

#if ULONG_MAX == 4294967295UL
#   ifndef UINT64_C
#       define UINT64_C(n) n ## ULL
#   endif
#   ifndef PRIu64
#       define PRIu64 "llu"
#   endif
#   ifndef PRIX64
#       define PRIX64 "llX"
#   endif
#else
#   ifndef UINT64_C
#       define UINT64_C(n) n ## UL
#   endif
#   ifndef PRIu64
#       define PRIu64 "lu"
#   endif
#   ifndef PRIX64
#       define PRIX64 "lX"
#   endif
#endif
#ifndef UINT64_MAX
#   define UINT64_MAX UINT64_C(18446744073709551615)
#endif

// Interix has broken header files, which typedef size_t to unsigned long,
// but a few lines later define SIZE_MAX to INT32_MAX.
#ifdef __INTERIX
#   undef SIZE_MAX
#endif

// The code currently assumes that size_t is either 32-bit or 64-bit.
#ifndef SIZE_MAX
#   if SIZEOF_SIZE_T == 4
#       define SIZE_MAX UINT32_MAX
#   elif SIZEOF_SIZE_T == 8
#       define SIZE_MAX UINT64_MAX
#   else
#       error size_t is not 32-bit or 64-bit
#   endif
#endif
#if SIZE_MAX != UINT32_MAX && SIZE_MAX != UINT64_MAX
#   error size_t is not 32-bit or 64-bit
#endif

#include <stdlib.h>
#include <assert.h>

// Pre-C99 systems lack stdbool.h. All the code in LZMA Utils must be written
// so that it works with fake bool type, for example:
//
//    bool foo = (flags & 0x100) != 0;
//    bool bar = !!(flags & 0x100);
//
// This works with the real C99 bool but breaks with fake bool:
//
//    bool baz = (flags & 0x100);
//
#ifdef HAVE_STDBOOL_H
#   include <stdbool.h>
#else
#   if ! HAVE__BOOL
/* _Bool gave problems on one Solaris system */
typedef unsigned char _Bool8;
#   endif
#   define bool _Bool8
#   define false 0
#   define true 1
#   define __bool_true_false_are_defined 1
#endif

// string.h should be enough but let's include strings.h and memory.h too if
// they exists, since that shouldn't do any harm, but may improve portability.
#ifdef HAVE_STRING_H
#   include <string.h>
#endif

#ifdef HAVE_STRINGS_H
#   include <strings.h>
#endif

#ifdef HAVE_MEMORY_H
#   include <memory.h>
#endif


////////////
// Macros //
////////////

#undef memzero
#define memzero(s, n) memset(s, 0, n)

// NOTE: Avoid using MIN() and MAX(), because even conditionally defining
// those macros can cause some portability trouble, since on some systems
// the system headers insist defining their own versions.
#define my_min(x, y) ((x) < (y) ? (x) : (y))
#define my_max(x, y) ((x) > (y) ? (x) : (y))

#ifndef ARRAY_SIZE
#   define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
#endif

#endif