libutil

C Utility Library
git clone http://git.omkov.net/libutil
Log | Tree | Refs | README | LICENCE | Download

libutil/src/endian.h (135 lines, 4.6 KiB) -rw-r--r-- file download

8a5f06f Jamozed 2022-02-09 20:04:50
0
// util/endian.h, version 1.0.2
98e5939 Jamozed 2021-11-27 17:53:46
1
// Endian header file from libutil
9f6b39c Jamozed 2021-01-26 12:32:10
2
// Copyright (C) 2021, Jakob Wakeling
7f427d9 Jamozed 2022-03-06 12:55:13
3
// MIT Licence
9f6b39c Jamozed 2021-01-26 12:32:10
4
98e5939 Jamozed 2021-11-27 17:53:46
5
#ifndef UTIL_ENDIAN_H_G7AID2RQ
98e5939 Jamozed 2021-11-27 17:53:46
6
#define UTIL_ENDIAN_H_G7AID2RQ
8a5f06f Jamozed 2022-02-09 20:04:50
7
8a5f06f Jamozed 2022-02-09 20:04:50
8
#ifdef __cplusplus
8a5f06f Jamozed 2022-02-09 20:04:50
9
extern "C" {
8a5f06f Jamozed 2022-02-09 20:04:50
10
#endif
9f6b39c Jamozed 2021-01-26 12:32:10
11
9f6b39c Jamozed 2021-01-26 12:32:10
12
#include <stdint.h>
9f6b39c Jamozed 2021-01-26 12:32:10
13
9f6b39c Jamozed 2021-01-26 12:32:10
14
/* Byte swap a 16-bit integer */
9f6b39c Jamozed 2021-01-26 12:32:10
15
#define BSWAP16(x) ( \
9f6b39c Jamozed 2021-01-26 12:32:10
16
	(((uint16_t)(x) & 0xFF00u) >> 8) | \
9f6b39c Jamozed 2021-01-26 12:32:10
17
	(((uint16_t)(x) & 0x00FFu) << 8))
9f6b39c Jamozed 2021-01-26 12:32:10
18
9f6b39c Jamozed 2021-01-26 12:32:10
19
/* Byte swap a 32-bit integer */
9f6b39c Jamozed 2021-01-26 12:32:10
20
#define BSWAP32(x) ( \
9f6b39c Jamozed 2021-01-26 12:32:10
21
	(((uint32_t)(x) & 0xFF000000uL) >> 24) | \
9f6b39c Jamozed 2021-01-26 12:32:10
22
	(((uint32_t)(x) & 0x00FF0000uL) >>  8) | \
9f6b39c Jamozed 2021-01-26 12:32:10
23
	(((uint32_t)(x) & 0x0000FF00uL) <<  8) | \
9f6b39c Jamozed 2021-01-26 12:32:10
24
	(((uint32_t)(x) & 0x000000FFuL) << 24))
9f6b39c Jamozed 2021-01-26 12:32:10
25
9f6b39c Jamozed 2021-01-26 12:32:10
26
/* Byte swap a 64-bit integer */
9f6b39c Jamozed 2021-01-26 12:32:10
27
#define BSWAP64(x) ( \
9f6b39c Jamozed 2021-01-26 12:32:10
28
	(((uint64_t)(x) & 0xFF00000000000000uLL) >> 56) | \
9f6b39c Jamozed 2021-01-26 12:32:10
29
	(((uint64_t)(x) & 0x00FF000000000000uLL) >> 40) | \
9f6b39c Jamozed 2021-01-26 12:32:10
30
	(((uint64_t)(x) & 0x0000FF0000000000uLL) >> 24) | \
9f6b39c Jamozed 2021-01-26 12:32:10
31
	(((uint64_t)(x) & 0x000000FF00000000uLL) >>  8) | \
9f6b39c Jamozed 2021-01-26 12:32:10
32
	(((uint64_t)(x) & 0x00000000FF000000uLL) <<  8) | \
9f6b39c Jamozed 2021-01-26 12:32:10
33
	(((uint64_t)(x) & 0x0000000000FF0000uLL) << 24) | \
9f6b39c Jamozed 2021-01-26 12:32:10
34
	(((uint64_t)(x) & 0x000000000000FF00uLL) << 40) | \
