blob: e0607d07607ff4b0e9d1a23c093dbdc356681791 [file]
// Copyright 2023 The Wuffs Authors.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
//
// SPDX-License-Identifier: Apache-2.0 OR MIT
#include "xxhash.h"
uint32_t global_mimiclib_xxhash32_unused_u32;
uint64_t global_mimiclib_xxhash64_unused_u64;
const char* //
mimic_bench_xxhash32(wuffs_base__io_buffer* dst,
wuffs_base__io_buffer* src,
uint32_t wuffs_initialize_flags,
uint64_t wlimit,
uint64_t rlimit) {
XXH32_state_t* hasher = XXH32_createState();
if (!hasher) {
return "libxxhash: XXH32_createState failed";
} else if (XXH_OK != XXH32_reset(hasher, 0)) {
return "libxxhash: XXH32_reset failed";
}
global_mimiclib_xxhash32_unused_u32 = 0;
while (src->meta.ri < src->meta.wi) {
uint8_t* ptr = src->data.ptr + src->meta.ri;
size_t len = src->meta.wi - src->meta.ri;
if (len > 0x7FFFFFFF) {
return "src length is too large";
} else if (len > rlimit) {
len = rlimit;
}
if (XXH_OK != XXH32_update(hasher, ptr, len)) {
return "libxxhash: XXH32_update failed";
}
src->meta.ri += len;
}
global_mimiclib_xxhash32_unused_u32 = XXH32_digest(hasher);
if (XXH_OK != XXH32_freeState(hasher)) {
return "libxxhash: XXH32_freeState failed";
}
return NULL;
}
const char* //
mimic_bench_xxhash64(wuffs_base__io_buffer* dst,
wuffs_base__io_buffer* src,
uint32_t wuffs_initialize_flags,
uint64_t wlimit,
uint64_t rlimit) {
XXH64_state_t* hasher = XXH64_createState();
if (!hasher) {
return "libxxhash: XXH64_createState failed";
} else if (XXH_OK != XXH64_reset(hasher, 0)) {
return "libxxhash: XXH64_reset failed";
}
global_mimiclib_xxhash64_unused_u64 = 0;
while (src->meta.ri < src->meta.wi) {
uint8_t* ptr = src->data.ptr + src->meta.ri;
size_t len = src->meta.wi - src->meta.ri;
if (len > 0x7FFFFFFF) {
return "src length is too large";
} else if (len > rlimit) {
len = rlimit;
}
if (XXH_OK != XXH64_update(hasher, ptr, len)) {
return "libxxhash: XXH64_update failed";
}
src->meta.ri += len;
}
global_mimiclib_xxhash64_unused_u64 = XXH64_digest(hasher);
if (XXH_OK != XXH64_freeState(hasher)) {
return "libxxhash: XXH64_freeState failed";
}
return NULL;
}
uint32_t //
mimic_xxhash32_one_shot_checksum_u32(wuffs_base__slice_u8 data) {
return XXH32(data.ptr, data.len, 0);
}
uint64_t //
mimic_xxhash64_one_shot_checksum_u64(wuffs_base__slice_u8 data) {
return XXH64(data.ptr, data.len, 0);
}