]> wimlib.net Git - wimlib/blobdiff - src/util.c
util.c: for aligned_malloc, store original pointer directly
[wimlib] / src / util.c
index 20f04388156243d4c25072fe7a13280e85e128f6..e0c5cc1bbc94ec0421bfd6184ee4834495c6f1e0 100644 (file)
@@ -91,46 +91,27 @@ wimlib_calloc(size_t nmemb, size_t size)
 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;
 }
@@ -139,7 +120,7 @@ void
 wimlib_aligned_free(void *ptr)
 {
        if (ptr)
-               FREE((char *)ptr - *((size_t *)ptr - 1));
+               FREE(((void **)ptr)[-1]);
 }
 
 void *