/** @file
  Module to rewrite stdlib references within Oniguruma
  (C) Copyright 2014-2021 Hewlett Packard Enterprise Development LP
  Copyright (c) 2020, Intel Corporation. All rights reserved.
  Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
  SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include "OnigurumaUefiPort.h"
#define ONIGMEM_HEAD_SIGNATURE  SIGNATURE_32('o','m','h','d')
typedef struct {
  UINT32    Signature;
  UINTN     Size;
} ONIGMEM_HEAD;
#define ONIGMEM_OVERHEAD  sizeof(ONIGMEM_HEAD)
int EFIAPI
sprintf_s (
  char        *str,
  size_t      sizeOfBuffer,
  char const  *fmt,
  ...
  )
{
  VA_LIST  Marker;
  int      NumberOfPrinted;
  VA_START (Marker, fmt);
  NumberOfPrinted = (int)AsciiVSPrint (str, sizeOfBuffer, fmt, Marker);
  VA_END (Marker);
  return NumberOfPrinted;
}
int
OnigStrCmp (
  const char  *Str1,
  const char  *Str2
  )
{
  return (int)AsciiStrCmp (Str1, Str2);
}
int
strlen (
  const char  *str
  )
{
  return strlen_s (str, MAX_STRING_SIZE);
}
void *
malloc (
  size_t  size
  )
{
  ONIGMEM_HEAD  *PoolHdr;
  UINTN         NewSize;
  VOID          *Data;
  NewSize = (UINTN)(size) + ONIGMEM_OVERHEAD;
  Data = AllocatePool (NewSize);
  if (Data != NULL) {
    PoolHdr            = (ONIGMEM_HEAD *)Data;
    PoolHdr->Signature = ONIGMEM_HEAD_SIGNATURE;
    PoolHdr->Size      = size;
    return (VOID *)(PoolHdr + 1);
  }
  return NULL;
}
void *
realloc (
  void    *ptr,
  size_t  size
  )
{
  ONIGMEM_HEAD  *OldPoolHdr;
  ONIGMEM_HEAD  *NewPoolHdr;
  UINTN         OldSize;
  UINTN         NewSize;
  VOID          *Data;
  NewSize = (UINTN)size + ONIGMEM_OVERHEAD;
  Data    = AllocatePool (NewSize);
  if (Data != NULL) {
    NewPoolHdr            = (ONIGMEM_HEAD *)Data;
    NewPoolHdr->Signature = ONIGMEM_HEAD_SIGNATURE;
    NewPoolHdr->Size      = size;
    if (ptr != NULL) {
      OldPoolHdr = (ONIGMEM_HEAD *)ptr - 1;
      ASSERT (OldPoolHdr->Signature == ONIGMEM_HEAD_SIGNATURE);
      OldSize = OldPoolHdr->Size;
      CopyMem ((VOID *)(NewPoolHdr + 1), ptr, MIN (OldSize, size));
      FreePool ((VOID *)OldPoolHdr);
    }
    return (VOID *)(NewPoolHdr + 1);
  }
  return NULL;
}
#if !defined (MDE_CPU_ARM)
void *
memcpy (
  void          *dest,
  const void    *src,
  unsigned int  count
  )
{
  return CopyMem (dest, src, (UINTN)count);
}
#endif
void *
memset (
  void          *dest,
  int           ch,
  unsigned int  count
  )
{
  return SetMem (dest, (UINTN)count, (UINT8)ch);
}
void
free (
  void  *ptr
  )
{
  VOID          *EvalOnce;
  ONIGMEM_HEAD  *PoolHdr;
  EvalOnce = ptr;
  if (EvalOnce == NULL) {
    return;
  }
  PoolHdr = (ONIGMEM_HEAD *)EvalOnce - 1;
  if (PoolHdr->Signature == ONIGMEM_HEAD_SIGNATURE) {
    FreePool (PoolHdr);
  } else {
    FreePool (EvalOnce);
  }
}