X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Futil.h;h=083ddb2e14e4b6ed8d7344bf7bc77a069a4a6dc9;hb=31cea10bc58ea3067c711c47a266cc68f34459d9;hp=a8e06f7d4e3291a3486c939f65dec461b15213af;hpb=cdda846b47fae4633ba1084472c982766592ac10;p=wimlib diff --git a/src/util.h b/src/util.h index a8e06f7d..083ddb2e 100644 --- a/src/util.h +++ b/src/util.h @@ -30,6 +30,17 @@ # define HOT #endif /* __GNUC__ */ + +#if 0 +#ifdef WITH_FUSE +#define atomic_inc(ptr) \ + __sync_fetch_and_add(ptr, 1) + +#define atomic_dec(ptr) \ + __sync_sub_and_fetch(ptr, 1) +#endif +#endif + #ifndef _NTFS_TYPES_H typedef uint8_t u8; typedef uint16_t u16; @@ -52,6 +63,25 @@ typedef unsigned uint; #define swap(a, b) ({typeof(a) _a = a; (a) = (b); (b) = _a;}) #endif +/** + * container_of - cast a member of a structure out to the containing structure + * @ptr: the pointer to the member. + * @type: the type of the container struct this is embedded in. + * @member: the name of the member within the struct. + * + */ +#ifndef container_of +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (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)) @@ -61,9 +91,9 @@ typedef unsigned uint; #ifdef ENABLE_ERROR_MESSAGES extern bool __wimlib_print_errors; -extern void wimlib_error(const char *format, ...) +extern void wimlib_error(const char *format, ...) FORMAT(printf, 1, 2) COLD; -extern void wimlib_error_with_errno(const char *format, ...) +extern void wimlib_error_with_errno(const char *format, ...) FORMAT(printf, 1, 2) COLD; extern void wimlib_warning(const char *format, ...) FORMAT(printf, 1, 2) COLD; @@ -131,31 +161,45 @@ extern char *wimlib_strdup(const char *str); extern char *utf16_to_utf8(const char *utf16_str, size_t utf16_len, size_t *utf8_len_ret); -extern char *utf8_to_utf16(const char *utf8_str, size_t utf8_len, +extern char *utf8_to_utf16(const char *utf8_str, size_t utf8_len, size_t *utf16_len_ret); extern void randomize_byte_array(u8 *p, size_t n); extern void randomize_char_array_with_alnum(char p[], size_t n); -extern const char *path_next_part(const char *path, +extern const char *path_next_part(const char *path, size_t *first_part_len_ret); extern const char *path_basename(const char *path); +extern const char *path_stream_name(const char *path); + extern void to_parent_name(char buf[], size_t len); extern void print_string(const void *string, size_t len); 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 */