/** @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);
}
}