9f6b39c Jamozed 2021-01-26 12:32:10
35
	(((uint64_t)(x) & 0x00000000000000FFuLL) << 56))
9f6b39c Jamozed 2021-01-26 12:32:10
36
9f6b39c Jamozed 2021-01-26 12:32:10
37
/* Load a 16-bit little endian integer */
9f6b39c Jamozed 2021-01-26 12:32:10
38
#define LD16LE(p) ( \
9f6b39c Jamozed 2021-01-26 12:32:10
39
	((uint16_t)(((uint8_t *)(p))[0]) << 0) | \
9f6b39c Jamozed 2021-01-26 12:32:10
40
	((uint16_t)(((uint8_t *)(p))[1]) << 8))
9f6b39c Jamozed 2021-01-26 12:32:10
41
9f6b39c Jamozed 2021-01-26 12:32:10
42
/* Load a 16-bit big endian integer */
9f6b39c Jamozed 2021-01-26 12:32:10
43
#define LD16BE(p) ( \
9f6b39c Jamozed 2021-01-26 12:32:10
44
	((uint16_t)(((uint8_t *)(p))[0]) << 8) | \
9f6b39c Jamozed 2021-01-26 12:32:10
45
	((uint16_t)(((uint8_t *)(p))[1]) << 0))
9f6b39c Jamozed 2021-01-26 12:32:10
46
9f6b39c Jamozed 2021-01-26 12:32:10
47
/* Load a 32-bit little endian integer */
9f6b39c Jamozed 2021-01-26 12:32:10
48
#define LD32LE(p) ( \
9f6b39c Jamozed 2021-01-26 12:32:10
49
	((uint32_t)(((uint8_t *)(p))[0]) <<  0) | \
9f6b39c Jamozed 2021-01-26 12:32:10
50
	((uint32_t)(((uint8_t *)(p))[1]) <<  8) | \
9f6b39c Jamozed 2021-01-26 12:32:10
51
	((uint32_t)(((uint8_t *)(p))[2]) << 16) | \
9f6b39c Jamozed 2021-01-26 12:32:10
52
	((uint32_t)(((uint8_t *)(p))[3]) << 24))
9f6b39c Jamozed 2021-01-26 12:32:10
53
9f6b39c Jamozed 2021-01-26 12:32:10
54
/* Load a 32-bit big endian integer */
9f6b39c Jamozed 2021-01-26 12:32:10
55
#define LD32BE(p) ( \
9f6b39c Jamozed 2021-01-26 12:32:10
56
	((uint32_t)(((uint8_t *)(p))[0]) << 24) | \
9f6b39c Jamozed 2021-01-26 12:32:10
57
	((uint32_t)(((uint8_t *)(p))[1]) << 16) | \
9f6b39c Jamozed 2021-01-26 12:32:10
58
	((uint32_t)(((uint8_t *)(p))[2]) <<  8) | \
9f6b39c Jamozed 2021-01-26 12:32:10
59
	((uint32_t)(((uint8_t *)(p))[3]) <<  0))
9f6b39c Jamozed 2021-01-26 12:32:10
60
9f6b39c Jamozed 2021-01-26 12:32:10
61
/* Load a 64-bit little endian integer */
9f6b39c Jamozed 2021-01-26 12:32:10
62
#define LD64LE(p) ( \
9f6b39c Jamozed 2021-01-26 12:32:10
63
	((uint64_t)(((uint8_t *)(p))[0]) <<  0) | \
9f6b39c Jamozed 2021-01-26 12:32:10
64
	((uint64_t)(((uint8_t *)(p))[1]) <<  8) | \
9f6b39c Jamozed 2021-01-26 12:32:10
65
	((uint64_t)(((uint8_t *)(p))[2]) << 16) | \
9f6b39c Jamozed 2021-01-26 12:32:10
66
	((uint64_t)(((uint8_t *)(p))[3]) << 24) | \
9f6b39c Jamozed 2021-01-26 12:32:10
67
	((uint64_t)(((uint8_t *)(p))[4]) << 32) | \
9f6b39c Jamozed 2021-01-26 12:32:10
68
	((uint64_t)(((uint8_t *)(p))[5]) << 40) | \
9f6b39c Jamozed 2021-01-26 12:32:10
69
	((uint64_t)(((uint8_t *)(p))[6]) << 48) | \
