File indexing completed on 2025-02-02 04:25:58
0001 /* Copyright 2015 the unarr project authors (see AUTHORS file). 0002 License: LGPLv3 */ 0003 0004 #include <stdlib.h> 0005 #include <stdint.h> 0006 #include <string.h> 0007 0008 typedef void *(* custom_malloc_fn)(void *opaque, size_t size); 0009 typedef void (* custom_free_fn)(void *opaque, void *ptr); 0010 0011 static void *default_malloc(void *opaque, size_t size) { (void)opaque; return malloc(size); } 0012 static void default_free(void *opaque, void *ptr) { (void)opaque; free(ptr); } 0013 0014 static struct { 0015 custom_malloc_fn malloc; 0016 custom_free_fn free; 0017 void *opaque; 0018 } gAllocator = { 0019 default_malloc, 0020 default_free, 0021 NULL, 0022 }; 0023 0024 void *ar_malloc(size_t size) 0025 { 0026 return gAllocator.malloc(gAllocator.opaque, size); 0027 } 0028 0029 void *ar_calloc(size_t count, size_t size) 0030 { 0031 void *ptr = NULL; 0032 if (size <= SIZE_MAX / count) 0033 ptr = ar_malloc(count * size); 0034 if (ptr) 0035 memset(ptr, 0, count * size); 0036 return ptr; 0037 } 0038 0039 void ar_free(void *ptr) 0040 { 0041 gAllocator.free(gAllocator.opaque, ptr); 0042 } 0043 0044 void ar_set_custom_allocator(custom_malloc_fn custom_malloc, custom_free_fn custom_free, void *opaque) 0045 { 0046 gAllocator.malloc = custom_malloc ? custom_malloc : default_malloc; 0047 gAllocator.free = custom_free ? custom_free : default_free; 0048 gAllocator.opaque = opaque; 0049 }