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