#endif
#include "wimlib.h"
+#include "wimlib/assert.h"
#include "wimlib/compiler.h"
#include "wimlib/encoding.h"
#include "wimlib/error.h"
}
#endif
+void *
+wimlib_aligned_malloc(size_t size, size_t alignment)
+{
+ u8 *raw_ptr;
+ u8 *ptr;
+ uintptr_t mask;
+
+ wimlib_assert(alignment != 0 && is_power_of_2(alignment) &&
+ alignment <= 4096);
+ mask = alignment - 1;
+
+ raw_ptr = MALLOC(size + alignment - 1 + sizeof(size_t));
+ if (!raw_ptr)
+ return NULL;
+
+ ptr = (u8 *)raw_ptr + sizeof(size_t);
+ while ((uintptr_t)ptr & mask)
+ ptr++;
+ *((size_t *)ptr - 1) = (ptr - raw_ptr);
+
+ return ptr;
+}
+
+void
+wimlib_aligned_free(void *ptr)
+{
+ if (ptr)
+ FREE((u8 *)ptr - *((size_t *)ptr - 1));
+}
+
void *
memdup(const void *mem, size_t size)
{