Blame libarchive/xxhash.c

Packit Service 1d0348
/*
Packit Service 1d0348
xxHash - Fast Hash algorithm
Packit Service 1d0348
Copyright (C) 2012-2014, Yann Collet.
Packit Service 1d0348
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
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 are
Packit Service 1d0348
met:
Packit Service 1d0348
Packit Service 1d0348
* Redistributions of source code must retain the above copyright
Packit Service 1d0348
notice, this list of conditions and the following disclaimer.
Packit Service 1d0348
* Redistributions in binary form must reproduce the above
Packit Service 1d0348
copyright notice, this list of conditions and the following disclaimer
Packit Service 1d0348
in the documentation and/or other materials provided with the
Packit Service 1d0348
distribution.
Packit Service 1d0348
Packit Service 1d0348
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit Service 1d0348
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit Service 1d0348
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit Service 1d0348
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit Service 1d0348
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit Service 1d0348
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit Service 1d0348
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit Service 1d0348
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit Service 1d0348
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit Service 1d0348
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit Service 1d0348
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit Service 1d0348
Packit Service 1d0348
You can contact the author at :
Packit Service 1d0348
- xxHash source repository : http://code.google.com/p/xxhash/
Packit Service 1d0348
*/
Packit Service 1d0348
#include "archive_platform.h"
Packit Service 1d0348
Packit Service 1d0348
#include <stdlib.h>
Packit Service 1d0348
#include <string.h>
Packit Service 1d0348
Packit Service 1d0348
#include "archive_xxhash.h"
Packit Service 1d0348
Packit Service 1d0348
#ifdef HAVE_LIBLZ4
Packit Service 1d0348
Packit Service 1d0348
/***************************************
Packit Service 1d0348
** Tuning parameters
Packit Service 1d0348
****************************************/
Packit Service 1d0348
/* Unaligned memory access is automatically enabled for "common" CPU, such as x86.
Packit Service 1d0348
** For others CPU, the compiler will be more cautious, and insert extra code to ensure aligned access is respected.
Packit Service 1d0348
** If you know your target CPU supports unaligned memory access, you want to force this option manually to improve performance.
Packit Service 1d0348
** You can also enable this parameter if you know your input data will always be aligned (boundaries of 4, for U32).
Packit Service 1d0348
*/
Packit Service 1d0348
#if defined(__ARM_FEATURE_UNALIGNED) || defined(__i386) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64)
Packit Service 1d0348
#  define XXH_USE_UNALIGNED_ACCESS 1
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
/* XXH_ACCEPT_NULL_INPUT_POINTER :
Packit Service 1d0348
** If the input pointer is a null pointer, xxHash default behavior is to trigger a memory access error, since it is a bad pointer.
Packit Service 1d0348
** When this option is enabled, xxHash output for null input pointers will be the same as a null-length input.
Packit Service 1d0348
** This option has a very small performance cost (only measurable on small inputs).
Packit Service 1d0348
** By default, this option is disabled. To enable it, uncomment below define :
Packit Service 1d0348
** #define XXH_ACCEPT_NULL_INPUT_POINTER 1
Packit Service 1d0348
Packit Service 1d0348
** XXH_FORCE_NATIVE_FORMAT :
Packit Service 1d0348
** By default, xxHash library provides endian-independent Hash values, based on little-endian convention.
Packit Service 1d0348
** Results are therefore identical for little-endian and big-endian CPU.
Packit Service 1d0348
** This comes at a performance cost for big-endian CPU, since some swapping is required to emulate little-endian format.
Packit Service 1d0348
** Should endian-independence be of no importance for your application, you may set the #define below to 1.
Packit Service 1d0348
** It will improve speed for Big-endian CPU.
Packit Service 1d0348
** This option has no impact on Little_Endian CPU.
Packit Service 1d0348
*/
Packit Service 1d0348
#define XXH_FORCE_NATIVE_FORMAT 0
Packit Service 1d0348
Packit Service 1d0348
/***************************************
Packit Service 1d0348
** Compiler Specific Options
Packit Service 1d0348
****************************************/
Packit Service 1d0348
/* Disable some Visual warning messages */
Packit Service 1d0348
#ifdef _MSC_VER  /* Visual Studio */
Packit Service 1d0348
#  pragma warning(disable : 4127)      /* disable: C4127: conditional expression is constant */
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
#ifdef _MSC_VER    /* Visual Studio */
Packit Service 1d0348
#  define FORCE_INLINE __forceinline
Packit Service 1d0348
#else
Packit Service 1d0348
#  ifdef __GNUC__
Packit Service 1d0348
#    define FORCE_INLINE inline __attribute__((always_inline))
Packit Service 1d0348
#  else
Packit Service 1d0348
#    define FORCE_INLINE inline
Packit Service 1d0348
#  endif
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
/***************************************
Packit Service 1d0348
** Includes & Memory related functions
Packit Service 1d0348
****************************************/
Packit Service 1d0348
#define XXH_malloc malloc
Packit Service 1d0348
#define XXH_free free
Packit Service 1d0348
#define XXH_memcpy memcpy
Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348
static unsigned int	  XXH32 (const void*, unsigned int, unsigned int);
Packit Service 1d0348
static void*		  XXH32_init   (unsigned int);
Packit Service 1d0348
static XXH_errorcode	  XXH32_update (void*, const void*, unsigned int);
Packit Service 1d0348
static unsigned int	  XXH32_digest (void*);
Packit Service 1d0348
/*static int		  XXH32_sizeofState(void);*/
Packit Service 1d0348
static XXH_errorcode	  XXH32_resetState(void*, unsigned int);
Packit Service 1d0348
#define       XXH32_SIZEOFSTATE 48
Packit Service 1d0348
typedef struct { long long ll[(XXH32_SIZEOFSTATE+(sizeof(long long)-1))/sizeof(long long)]; } XXH32_stateSpace_t;
Packit Service 1d0348
static unsigned int	  XXH32_intermediateDigest (void*);
Packit Service 1d0348
Packit Service 1d0348
/***************************************
Packit Service 1d0348
** Basic Types
Packit Service 1d0348
****************************************/
Packit Service 1d0348
#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L   /* C99 */
Packit Service 1d0348
# include <stdint.h>
Packit Service 1d0348
  typedef uint8_t  BYTE;
