#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
-#ifdef ENABLE_CUSTOM_MEMORY_ALLOCATOR
-extern void *(*wimlib_malloc_func)(size_t);
-extern void (*wimlib_free_func)(void *);
-extern void *(*wimlib_realloc_func)(void *, size_t);
-extern void *wimlib_calloc(size_t nmemb, size_t size);
+/* Maximum number of array elements to allocate on the stack (used in various
+ * places when large temporary buffers are needed). */
+#define STACK_MAX 32768
+
+extern void *
+wimlib_malloc(size_t) _malloc_attribute;
+
+extern void
+wimlib_free_memory(void *p);
+
+extern void *
+wimlib_realloc(void *, size_t) _warn_unused_result_attribute;
+
+extern void *
+wimlib_calloc(size_t nmemb, size_t size) _malloc_attribute;
+
#ifdef __WIN32__
-extern wchar_t *wimlib_wcsdup(const wchar_t *str);
-#endif
-extern char *wimlib_strdup(const char *str);
-# define MALLOC wimlib_malloc_func
-# define FREE wimlib_free_func
-# define REALLOC wimlib_realloc_func
-# define CALLOC wimlib_calloc
-# define STRDUP wimlib_strdup
-# define WSTRDUP wimlib_wcsdup
-#else /* ENABLE_CUSTOM_MEMORY_ALLOCATOR */
-# include <stdlib.h>
-# include <string.h>
-# define MALLOC malloc
-# define FREE free
-# define REALLOC realloc
-# define CALLOC calloc
-# define STRDUP strdup
-# define WSTRDUP wcsdup
-#endif /* !ENABLE_CUSTOM_MEMORY_ALLOCATOR */
+extern wchar_t *
+wimlib_wcsdup(const wchar_t *str) _malloc_attribute;
+#endif
+extern char *
+wimlib_strdup(const char *str) _malloc_attribute;
+
+#define MALLOC wimlib_malloc
+#define FREE wimlib_free_memory
+#define REALLOC wimlib_realloc
+#define CALLOC wimlib_calloc
+#define STRDUP wimlib_strdup
+#define WCSDUP wimlib_wcsdup
+
+extern void *
+memdup(const void *mem, size_t size) _malloc_attribute;
+
+#ifndef HAVE_MEMPCPY
+extern void *
+mempcpy(void *dst, const void *src, size_t n);
+#endif
/* util.c */
extern void
#endif
}
+static inline bool
+is_power_of_2(unsigned long n)
+{
+ return (n != 0 && (n & (n - 1)) == 0);
+
+}
+
static inline u64
hash_u64(u64 n)
{
return n * 0x9e37fffffffc0001ULL;
}
+static inline int
+cmp_u64(u64 n1, u64 n2)
+{
+ if (n1 < n2)
+ return -1;
+ else if (n1 > n2)
+ return 1;
+ else
+ return 0;
+}
+
+/* is_any_path_separator() - characters treated as path separators in WIM path
+ * specifications and capture configuration files (the former will be translated
+ * to WIM_PATH_SEPARATOR; the latter will be translated to
+ * OS_PREFERRED_PATH_SEPARATOR)
+ *
+ * OS_PREFERRED_PATH_SEPARATOR - preferred (or only) path separator on the
+ * operating system. Used when constructing filesystem paths to extract or
+ * archive.
+ *
+ * WIM_PATH_SEPARATOR - character treated as path separator for WIM paths.
+ * Currently needs to be '/' on UNIX for the WIM mounting code to work properly.
+ */
+
+#ifdef __WIN32__
+# define OS_PREFERRED_PATH_SEPARATOR L'\\'
+# define is_any_path_separator(c) ((c) == L'/' || (c) == L'\\')
+#else
+# define OS_PREFERRED_PATH_SEPARATOR '/'
+# define is_any_path_separator(c) ((c) == '/' || (c) == '\\')
+#endif
+
+#define WIM_PATH_SEPARATOR WIMLIB_WIM_PATH_SEPARATOR
+
#endif /* _WIMLIB_UTIL_H */