// Copyright 2022 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "core/fxcrt/fx_memory.h"

#include <stdlib.h>

#include <limits>

#include "build/build_config.h"
#include "core/fxcrt/fx_safe_types.h"

namespace pdfium {
namespace internal {

// Slightly less than 2GB, typically.
constexpr size_t kMallocSizeLimit = std::numeric_limits<int>::max() - (1 << 12);

void* Alloc(size_t num_members, size_t member_size) {
  FX_SAFE_SIZE_T total = member_size;
  total *= num_members;
  if (!total.IsValid() || total.ValueOrDie() >= kMallocSizeLimit)
    return nullptr;
  return malloc(total.ValueOrDie());
}

void* Calloc(size_t num_members, size_t member_size) {
  FX_SAFE_SIZE_T total = member_size;
  total *= num_members;
  if (!total.IsValid() || total.ValueOrDie() >= kMallocSizeLimit)
    return nullptr;
  return calloc(num_members, member_size);
}

void* Realloc(void* ptr, size_t num_members, size_t member_size) {
  FX_SAFE_SIZE_T total = num_members;
  total *= member_size;
  if (!total.IsValid() || total.ValueOrDie() >= kMallocSizeLimit)
    return nullptr;
  return realloc(ptr, total.ValueOrDie());
}

void* StringAlloc(size_t num_members, size_t member_size) {
  FX_SAFE_SIZE_T total = member_size;
  total *= num_members;
  if (!total.IsValid())
    return nullptr;
  return malloc(total.ValueOrDie());
}

}  // namespace internal
}  // namespace pdfium

void FX_InitializeMemoryAllocators() {}

void* FX_ArrayBufferAllocate(size_t length) {
  void* result = calloc(length, 1);
  if (!result)
    FX_OutOfMemoryTerminate(length);
  return result;
}

void* FX_ArrayBufferAllocateUninitialized(size_t length) {
  void* result = malloc(length);
  if (!result)
    FX_OutOfMemoryTerminate(length);
  return result;
}

void FX_ArrayBufferFree(void* data) {
  free(data);
}

void FX_Free(void* ptr) {
  free(ptr);
}