9f6b39c Jamozed 2021-01-26 12:32:10
70
	((uint64_t)(((uint8_t *)(p))[7]) << 56))
9f6b39c Jamozed 2021-01-26 12:32:10
71
9f6b39c Jamozed 2021-01-26 12:32:10
72
/* Load a 64-bit big endian integer */
9f6b39c Jamozed 2021-01-26 12:32:10
73
#define LD64BE(p) ( \
9f6b39c Jamozed 2021-01-26 12:32:10
74
	((uint64_t)(((uint8_t *)(p))[0]) << 56) | \
9f6b39c Jamozed 2021-01-26 12:32:10
75
	((uint64_t)(((uint8_t *)(p))[1]) << 48) | \
9f6b39c Jamozed 2021-01-26 12:32:10
76
	((uint64_t)(((uint8_t *)(p))[2]) << 40) | \
9f6b39c Jamozed 2021-01-26 12:32:10
77
	((uint64_t)(((uint8_t *)(p))[3]) << 32) | \
9f6b39c Jamozed 2021-01-26 12:32:10
78
	((uint64_t)(((uint8_t *)(p))[4]) << 24) | \
9f6b39c Jamozed 2021-01-26 12:32:10
79
	((uint64_t)(((uint8_t *)(p))[5]) << 16) | \
9f6b39c Jamozed 2021-01-26 12:32:10
80
	((uint64_t)(((uint8_t *)(p))[6]) <<  8) | \
9f6b39c Jamozed 2021-01-26 12:32:10
81
	((uint64_t)(((uint8_t *)(p))[7]) <<  0))
9f6b39c Jamozed 2021-01-26 12:32:10
82
9f6b39c Jamozed 2021-01-26 12:32:10
83
/* Store a 16-bit little endian integer */
9f6b39c Jamozed 2021-01-26 12:32:10
84
#define ST16LE(p, x) \
9f6b39c Jamozed 2021-01-26 12:32:10
85
	((uint8_t *)(p))[0] = ((uint16_t)(x) >> 0) & 0xFFu; \
9f6b39c Jamozed 2021-01-26 12:32:10
86
	((uint8_t *)(p))[1] = ((uint16_t)(x) >> 8) & 0xFFu
9f6b39c Jamozed 2021-01-26 12:32:10
87
9f6b39c Jamozed 2021-01-26 12:32:10
88
/* Store a 16-bit big endian integer */
9f6b39c Jamozed 2021-01-26 12:32:10
89
#define ST16BE(p, x) \
9f6b39c Jamozed 2021-01-26 12:32:10
90
	((uint8_t *)(p))[0] = ((uint16_t)(x) >> 8) & 0xFFu; \
9f6b39c Jamozed 2021-01-26 12:32:10
91
	((uint8_t *)(p))[1] = ((uint16_t)(x) >> 0) & 0xFFu
9f6b39c Jamozed 2021-01-26 12:32:10
92
9f6b39c Jamozed 2021-01-26 12:32:10
93
/* Store a 32-bit little endian integer */
9f6b39c Jamozed 2021-01-26 12:32:10
94
#define ST32LE(p, x) \
9f6b39c Jamozed 2021-01-26 12:32:10
95
	((uint8_t *)(p))[0] = ((uint32_t)(x) >>  0) & 0xFFu; \
9f6b39c Jamozed 2021-01-26 12:32:10
96
	((uint8_t *)(p))[1] = ((uint32_t)(x) >>  8) & 0xFFu; \
9f6b39c Jamozed 2021-01-26 12:32:10
97
	((uint8_t *)(p))[2] = ((uint32_t)(x) >> 16) & 0xFFu; \
9f6b39c Jamozed 2021-01-26 12:32:10
98
	((uint8_t *)(p))[3] = ((uint32_t)(x) >> 24) & 0xFFu
9f6b39c Jamozed 2021-01-26 12:32:10
99
9f6b39c Jamozed 2021-01-26 12:32:10
100
/* Store a 32-bit big endian integer */
9f6b39c Jamozed 2021-01-26 12:32:10
101
#define ST32BE(p, x) \
9f6b39c Jamozed 2021-01-26 12:32:10
102
	((uint8_t *)(p))[0] = ((uint32_t)(x) >> 24) & 0xFFu; \
