Adaptive Framework  0.9.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
afw_endian.h
Go to the documentation of this file.
1 // See the 'COPYING' file in the project root for licensing information.
2 /*
3  * Adaptive Framework Endian Header
4  *
5  * Copyright (c) 2010-2023 Clemson University
6  *
7  */
8 
9 #ifndef __AFW_ENDIAN_H__
10 #define __AFW_ENDIAN_H__
11 
12 #include "afw_common.h"
13 
28 
29 #define AFW_ENDIAN_IS_BIG APR_IS_BIGENDIAN
30 
31 #define AFW_ENDIAN_SWAP(_X_, _Y_) \
32  _X_ ^= _Y_; \
33  _Y_ ^= _X_; \
34  _X_ ^= _Y_
35 
37 #define AFW_ENDIAN_SWITCH_64(_N_) \
38  AFW_ENDIAN_SWAP(((unsigned char *)(_N_))[0], ((unsigned char *)(_N_))[7]); \
39  AFW_ENDIAN_SWAP(((unsigned char *)(_N_))[1], ((unsigned char *)(_N_))[6]); \
40  AFW_ENDIAN_SWAP(((unsigned char *)(_N_))[2], ((unsigned char *)(_N_))[5]); \
41  AFW_ENDIAN_SWAP(((unsigned char *)(_N_))[3], ((unsigned char *)(_N_))[4]); \
42 
44 #define AFW_ENDIAN_SWITCH_32(_N_) \
45  AFW_ENDIAN_SWAP(((unsigned char *)(_N_))[0], ((unsigned char *)(_N_))[3]); \
46  AFW_ENDIAN_SWAP(((unsigned char *)(_N_))[1], ((unsigned char *)(_N_))[2]); \
47 
49 #define AFW_ENDIAN_SWITCH_16(_N_) \
50  AFW_ENDIAN_SWAP(((unsigned char *)(_N_))[0], ((unsigned char *)(_N_))[1]); \
51 
52 
54 #if AFW_ENDIAN_IS_BIG
55 #define AFW_ENDIAN_IS_LITTLE 0
56 #define AFW_ENDIAN_NATIVE_TO_LITTLE_64(_N_) AFW_ENDIAN_SWITCH_64(_N_)
57 #define AFW_ENDIAN_LITTLE_TO_NATIVE_64(_N_) AFW_ENDIAN_SWITCH_64(_N_)
58 #define AFW_ENDIAN_NATIVE_TO_LITTLE_32(_N_) AFW_ENDIAN_SWITCH_32(_N_)
59 #define AFW_ENDIAN_LITTLE_TO_NATIVE_32(_N_) AFW_ENDIAN_SWITCH_32(_N_)
60 #define AFW_ENDIAN_NATIVE_TO_LITTLE_16(_N_) AFW_ENDIAN_SWITCH_16(_N_)
61 #define AFW_ENDIAN_LITTLE_TO_NATIVE_16(_N_) AFW_ENDIAN_SWITCH_16(_N_)
62 #define AFW_ENDIAN_NATIVE_TO_BIG_64(_N_)
63 #define AFW_ENDIAN_BIG_TO_NATIVE_64(_N_)
64 #define AFW_ENDIAN_NATIVE_TO_BIG_32(_N_)
65 #define AFW_ENDIAN_BIG_TO_NATIVE_32(_N_)
66 #define AFW_ENDIAN_NATIVE_TO_BIG_16(_N_)
67 #define AFW_ENDIAN_BIG_TO_NATIVE_16(_N_)
68 #else
69 #define AFW_ENDIAN_IS_LITTLE 1
70 #define AFW_ENDIAN_NATIVE_TO_LITTLE_64(_N_)
71 #define AFW_ENDIAN_LITTLE_TO_NATIVE_64(_N_)
72 #define AFW_ENDIAN_NATIVE_TO_LITTLE_32(_N_)
73 #define AFW_ENDIAN_LITTLE_TO_NATIVE_32(_N_)
74 #define AFW_ENDIAN_NATIVE_TO_LITTLE_16(_N_)
75 #define AFW_ENDIAN_LITTLE_TO_NATIVE_16(_N_)
76 #define AFW_ENDIAN_NATIVE_TO_BIG_64(_N_) AFW_ENDIAN_SWITCH_64(_N_)
77 #define AFW_ENDIAN_BIG_TO_NATIVE_64(_N_) AFW_ENDIAN_SWITCH_64(_N_)
78 #define AFW_ENDIAN_NATIVE_TO_BIG_32(_N_) AFW_ENDIAN_SWITCH_32(_N_)
79 #define AFW_ENDIAN_BIG_TO_NATIVE_32(_N_) AFW_ENDIAN_SWITCH_32(_N_)
80 #define AFW_ENDIAN_NATIVE_TO_BIG_16(_N_) AFW_ENDIAN_SWITCH_16(_N_)
81 #define AFW_ENDIAN_BIG_TO_NATIVE_16(_N_) AFW_ENDIAN_SWITCH_16(_N_)
82 #endif
83 
84 #define AFW_ENDIAN_NATIVE_TO_BIG(_N_, _BITS_) AFW_ENDIAN_NATIVE_TO_BIG_ ## _BITS_(_N_)
85 #define AFW_ENDIAN_BIG_TO_NATIVE(_N_, _BITS_) AFW_ENDIAN_BIG_TO_NATIVE_ ## _BITS_(_N_)
86 
87 #define AFW_ENDIAN_INCREMENT_BIG_64(_N_) \
88  AFW_ENDIAN_BIG_TO_NATIVE_64(_N_); \
89  (_N_)++; \
90  AFW_ENDIAN_NATIVE_TO_BIG_64(_N_)
91 
92 #define AFW_ENDIAN_INCREMENT_BIG_32(_N_) \
93  AFW_ENDIAN_BIG_TO_NATIVE_32(_N_); \
94  (_N_)++; \
95  AFW_ENDIAN_NATIVE_TO_BIG_32(_N_)
96 
97 #define AFW_ENDIAN_INCREMENT_BIG_16(_N_) \
98  AFW_ENDIAN_BIG_TO_NATIVE_16(_N_); \
99  (_N_)++; \
100  AFW_ENDIAN_NATIVE_TO_BIG_16(_N_)
101 
103 typedef union {
104  unsigned char c[8];
105  afw_uint64_t i;
107 
109 typedef union {
110  unsigned char c[8];
111  afw_uint64_t i;
113 
115 typedef union {
116  unsigned char c[8];
117  afw_int64_t i;
119 
121 typedef union {
122  unsigned char c[8];
123  afw_int64_t i;
125 
127 typedef union {
128  unsigned char c[4];
129  afw_uint32_t i;
131 
133 typedef union {
134  unsigned char c[4];
135  afw_uint32_t i;
137 
139 typedef union {
140  unsigned char c[4];
141  afw_int32_t i;
143 
145 typedef union {
146  unsigned char c[4];
147  afw_int32_t i;
149 
151 typedef union {
152  unsigned char c[2];
153  afw_uint16_t i;
155 
157 typedef union {
158  unsigned char c[2];
159  afw_uint16_t i;
161 
163 typedef union {
164  unsigned char c[2];
165  afw_int16_t i;
167 
169 typedef union {
170  unsigned char c[2];
171  afw_int16_t i;
173 
182 AFW_DEFINE_STATIC_INLINE(afw_size_t)
185 {
186  afw_uint64_t result = big.i;
187 
188  /* Convert to native and throw error if it didn't fit afw_size_t. */
189  AFW_ENDIAN_BIG_TO_NATIVE_64(&result);
190  if (result != (afw_size_t)result) {
191  AFW_THROW_ERROR_Z(general,
192  "Value in afw_endian_big_uint64_t exceeds the value that will "
193  "fit in afw_size_t",
194  xctx);
195  }
196 
197  return (afw_size_t)result;
198 }
199 
205 AFW_DEFINE_STATIC_INLINE(afw_uint64_t)
208 {
209  afw_uint64_t result = big.i;
210  AFW_ENDIAN_BIG_TO_NATIVE_64(&result);
211  return result;
212 }
213 
219 AFW_DEFINE_STATIC_INLINE(afw_int64_t)
222 {
223  afw_int64_t result = big.i;
224  AFW_ENDIAN_BIG_TO_NATIVE_64(&result);
225  return result;
226 }
227 
233 AFW_DEFINE_STATIC_INLINE(afw_endian_big_uint64_t)
235  afw_uint64_t native)
236 {
238  result.i = native;
239  AFW_ENDIAN_NATIVE_TO_BIG_64(&result);
240  return result;
241 }
242 
248 AFW_DEFINE_STATIC_INLINE(afw_endian_big_int64_t)
250  afw_int64_t native)
251 {
252  afw_endian_big_int64_t result;
253  result.i = native;
254  AFW_ENDIAN_NATIVE_TO_BIG_64(&result);
255  return result;
256 }
257 
263 AFW_DEFINE_STATIC_INLINE(afw_uint32_t)
266 {
267  afw_uint32_t result = big.i;
268  AFW_ENDIAN_BIG_TO_NATIVE_32(&result);
269  return result;
270 }
271 
277 AFW_DEFINE_STATIC_INLINE(afw_int32_t)
280 {
281  afw_int32_t result = big.i;
282  AFW_ENDIAN_BIG_TO_NATIVE_32(&result);
283  return result;
284 }
285 
291 AFW_DEFINE_STATIC_INLINE(afw_endian_big_uint32_t)
293  afw_uint32_t native)
294 {
296  result.i = native;
297  AFW_ENDIAN_NATIVE_TO_BIG_32(&result);
298  return result;
299 }
300 
306 AFW_DEFINE_STATIC_INLINE(afw_endian_big_int32_t)
308  afw_int32_t native)
309 {
310  afw_endian_big_int32_t result;
311  result.i = native;
312  AFW_ENDIAN_NATIVE_TO_BIG_32(&result);
313  return result;
314 }
315 
321 AFW_DEFINE_STATIC_INLINE(afw_uint16_t)
324 {
325  afw_uint16_t result = big.i;
326  AFW_ENDIAN_BIG_TO_NATIVE_16(&result);
327  return result;
328 }
329 
335 AFW_DEFINE_STATIC_INLINE(afw_int16_t)
338 {
339  afw_int16_t result = big.i;
340  AFW_ENDIAN_BIG_TO_NATIVE_16(&result);
341  return result;
342 }
343 
349 AFW_DEFINE_STATIC_INLINE(afw_endian_big_uint16_t)
351  afw_uint16_t native)
352 {
354  result.i = native;
355  AFW_ENDIAN_NATIVE_TO_BIG_16(&result);
356  return result;
357 }
358 
364 AFW_DEFINE_STATIC_INLINE(afw_endian_big_int16_t)
366  afw_int16_t native)
367 {
368  afw_endian_big_int16_t result;
369  result.i = native;
370  AFW_ENDIAN_NATIVE_TO_BIG_16(&result);
371  return result;
372 }
373 
382 AFW_DEFINE_STATIC_INLINE(afw_size_t)
385 {
386  afw_uint64_t result = little.i;
387 
388  /* Convert to native and throw error if it didn't fit afw_size_t. */
389  AFW_ENDIAN_LITTLE_TO_NATIVE_64(&result);
390  if (result != (afw_size_t)result) {
391  AFW_THROW_ERROR_Z(general,
392  "Value in afw_endian_little_uint64_t exceeds the value that will "
393  "fit in afw_size_t",
394  xctx);
395  }
396 
397  return (afw_size_t)result;
398 }
399 
405 AFW_DEFINE_STATIC_INLINE(afw_uint64_t)
408 {
409  afw_uint64_t result = little.i;
410  AFW_ENDIAN_LITTLE_TO_NATIVE_64(&result);
411  return result;
412 }
413 
419 AFW_DEFINE_STATIC_INLINE(afw_int64_t)
422 {
423  afw_int64_t result = little.i;
424  AFW_ENDIAN_LITTLE_TO_NATIVE_64(&result);
425  return result;
426 }
427 
433 AFW_DEFINE_STATIC_INLINE(afw_endian_little_uint64_t)
435  afw_uint64_t native)
436 {
438  result.i = native;
439  AFW_ENDIAN_NATIVE_TO_LITTLE_64(&result);
440  return result;
441 }
442 
448 AFW_DEFINE_STATIC_INLINE(afw_endian_little_int64_t)
450  afw_int64_t native)
451 {
453  result.i = native;
454  AFW_ENDIAN_NATIVE_TO_LITTLE_64(&result);
455  return result;
456 }
457 
463 AFW_DEFINE_STATIC_INLINE(afw_uint32_t)
466 {
467  afw_uint32_t result = little.i;
468  AFW_ENDIAN_LITTLE_TO_NATIVE_32(&result);
469  return result;
470 }
471 
477 AFW_DEFINE_STATIC_INLINE(afw_int32_t)
480 {
481  afw_int32_t result = little.i;
482  AFW_ENDIAN_LITTLE_TO_NATIVE_32(&result);
483  return result;
484 }
485 
491 AFW_DEFINE_STATIC_INLINE(afw_endian_little_uint32_t)
493  afw_uint32_t native)
494 {
496  result.i = native;
497  AFW_ENDIAN_NATIVE_TO_LITTLE_32(&result);
498  return result;
499 }
500 
506 AFW_DEFINE_STATIC_INLINE(afw_endian_little_int32_t)
508  afw_int32_t native)
509 {
511  result.i = native;
512  AFW_ENDIAN_NATIVE_TO_LITTLE_32(&result);
513  return result;
514 }
515 
521 AFW_DEFINE_STATIC_INLINE(afw_uint16_t)
524 {
525  afw_uint16_t result = little.i;
526  AFW_ENDIAN_LITTLE_TO_NATIVE_16(&result);
527  return result;
528 }
529 
535 AFW_DEFINE_STATIC_INLINE(afw_int16_t)
538 {
539  afw_int16_t result = little.i;
540  AFW_ENDIAN_LITTLE_TO_NATIVE_16(&result);
541  return result;
542 }
543 
549 AFW_DEFINE_STATIC_INLINE(afw_endian_little_uint16_t)
551  afw_uint16_t native)
552 {
554  result.i = native;
555  AFW_ENDIAN_NATIVE_TO_LITTLE_16(&result);
556  return result;
557 }
558 
564 AFW_DEFINE_STATIC_INLINE(afw_endian_little_int16_t)
566  afw_int16_t native)
567 {
569  result.i = native;
570  AFW_ENDIAN_NATIVE_TO_LITTLE_16(&result);
571  return result;
572 }
573 
574 AFW_END_DECLARES
575 
578 #endif /* __AFW_ENDIAN_H__ */
Adaptive Framework Common Header.
#define AFW_BEGIN_DECLARES
apr_uint64_t afw_uint64_t
64-bit unsigned integer.
Definition: afw_common.h:190
apr_uint16_t afw_uint16_t
16-bit unsigned integer.
Definition: afw_common.h:178
apr_int32_t afw_int32_t
32-bit signed integer.
Definition: afw_common.h:163
apr_int16_t afw_int16_t
16-bit signed integer.
Definition: afw_common.h:160
apr_int64_t afw_int64_t
64-bit signed integer.
Definition: afw_common.h:172
apr_uint32_t afw_uint32_t
32-bit unsigned integer.
Definition: afw_common.h:184
apr_size_t afw_size_t
size_t.
Definition: afw_common.h:151
afw_uint64_t afw_endian_big_to_native_uint64(afw_endian_big_uint64_t big)
afw_endian_big_uint64_t to native afw_uint64_t
Definition: afw_endian.h:206
afw_endian_little_uint32_t afw_endian_native_to_little_uint32(afw_uint32_t native)
native afw_uint32_t to afw_endian_little_uint32_t
Definition: afw_endian.h:492
afw_size_t afw_endian_safe_big_uint64_to_native_size_t(afw_endian_big_uint64_t big, afw_xctx_t *xctx)
Safe afw_endian_big_uint64_t to native afw_size_t.
Definition: afw_endian.h:183
afw_int32_t afw_endian_big_to_native_int32(afw_endian_big_int32_t big)
afw_endian_big_int32_t to native afw_int32_t
Definition: afw_endian.h:278
afw_endian_big_uint64_t afw_endian_native_to_big_uint64(afw_uint64_t native)
native afw_uint64_t to afw_endian_big_uint64_t
Definition: afw_endian.h:234
afw_int16_t afw_endian_big_to_native_int16(afw_endian_big_int16_t big)
afw_endian_big_int16_t to native afw_int16_t
Definition: afw_endian.h:336
afw_endian_little_int16_t afw_endian_native_to_little_int16(afw_int16_t native)
native afw_int16_t to afw_endian_little_int16_t
Definition: afw_endian.h:565
afw_uint32_t afw_endian_big_to_native_uint32(afw_endian_big_uint32_t big)
afw_endian_big_uint32_t to native afw_uint32_t
Definition: afw_endian.h:264
afw_endian_big_int64_t afw_endian_native_to_big_int64(afw_int64_t native)
native afw_int64_t to afw_endian_big_int64_t
Definition: afw_endian.h:249
afw_endian_little_uint64_t afw_endian_native_to_little_uint64(afw_uint64_t native)
native afw_uint64_t to afw_endian_little_uint64_t
Definition: afw_endian.h:434
afw_int64_t afw_endian_little_to_native_int64(afw_endian_little_int64_t little)
afw_endian_little_int64_t to native afw_int64_t
Definition: afw_endian.h:420
afw_int32_t afw_endian_little_to_native_int32(afw_endian_little_int32_t little)
afw_endian_little_int32_t to native afw_int32_t
Definition: afw_endian.h:478
afw_uint16_t afw_endian_big_to_native_uint16(afw_endian_big_uint16_t big)
afw_endian_big_uint16_t to native afw_uint16_t
Definition: afw_endian.h:322
afw_endian_big_int32_t afw_endian_native_to_big_int32(afw_int32_t native)
native afw_int32_t to afw_endian_big_int32_t
Definition: afw_endian.h:307
afw_endian_little_uint16_t afw_endian_native_to_little_uint16(afw_uint16_t native)
native afw_uint16_t to afw_endian_little_uint16_t
Definition: afw_endian.h:550
afw_endian_little_int64_t afw_endian_native_to_little_int64(afw_int64_t native)
native afw_int64_t to afw_endian_little_int64_t
Definition: afw_endian.h:449
afw_int64_t afw_endian_big_to_native_int64(afw_endian_big_int64_t big)
afw_endian_big_int64_t to native afw_int64_t
Definition: afw_endian.h:220
afw_endian_big_int16_t afw_endian_native_to_big_int16(afw_int16_t native)
native afw_int16_t to afw_endian_big_int16_t
Definition: afw_endian.h:365
afw_endian_little_int32_t afw_endian_native_to_little_int32(afw_int32_t native)
native afw_int32_t to afw_endian_little_int32_t
Definition: afw_endian.h:507
afw_uint64_t afw_endian_little_to_native_uint64(afw_endian_little_uint64_t little)
afw_endian_little_uint64_t to native afw_uint64_t
Definition: afw_endian.h:406
afw_int16_t afw_endian_little_to_native_int16(afw_endian_little_int16_t little)
afw_endian_little_int16_t to native afw_int16_t
Definition: afw_endian.h:536
afw_size_t afw_endian_safe_little_uint64_to_native_size_t(afw_endian_little_uint64_t little, afw_xctx_t *xctx)
Safe afw_endian_little_uint64_t to native afw_size_t.
Definition: afw_endian.h:383
afw_uint32_t afw_endian_little_to_native_uint32(afw_endian_little_uint32_t little)
afw_endian_little_uint32_t to native afw_uint32_t
Definition: afw_endian.h:464
afw_endian_big_uint32_t afw_endian_native_to_big_uint32(afw_uint32_t native)
native afw_uint32_t to afw_endian_big_uint32_t
Definition: afw_endian.h:292
afw_endian_big_uint16_t afw_endian_native_to_big_uint16(afw_uint16_t native)
native afw_uint16_t to afw_endian_big_uint16_t
Definition: afw_endian.h:350
afw_uint16_t afw_endian_little_to_native_uint16(afw_endian_little_uint16_t little)
afw_endian_little_uint16_t to native afw_uint16_t
Definition: afw_endian.h:522
#define AFW_THROW_ERROR_Z(code, message_z, xctx)
Macro used to set error and 0 rv in xctx and throw it.
Definition: afw_error.h:283
Interface afw_xctx public struct.
16-bit signed big endian integer.
Definition: afw_endian.h:163
32-bit signed big endian integer.
Definition: afw_endian.h:139
64-bit signed big endian integer.
Definition: afw_endian.h:115
16-bit unsigned big endian integer.
Definition: afw_endian.h:151
32-bit unsigned big endian integer.
Definition: afw_endian.h:127
64-bit unsigned big endian integer.
Definition: afw_endian.h:103
16-bit signed little endian integer.
Definition: afw_endian.h:169
32-bit signed little endian integer.
Definition: afw_endian.h:145
64-bit signed little endian integer.
Definition: afw_endian.h:121
16-bit unsigned little endian integer.
Definition: afw_endian.h:157
32-bit unsigned little endian integer.
Definition: afw_endian.h:133
64-bit unsigned little endian integer.
Definition: afw_endian.h:109