/*** 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 AU_OPTIMIZED 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 AU_OPTIMIZED 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 AU_OPTIMIZED 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 AU_OPTIMIZED void *AuMemmove(void *dest, const void *src, size_t n) { return AURORA_RUNTIME_MEMMOVE(dest, src, n); } AU_OPTIMIZED 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 }