Blame libarchive/archive_endian.h

Packit Service 1d0348
/*-
Packit Service 1d0348
 * Copyright (c) 2002 Thomas Moestl <tmm@FreeBSD.org>
Packit Service 1d0348
 * All rights reserved.
Packit Service 1d0348
 *
Packit Service 1d0348
 * Redistribution and use in source and binary forms, with or without
Packit Service 1d0348
 * modification, are permitted provided that the following conditions
Packit Service 1d0348
 * are met:
Packit Service 1d0348
 * 1. Redistributions of source code must retain the above copyright
Packit Service 1d0348
 *    notice, this list of conditions and the following disclaimer.
Packit Service 1d0348
 * 2. Redistributions in binary form must reproduce the above copyright
Packit Service 1d0348
 *    notice, this list of conditions and the following disclaimer in the
Packit Service 1d0348
 *    documentation and/or other materials provided with the distribution.
Packit Service 1d0348
 *
Packit Service 1d0348
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
Packit Service 1d0348
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Packit Service 1d0348
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Packit Service 1d0348
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
Packit Service 1d0348
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Packit Service 1d0348
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
Packit Service 1d0348
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
Packit Service 1d0348
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
Packit Service 1d0348
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
Packit Service 1d0348
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
Packit Service 1d0348
 * SUCH DAMAGE.
Packit Service 1d0348
 *
Packit Service 1d0348
 * $FreeBSD: head/lib/libarchive/archive_endian.h 201085 2009-12-28 02:17:15Z kientzle $
Packit Service 1d0348
 *
Packit Service 1d0348
 * Borrowed from FreeBSD's <sys/endian.h>
Packit Service 1d0348
 */
Packit Service 1d0348
Packit Service 1d0348
#ifndef __LIBARCHIVE_BUILD
Packit Service 1d0348
#error This header is only to be used internally to libarchive.
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
/* Note:  This is a purely internal header! */
Packit Service 1d0348
/* Do not use this outside of libarchive internal code! */
Packit Service 1d0348
Packit Service 1d0348
#ifndef ARCHIVE_ENDIAN_H_INCLUDED
Packit Service 1d0348
#define ARCHIVE_ENDIAN_H_INCLUDED
Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348
/*
Packit Service 1d0348
 * Disabling inline keyword for compilers known to choke on it:
Packit Service 1d0348
 * - Watcom C++ in C code.  (For any version?)
Packit Service 1d0348
 * - SGI MIPSpro
Packit Service 1d0348
 * - Microsoft Visual C++ 6.0 (supposedly newer versions too)
Packit Service 1d0348
 * - IBM VisualAge 6 (XL v6)
Packit Service 1d0348
 * - Sun WorkShop C (SunPro) before 5.9
Packit Service 1d0348
 */