9f6b39c Jamozed 2021-01-26 12:32:10
103
	((uint8_t *)(p))[1] = ((uint32_t)(x) >> 16) & 0xFFu; \
9f6b39c Jamozed 2021-01-26 12:32:10
104
	((uint8_t *)(p))[2] = ((uint32_t)(x) >>  8) & 0xFFu; \
9f6b39c Jamozed 2021-01-26 12:32:10
105
	((uint8_t *)(p))[3] = ((uint32_t)(x) >>  0) & 0xFFu
9f6b39c Jamozed 2021-01-26 12:32:10
106
9f6b39c Jamozed 2021-01-26 12:32:10
107
/* Store a 64-bit little endian integer */
9f6b39c Jamozed 2021-01-26 12:32:10
108
#define ST64LE(p, x) \
9f6b39c Jamozed 2021-01-26 12:32:10
109
	((uint8_t *)(p))[0] = ((uint64_t)(x) >>  0) & 0xFFu; \
9f6b39c Jamozed 2021-01-26 12:32:10
110
	((uint8_t *)(p))[1] = ((uint64_t)(x) >>  8) & 0xFFu; \
9f6b39c Jamozed 2021-01-26 12:32:10
111
	((uint8_t *)(p))[2] = ((uint64_t)(x) >> 16) & 0xFFu; \
9f6b39c Jamozed 2021-01-26 12:32:10
112
	((uint8_t *)(p))[3] = ((uint64_t)(x) >> 24) & 0xFFu; \
9f6b39c Jamozed 2021-01-26 12:32:10
113
	((uint8_t *)(p))[4] = ((uint64_t)(x) >> 32) & 0xFFu; \
9f6b39c Jamozed 2021-01-26 12:32:10
114
	((uint8_t *)(p))[5] = ((uint64_t)(x) >> 40) & 0xFFu; \
9f6b39c Jamozed 2021-01-26 12:32:10
115
	((uint8_t *)(p))[6] = ((uint64_t)(x) >> 48) & 0xFFu; \
9f6b39c Jamozed 2021-01-26 12:32:10
116
	((uint8_t *)(p))[7] = ((uint64_t)(x) >> 56) & 0xFFu
9f6b39c Jamozed 2021-01-26 12:32:10
117
9f6b39c Jamozed 2021-01-26 12:32:10
118
/* Store a 64-bit big endian integer */
9f6b39c Jamozed 2021-01-26 12:32:10
119
#define ST64BE(p, x) \
9f6b39c Jamozed 2021-01-26 12:32:10
120
	((uint8_t *)(p))[0] = ((uint64_t)(x) >> 56) & 0xFFu; \
9f6b39c Jamozed 2021-01-26 12:32:10
121
	((uint8_t *)(p))[1] = ((uint64_t)(x) >> 48) & 0xFFu; \
9f6b39c Jamozed 2021-01-26 12:32:10
122
	((uint8_t *)(p))[2] = ((uint64_t)(x) >> 40) & 0xFFu; \
9f6b39c Jamozed 2021-01-26 12:32:10
123
	((uint8_t *)(p))[3] = ((uint64_t)(x) >> 32) & 0xFFu; \
9f6b39c Jamozed 2021-01-26 12:32:10
124
	((uint8_t *)(p))[4] = ((uint64_t)(x) >> 24) & 0xFFu; \
9f6b39c Jamozed 2021-01-26 12:32:10
125
	((uint8_t *)(p))[5] = ((uint64_t)(x) >> 16) & 0xFFu; \
9f6b39c Jamozed 2021-01-26 12:32:10
126
	((uint8_t *)(p))[6] = ((uint64_t)(x) >>  8) & 0xFFu; \
9f6b39c Jamozed 2021-01-26 12:32:10
127
	((uint8_t *)(p))[7] = ((uint64_t)(x) >>  0) & 0xFFu
8a5f06f Jamozed 2022-02-09 20:04:50
128
8a5f06f Jamozed 2022-02-09 20:04:50
129
#ifdef __cplusplus
8a5f06f Jamozed 2022-02-09 20:04:50
130
} // extern "C"
8a5f06f Jamozed 2022-02-09 20:04:50
131
#endif
9f6b39c Jamozed 2021-01-26 12:32:10
132
98e5939 Jamozed 2021-11-27 17:53:46
133
#endif // UTIL_ENDIAN_H_G7AID2RQ
134