// 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 <limits.h>
#include <stdint.h>

#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);
}