Packit Service 1d0348
#if defined(__WATCOMC__) || defined(__sgi) || defined(__hpux) || defined(__BORLANDC__)
Packit Service 1d0348
#define	inline
Packit Service 1d0348
#elif defined(__IBMC__) && __IBMC__ < 700
Packit Service 1d0348
#define	inline
Packit Service 1d0348
#elif defined(__SUNPRO_C) && __SUNPRO_C < 0x590
Packit Service 1d0348
#define inline
Packit Service 1d0348
#elif defined(_MSC_VER) || defined(__osf__)
Packit Service 1d0348
#define inline __inline
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
/* Alignment-agnostic encode/decode bytestream to/from little/big endian. */
Packit Service 1d0348
Packit Service 1d0348
static inline uint16_t
Packit Service 1d0348
archive_be16dec(const void *pp)
Packit Service 1d0348
{
Packit Service 1d0348
	unsigned char const *p = (unsigned char const *)pp;
Packit Service 1d0348
Packit Service 1d0348
	/* Store into unsigned temporaries before left shifting, to avoid
Packit Service 1d0348
	promotion to signed int and then left shifting into the sign bit,
Packit Service 1d0348
	which is undefined behaviour. */
Packit Service 1d0348
	unsigned int p1 = p[1];
Packit Service 1d0348
	unsigned int p0 = p[0];
Packit Service 1d0348
Packit Service 1d0348
	return ((p0 << 8) | p1);
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static inline uint32_t
Packit Service 1d0348
archive_be32dec(const void *pp)
Packit Service 1d0348
{
Packit Service 1d0348
	unsigned char const *p = (unsigned char const *)pp;
Packit Service 1d0348
Packit Service 1d0348
	/* Store into unsigned temporaries before left shifting, to avoid
Packit Service 1d0348
	promotion to signed int and then left shifting into the sign bit,
Packit Service 1d0348
	which is undefined behaviour. */
Packit Service 1d0348
	unsigned int p3 = p[3];
Packit Service 1d0348
	unsigned int p2 = p[2];
Packit Service 1d0348
	unsigned int p1 = p[1];
Packit Service 1d0348
	unsigned int p0 = p[0];
Packit Service 1d0348
Packit Service 1d0348
	return ((p0 << 24) | (p1 << 16) | (p2 << 8) | p3);
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static inline uint64_t
Packit Service 1d0348
archive_be64dec(const void *pp)
Packit Service 1d0348
{
Packit Service 1d0348
	unsigned char const *p = (unsigned char const *)pp;
Packit Service 1d0348
Packit Service 1d0348
	return (((uint64_t)archive_be32dec(p) << 32) | archive_be32dec(p + 4));
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static inline uint16_t
Packit Service 1d0348
archive_le16dec(const void *pp)
Packit Service 1d0348
{
Packit Service 1d0348
	unsigned char const *p = (unsigned char const *)pp;
Packit Service 1d0348
Packit Service 1d0348
	/* Store into unsigned temporaries before left shifting, to avoid
Packit Service 1d0348
	promotion to signed int and then left shifting into the sign bit,
Packit Service 1d0348
	which is undefined behaviour. */
Packit Service 1d0348
	unsigned int p1 = p[1];
Packit Service 1d0348
	unsigned int p0 = p[0];
Packit Service 1d0348
Packit Service 1d0348
	return ((p1 << 8) | p0);
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static inline uint32_t
Packit Service 1d0348
archive_le32dec(const void *pp)
Packit Service 1d0348
{
Packit Service 1d0348
	unsigned char const *p = (unsigned char const *)pp;
Packit Service 1d0348
Packit Service 1d0348
	/* Store into unsigned temporaries before left shifting, to avoid
Packit Service 1d0348
	promotion to signed int and then left shifting into the sign bit,
Packit Service 1d0348
	which is undefined behaviour. */
Packit Service 1d0348
	unsigned int p3 = p[3];
Packit Service 1d0348
	unsigned int p2 = p[2];
Packit Service 1d0348
	unsigned int p1 = p[1];
Packit Service 1d0348
	unsigned int p0 = p[0];
Packit Service 1d0348
Packit Service 1d0348
	return ((p3 << 24) | (p2 << 16) | (p1 << 8) | p0);
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static inline uint64_t
Packit Service 1d0348
archive_le64dec(const void *pp)
Packit Service 1d0348
{
Packit Service 1d0348
	unsigned char const *p = (unsigned char const *)pp;
Packit Service 1d0348
Packit Service 1d0348
	return (((uint64_t)archive_le32dec(p + 4) << 32) | archive_le32dec(p));
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static inline void
Packit Service 1d0348
archive_be16enc(void *pp, uint16_t u)
Packit Service 1d0348
{
Packit Service 1d0348
	unsigned char *p = (unsigned char *)pp;
Packit Service 1d0348
Packit Service 1d0348
	p[0] = (u >> 8) & 0xff;
Packit Service 1d0348
	p[1] = u & 0xff;
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static inline void
Packit Service 1d0348
archive_be32enc(void *pp, uint32_t u)
Packit Service 1d0348
{
Packit Service 1d0348
	unsigned char *p = (unsigned char *)pp;
Packit Service 1d0348
Packit Service 1d0348
	p[0] = (u >> 24) & 0xff;
Packit Service 1d0348
	p[1] = (u >> 16) & 0xff;
Packit Service 1d0348
	p[2] = (u >> 8) & 0xff;
Packit Service 1d0348
	p[3] = u & 0xff;
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static inline void
Packit Service 1d0348
archive_be64enc(void *pp, uint64_t u)
Packit Service 1d0348
{
Packit Service 1d0348
	unsigned char *p = (unsigned char *)pp;
Packit Service 1d0348
Packit Service 1d0348
	archive_be32enc(p, (uint32_t)(u >> 32));
Packit Service 1d0348
	archive_be32enc(p + 4, (uint32_t)(u & 0xffffffff));
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static inline void
Packit Service 1d0348
archive_le16enc(void *pp, uint16_t u)
Packit Service 1d0348
{
Packit Service 1d0348
	unsigned char *p = (unsigned char *)pp;
Packit Service 1d0348
Packit Service 1d0348
	p[0] = u & 0xff;
Packit Service 1d0348
	p[1] = (u >> 8) & 0xff;
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static inline void
Packit Service 1d0348
archive_le32enc(void *pp, uint32_t u)
Packit Service 1d0348
{
Packit Service 1d0348
	unsigned char *p = (unsigned char *)pp;
Packit Service 1d0348
Packit Service 1d0348
	p[0] = u & 0xff;
Packit Service 1d0348
	p[1] = (u >> 8) & 0xff;
Packit Service 1d0348
	p[2] = (u >> 16) & 0xff;
Packit Service 1d0348
	p[3] = (u >> 24) & 0xff;
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static inline void
Packit Service 1d0348
archive_le64enc(void *pp, uint64_t u)
Packit Service 1d0348
{
Packit Service 1d0348
	unsigned char *p = (unsigned char *)pp;
Packit Service 1d0348
Packit Service 1d0348
	archive_le32enc(p, (uint32_t)(u & 0xffffffff));
Packit Service 1d0348
	archive_le32enc(p + 4, (uint32_t)(u >> 32));
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
#endif