1caf54c4fSMartin Matuska /*- 2caf54c4fSMartin Matuska * Copyright (c) 2002 Thomas Moestl <tmm@FreeBSD.org> 3caf54c4fSMartin Matuska * All rights reserved. 4caf54c4fSMartin Matuska * 5caf54c4fSMartin Matuska * Redistribution and use in source and binary forms, with or without 6caf54c4fSMartin Matuska * modification, are permitted provided that the following conditions 7caf54c4fSMartin Matuska * are met: 8caf54c4fSMartin Matuska * 1. Redistributions of source code must retain the above copyright 9caf54c4fSMartin Matuska * notice, this list of conditions and the following disclaimer. 10caf54c4fSMartin Matuska * 2. Redistributions in binary form must reproduce the above copyright 11caf54c4fSMartin Matuska * notice, this list of conditions and the following disclaimer in the 12caf54c4fSMartin Matuska * documentation and/or other materials provided with the distribution. 13caf54c4fSMartin Matuska * 14caf54c4fSMartin Matuska * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15caf54c4fSMartin Matuska * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16caf54c4fSMartin Matuska * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17caf54c4fSMartin Matuska * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18caf54c4fSMartin Matuska * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19caf54c4fSMartin Matuska * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20caf54c4fSMartin Matuska * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21caf54c4fSMartin Matuska * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22caf54c4fSMartin Matuska * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23caf54c4fSMartin Matuska * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24caf54c4fSMartin Matuska * SUCH DAMAGE. 25caf54c4fSMartin Matuska * 266c22d9efSMartin Matuska * $FreeBSD$ 27caf54c4fSMartin Matuska * 28caf54c4fSMartin Matuska * Borrowed from FreeBSD's <sys/endian.h> 29caf54c4fSMartin Matuska */ 30caf54c4fSMartin Matuska 31caf54c4fSMartin Matuska #ifndef __LIBARCHIVE_BUILD 32caf54c4fSMartin Matuska #error This header is only to be used internally to libarchive. 33caf54c4fSMartin Matuska #endif 34caf54c4fSMartin Matuska 35caf54c4fSMartin Matuska /* Note: This is a purely internal header! */ 36caf54c4fSMartin Matuska /* Do not use this outside of libarchive internal code! */ 37caf54c4fSMartin Matuska 38caf54c4fSMartin Matuska #ifndef ARCHIVE_ENDIAN_H_INCLUDED 39caf54c4fSMartin Matuska #define ARCHIVE_ENDIAN_H_INCLUDED 40caf54c4fSMartin Matuska 41caf54c4fSMartin Matuska 42caf54c4fSMartin Matuska /* 43caf54c4fSMartin Matuska * Disabling inline keyword for compilers known to choke on it: 44caf54c4fSMartin Matuska * - Watcom C++ in C code. (For any version?) 45caf54c4fSMartin Matuska * - SGI MIPSpro 46caf54c4fSMartin Matuska * - Microsoft Visual C++ 6.0 (supposedly newer versions too) 47caf54c4fSMartin Matuska */ 48caf54c4fSMartin Matuska #if defined(__WATCOMC__) || defined(__sgi) || defined(__hpux) || defined(__BORLANDC__) 49caf54c4fSMartin Matuska #define inline 50caf54c4fSMartin Matuska #elif defined(_MSC_VER) 51caf54c4fSMartin Matuska #define inline __inline 52caf54c4fSMartin Matuska #endif 53caf54c4fSMartin Matuska 54caf54c4fSMartin Matuska /* Alignment-agnostic encode/decode bytestream to/from little/big endian. */ 55caf54c4fSMartin Matuska 56caf54c4fSMartin Matuska static inline uint16_t 57caf54c4fSMartin Matuska archive_be16dec(const void *pp) 58caf54c4fSMartin Matuska { 59caf54c4fSMartin Matuska unsigned char const *p = (unsigned char const *)pp; 60caf54c4fSMartin Matuska 61caf54c4fSMartin Matuska return ((p[0] << 8) | p[1]); 62caf54c4fSMartin Matuska } 63caf54c4fSMartin Matuska 64caf54c4fSMartin Matuska static inline uint32_t 65caf54c4fSMartin Matuska archive_be32dec(const void *pp) 66caf54c4fSMartin Matuska { 67caf54c4fSMartin Matuska unsigned char const *p = (unsigned char const *)pp; 68caf54c4fSMartin Matuska 69caf54c4fSMartin Matuska return ((p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]); 70caf54c4fSMartin Matuska } 71caf54c4fSMartin Matuska 72caf54c4fSMartin Matuska static inline uint64_t 73caf54c4fSMartin Matuska archive_be64dec(const void *pp) 74caf54c4fSMartin Matuska { 75caf54c4fSMartin Matuska unsigned char const *p = (unsigned char const *)pp; 76caf54c4fSMartin Matuska 77caf54c4fSMartin Matuska return (((uint64_t)archive_be32dec(p) << 32) | archive_be32dec(p + 4)); 78caf54c4fSMartin Matuska } 79caf54c4fSMartin Matuska 80caf54c4fSMartin Matuska static inline uint16_t 81caf54c4fSMartin Matuska archive_le16dec(const void *pp) 82caf54c4fSMartin Matuska { 83caf54c4fSMartin Matuska unsigned char const *p = (unsigned char const *)pp; 84caf54c4fSMartin Matuska 85caf54c4fSMartin Matuska return ((p[1] << 8) | p[0]); 86caf54c4fSMartin Matuska } 87caf54c4fSMartin Matuska 88caf54c4fSMartin Matuska static inline uint32_t 89caf54c4fSMartin Matuska archive_le32dec(const void *pp) 90caf54c4fSMartin Matuska { 91caf54c4fSMartin Matuska unsigned char const *p = (unsigned char const *)pp; 92caf54c4fSMartin Matuska 93caf54c4fSMartin Matuska return ((p[3] << 24) | (p[2] << 16) | (p[1] << 8) | p[0]); 94caf54c4fSMartin Matuska } 95caf54c4fSMartin Matuska 96caf54c4fSMartin Matuska static inline uint64_t 97caf54c4fSMartin Matuska archive_le64dec(const void *pp) 98caf54c4fSMartin Matuska { 99caf54c4fSMartin Matuska unsigned char const *p = (unsigned char const *)pp; 100caf54c4fSMartin Matuska 101caf54c4fSMartin Matuska return (((uint64_t)archive_le32dec(p + 4) << 32) | archive_le32dec(p)); 102caf54c4fSMartin Matuska } 103caf54c4fSMartin Matuska 104caf54c4fSMartin Matuska static inline void 105caf54c4fSMartin Matuska archive_be16enc(void *pp, uint16_t u) 106caf54c4fSMartin Matuska { 107caf54c4fSMartin Matuska unsigned char *p = (unsigned char *)pp; 108caf54c4fSMartin Matuska 109caf54c4fSMartin Matuska p[0] = (u >> 8) & 0xff; 110caf54c4fSMartin Matuska p[1] = u & 0xff; 111caf54c4fSMartin Matuska } 112caf54c4fSMartin Matuska 113caf54c4fSMartin Matuska static inline void 114caf54c4fSMartin Matuska archive_be32enc(void *pp, uint32_t u) 115caf54c4fSMartin Matuska { 116caf54c4fSMartin Matuska unsigned char *p = (unsigned char *)pp; 117caf54c4fSMartin Matuska 118caf54c4fSMartin Matuska p[0] = (u >> 24) & 0xff; 119caf54c4fSMartin Matuska p[1] = (u >> 16) & 0xff; 120caf54c4fSMartin Matuska p[2] = (u >> 8) & 0xff; 121caf54c4fSMartin Matuska p[3] = u & 0xff; 122caf54c4fSMartin Matuska } 123caf54c4fSMartin Matuska 124caf54c4fSMartin Matuska static inline void 125caf54c4fSMartin Matuska archive_be64enc(void *pp, uint64_t u) 126caf54c4fSMartin Matuska { 127caf54c4fSMartin Matuska unsigned char *p = (unsigned char *)pp; 128caf54c4fSMartin Matuska 129*fd082e96SMartin Matuska archive_be32enc(p, (uint32_t)(u >> 32)); 130*fd082e96SMartin Matuska archive_be32enc(p + 4, (uint32_t)(u & 0xffffffff)); 131caf54c4fSMartin Matuska } 132caf54c4fSMartin Matuska 133caf54c4fSMartin Matuska static inline void 134caf54c4fSMartin Matuska archive_le16enc(void *pp, uint16_t u) 135caf54c4fSMartin Matuska { 136caf54c4fSMartin Matuska unsigned char *p = (unsigned char *)pp; 137caf54c4fSMartin Matuska 138caf54c4fSMartin Matuska p[0] = u & 0xff; 139caf54c4fSMartin Matuska p[1] = (u >> 8) & 0xff; 140caf54c4fSMartin Matuska } 141caf54c4fSMartin Matuska 142caf54c4fSMartin Matuska static inline void 143caf54c4fSMartin Matuska archive_le32enc(void *pp, uint32_t u) 144caf54c4fSMartin Matuska { 145caf54c4fSMartin Matuska unsigned char *p = (unsigned char *)pp; 146caf54c4fSMartin Matuska 147caf54c4fSMartin Matuska p[0] = u & 0xff; 148caf54c4fSMartin Matuska p[1] = (u >> 8) & 0xff; 149caf54c4fSMartin Matuska p[2] = (u >> 16) & 0xff; 150caf54c4fSMartin Matuska p[3] = (u >> 24) & 0xff; 151caf54c4fSMartin Matuska } 152caf54c4fSMartin Matuska 153caf54c4fSMartin Matuska static inline void 154caf54c4fSMartin Matuska archive_le64enc(void *pp, uint64_t u) 155caf54c4fSMartin Matuska { 156caf54c4fSMartin Matuska unsigned char *p = (unsigned char *)pp; 157caf54c4fSMartin Matuska 158*fd082e96SMartin Matuska archive_le32enc(p, (uint32_t)(u & 0xffffffff)); 159*fd082e96SMartin Matuska archive_le32enc(p + 4, (uint32_t)(u >> 32)); 160caf54c4fSMartin Matuska } 161caf54c4fSMartin Matuska 162caf54c4fSMartin Matuska #endif 163