/* libmisc/heap.c - Heap memory allocator * * Copyright (C) 2025 Luke T. Shumaker * SPDX-License-Identifier: AGPL-3.0-or-later */ #include /* for uintptr_t */ #include /* for memset(), memcpy(), strlen() */ #include #include #include void *_heap_aligned_realloc(void *ptr, size_t align, size_t objcnt, size_t objsize) { if (align < sizeof(void*)) align = sizeof(void*); size_t size; if (__builtin_mul_overflow(objcnt, objsize, &size)) assert_notreached("heap multiplication overflow"); void *base = __lm_heap_aligned_realloc(ptr, align, size); assert(base); assert((uintptr_t)base % align == 0); return base; } void heap_free(void *ptr) { if (ptr) __lm_heap_free(ptr); } void heap_take(void *ptr) { if (ptr) __lm_heap_take(ptr); } char *heap_strdup(const char *str) { assert(str); size_t len = strlen(str)+1; char *ret = heap_alloc(len, char); memcpy(ret, str, len); return ret; }