X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fendianness.h;h=584b62178769ce80cc9fe593e2ef63f236c5ab15;hp=55a832ded50c3767fc884ed3036b581dc952ca34;hb=8f520d21297a3ae557d82b586ad369662714d829;hpb=6f77434ea6ff1407603410e28d1edb966c40e568 diff --git a/src/endianness.h b/src/endianness.h index 55a832de..584b6217 100644 --- a/src/endianness.h +++ b/src/endianness.h @@ -5,93 +5,83 @@ #include "config.h" #include -/* Changes the endianness of a 32-bit value. */ +/* Watch out for conflicts with ntfs-3g headers... */ + +#ifndef bswap16 +static inline uint16_t bswap16(uint16_t n) +{ + return (n << 8) | (n >> 8); +} +#endif /* ifndef bswap16 */ + +#ifndef bswap32 static inline uint32_t bswap32(uint32_t n) { #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) return __builtin_bswap32(n); #else - return (n << 24) | ((n & 0xff00) << 8) | ((n & 0xff0000) >> 8) | + return (n << 24) | ((n & 0xff00) << 8) | ((n & 0xff0000) >> 8) | (n >> 24); #endif } +#endif /* ifndef bswap32 */ -#ifdef WORDS_BIGENDIAN - -/* Big endian. */ - -/* Changes the endianness of a 16-bit value. */ -static inline uint16_t bswap16(uint16_t n) -{ - return (n << 8) | (n >> 8); -} - - -/* Changes the endianness of a 64-bit value. */ +#ifndef bswap64 static inline uint64_t bswap64(uint64_t n) { -#ifdef __GNUC__ +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) return __builtin_bswap64(n); #else - return (n << 56) | ((n & 0xff00) << 40) | ((n & 0xff0000) << 24) | - ((n & 0xff000000) << 8) | ((n & 0xff00000000) >> 8) | - ((n & 0xff0000000000) >> 24) | + return (n << 56) | ((n & 0xff00) << 40) | ((n & 0xff0000) << 24) | + ((n & 0xff000000) << 8) | ((n & 0xff00000000) >> 8) | + ((n & 0xff0000000000) >> 24) | ((n & 0xff000000000000) >> 40) | (n >> 56); #endif } +#endif /* ifndef bswap64 */ + + +#ifndef _NTFS_ENDIANS_H +# ifdef WORDS_BIGENDIAN +# define le16_to_cpu(n) bswap16(n) +# define le32_to_cpu(n) bswap32(n) +# define le64_to_cpu(n) bswap64(n) +# define cpu_to_le16(n) bswap16(n) +# define cpu_to_le32(n) bswap32(n) +# define cpu_to_le64(n) bswap64(n) +# else +# define cpu_to_le16(n) (n) +# define cpu_to_le32(n) (n) +# define cpu_to_le64(n) (n) +# define le16_to_cpu(n) (n) +# define le32_to_cpu(n) (n) +# define le64_to_cpu(n) (n) +# endif +#endif -/* Not in place */ -#define to_le16(n) bswap16(n) -#define to_le32(n) bswap32(n) -#define to_le64(n) bswap64(n) -#define to_be16(n) (n) -#define to_be32(n) (n) -#define to_be64(n) (n) - -/* In place */ -#define TO_LE16(n) (n = to_le16(n)) -#define TO_LE32(n) (n = to_le32(n)) -#define TO_LE64(n) (n = to_le64(n)) - -static inline void array_to_le16(uint16_t *p, uint64_t n) +static inline void array_cpu_to_le32(uint32_t *p, size_t n) { - while (n--) - *p++ = to_le16(*p); + for (size_t i = 0; i < n; i++) + p[i] = cpu_to_le32(p[i]); } -static inline void array_to_le32(uint32_t *p, uint64_t n) + +static inline void array_le32_to_cpu(uint32_t *p, size_t n) { - while (n--) - *p++ = to_le32(*p); + for (size_t i = 0; i < n; i++) + p[i] = le32_to_cpu(p[i]); } -static inline void array_to_le64(uint64_t *p, uint64_t n) + +static inline void array_cpu_to_le64(uint64_t *p, size_t n) { - while (n--) - *p++ = to_le64(*p); + for (size_t i = 0; i < n; i++) + p[i] = cpu_to_le64(p[i]); } -#else - -/* Little endian. */ - -/* Not in place */ -#define to_le16(n) (n) -#define to_le32(n) (n) -#define to_le64(n) (n) - -#define to_be16(n) (bswap16(n)) -#define to_be32(n) (bswap32(n)) -#define to_be64(n) (bswap64(n)) - -/* In place */ -#define TO_LE16(n) -#define TO_LE32(n) -#define TO_LE64(n) - -#define array_to_le16(p, n) -#define array_to_le32(p, n) -#define array_to_le64(p, n) - -#endif +static inline void array_le64_to_cpu(uint64_t *p, size_t n) +{ + for (size_t i = 0; i < n; i++) + p[i] = le64_to_cpu(p[i]); +} #endif /* _WIMLIB_ENDIANNESS_H */