#include <stdlib.h>
#include <string.h>
#ifdef HAVE_SYS_SYSCTL_H
+# include <sys/types.h>
# include <sys/sysctl.h>
#endif
#include <unistd.h>
char *
wimlib_strdup(const char *str)
{
- size_t size;
- char *p;
-
- size = strlen(str);
- p = MALLOC(size + 1);
- if (p)
- p = memcpy(p, str, size + 1);
- return p;
+ return memdup(str, strlen(str) + 1);
}
#ifdef __WIN32__
wchar_t *
wimlib_wcsdup(const wchar_t *str)
{
- size_t size;
- wchar_t *p;
-
- size = wcslen(str);
- p = MALLOC((size + 1) * sizeof(wchar_t));
- if (p)
- p = wmemcpy(p, str, size + 1);
- return p;
+ return memdup(str, (wcslen(str) + 1) * sizeof(wchar_t));
}
#endif
void *
wimlib_aligned_malloc(size_t size, size_t alignment)
{
- wimlib_assert(alignment != 0 && is_power_of_2(alignment) &&
- alignment <= 4096);
-
- const uintptr_t mask = alignment - 1;
- char *ptr = NULL;
- char *raw_ptr;
+ wimlib_assert(is_power_of_2(alignment));
- raw_ptr = MALLOC(mask + sizeof(size_t) + size);
- if (raw_ptr) {
- ptr = (char *)raw_ptr + sizeof(size_t);
- ptr = (void *)(((uintptr_t)ptr + mask) & ~mask);
- *((size_t *)ptr - 1) = ptr - raw_ptr;
+ void *ptr = MALLOC(sizeof(void *) + alignment - 1 + size);
+ if (ptr) {
+ void *orig_ptr = ptr;
+ ptr = (void *)ALIGN((uintptr_t)ptr + sizeof(void *), alignment);
+ ((void **)ptr)[-1] = orig_ptr;
}
return ptr;
}
wimlib_aligned_free(void *ptr)
{
if (ptr)
- FREE((char *)ptr - *((size_t *)ptr - 1));
+ FREE(((void **)ptr)[-1]);
}
void *