X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Futil.c;h=08bcb39b70f4037211fa19e88a6b0526144c158f;hp=df3b5c8a67cffa70c0dc26258ba2830950d5bf5f;hb=1a8b4a9f6e24d3ebbd75a86f73955e0f3f5e1785;hpb=e8c3ca2d1d0cac3d64985b45a9f654d2029a7518 diff --git a/src/util.c b/src/util.c index df3b5c8a..08bcb39b 100644 --- a/src/util.c +++ b/src/util.c @@ -145,7 +145,7 @@ wimlib_fprintf(FILE *fp, const tchar *format, ...) #endif /* __WIN32__ */ #ifdef ENABLE_ERROR_MESSAGES -static bool wimlib_print_errors = false; +bool wimlib_print_errors = false; #endif #if defined(ENABLE_ERROR_MESSAGES) || defined(ENABLE_DEBUG) @@ -369,6 +369,8 @@ static const tchar *error_strings[] = { = T("Could not rename a file"), [WIMLIB_ERR_REPARSE_POINT_FIXUP_FAILED] = T("Unable to complete reparse point fixup"), + [WIMLIB_ERR_RESOURCE_NOT_FOUND] + = T("A file resource needed to complete the operation was missing from the WIM"), [WIMLIB_ERR_RESOURCE_ORDER] = T("The components of the WIM were arranged in an unexpected order"), [WIMLIB_ERR_SPECIAL_FILE] @@ -389,6 +391,8 @@ static const tchar *error_strings[] = { = T("The requested operation is unsupported"), [WIMLIB_ERR_VOLUME_LACKS_FEATURES] = T("The volume did not support a feature necessary to complete the operation"), + [WIMLIB_ERR_WIM_IS_READONLY] + = T("The WIM is read-only (file permissions, header flag, or split WIM)"), [WIMLIB_ERR_WRITE] = T("Failed to write data to a file"), [WIMLIB_ERR_XML] @@ -407,9 +411,33 @@ 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) @@ -417,7 +445,7 @@ wimlib_calloc(size_t nmemb, size_t size) size_t total_size = nmemb * size; void *p = MALLOC(total_size); if (p) - memset(p, 0, total_size); + p = memset(p, 0, total_size); return p; } @@ -430,7 +458,7 @@ wimlib_strdup(const char *str) size = strlen(str); p = MALLOC(size + 1); if (p) - memcpy(p, str, size + 1); + p = memcpy(p, str, size + 1); return p; } @@ -444,13 +472,22 @@ wimlib_wcsdup(const wchar_t *str) size = wcslen(str); p = MALLOC((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 *),