1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2 #pragma once
3
4 #include <endian.h>
5 #include <stdint.h>
6
7 /* BE */
8
unaligned_read_be16(const void * _u)9 static inline uint16_t unaligned_read_be16(const void *_u) {
10 const struct __attribute__((__packed__, __may_alias__)) { uint16_t x; } *u = _u;
11
12 return be16toh(u->x);
13 }
14
unaligned_read_be32(const void * _u)15 static inline uint32_t unaligned_read_be32(const void *_u) {
16 const struct __attribute__((__packed__, __may_alias__)) { uint32_t x; } *u = _u;
17
18 return be32toh(u->x);
19 }
20
unaligned_read_be64(const void * _u)21 static inline uint64_t unaligned_read_be64(const void *_u) {
22 const struct __attribute__((__packed__, __may_alias__)) { uint64_t x; } *u = _u;
23
24 return be64toh(u->x);
25 }
26
unaligned_write_be16(void * _u,uint16_t a)27 static inline void unaligned_write_be16(void *_u, uint16_t a) {
28 struct __attribute__((__packed__, __may_alias__)) { uint16_t x; } *u = _u;
29
30 u->x = be16toh(a);
31 }
32
unaligned_write_be32(void * _u,uint32_t a)33 static inline void unaligned_write_be32(void *_u, uint32_t a) {
34 struct __attribute__((__packed__, __may_alias__)) { uint32_t x; } *u = _u;
35
36 u->x = be32toh(a);
37 }
38
unaligned_write_be64(void * _u,uint64_t a)39 static inline void unaligned_write_be64(void *_u, uint64_t a) {
40 struct __attribute__((__packed__, __may_alias__)) { uint64_t x; } *u = _u;
41
42 u->x = be64toh(a);
43 }
44
45 /* LE */
46
unaligned_read_le16(const void * _u)47 static inline uint16_t unaligned_read_le16(const void *_u) {
48 const struct __attribute__((__packed__, __may_alias__)) { uint16_t x; } *u = _u;
49
50 return le16toh(u->x);
51 }
52
unaligned_read_le32(const void * _u)53 static inline uint32_t unaligned_read_le32(const void *_u) {
54 const struct __attribute__((__packed__, __may_alias__)) { uint32_t x; } *u = _u;
55
56 return le32toh(u->x);
57 }
58
unaligned_read_le64(const void * _u)59 static inline uint64_t unaligned_read_le64(const void *_u) {
60 const struct __attribute__((__packed__, __may_alias__)) { uint64_t x; } *u = _u;
61
62 return le64toh(u->x);
63 }
64
unaligned_write_le16(void * _u,uint16_t a)65 static inline void unaligned_write_le16(void *_u, uint16_t a) {
66 struct __attribute__((__packed__, __may_alias__)) { uint16_t x; } *u = _u;
67
68 u->x = le16toh(a);
69 }
70
unaligned_write_le32(void * _u,uint32_t a)71 static inline void unaligned_write_le32(void *_u, uint32_t a) {
72 struct __attribute__((__packed__, __may_alias__)) { uint32_t x; } *u = _u;
73
74 u->x = le32toh(a);
75 }
76
unaligned_write_le64(void * _u,uint64_t a)77 static inline void unaligned_write_le64(void *_u, uint64_t a) {
78 struct __attribute__((__packed__, __may_alias__)) { uint64_t x; } *u = _u;
79
80 u->x = le64toh(a);
81 }
82
83 #if __BYTE_ORDER == __BIG_ENDIAN
84 #define unaligned_read_ne16 unaligned_read_be16
85 #define unaligned_read_ne32 unaligned_read_be32
86 #define unaligned_read_ne64 unaligned_read_be64
87
88 #define unaligned_write_ne16 unaligned_write_be16
89 #define unaligned_write_ne32 unaligned_write_be32
90 #define unaligned_write_ne64 unaligned_write_be64
91 #else
92 #define unaligned_read_ne16 unaligned_read_le16
93 #define unaligned_read_ne32 unaligned_read_le32
94 #define unaligned_read_ne64 unaligned_read_le64
95
96 #define unaligned_write_ne16 unaligned_write_le16
97 #define unaligned_write_ne32 unaligned_write_le32
98 #define unaligned_write_ne64 unaligned_write_le64
99 #endif
100