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