X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Futil.c;h=3b45ce6fa26626e8d9690151a1ee92f879d613c5;hb=efdb571bf22033727f0d15bb161614686e5bcf66;hp=fceae14b026b4aa196547dc0f815dad22622f668;hpb=11b4f88edd142c41c7d09384081157d9830ee437;p=wimlib diff --git a/src/util.c b/src/util.c index fceae14b..3b45ce6f 100644 --- a/src/util.c +++ b/src/util.c @@ -37,6 +37,7 @@ #endif #include "wimlib.h" +#include "wimlib/assert.h" #include "wimlib/compiler.h" #include "wimlib/encoding.h" #include "wimlib/error.h" @@ -65,6 +66,8 @@ utf16le_strlen(const utf16lechar *s) #ifdef ENABLE_ERROR_MESSAGES bool wimlib_print_errors = false; +FILE *wimlib_error_file = NULL; /* Set in wimlib_global_init() */ +static bool wimlib_owns_error_file = false; #endif #if defined(ENABLE_ERROR_MESSAGES) || defined(ENABLE_DEBUG) @@ -78,8 +81,8 @@ wimlib_vmsg(const tchar *tag, const tchar *format, { int errno_save = errno; fflush(stdout); - tfputs(tag, stderr); - tvfprintf(stderr, format, va); + tfputs(tag, wimlib_error_file); + tvfprintf(wimlib_error_file, format, va); if (perror && errno_save != 0) { tchar buf[64]; int res; @@ -93,10 +96,10 @@ wimlib_vmsg(const tchar *tag, const tchar *format, if (errno_save == EBUSY) tstrcpy(buf, T("Resource busy")); #endif - tfprintf(stderr, T(": %"TS), buf); + tfprintf(wimlib_error_file, T(": %"TS), buf); } - tputc(T('\n'), stderr); - fflush(stderr); + tputc(T('\n'), wimlib_error_file); + fflush(wimlib_error_file); errno = errno_save; } } @@ -186,6 +189,38 @@ wimlib_set_print_errors(bool show_error_messages) #endif } +WIMLIBAPI int +wimlib_set_error_file(FILE *fp) +{ +#ifdef ENABLE_ERROR_MESSAGES + if (wimlib_owns_error_file) + fclose(wimlib_error_file); + wimlib_error_file = fp; + wimlib_print_errors = (fp != NULL); + wimlib_owns_error_file = false; + return 0; +#else + return WIMLIB_ERR_UNSUPPORTED; +#endif +} + +WIMLIBAPI int +wimlib_set_error_file_by_name(const tchar *path) +{ +#ifdef ENABLE_ERROR_MESSAGES + FILE *fp; + + fp = tfopen(path, "a"); + if (!fp) + return WIMLIB_ERR_OPEN; + wimlib_set_error_file(fp); + wimlib_owns_error_file = true; + return 0; +#else + return WIMLIB_ERR_UNSUPPORTED; +#endif +} + static const tchar *error_strings[] = { [WIMLIB_ERR_SUCCESS] = T("Success"), @@ -432,6 +467,36 @@ wimlib_wcsdup(const wchar_t *str) } #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) {