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 #undef ALIGN /* NetBSD <sys/param.h> defines this already */
30 #define ALIGN(v, alignment) (((v) + ((alignment) - 1)) & ~((alignment) - 1))
32 /* Maximum number of bytes that can be allocated on the stack.
34 * Note: this isn't a hard bound on the stack space used, since this is just for
35 * individual arrays. The full call stack could use more than this. */
36 #define STACK_MAX 32768
38 /* Default size of file I/O buffer. Currently assumed to be <= STACK_MAX. */
39 #define BUFFER_SIZE 32768
46 wimlib_malloc(size_t size);
49 wimlib_free_memory(void *p);
52 wimlib_realloc(void *ptr, size_t size);
55 wimlib_calloc(size_t nmemb, size_t size);
58 wimlib_strdup(const char *str);
62 wimlib_wcsdup(const wchar_t *str);
66 wimlib_aligned_malloc(size_t size, size_t alignment);
69 wimlib_aligned_free(void *ptr);
72 memdup(const void *mem, size_t size);
74 #define MALLOC wimlib_malloc
75 #define FREE wimlib_free_memory
76 #define REALLOC wimlib_realloc
77 #define CALLOC wimlib_calloc
78 #define STRDUP wimlib_strdup
79 #define WCSDUP wimlib_wcsdup
80 #define ALIGNED_MALLOC wimlib_aligned_malloc
81 #define ALIGNED_FREE wimlib_aligned_free
89 mempcpy(void *dst, const void *src, size_t n);
92 /**************************
93 * Random number generation
94 **************************/
97 get_random_bytes(void *p, size_t n);
100 get_random_alnum_chars(tchar *p, size_t n);
102 /************************
103 * Hashing and comparison
104 ************************/
107 is_power_of_2(unsigned long n)
109 return (n != 0 && (n & (n - 1)) == 0);
116 return n * 0x9e37fffffffc0001ULL;
120 cmp_u32(u32 n1, u32 n2)
130 cmp_u64(u64 n1, u64 n2)
139 /************************
141 ************************/
144 get_available_cpus(void);
147 get_available_memory(void);
149 #endif /* _WIMLIB_UTIL_H */