lwpa
0.1.0
LightWeight Platform Abstraction (lwpa)
View other versions:
lwpa_pack.h
1
/******************************************************************************
2
* Copyright 2018 ETC Inc.
3
*
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
* you may not use this file except in compliance with the License.
6
* You may obtain a copy of the License at
7
*
8
* http://www.apache.org/licenses/LICENSE-2.0
9
*
10
* Unless required by applicable law or agreed to in writing, software
11
* distributed under the License is distributed on an "AS IS" BASIS,
12
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
* See the License for the specific language governing permissions and
14
* limitations under the License.
15
*******************************************************************************
16
* This file is a part of lwpa. For more information, go to:
17
* https://github.com/ETCLabs/lwpa
18
******************************************************************************/
19
20
/* lwpa_pack.h: Platform- and endianness-independent buffer packing and
21
* unpacking. */
22
#ifndef _LWPA_PACK_H_
23
#define _LWPA_PACK_H_
24
25
#include "lwpa_int.h"
26
41
/* clang-format off */
42
47
#define upack_16b(ptr) \
48
(((uint16_t)0u) | \
49
(((uint16_t)((uint8_t *)(ptr))[0]) << 8) | \
50
((uint16_t)((uint8_t *)(ptr))[1]))
51
56
#define pack_16b(ptr, val) \
57
do \
58
{ \
59
((uint8_t *)(ptr))[1] = (uint8_t) ((val) & 0xff); \
60
((uint8_t *)(ptr))[0] = (uint8_t)(((val) & 0xff00) >> 8); \
61
} while (0)
62
67
#define upack_16l(ptr) \
68
(((uint16_t)0u) | \
69
(((uint16_t)((uint8_t *)(ptr))[1]) << 8) | \
70
((uint16_t)((uint8_t *)(ptr))[0]))
71
76
#define pack_16l(ptr, val) \
77
do \
78
{ \
79
((uint8_t *)(ptr))[0] = (uint8_t) ((val) & 0xff); \
80
((uint8_t *)(ptr))[1] = (uint8_t)(((val) & 0xff00) >> 8); \
81
} while (0)
82
87
#define upack_32b(ptr) \
88
(((uint32_t)0u) | \
89
(((uint32_t)((uint8_t *)(ptr))[0]) << 24) | \
90
(((uint32_t)((uint8_t *)(ptr))[1]) << 16) | \
91
(((uint32_t)((uint8_t *)(ptr))[2]) << 8) | \
92
((uint32_t)((uint8_t *)(ptr))[3]))
93
98
#define pack_32b(ptr, val) \
99
do \
100
{ \
101
((uint8_t *)(ptr))[3] = (uint8_t) ((val) & 0xff); \
102
((uint8_t *)(ptr))[2] = (uint8_t)(((val) & 0xff00) >> 8); \
103
((uint8_t *)(ptr))[1] = (uint8_t)(((val) & 0xff0000) >> 16); \
104
((uint8_t *)(ptr))[0] = (uint8_t)(((val) & 0xff000000) >> 24); \
105
} while (0)
106
111
#define upack_32l(ptr) \
112
(((uint32_t)0u) | \
113
(((uint32_t)((uint8_t *)(ptr))[3]) << 24) | \
114
(((uint32_t)((uint8_t *)(ptr))[2]) << 16) | \
115
(((uint32_t)((uint8_t *)(ptr))[1]) << 8) | \
116
((uint32_t)((uint8_t *)(ptr))[0]))
117
122
#define pack_32l(ptr, val) \
123
do \
124
{ \
125
((uint8_t *)(ptr))[0] = (uint8_t) ((val) & 0xff); \
126
((uint8_t *)(ptr))[1] = (uint8_t)(((val) & 0xff00) >> 8); \
127
((uint8_t *)(ptr))[2] = (uint8_t)(((val) & 0xff0000) >> 16); \
128
((uint8_t *)(ptr))[3] = (uint8_t)(((val) & 0xff000000) >> 24); \
129
} while (0)
130
131
#if !LWPA_NO_64BIT_SUPPORT
132
137
#define upack_64b(ptr) \
138
(((uint64_t)0u) | \
139
(((uint64_t)((uint8_t *)(ptr))[0]) << 56) | \
140
(((uint64_t)((uint8_t *)(ptr))[1]) << 48) | \
141
(((uint64_t)((uint8_t *)(ptr))[2]) << 40) | \
142
(((uint64_t)((uint8_t *)(ptr))[3]) << 32) | \
143
(((uint64_t)((uint8_t *)(ptr))[4]) << 24) | \
144
(((uint64_t)((uint8_t *)(ptr))[5]) << 16) | \
145
(((uint64_t)((uint8_t *)(ptr))[6]) << 8) | \
146
((uint64_t)((uint8_t *)(ptr))[7]))
147
152
#define pack_64b(ptr, val) \
153
do \
154
{ \
155
((uint8_t *)(ptr))[7] = (uint8_t) ((val) & 0xff); \
156
((uint8_t *)(ptr))[6] = (uint8_t)(((val) & 0xff00) >> 8); \
157
((uint8_t *)(ptr))[5] = (uint8_t)(((val) & 0xff0000) >> 16); \
158
((uint8_t *)(ptr))[4] = (uint8_t)(((val) & 0xff000000) >> 24); \
159
((uint8_t *)(ptr))[3] = (uint8_t)(((val) & 0xff00000000) >> 32); \
160
((uint8_t *)(ptr))[2] = (uint8_t)(((val) & 0xff0000000000) >> 40); \
161
((uint8_t *)(ptr))[1] = (uint8_t)(((val) & 0xff000000000000) >> 48); \
162
((uint8_t *)(ptr))[0] = (uint8_t)(((val) & 0xff00000000000000) >> 56); \
163
} while (0)
164
169
#define upack_64l(ptr) \
170
(((uint64_t)0u) | \
171
(((uint64_t)((uint8_t *)(ptr))[7]) << 56) | \
172
(((uint64_t)((uint8_t *)(ptr))[6]) << 48) | \
173
(((uint64_t)((uint8_t *)(ptr))[5]) << 40) | \
174
(((uint64_t)((uint8_t *)(ptr))[4]) << 32) | \
175
(((uint64_t)((uint8_t *)(ptr))[3]) << 24) | \
176
(((uint64_t)((uint8_t *)(ptr))[2]) << 16) | \
177
(((uint64_t)((uint8_t *)(ptr))[1]) << 8) | \
178
((uint64_t)((uint8_t *)(ptr))[0]))
179
184
#define pack_64l(ptr, val) \
185
do \
186
{ \
187
((uint8_t *)(ptr))[0] = (uint8_t) ((val) & 0xff); \
188
((uint8_t *)(ptr))[1] = (uint8_t)(((val) & 0xff00) >> 8); \
189
((uint8_t *)(ptr))[2] = (uint8_t)(((val) & 0xff0000) >> 16); \
190
((uint8_t *)(ptr))[3] = (uint8_t)(((val) & 0xff000000) >> 24); \
191
((uint8_t *)(ptr))[4] = (uint8_t)(((val) & 0xff00000000) >> 32); \
192
((uint8_t *)(ptr))[5] = (uint8_t)(((val) & 0xff0000000000) >> 40); \
193
((uint8_t *)(ptr))[6] = (uint8_t)(((val) & 0xff000000000000) >> 48); \
194
((uint8_t *)(ptr))[7] = (uint8_t)(((val) & 0xff00000000000000) >> 56); \
195
} while (0)
196
197
#endif
/* !LWPA_NO_64BIT_SUPPORT */
198
201
#endif
/* _LWPA_PACK_H_ */
include
lwpa_pack.h
Generated by
1.9.1