/* See LICENSE file for copyright and license details. */ #include "libsimple.h" static inline size_t alloc_size_product(size_t n, va_list ap) { size_t prod = n; if (!n) { errno = EINVAL; return 0; } for (;;) { n = va_arg(ap, size_t); if (!n) break; if (n >= SIZE_MAX / prod) { errno = ENOMEM; return 0; } prod *= n; } return prod; } void * libsimple_vmalloczn(int clear, size_t n, va_list ap) { n = alloc_size_product(n, ap); return !n ? NULL : clear ? calloc(1, n) : malloc(n); } void * libsimple_vreallocn(void *ptr, size_t n, va_list ap) { n = alloc_size_product(n, ap); return !n ? NULL : realloc(ptr, n); }