X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Futil.c;h=e0c5cc1bbc94ec0421bfd6184ee4834495c6f1e0;hp=f22d451e6e8f4b4fd08c5a023dbaecb90ea62017;hb=26d5d280ea5394a573add55e1e22cb56a1515c4c;hpb=f0b5b16920d4478d053e48db08014e5d57f11263 diff --git a/src/util.c b/src/util.c index f22d451e..e0c5cc1b 100644 --- a/src/util.c +++ b/src/util.c @@ -28,6 +28,7 @@ #include #include #ifdef HAVE_SYS_SYSCTL_H +# include # include #endif #include @@ -90,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; } @@ -138,7 +120,7 @@ void wimlib_aligned_free(void *ptr) { if (ptr) - FREE((char *)ptr - *((size_t *)ptr - 1)); + FREE(((void **)ptr)[-1]); } void *