2 * util.h - utility functions and macros
7 #include "wimlib/compiler.h"
8 #include "wimlib/types.h"
14 /* Cast a pointer to a struct member to a pointer to the containing struct. */
15 #define container_of(ptr, type, member) \
16 ((type *)((char *)(ptr) - offsetof(type, member)))
18 /* Calculate 'n / d', but round up instead of down. */
19 #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
21 /* Calculate 'n % d', but return 'd' if the result would be 0. */
22 #define MODULO_NONZERO(n, d) (((n) % (d)) ? ((n) % (d)) : (d))
24 /* Get the number of elements of an array type. */
25 #define ARRAY_LEN(array) (sizeof(array) / sizeof((array)[0]))
27 /* Maximum number of bytes that can be allocated on the stack.
29 * Note: this isn't a hard bound on the stack space used, since this is just for
30 * individual arrays. The full call stack could use more than this. */
31 #define STACK_MAX 32768
33 /* Default size of file I/O buffer. Currently assumed to be <= STACK_MAX. */
34 #define BUFFER_SIZE 32768
41 wimlib_malloc(size_t size) _malloc_attribute;
44 wimlib_free_memory(void *p);
47 wimlib_realloc(void *ptr, size_t size);
50 wimlib_calloc(size_t nmemb, size_t size) _malloc_attribute;
53 wimlib_strdup(const char *str) _malloc_attribute;
57 wimlib_wcsdup(const wchar_t *str) _malloc_attribute;
61 wimlib_aligned_malloc(size_t size, size_t alignment) _malloc_attribute;
64 wimlib_aligned_free(void *ptr);
67 memdup(const void *mem, size_t size) _malloc_attribute;
69 #define MALLOC wimlib_malloc
70 #define FREE wimlib_free_memory
71 #define REALLOC wimlib_realloc
72 #define CALLOC wimlib_calloc
73 #define STRDUP wimlib_strdup
74 #define WCSDUP wimlib_wcsdup
75 #define ALIGNED_MALLOC wimlib_aligned_malloc
76 #define ALIGNED_FREE wimlib_aligned_free
84 mempcpy(void *dst, const void *src, size_t n);
88 randomize_byte_array(u8 *p, size_t n);
91 randomize_char_array_with_alnum(tchar *p, size_t n);
93 /************************
94 * Hashing and comparison
95 ************************/
98 is_power_of_2(unsigned long n)
100 return (n != 0 && (n & (n - 1)) == 0);
107 return n * 0x9e37fffffffc0001ULL;
111 cmp_u64(u64 n1, u64 n2)
120 #endif /* _WIMLIB_UTIL_H */