(type *)( (char *)__mptr - offsetof(type,member) );})
#endif
+#define DIV_ROUND_UP(numerator, denominator) \
+ (((numerator) + (denominator) - 1) / (denominator))
+
+#define MODULO_NONZERO(numerator, denominator) \
+ (((numerator) % (denominator)) ? ((numerator) % (denominator)) : (denominator))
+
#define ARRAY_LEN(array) (sizeof(array) / sizeof((array)[0]))
#define ZERO_ARRAY(array) memset(array, 0, sizeof(array))
extern int get_num_path_components(const char *path);
-extern ssize_t full_write(int fd, const void *buf, size_t n);
-
static inline void print_byte_field(const u8 field[], size_t len)
{
while (len--)
printf("%02hhx", *field++);
}
+static inline u32 bsr32(u32 n)
+{
+#if defined(__x86__) || defined(__x86_64__)
+ asm("bsrl %0, %0;"
+ : "=r"(n)
+ : "0" (n));
+ return n;
+#else
+ u32 pow = 0;
+ while ((n >>= 1) != 0)
+ pow++;
+ return pow;
+#endif
+}
#endif /* _WIMLIB_UTIL_H */