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 }