AuROXTL/Include/auROXTL/auMemoryUtils.hpp

111 lines
2.2 KiB
C++

/***
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
File: auMemoryUtils.hpp
Date: 2022-2-1
File: AuroraUtils.hpp
File: auROXTLUtils.hpp
Date: 2021-6-9
Author: Reece
***/
#pragma once
#if !defined(AURORA_RUNTIME_MEMCMP)
#define AURORA_RUNTIME_MEMCMP std::memcmp
#endif
#if defined(AURORA_RUNTIME_MEMCMP_) && AURORA_RUNTIME_MEMCMP_ == 1
#define AuMemcmp AURORA_RUNTIME_MEMCMP
#else
static auline int AuMemcmp(const void *dest, const void *src, size_t n)
{
return AURORA_RUNTIME_MEMCMP(dest, src, n);
}
#endif
#if !defined(AURORA_RUNTIME_MEMSET)
#define AURORA_RUNTIME_MEMSET std::memset
#endif
#if defined(AURORA_RUNTIME_MEMSET_) && AURORA_RUNTIME_MEMSET_ == 1
#define AuMemset AURORA_RUNTIME_MEMSET
#else
static auline void *AuMemset(void *dest, AuUInt8 c, size_t n)
{
return AURORA_RUNTIME_MEMSET(dest, c, n);
}
#endif
#if !defined(AURORA_RUNTIME_MEMCPY)
#define AURORA_RUNTIME_MEMCPY std::memcpy
#endif
#if defined(AURORA_RUNTIME_MEMCPY_) && AURORA_RUNTIME_MEMCPY_ == 1
#define AuMemcpy AURORA_RUNTIME_MEMCPY
#else
static auline void *AuMemcpy(void *dest, const void *src, size_t n)
{
return AURORA_RUNTIME_MEMCPY(dest, src, n);
}
#endif
#if !defined(AURORA_RUNTIME_MEMMOVE)
#define AURORA_RUNTIME_MEMMOVE std::memmove
#endif
static auline void *AuMemmove(void *dest, const void *src, size_t n)
{
return AURORA_RUNTIME_MEMMOVE(dest, src, n);
}
static auline void *AuMemmem(const void *haystack, size_t haystackLen,
const void *const needle, const size_t needleLen)
{
#if defined(AURORA_IS_LINUX_DERIVED)
return ::memmem(haystack, haystackLen, needle, needleLen);
#else
if (!haystack)
{
return {};
}
if (!haystackLen)
{
return {};
}
if (!needle)
{
return {};
}
if (!needleLen)
{
return {};
}
for (const char *h = (const char *)haystack;
haystackLen >= needleLen;
++h, --haystackLen)
{
if (!AuMemcmp(h, needle, needleLen))
{
return (void *)h;
}
}
return {};
#endif
}