]> wimlib.net Git - wimlib/blobdiff - src/util.c
Add memdup() function
[wimlib] / src / util.c
index df3b5c8a67cffa70c0dc26258ba2830950d5bf5f..a0ed84d95014760cff7f0b95618c1fcb78c1d943 100644 (file)
@@ -407,17 +407,41 @@ wimlib_get_error_string(enum wimlib_error_code code)
 
 
 #ifdef ENABLE_CUSTOM_MEMORY_ALLOCATOR
-void *(*wimlib_malloc_func) (size_t)        = malloc;
-void  (*wimlib_free_func)   (void *)        = free;
-void *(*wimlib_realloc_func)(void *, size_t) = realloc;
+static void *(*wimlib_malloc_func) (size_t)         = malloc;
+static void  (*wimlib_free_func)   (void *)         = free;
+static void *(*wimlib_realloc_func)(void *, size_t) = realloc;
+
+void *
+wimlib_malloc(size_t size)
+{
+       void *ptr = (*wimlib_malloc_func)(size);
+       if (ptr == NULL && size != 0)
+               ERROR("memory exhausted");
+       return ptr;
+}
+
+void
+wimlib_free_memory(void *ptr)
+{
+       (*wimlib_free_func)(ptr);
+}
+
+void *
+wimlib_realloc(void *ptr, size_t size)
+{
+       ptr = (*wimlib_realloc_func)(ptr, size);
+       if (ptr == NULL && size != 0)
+               ERROR("memory exhausted");
+       return ptr;
+}
 
 void *
 wimlib_calloc(size_t nmemb, size_t size)
 {
        size_t total_size = nmemb * size;
-       void *p = MALLOC(total_size);
+       void *p = (*wimlib_malloc_func)(total_size);
        if (p)
-               memset(p, 0, total_size);
+               p = memset(p, 0, total_size);
        return p;
 }
 
@@ -428,7 +452,7 @@ wimlib_strdup(const char *str)
        char *p;
 
        size = strlen(str);
-       p = MALLOC(size + 1);
+       p = (*wimlib_malloc_func)(size + 1);
        if (p)
                memcpy(p, str, size + 1);
        return p;
@@ -442,15 +466,24 @@ wimlib_wcsdup(const wchar_t *str)
        wchar_t *p;
 
        size = wcslen(str);
-       p = MALLOC((size + 1) * sizeof(wchar_t));
+       p = (*wimlib_malloc_func)((size + 1) * sizeof(wchar_t));
        if (p)
-               memcpy(p, str, (size + 1) * sizeof(wchar_t));
+               p = wmemcpy(p, str, size + 1);
        return p;
 }
 #endif
 
 #endif /* ENABLE_CUSTOM_MEMORY_ALLOCATOR */
 
+void *
+memdup(const void *mem, size_t size)
+{
+       void *ptr = MALLOC(size);
+       if (ptr)
+               ptr = memcpy(ptr, mem, size);
+       return ptr;
+}
+
 WIMLIBAPI int
 wimlib_set_memory_allocator(void *(*malloc_func)(size_t),
                            void (*free_func)(void *),