/* Copyright (C) 2015-2020, Dirk Krause SPDX-License-Identifier: BSD-3-Clause */ /* WARNING: This file was generated by the dkct program (see http://dktools.sourceforge.net/ for details). Changes you make here will be lost if dkct is run again! You should modify the original source and run dkct on it. Original source: dk4mem.ctr */ /** @file dk4mem.c The dk4mem module. */ #line 895 "dk4mem.ctr" #include "dk4conf.h" #if DK4_ON_WINDOWS && (DK4_WIN_AVOID_CRT || DK4_WIN_DENY_CRT) #ifndef WINDOWS_H_INCLUDED #include #define WINDOWS_H_INCLUDED 1 #endif #endif #include "dk4types.h" #if DK4_HAVE_STRING_H #ifndef STRING_H_INCLUDED #include #define STRING_H_INCLUDED 1 #endif #endif #if DK4_HAVE_STRINGS_H #ifndef STRINGS_H_INCLUDED #include #define STRINGS_H_INCLUDED 1 #endif #endif #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif #include "dk4mem.h" #include "dk4numco.h" #line 932 "dk4mem.ctr" #if ((!(DK4_ON_WINDOWS)) && (!(DK4_HAVE_MEMSET)) && (!(DK4_HAVE_BZERO))) static void dk4mem_fallback_i_reset(unsigned char *bptr, size_t sz) { while (0 < sz--) { *(bptr++) = '\0'; } } void dk4mem_fallback_reset(void *bptr, size_t sz) { #if DK4_USE_ASSERT assert(NULL != bptr); assert(0 < sz); #endif dk4mem_fallback_i_reset((unsigned char *)bptr, sz); } #endif void dk4mem_reset(void *bptr, size_t sz, dk4_er_t *erp) { #line 963 "dk4mem.ctr" #if DK4_USE_ASSERT assert(NULL != bptr); assert(0 < sz); #endif if ((NULL != bptr) && (0 < sz)) { DK4_MEMRES(bptr, sz); } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } #line 973 "dk4mem.ctr" } void dk4mem_set(void *bptr, size_t sz, unsigned char uc, dk4_er_t *erp) { #if DK4_HAVE_MEMSET \ && (!(DK4_ON_WINDOWS && (DK4_WIN_AVOID_CRT || DK4_WIN_AVOID_CRT))) #if DK4_USE_ASSERT assert(NULL != bptr); assert(0 < sz); #endif if ((NULL != bptr) && (0 < sz)) { memset(bptr, (int)uc, sz); } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } #else unsigned char *ucptr; #if DK4_USE_ASSERT assert(NULL != bptr); assert(0 < sz); #endif if ((NULL != bptr) && (0 < sz)) { ucptr = (unsigned char *)bptr; while (0 < sz--) { *(ucptr++) = uc; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } #endif } #if ((!(DK4_ON_WINDOWS)) && (!(DK4_HAVE_MEMCPY)) && (!(DK4_HAVE_BCOPY))) static void dk4mem_fallback_i_cpy(unsigned char *dst, const unsigned char *src, size_t sz) { while(0 < sz--) { *(dst++) = *(src++); } } void dk4mem_fallback_cpy(void *dst, const void *src, size_t sz) { #if DK4_USE_ASSERT assert(NULL != dst); assert(NULL != src); assert(0 < sz); #endif dk4mem_fallback_i_cpy( (unsigned char *)dst, (const unsigned char *)src, sz ); } #endif void dk4mem_cpy(void *dst, void const *src, size_t sz, dk4_er_t *erp) { #if DK4_USE_ASSERT assert(NULL != dst); assert(NULL != src); assert(0 < sz); #endif if ((NULL != dst) && (NULL != src) && (0 < sz)) { DK4_MEMCPY(dst, src, sz); } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } } #if (DK4_ON_WINDOWS && (DK4_WIN_AVOID_CRT || DK4_WIN_DENY_CRT)) \ || ((!(DK4_ON_WINDOWS)) && (!(DK4_HAVE_MEMCMP)) && (!(DK4_HAVE_BCMP))) static int dk4mem_fallback_i_cmp( const unsigned char *s1, const unsigned char *s2, size_t sz ) { int back = 0; while ((0 < sz--) && (0 == back)) { if (*s1 > *s2) { back = 1; } else { if (*s1 < *s2) { back = -1; } } s1++; s2++; } return back; } int dk4mem_fallback_cmp(const void *s1, const void *s2, size_t sz) { #if DK4_USE_ASSERT assert(NULL != s1); assert(NULL != s2); assert(0 < sz); #endif return( dk4mem_fallback_i_cmp( (const unsigned char *)s1, (const unsigned char *)s2, sz ) ); } #endif int dk4mem_cmp(const void *s1, const void *s2, size_t sz, dk4_er_t *erp) { int back = 0; #if DK4_USE_ASSERT assert(NULL != s1); assert(NULL != s2); assert(0 < sz); #endif if ((NULL != s1) && (NULL != s2) && (0 < sz)) { back = DK4_MEMCMP(s1, s2, sz); } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; } #if (DK4_ON_WINDOWS) || (DK4_HAVE_MALLOC && DK4_HAVE_FREE) void * dk4mem_malloc_bytes(size_t bytes, dk4_er_t *erp) { void *back = NULL; /* Function result. */ #if DK4_USE_ASSERT assert(0 < bytes); #endif if (0 < bytes) { #if DK4_ON_WINDOWS /* +++ Windows */ #if DK4_WIN_AVOID_CRT || DK4_WIN_DENY_CRT if ((dk4_um_t)bytes <= (dk4_um_t)0xFFFFFFFFUL) { #if DK4_USE_WINDOWS_LOCAL_ALLOC back = (void*)LocalAlloc(LMEM_FIXED, (DWORD)bytes); #else back = (void*)GlobalAlloc(GMEM_FIXED, (DWORD)bytes); #endif if (NULL == back) { dk4error_set_elsize_nelem(erp,DK4_E_MEMORY_ALLOCATION_FAILED,1,bytes); } } else { dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); } #else back = malloc(bytes); if (NULL == back) { dk4error_set_elsize_nelem(erp, DK4_E_MEMORY_ALLOCATION_FAILED, 1, bytes); } #endif /* --- Windows */ #else /* +++ non-Windows */ back = malloc(bytes); if (NULL == back) { dk4error_set_elsize_nelem(erp, DK4_E_MEMORY_ALLOCATION_FAILED, 1, bytes); } /* --- non-Windows */ #endif } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; } void * dk4mem_malloc(size_t elsize, size_t nelem, dk4_er_t *erp) { void *back = NULL; size_t bytes; #if DK4_USE_ASSERT assert(0 < elsize); assert(0 < nelem); assert((SIZE_MAX / elsize) >= nelem); #endif if ((0 < elsize) && (0 < nelem)) { if ((SIZE_MAX / elsize) >= nelem) { bytes = elsize * nelem; back = dk4mem_malloc_bytes(bytes, erp); } else { dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; } void * dk4mem_calloc(size_t elsize, size_t nelem, dk4_er_t *erp) { void *back = NULL; #if DK4_USE_ASSERT assert(0 < elsize); assert(0 < nelem); assert((SIZE_MAX / elsize) >= nelem); #endif if ((0 < elsize) && (0 < nelem)) { if ((SIZE_MAX / elsize) >= nelem) { #if DK4_ON_WINDOWS /* +++ Windows */ #if DK4_WIN_AVOID_CRT || DK4_WIN_DENY_CRT size_t bytes; bytes = elsize * nelem; if ((dk4_um_t)bytes <= (dk4_um_t)0xFFFFFFFFUL) { #if DK4_USE_WINDOWS_LOCAL_ALLOC back = (void *)LocalAlloc((LMEM_FIXED | LMEM_ZEROINIT), (DWORD)bytes); #else back = (void *)GlobalAlloc((GMEM_FIXED | GMEM_ZEROINIT), (DWORD)bytes); #endif if (NULL == back) { dk4error_set_elsize_nelem( erp, DK4_E_MEMORY_ALLOCATION_FAILED, elsize, nelem ); } } else { dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); } #else back = calloc(nelem, elsize); if (NULL == back) { dk4error_set_elsize_nelem( erp, DK4_E_MEMORY_ALLOCATION_FAILED, elsize, nelem ); } #endif /* --- Windows */ #else /* +++ non-Windows */ #if DK4_HAVE_CALLOC back = calloc(nelem, elsize); if (NULL == back) { dk4error_set_elsize_nelem( erp, DK4_E_MEMORY_ALLOCATION_FAILED, elsize, nelem ); } #else size_t bytes; bytes = elsize * nelem; back = malloc(bytes); if (NULL != back) { dk4mem_reset(back, bytes); } else { dk4error_set_elsize_nelem( erp, DK4_E_MEMORY_ALLOCATION_FAILED, elsize, nelem ); } #endif /* --- non-Windows */ #endif } else { dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; } void dk4mem_free(void *ptr) { #if DK4_USE_ASSERT assert(NULL != ptr); #endif if (NULL != ptr) { #if DK4_ON_WINDOWS /* +++ Windows */ #if DK4_WIN_AVOID_CRT || DK4_WIN_DENY_CRT #if DK4_USE_WINDOWS_LOCAL_ALLOC LocalFree((HLOCAL)ptr); #else GlobalFree((HLOCAL)ptr); #endif #else free(ptr); #endif /* --- Windows */ #else /* +++ non-Windows */ free(ptr); /* --- non-Windows */ #endif } } #endif /* if defined(_WIN32) ... */