]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/basic/unaligned.h
pkgconfig: define variables relative to ${prefix}/${rootprefix}/${sysconfdir}
[thirdparty/systemd.git] / src / basic / unaligned.h
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 #pragma once
3
4 #include <endian.h>
5 #include <stdint.h>
6
7 /* BE */
8
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
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
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
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
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
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
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
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
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
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
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
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