Packit Service 1d0348
  typedef uint16_t U16;
Packit Service 1d0348
  typedef uint32_t U32;
Packit Service 1d0348
  typedef  int32_t S32;
Packit Service 1d0348
  typedef uint64_t U64;
Packit Service 1d0348
#else
Packit Service 1d0348
  typedef unsigned char      BYTE;
Packit Service 1d0348
  typedef unsigned short     U16;
Packit Service 1d0348
  typedef unsigned int       U32;
Packit Service 1d0348
  typedef   signed int       S32;
Packit Service 1d0348
  typedef unsigned long long U64;
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
#if defined(__GNUC__)  && !defined(XXH_USE_UNALIGNED_ACCESS)
Packit Service 1d0348
#  define _PACKED __attribute__ ((packed))
Packit Service 1d0348
#else
Packit Service 1d0348
#  define _PACKED
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
#if !defined(XXH_USE_UNALIGNED_ACCESS) && !defined(__GNUC__)
Packit Service 1d0348
#  ifdef __IBMC__
Packit Service 1d0348
#    pragma pack(1)
Packit Service 1d0348
#  else
Packit Service 1d0348
#    pragma pack(push, 1)
Packit Service 1d0348
#  endif
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
typedef struct _U32_S { U32 v; } _PACKED U32_S;
Packit Service 1d0348
Packit Service 1d0348
#if !defined(XXH_USE_UNALIGNED_ACCESS) && !defined(__GNUC__)
Packit Service 1d0348
#  pragma pack(pop)
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348
/****************************************
Packit Service 1d0348
** Compiler-specific Functions and Macros
Packit Service 1d0348
*****************************************/
Packit Service 1d0348
#define GCC_VERSION ((__GNUC__-0) * 100 + (__GNUC_MINOR__ - 0))
Packit Service 1d0348
Packit Service 1d0348
#if GCC_VERSION >= 409
Packit Service 1d0348
__attribute__((__no_sanitize_undefined__))
Packit Service 1d0348
#endif
Packit Service 1d0348
static inline U32 A32(const void * x)
Packit Service 1d0348
{
Packit Service 1d0348
    return (((const U32_S *)(x))->v);
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
/* Note : although _rotl exists for minGW (GCC under windows), performance seems poor */
Packit Service 1d0348
#if defined(_MSC_VER)
Packit Service 1d0348
#  define XXH_rotl32(x,r) _rotl(x,r)
Packit Service 1d0348
#else
Packit Service 1d0348
#  define XXH_rotl32(x,r) ((x << r) | (x >> (32 - r)))
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
#if defined(_MSC_VER)     /* Visual Studio */
Packit Service 1d0348
#  define XXH_swap32 _byteswap_ulong
Packit Service 1d0348
#elif GCC_VERSION >= 403
Packit Service 1d0348
#  define XXH_swap32 __builtin_bswap32
Packit Service 1d0348
#else
Packit Service 1d0348
static inline U32 XXH_swap32 (U32 x) {
Packit Service 1d0348
    return  ((x << 24) & 0xff000000 ) |
Packit Service 1d0348
			((x <<  8) & 0x00ff0000 ) |
Packit Service 1d0348
			((x >>  8) & 0x0000ff00 ) |
Packit Service 1d0348
			((x >> 24) & 0x000000ff );}
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348
/***************************************
Packit Service 1d0348
** Constants
Packit Service 1d0348
****************************************/
Packit Service 1d0348
#define PRIME32_1   2654435761U
Packit Service 1d0348
#define PRIME32_2   2246822519U
Packit Service 1d0348
#define PRIME32_3   3266489917U
Packit Service 1d0348
#define PRIME32_4    668265263U
Packit Service 1d0348
#define PRIME32_5    374761393U
Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348
/***************************************
Packit Service 1d0348
** Architecture Macros
Packit Service 1d0348
****************************************/
Packit Service 1d0348
typedef enum { XXH_bigEndian=0, XXH_littleEndian=1 } XXH_endianess;
Packit Service 1d0348
#ifndef XXH_CPU_LITTLE_ENDIAN   /* It is possible to define XXH_CPU_LITTLE_ENDIAN externally, for example using a compiler switch */
Packit Service 1d0348
    static const int one = 1;
Packit Service 1d0348
#   define XXH_CPU_LITTLE_ENDIAN   (*(const char*)(&one))
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348
/***************************************
Packit Service 1d0348
** Macros
Packit Service 1d0348
****************************************/
Packit Service 1d0348
#define XXH_STATIC_ASSERT(c)   { enum { XXH_static_assert = 1/(!!(c)) }; }    /* use only *after* variable declarations */
Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348
/*****************************
Packit Service 1d0348
** Memory reads
Packit Service 1d0348
******************************/
Packit Service 1d0348
typedef enum { XXH_aligned, XXH_unaligned } XXH_alignment;
Packit Service 1d0348
Packit Service 1d0348
static
Packit Service 1d0348
FORCE_INLINE U32 XXH_readLE32_align(const U32* ptr, XXH_endianess endian, XXH_alignment align)
Packit Service 1d0348
{
Packit Service 1d0348
    if (align==XXH_unaligned)
Packit Service 1d0348
        return endian==XXH_littleEndian ? A32(ptr) : XXH_swap32(A32(ptr));
Packit Service 1d0348
    else
Packit Service 1d0348
        return endian==XXH_littleEndian ? *ptr : XXH_swap32(*ptr);
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static
Packit Service 1d0348
FORCE_INLINE U32 XXH_readLE32(const U32* ptr, XXH_endianess endian) { return XXH_readLE32_align(ptr, endian, XXH_unaligned); }
Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348
/*****************************
Packit Service 1d0348
** Simple Hash Functions
Packit Service 1d0348
******************************/
Packit Service 1d0348
static
Packit Service 1d0348
FORCE_INLINE U32 XXH32_endian_align(const void* input, unsigned int len, U32 seed, XXH_endianess endian, XXH_alignment align)
Packit Service 1d0348
{
Packit Service 1d0348
    const BYTE* p = (const BYTE*)input;
Packit Service 1d0348
    const BYTE* bEnd = p + len;
Packit Service 1d0348
    U32 h32;
Packit Service 1d0348
#define XXH_get32bits(p) XXH_readLE32_align((const U32*)p, endian, align)
Packit Service 1d0348
Packit Service 1d0348
#ifdef XXH_ACCEPT_NULL_INPUT_POINTER
Packit Service 1d0348
    if (p==NULL) { len=0; bEnd=p=(const BYTE*)(size_t)16; }
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
    if (len>=16)
Packit Service 1d0348
    {
Packit Service 1d0348
        const BYTE* const limit = bEnd - 16;
Packit Service 1d0348
        U32 v1 = seed + PRIME32_1 + PRIME32_2;
Packit Service 1d0348
        U32 v2 = seed + PRIME32_2;
Packit Service 1d0348
        U32 v3 = seed + 0;
Packit Service 1d0348
        U32 v4 = seed - PRIME32_1;
Packit Service 1d0348
Packit Service 1d0348
        do
Packit Service 1d0348
        {
Packit Service 1d0348
            v1 += XXH_get32bits(p) * PRIME32_2; v1 = XXH_rotl32(v1, 13); v1 *= PRIME32_1; p+=4;
Packit Service 1d0348
            v2 += XXH_get32bits(p) * PRIME32_2; v2 = XXH_rotl32(v2, 13); v2 *= PRIME32_1; p+=4;
Packit Service 1d0348
            v3 += XXH_get32bits(p) * PRIME32_2; v3 = XXH_rotl32(v3, 13); v3 *= PRIME32_1; p+=4;
Packit Service 1d0348
            v4 += XXH_get32bits(p) * PRIME32_2; v4 = XXH_rotl32(v4, 13); v4 *= PRIME32_1; p+=4;
Packit Service 1d0348
        } while (p<=limit);
Packit Service 1d0348
Packit Service 1d0348
        h32 = XXH_rotl32(v1, 1) + XXH_rotl32(v2, 7) + XXH_rotl32(v3, 12) + XXH_rotl32(v4, 18);
Packit Service 1d0348
    }
Packit Service 1d0348
    else
Packit Service 1d0348
    {
Packit Service 1d0348
        h32  = seed + PRIME32_5;
Packit Service 1d0348
    }
Packit Service 1d0348
Packit Service 1d0348
    h32 += (U32) len;
Packit Service 1d0348
Packit Service 1d0348
    while (p<=bEnd-4)
Packit Service 1d0348
    {
Packit Service 1d0348
        h32 += XXH_get32bits(p) * PRIME32_3;
Packit Service 1d0348
        h32  = XXH_rotl32(h32, 17) * PRIME32_4 ;
Packit Service 1d0348
        p+=4;
Packit Service 1d0348
    }
Packit Service 1d0348
Packit Service 1d0348
    while (p
Packit Service 1d0348
    {
Packit Service 1d0348
        h32 += (*p) * PRIME32_5;
Packit Service 1d0348
        h32 = XXH_rotl32(h32, 11) * PRIME32_1 ;
Packit Service 1d0348
        p++;
Packit Service 1d0348
    }
Packit Service 1d0348
Packit Service 1d0348
    h32 ^= h32 >> 15;
Packit Service 1d0348
    h32 *= PRIME32_2;
Packit Service 1d0348
    h32 ^= h32 >> 13;
Packit Service 1d0348
    h32 *= PRIME32_3;
Packit Service 1d0348
    h32 ^= h32 >> 16;
Packit Service 1d0348
Packit Service 1d0348
    return h32;
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348
U32 XXH32(const void* input, unsigned int len, U32 seed)
Packit Service 1d0348
{
Packit Service 1d0348
#if 0
Packit Service 1d0348
    // Simple version, good for code maintenance, but unfortunately slow for small inputs
Packit Service 1d0348
    void* state = XXH32_init(seed);
Packit Service 1d0348
    XXH32_update(state, input, len);
Packit Service 1d0348
    return XXH32_digest(state);
Packit Service 1d0348
#else
Packit Service 1d0348
    XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;
Packit Service 1d0348
Packit Service 1d0348
#  if !defined(XXH_USE_UNALIGNED_ACCESS)
Packit Service 1d0348
    if ((((size_t)input) & 3) == 0)   /* Input is aligned, let's leverage the speed advantage */
Packit Service 1d0348
    {
Packit Service 1d0348
        if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
Packit Service 1d0348
            return XXH32_endian_align(input, len, seed, XXH_littleEndian, XXH_aligned);
Packit Service 1d0348
        else
Packit Service 1d0348
            return XXH32_endian_align(input, len, seed, XXH_bigEndian, XXH_aligned);
Packit Service 1d0348
    }
Packit Service 1d0348
#  endif
Packit Service 1d0348
Packit Service 1d0348
    if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
Packit Service 1d0348
        return XXH32_endian_align(input, len, seed, XXH_littleEndian, XXH_unaligned);
Packit Service 1d0348
    else
Packit Service 1d0348
        return XXH32_endian_align(input, len, seed, XXH_bigEndian, XXH_unaligned);
Packit Service 1d0348
#endif
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
/*****************************
Packit Service 1d0348
** Advanced Hash Functions
Packit Service 1d0348
******************************/
Packit Service 1d0348
Packit Service 1d0348
struct XXH_state32_t
Packit Service 1d0348
{
Packit Service 1d0348
    U64 total_len;
Packit Service 1d0348
    U32 seed;
Packit Service 1d0348
    U32 v1;
Packit Service 1d0348
    U32 v2;
Packit Service 1d0348
    U32 v3;
Packit Service 1d0348
    U32 v4;
Packit Service 1d0348
    int memsize;
Packit Service 1d0348
    char memory[16];
Packit Service 1d0348
};
Packit Service 1d0348
Packit Service 1d0348
#if 0
Packit Service 1d0348
static
Packit Service 1d0348
int XXH32_sizeofState(void)
Packit Service 1d0348
{
Packit Service 1d0348
    XXH_STATIC_ASSERT(XXH32_SIZEOFSTATE >= sizeof(struct XXH_state32_t));   /* A compilation error here means XXH32_SIZEOFSTATE is not large enough */
Packit Service 1d0348
    return sizeof(struct XXH_state32_t);
Packit Service 1d0348
}
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
static
Packit Service 1d0348
XXH_errorcode XXH32_resetState(void* state_in, U32 seed)
Packit Service 1d0348
{
Packit Service 1d0348
    struct XXH_state32_t * state = (struct XXH_state32_t *) state_in;
Packit Service 1d0348
    state->seed = seed;
Packit Service 1d0348
    state->v1 = seed + PRIME32_1 + PRIME32_2;
Packit Service 1d0348
    state->v2 = seed + PRIME32_2;
Packit Service 1d0348
    state->v3 = seed + 0;
Packit Service 1d0348
    state->v4 = seed - PRIME32_1;
Packit Service 1d0348
    state->total_len = 0;
Packit Service 1d0348
    state->memsize = 0;
Packit Service 1d0348
    return XXH_OK;
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static
Packit Service 1d0348
void* XXH32_init (U32 seed)
Packit Service 1d0348
{
Packit Service 1d0348
    void* state = XXH_malloc (sizeof(struct XXH_state32_t));
Packit Service 1d0348
    XXH32_resetState(state, seed);
Packit Service 1d0348
    return state;
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static
Packit Service 1d0348
FORCE_INLINE XXH_errorcode XXH32_update_endian (void* state_in, const void* input, int len, XXH_endianess endian)
Packit Service 1d0348
{
Packit Service 1d0348
    struct XXH_state32_t * state = (struct XXH_state32_t *) state_in;
Packit Service 1d0348
    const BYTE* p = (const BYTE*)input;
Packit Service 1d0348
    const BYTE* const bEnd = p + len;
Packit Service 1d0348
Packit Service 1d0348
#ifdef XXH_ACCEPT_NULL_INPUT_POINTER
Packit Service 1d0348
    if (input==NULL) return XXH_ERROR;
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
    state->total_len += len;
Packit Service 1d0348
Packit Service 1d0348
    if (state->memsize + len < 16)   /* fill in tmp buffer */
Packit Service 1d0348
    {
Packit Service 1d0348
        XXH_memcpy(state->memory + state->memsize, input, len);
Packit Service 1d0348
        state->memsize +=  len;
Packit Service 1d0348
        return XXH_OK;
Packit Service 1d0348
    }
Packit Service 1d0348
Packit Service 1d0348
    if (state->memsize)   /* some data left from previous update */
Packit Service 1d0348
    {
Packit Service 1d0348
        XXH_memcpy(state->memory + state->memsize, input, 16-state->memsize);
Packit Service 1d0348
        {
Packit Service 1d0348
            const U32* p32 = (const U32*)state->memory;
Packit Service 1d0348
            state->v1 += XXH_readLE32(p32, endian) * PRIME32_2; state->v1 = XXH_rotl32(state->v1, 13); state->v1 *= PRIME32_1; p32++;
Packit Service 1d0348
            state->v2 += XXH_readLE32(p32, endian) * PRIME32_2; state->v2 = XXH_rotl32(state->v2, 13); state->v2 *= PRIME32_1; p32++;
Packit Service 1d0348
            state->v3 += XXH_readLE32(p32, endian) * PRIME32_2; state->v3 = XXH_rotl32(state->v3, 13); state->v3 *= PRIME32_1; p32++;
Packit Service 1d0348
            state->v4 += XXH_readLE32(p32, endian) * PRIME32_2; state->v4 = XXH_rotl32(state->v4, 13); state->v4 *= PRIME32_1; p32++;
Packit Service 1d0348
        }
Packit Service 1d0348
        p += 16-state->memsize;
Packit Service 1d0348
        state->memsize = 0;
Packit Service 1d0348
    }
Packit Service 1d0348
Packit Service 1d0348
    if (p <= bEnd-16)
Packit Service 1d0348
    {
Packit Service 1d0348
        const BYTE* const limit = bEnd - 16;
Packit Service 1d0348
        U32 v1 = state->v1;
Packit Service 1d0348
        U32 v2 = state->v2;
Packit Service 1d0348
        U32 v3 = state->v3;
Packit Service 1d0348
        U32 v4 = state->v4;
Packit Service 1d0348
Packit Service 1d0348
        do
Packit Service 1d0348
        {
Packit Service 1d0348
            v1 += XXH_readLE32((const U32*)p, endian) * PRIME32_2; v1 = XXH_rotl32(v1, 13); v1 *= PRIME32_1; p+=4;
Packit Service 1d0348
            v2 += XXH_readLE32((const U32*)p, endian) * PRIME32_2; v2 = XXH_rotl32(v2, 13); v2 *= PRIME32_1; p+=4;
Packit Service 1d0348
            v3 += XXH_readLE32((const U32*)p, endian) * PRIME32_2; v3 = XXH_rotl32(v3, 13); v3 *= PRIME32_1; p+=4;
Packit Service 1d0348
            v4 += XXH_readLE32((const U32*)p, endian) * PRIME32_2; v4 = XXH_rotl32(v4, 13); v4 *= PRIME32_1; p+=4;
Packit Service 1d0348
        } while (p<=limit);
Packit Service 1d0348
Packit Service 1d0348
        state->v1 = v1;
Packit Service 1d0348
        state->v2 = v2;
Packit Service 1d0348
        state->v3 = v3;
Packit Service 1d0348
        state->v4 = v4;
Packit Service 1d0348
    }
Packit Service 1d0348
Packit Service 1d0348
    if (p < bEnd)
Packit Service 1d0348
    {
Packit Service 1d0348
        XXH_memcpy(state->memory, p, bEnd-p);
Packit Service 1d0348
        state->memsize = (int)(bEnd-p);
Packit Service 1d0348
    }
Packit Service 1d0348
Packit Service 1d0348
    return XXH_OK;
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static
Packit Service 1d0348
XXH_errorcode XXH32_update (void* state_in, const void* input, unsigned int len)
Packit Service 1d0348
{
Packit Service 1d0348
    XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;
Packit Service 1d0348
Packit Service 1d0348
    if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
Packit Service 1d0348
        return XXH32_update_endian(state_in, input, len, XXH_littleEndian);
Packit Service 1d0348
    else
Packit Service 1d0348
        return XXH32_update_endian(state_in, input, len, XXH_bigEndian);
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348
static
Packit Service 1d0348
FORCE_INLINE U32 XXH32_intermediateDigest_endian (void* state_in, XXH_endianess endian)
Packit Service 1d0348
{
Packit Service 1d0348
    struct XXH_state32_t * state = (struct XXH_state32_t *) state_in;
Packit Service 1d0348
    const BYTE * p = (const BYTE*)state->memory;
Packit Service 1d0348
    BYTE* bEnd = (BYTE*)state->memory + state->memsize;
Packit Service 1d0348
    U32 h32;
Packit Service 1d0348
Packit Service 1d0348
    if (state->total_len >= 16)
Packit Service 1d0348
    {
Packit Service 1d0348
        h32 = XXH_rotl32(state->v1, 1) + XXH_rotl32(state->v2, 7) + XXH_rotl32(state->v3, 12) + XXH_rotl32(state->v4, 18);
Packit Service 1d0348
    }
Packit Service 1d0348
    else
Packit Service 1d0348
    {
Packit Service 1d0348
        h32  = state->seed + PRIME32_5;
Packit Service 1d0348
    }
Packit Service 1d0348
Packit Service 1d0348
    h32 += (U32) state->total_len;
Packit Service 1d0348
Packit Service 1d0348
    while (p<=bEnd-4)
Packit Service 1d0348
    {
Packit Service 1d0348
        h32 += XXH_readLE32((const U32*)p, endian) * PRIME32_3;
Packit Service 1d0348
        h32  = XXH_rotl32(h32, 17) * PRIME32_4;
Packit Service 1d0348
        p+=4;
Packit Service 1d0348
    }
Packit Service 1d0348
Packit Service 1d0348
    while (p
Packit Service 1d0348
    {
Packit Service 1d0348
        h32 += (*p) * PRIME32_5;
Packit Service 1d0348
        h32 = XXH_rotl32(h32, 11) * PRIME32_1;
Packit Service 1d0348
        p++;
Packit Service 1d0348
    }
Packit Service 1d0348
Packit Service 1d0348
    h32 ^= h32 >> 15;
Packit Service 1d0348
    h32 *= PRIME32_2;
Packit Service 1d0348
    h32 ^= h32 >> 13;
Packit Service 1d0348
    h32 *= PRIME32_3;
Packit Service 1d0348
    h32 ^= h32 >> 16;
Packit Service 1d0348
Packit Service 1d0348
    return h32;
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static
Packit Service 1d0348
U32 XXH32_intermediateDigest (void* state_in)
Packit Service 1d0348
{
Packit Service 1d0348
    XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;
Packit Service 1d0348
Packit Service 1d0348
    if ((endian_detected==XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
Packit Service 1d0348
        return XXH32_intermediateDigest_endian(state_in, XXH_littleEndian);
Packit Service 1d0348
    else
Packit Service 1d0348
        return XXH32_intermediateDigest_endian(state_in, XXH_bigEndian);
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static
Packit Service 1d0348
U32 XXH32_digest (void* state_in)
Packit Service 1d0348
{
Packit Service 1d0348
    U32 h32 = XXH32_intermediateDigest(state_in);
Packit Service 1d0348
Packit Service 1d0348
    XXH_free(state_in);
Packit Service 1d0348
Packit Service 1d0348
    return h32;
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
const
Packit Service 1d0348
struct archive_xxhash __archive_xxhash = {
Packit Service 1d0348
	XXH32,
Packit Service 1d0348
	XXH32_init,
Packit Service 1d0348
	XXH32_update,
Packit Service 1d0348
	XXH32_digest
Packit Service 1d0348
};
Packit Service 1d0348
#else
Packit Service 1d0348
Packit Service 1d0348
/*
Packit Service 1d0348
 * Define an empty version of the struct if we aren't using the LZ4 library.
Packit Service 1d0348
 */
Packit Service 1d0348
const
Packit Service 1d0348
struct archive_xxhash __archive_xxhash = {
Packit Service 1d0348
	NULL,
Packit Service 1d0348
	NULL,
Packit Service 1d0348
	NULL,
Packit Service 1d0348
	NULL
Packit Service 1d0348
};
Packit Service 1d0348
Packit Service 1d0348
#endif /* HAVE_LIBLZ4 */