|
/* License: Apache 2.0 */ |
|
/* File: deser_buf.c */ |
|
|
|
#include "deser_buf.h" |
|
|
|
#ifdef __SIZEOF_INT128__ |
|
|
|
void pack_u128(void *dst, unsigned __int128 x) { |
|
unsigned char *out = (unsigned char *)dst; |
|
*out++ = (x >> 120) & 0xFF; |
|
*out++ = (x >> 112) & 0xFF; |
|
*out++ = (x >> 104) & 0xFF; |
|
*out++ = (x >> 96) & 0xFF; |
|
*out++ = (x >> 88) & 0xFF; |
|
*out++ = (x >> 80) & 0xFF; |
|
*out++ = (x >> 72) & 0xFF; |
|
*out++ = (x >> 64) & 0xFF; |
|
*out++ = (x >> 56) & 0xFF; |
|
*out++ = (x >> 48) & 0xFF; |
|
*out++ = (x >> 40) & 0xFF; |
|
*out++ = (x >> 32) & 0xFF; |
|
*out++ = (x >> 24) & 0xFF; |
|
*out++ = (x >> 16) & 0xFF; |
|
*out++ = (x >> 8) & 0xFF; |
|
*out = x & 0xFF; |
|
} |
|
|
|
void pack_i128(void *dst, __int128 x) { |
|
unsigned char *out = (unsigned char *)dst; |
|
*out++ = (x >> 120) & 0xFF; |
|
*out++ = (x >> 112) & 0xFF; |
|
*out++ = (x >> 104) & 0xFF; |
|
*out++ = (x >> 96) & 0xFF; |
|
*out++ = (x >> 88) & 0xFF; |
|
*out++ = (x >> 80) & 0xFF; |
|
*out++ = (x >> 72) & 0xFF; |
|
*out++ = (x >> 64) & 0xFF; |
|
*out++ = (x >> 56) & 0xFF; |
|
*out++ = (x >> 48) & 0xFF; |
|
*out++ = (x >> 40) & 0xFF; |
|
*out++ = (x >> 32) & 0xFF; |
|
*out++ = (x >> 24) & 0xFF; |
|
*out++ = (x >> 16) & 0xFF; |
|
*out++ = (x >> 8) & 0xFF; |
|
*out = x & 0xFF; |
|
} |
|
|
|
unsigned __int128 unpack_u128(const void *src) { |
|
const unsigned char *in = (const unsigned char *)src; |
|
unsigned __int128 r = (unsigned __int128)(*in++) << 120; |
|
r |= (unsigned __int128)(*in++) << 112; |
|
r |= (unsigned __int128)(*in++) << 104; |
|
r |= (unsigned __int128)(*in++) << 96; |
|
r |= (unsigned __int128)(*in++) << 88; |
|
r |= (unsigned __int128)(*in++) << 80; |
|
r |= (unsigned __int128)(*in++) << 72; |
|
r |= (unsigned __int128)(*in++) << 64; |
|
r |= (unsigned __int128)(*in++) << 56; |
|
r |= (unsigned __int128)(*in++) << 48; |
|
r |= (unsigned __int128)(*in++) << 40; |
|
r |= (unsigned __int128)(*in++) << 32; |
|
r |= (unsigned __int128)(*in++) << 24; |
|
r |= (unsigned __int128)(*in++) << 16; |
|
r |= (unsigned __int128)(*in++) << 8; |
|
r |= (unsigned __int128)(*in); |
|
return (r); |
|
} |
|
|
|
#endif /* __SIZEOF_INT128__ */ |
|
|
|
void pack_u64(void *dst, uint64_t x) { |
|
unsigned char *out = (unsigned char *)dst; |
|
*out++ = (x >> 56) & 0xFF; |
|
*out++ = (x >> 48) & 0xFF; |
|
*out++ = (x >> 40) & 0xFF; |
|
*out++ = (x >> 32) & 0xFF; |
|
*out++ = (x >> 24) & 0xFF; |
|
*out++ = (x >> 16) & 0xFF; |
|
*out++ = (x >> 8) & 0xFF; |
|
*out = x & 0xFF; |
|
} |
|
|
|
void pack_i64(void *dst, int64_t x) { |
|
unsigned char *out = (unsigned char *)dst; |
|
*out++ = (x >> 56) & 0xFF; |
|
*out++ = (x >> 48) & 0xFF; |
|
*out++ = (x >> 40) & 0xFF; |
|
*out++ = (x >> 32) & 0xFF; |
|
*out++ = (x >> 24) & 0xFF; |
|
*out++ = (x >> 16) & 0xFF; |
|
*out++ = (x >> 8) & 0xFF; |
|
*out = x & 0xFF; |
|
} |
|
|
|
void pack_u32(void *dst, uint32_t x) { |
|
unsigned char *out = (unsigned char *)dst; |
|
*out++ = (x >> 24) & 0xFF; |
|
*out++ = (x >> 16) & 0xFF; |
|
*out++ = (x >> 8) & 0xFF; |
|
*out = x & 0xFF; |
|
} |
|
|
|
void pack_i32(void *dst, int32_t x) { |
|
unsigned char *out = (unsigned char *)dst; |
|
*out++ = (x >> 24) & 0xFF; |
|
*out++ = (x >> 16) & 0xFF; |
|
*out++ = (x >> 8) & 0xFF; |
|
*out = x & 0xFF; |
|
} |
|
|
|
void pack_u16(void *dst, uint16_t x) { |
|
unsigned char *out = (unsigned char *)dst; |
|
*out++ = (x >> 8) & 0xFF; |
|
*out = x & 0xFF; |
|
} |
|
|
|
void pack_i16(void *dst, int16_t x) { |
|
unsigned char *out = (unsigned char *)dst; |
|
*out++ = (x >> 8) & 0xFF; |
|
*out = x & 0xFF; |
|
} |
|
|
|
#ifdef __SIZEOF_INT128__ |
|
|
|
unsigned __int128 unpack_u128(const void *src) { |
|
const unsigned char *in = (const unsigned char *)src; |
|
unsigned __int128 r = (unsigned __int128)(*in++) << 120; |
|
r |= (unsigned __int128)(*in++) << 112; |
|
r |= (unsigned __int128)(*in++) << 104; |
|
r |= (unsigned __int128)(*in++) << 96; |
|
r |= (unsigned __int128)(*in++) << 88; |
|
r |= (unsigned __int128)(*in++) << 80; |
|
r |= (unsigned __int128)(*in++) << 72; |
|
r |= (unsigned __int128)(*in++) << 64; |
|
r |= (unsigned __int128)(*in++) << 56; |
|
r |= (unsigned __int128)(*in++) << 48; |
|
r |= (unsigned __int128)(*in++) << 40; |
|
r |= (unsigned __int128)(*in++) << 32; |
|
r |= (unsigned __int128)(*in++) << 24; |
|
r |= (unsigned __int128)(*in++) << 16; |
|
r |= (unsigned __int128)(*in++) << 8; |
|
r |= (unsigned __int128)(*in); |
|
return (r); |
|
} |
|
|
|
__int128 unpack_i128(const void *src) { |
|
const char *in = (const char *)src; |
|
__int128 r = (__int128)(*in++) << 120; |
|
r |= (__int128)(*in++) << 112; |
|
r |= (__int128)(*in++) << 104; |
|
r |= (__int128)(*in++) << 96; |
|
r |= (__int128)(*in++) << 88; |
|
r |= (__int128)(*in++) << 80; |
|
r |= (__int128)(*in++) << 72; |
|
r |= (__int128)(*in++) << 64; |
|
r |= (__int128)(*in++) << 56; |
|
r |= (__int128)(*in++) << 48; |
|
r |= (__int128)(*in++) << 40; |
|
r |= (__int128)(*in++) << 32; |
|
r |= (__int128)(*in++) << 24; |
|
r |= (__int128)(*in++) << 16; |
|
r |= (__int128)(*in++) << 8; |
|
r |= (__int128)(*in); |
|
return (r); |
|
} |
|
|
|
#endif /* __SIZEOF_INT128__ */ |
|
|
|
uint64_t unpack_u64(const void *src) { |
|
const unsigned char *in = (const unsigned char *)src; |
|
uint64_t r = (uint64_t)(*in++) << 56; |
|
r |= (uint64_t)(*in++) << 48; |
|
r |= (uint64_t)(*in++) << 40; |
|
r |= (uint64_t)(*in++) << 32; |
|
r |= (uint64_t)(*in++) << 24; |
|
r |= (uint64_t)(*in++) << 16; |
|
r |= (uint64_t)(*in++) << 8; |
|
r |= (uint64_t)(*in); |
|
return (r) |
|
} |
|
|
|
int64_t unpack_i64(const void *src) { |
|
const unsigned char *in = (const unsigned char *)src; |
|
int64_t r = (int64_t)(*in++) << 56; |
|
r |= (int64_t)(*in++) << 48; |
|
r |= (int64_t)(*in++) << 40; |
|
r |= (int64_t)(*in++) << 32; |
|
r |= (int64_t)(*in++) << 24; |
|
r |= (int64_t)(*in++) << 16; |
|
r |= (int64_t)(*in++) << 8; |
|
r |= (int64_t)(*in); |
|
return (r); |
|
} |
|
|
|
uint32_t unpack_u32(const void *src) { |
|
const unsigned char *in = (const unsigned char *)src; |
|
uint32_t r = (uint32_t)(*in++) << 24; |
|
r |= (uint32_t)(*in++) << 16; |
|
r |= (uint32_t)(*in++) << 8; |
|
r |= (uint32_t)(*in); |
|
return (r); |
|
} |
|
|
|
int32_t unpack_i32(const void *src) { |
|
const unsigned char *in = (const unsigned char *)src; |
|
int32_t r = (int32_t)(*in++) << 24; |
|
r |= (int32_t)(*in++) << 16; |
|
r |= (int32_t)(*in++) << 8; |
|
r |= (int32_t)(*in); |
|
return (r); |
|
} |
|
|
|
uint16_t unpack_u16(const void *src) { |
|
const unsigned char *in = (const unsigned char *)src; |
|
uint16_t r = (uint16_t)(*in++) << 8; |
|
r |= (uint16_t)(*in); |
|
return (r); |
|
} |
|
|
|
int16_t unpack_i16(const void *src) { |
|
const unsigned char *in = (const unsigned char *)src; |
|
int16_t r = (int16_t)(*in++) << 8; |
|
r |= (int16_t)(*in); |
|
return (r); |
|
} |