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_ */