2007-12-08 23:42:33 +01:00
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
2008-06-18 17:02:10 +02:00
|
|
|
/// \file bswap.h
|
|
|
|
/// \brief Byte swapping
|
2007-12-08 23:42:33 +01:00
|
|
|
//
|
|
|
|
// This code has been put into the public domain.
|
|
|
|
//
|
|
|
|
// This library is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
//
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2008-06-18 17:02:10 +02:00
|
|
|
#ifndef LZMA_BSWAP_H
|
|
|
|
#define LZMA_BSWAP_H
|
2007-12-08 23:42:33 +01:00
|
|
|
|
2008-06-18 17:02:10 +02:00
|
|
|
// NOTE: We assume that config.h is already #included.
|
2007-12-08 23:42:33 +01:00
|
|
|
|
2008-11-19 19:46:52 +01:00
|
|
|
// At least glibc has byteswap.h which contains inline assembly code for
|
|
|
|
// byteswapping. Some systems have byteswap.h but lack one or more of the
|
|
|
|
// bswap_xx macros/functions, which is why we check them separately even
|
|
|
|
// if byteswap.h is available.
|
|
|
|
|
2007-12-08 23:42:33 +01:00
|
|
|
#ifdef HAVE_BYTESWAP_H
|
|
|
|
# include <byteswap.h>
|
2008-11-19 19:46:52 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef HAVE_BSWAP_16
|
2008-06-18 17:02:10 +02:00
|
|
|
# define bswap_16(num) \
|
|
|
|
(((num) << 8) | ((num) >> 8))
|
2008-11-19 19:46:52 +01:00
|
|
|
#endif
|
2008-06-18 17:02:10 +02:00
|
|
|
|
2008-11-19 19:46:52 +01:00
|
|
|
#ifndef HAVE_BSWAP_32
|
2007-12-08 23:42:33 +01:00
|
|
|
# define bswap_32(num) \
|
|
|
|
( (((num) << 24) ) \
|
|
|
|
| (((num) << 8) & UINT32_C(0x00FF0000)) \
|
|
|
|
| (((num) >> 8) & UINT32_C(0x0000FF00)) \
|
|
|
|
| (((num) >> 24) ) )
|
2008-11-19 19:46:52 +01:00
|
|
|
#endif
|
2007-12-08 23:42:33 +01:00
|
|
|
|
2008-11-19 19:46:52 +01:00
|
|
|
#ifndef HAVE_BSWAP_64
|
2007-12-08 23:42:33 +01:00
|
|
|
# define bswap_64(num) \
|
|
|
|
( (((num) << 56) ) \
|
|
|
|
| (((num) << 40) & UINT64_C(0x00FF000000000000)) \
|
|
|
|
| (((num) << 24) & UINT64_C(0x0000FF0000000000)) \
|
|
|
|
| (((num) << 8) & UINT64_C(0x000000FF00000000)) \
|
|
|
|
| (((num) >> 8) & UINT64_C(0x00000000FF000000)) \
|
|
|
|
| (((num) >> 24) & UINT64_C(0x0000000000FF0000)) \
|
|
|
|
| (((num) >> 40) & UINT64_C(0x000000000000FF00)) \
|
|
|
|
| (((num) >> 56) ) )
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif
|