37 lines
973 B
C
37 lines
973 B
C
|
#pragma once
|
||
|
|
||
|
#include <assert.h>
|
||
|
#include <stddef.h>
|
||
|
#include <stdint.h>
|
||
|
|
||
|
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
||
|
# define pack_Nbit_(N) \
|
||
|
static inline void biner_pack_l##N(const int##N##_t* v, uint8_t* c, size_t s) { \
|
||
|
assert(s < N/8); \
|
||
|
*c = (*v >> s*8) & 0xff; \
|
||
|
} \
|
||
|
static inline void biner_pack_b##N(const int##N##_t* v, uint8_t* c, size_t s) { \
|
||
|
assert(s < N/8); \
|
||
|
biner_pack_l##N(v, c, N/8-s-1); \
|
||
|
}
|
||
|
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
||
|
# define pack_Nbit_(N) \
|
||
|
static inline void biner_pack_b##N(const int##N##_t* v, uint8_t* c, size_t s) { \
|
||
|
assert(s < N/8); \
|
||
|
*c = (*v >> s*8) & 0xff; \
|
||
|
} \
|
||
|
static inline void biner_pack_l##N(const int##N##_t* v, uint8_t* c, size_t s) { \
|
||
|
assert(s < N/8); \
|
||
|
biner_pack_b##N(v, c, N/8-s-1); \
|
||
|
}
|
||
|
#else
|
||
|
# error "byte order unknown"
|
||
|
#endif
|
||
|
|
||
|
pack_Nbit_(8);
|
||
|
pack_Nbit_(16);
|
||
|
pack_Nbit_(32);
|
||
|
pack_Nbit_(64);
|
||
|
|
||
|
#undef pack_Nbit_
|