]> wimlib.net Git - wimlib/blob - src/endianness.h
overwrite_wim_inplace(): cleanup
[wimlib] / src / endianness.h
1 #ifndef _WIMLIB_ENDIANNESS_H
2 #define _WIMLIB_ENDIANNESS_H
3
4
5 #include "config.h"
6 #include <inttypes.h>
7
8 /* Watch out for conflicts with ntfs-3g headers... */
9
10 #ifndef bswap16
11 static inline uint16_t
12 bswap16(uint16_t n)
13 {
14         return (n << 8) | (n >> 8);
15 }
16 #endif /* ifndef bswap16 */
17
18 #ifndef bswap32
19 static inline uint32_t
20 bswap32(uint32_t n)
21 {
22 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
23         return __builtin_bswap32(n);
24 #else
25         return (n << 24) | ((n & 0xff00) << 8) | ((n & 0xff0000) >> 8) |
26                                                         (n >> 24);
27 #endif
28 }
29 #endif /* ifndef bswap32 */
30
31 #ifndef bswap64
32 static inline uint64_t
33 bswap64(uint64_t n)
34 {
35 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
36         return __builtin_bswap64(n);
37 #else
38         return (n << 56) | ((n & 0xff00) << 40) | ((n & 0xff0000) << 24) |
39                         ((n & 0xff000000) << 8) | ((n & 0xff00000000) >> 8) |
40                         ((n & 0xff0000000000) >> 24) |
41                         ((n & 0xff000000000000) >> 40) | (n >> 56);
42 #endif
43 }
44 #endif /* ifndef bswap64 */
45
46
47 #ifndef _NTFS_ENDIANS_H
48 #       ifdef WORDS_BIGENDIAN
49 #               define le16_to_cpu(n) bswap16(n)
50 #               define le32_to_cpu(n) bswap32(n)
51 #               define le64_to_cpu(n) bswap64(n)
52 #               define cpu_to_le16(n) bswap16(n)
53 #               define cpu_to_le32(n) bswap32(n)
54 #               define cpu_to_le64(n) bswap64(n)
55 #       else
56 #               define cpu_to_le16(n) (n)
57 #               define cpu_to_le32(n) (n)
58 #               define cpu_to_le64(n) (n)
59 #               define le16_to_cpu(n) (n)
60 #               define le32_to_cpu(n) (n)
61 #               define le64_to_cpu(n) (n)
62 #       endif
63 #endif
64
65 static inline void
66 array_cpu_to_le32(uint32_t *p, size_t n)
67 {
68         for (size_t i = 0; i < n; i++)
69                 p[i] = cpu_to_le32(p[i]);
70 }
71
72 static inline void
73 array_le32_to_cpu(uint32_t *p, size_t n)
74 {
75         for (size_t i = 0; i < n; i++)
76                 p[i] = le32_to_cpu(p[i]);
77 }
78
79 static inline void
80 array_cpu_to_le64(uint64_t *p, size_t n)
81 {
82         for (size_t i = 0; i < n; i++)
83                 p[i] = cpu_to_le64(p[i]);
84 }
85
86 static inline void
87 array_le64_to_cpu(uint64_t *p, size_t n)
88 {
89         for (size_t i = 0; i < n; i++)
90                 p[i] = le64_to_cpu(p[i]);
91 }
92
93
94 #endif /* _WIMLIB_ENDIANNESS_H */