chiark / gitweb /
feddaa9192444d040a4429addebfc6cbb85e90dd
[elogind.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