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 /* Round 'v' up to the next 'alignment'-byte aligned boundary. 'alignment' must
29 #define ALIGN(v, alignment) (((v) + ((alignment) - 1)) & ~((alignment) - 1))
31 /* Maximum number of bytes that can be allocated on the stack.
33 * Note: this isn't a hard bound on the stack space used, since this is just for
34 * individual arrays. The full call stack could use more than this. */
35 #define STACK_MAX 32768
37 /* Default size of file I/O buffer. Currently assumed to be <= STACK_MAX. */
38 #define BUFFER_SIZE 32768
45 wimlib_malloc(size_t size) _malloc_attribute;
48 wimlib_free_memory(void *p);
51 wimlib_realloc(void *ptr, size_t size);
54 wimlib_calloc(size_t nmemb, size_t size) _malloc_attribute;
57 wimlib_strdup(const char *str) _malloc_attribute;
61 wimlib_wcsdup(const wchar_t *str) _malloc_attribute;
65 wimlib_aligned_malloc(size_t size, size_t alignment) _malloc_attribute;
68 wimlib_aligned_free(void *ptr);
71 memdup(const void *mem, size_t size) _malloc_attribute;
73 #define MALLOC wimlib_malloc
74 #define FREE wimlib_free_memory
75 #define REALLOC wimlib_realloc
76 #define CALLOC wimlib_calloc
77 #define STRDUP wimlib_strdup
78 #define WCSDUP wimlib_wcsdup
79 #define ALIGNED_MALLOC wimlib_aligned_malloc
80 #define ALIGNED_FREE wimlib_aligned_free
88 mempcpy(void *dst, const void *src, size_t n);
92 randomize_byte_array(u8 *p, size_t n);
95 randomize_char_array_with_alnum(tchar *p, size_t n);
97 /************************
98 * Hashing and comparison
99 ************************/
102 is_power_of_2(unsigned long n)
104 return (n != 0 && (n & (n - 1)) == 0);
111 return n * 0x9e37fffffffc0001ULL;
115 cmp_u32(u32 n1, u32 n2)
125 cmp_u64(u64 n1, u64 n2)
134 /************************
136 ************************/
139 get_available_cpus(void);
142 get_available_memory(void);
144 #endif /* _WIMLIB_UTIL_H */