28#if !defined(_SPANDSP_UNALIGNED_H_)
29#define _SPANDSP_UNALIGNED_H_
31#if defined(__cplusplus)
37#define PACK( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop))
39PACK(
struct __dealign_uint16 { uint16_t datum; };)
40PACK(
struct __dealign_uint32 { uint32_t datum; };)
41PACK(
struct __dealign_uint64 { uint64_t datum; };)
44#
if defined(__GNUC__) || defined(__clang__)
45struct __dealign_uint16 { uint16_t datum; } __attribute__((packed));
46struct __dealign_uint32 { uint32_t datum; } __attribute__((packed));
47struct __dealign_uint64 { uint64_t datum; } __attribute__((packed));
50#if defined(__GNUC__) || defined(__clang__) || defined(_MSC_VER)
52static __inline__ uint64_t get_unaligned_uint64(
const void *p)
54 const struct __dealign_uint64 *pp = (
const struct __dealign_uint64 *) p;
60static __inline__
void put_unaligned_uint64(
void *p, uint32_t datum)
62 struct __dealign_uint64 *pp = (
struct __dealign_uint64 *) p;
68static __inline__ uint64_t get_net_unaligned_uint64(
const void *p)
70 const struct __dealign_uint64 *pp = (
const struct __dealign_uint64 *) p;
72#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
74#elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
75 return __builtin_bswap64(pp->datum);
80static __inline__
void put_net_unaligned_uint64(
void *p, uint64_t datum)
82 struct __dealign_uint64 *pp = (
struct __dealign_uint64 *) p;
84#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
86#elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
87 pp->datum = __builtin_bswap64(datum);
92static __inline__ uint32_t get_unaligned_uint32(
const void *p)
94 const struct __dealign_uint32 *pp = (
const struct __dealign_uint32 *) p;
100static __inline__
void put_unaligned_uint32(
void *p, uint32_t datum)
102 struct __dealign_uint32 *pp = (
struct __dealign_uint32 *) p;
108static __inline__ uint32_t get_net_unaligned_uint32(
const void *p)
110 const struct __dealign_uint32 *pp = (
const struct __dealign_uint32 *) p;
112#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
114#elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
115 return __builtin_bswap32(pp->datum);
120static __inline__
void put_net_unaligned_uint32(
void *p, uint32_t datum)
122 struct __dealign_uint32 *pp = (
struct __dealign_uint32 *) p;
124#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
126#elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
127 pp->datum = __builtin_bswap32(datum);
132static __inline__ uint16_t get_unaligned_uint16(
const void *p)
134 const struct __dealign_uint16 *pp = (
const struct __dealign_uint16 *) p;
140static __inline__
void put_unaligned_uint16(
void *p, uint16_t datum)
142 struct __dealign_uint16 *pp = (
struct __dealign_uint16 *) p;
148static __inline__ uint16_t get_net_unaligned_uint16(
const void *p)
150 const struct __dealign_uint16 *pp = (
const struct __dealign_uint16 *) p;
152#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
154#elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
155 return __builtin_bswap16(pp->datum);
160static __inline__
void put_net_unaligned_uint16(
void *p, uint16_t datum)
162 struct __dealign_uint16 *pp = (
struct __dealign_uint16 *) p;
164#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
166#elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
167 pp->datum = __builtin_bswap16(datum);
172#elif defined(SOLARIS) && defined(__sparc__)
174static __inline__ uint64_t get_unaligned_uint64(
const void *p)
176 const uint8_t *cp = p;
178 return (cp[0] << 56) | (cp[1] << 48) | (cp[2] << 40) | (cp[3] << 32) | (cp[4] << 24) | (cp[5] << 16) | (cp[6] << 8) | cp[7];
182static __inline__
void put_unaligned_uint64(
void *p, uint64_t datum)
184 const uint8_t *cp = p;
197static __inline__ uint32_t get_unaligned_uint32(
const void *p)
199 const uint8_t *cp = p;
201 return (cp[0] << 24) | (cp[1] << 16) | (cp[2] << 8) | cp[3];
205static __inline__
void put_unaligned_uint32(
void *p, uint32_t datum)
207 const uint8_t *cp = p;
216static __inline__ uint16_t get_unaligned_uint16(
const void *p)
218 const uint8_t *cp = p;
220 return (cp[0] << 8) | cp[1];
224static __inline__
void put_unaligned_uint16(
void *p, uint16_t datum)
236#define get_unaligned_uint64(p) (*((uint64_t *) (p)))
237#define put_unaligned_uint64(p,d) do { uint64_t *__P = (p); *__P = d; } while(0)
238#define get_net_unaligned_uint64(p) (*((uint64_t *) (p)))
239#define put_net_unaligned_uint64(p,d) do { uint64_t *__P = (p); *__P = d; } while(0)
240#define get_unaligned_uint32(p) (*((uint32_t *) (p)))
241#define put_unaligned_uint32(p,d) do { uint32_t *__P = (p); *__P = d; } while(0)
242#define get_net_unaligned_uint32(p) (*((uint32_t *) (p)))
243#define put_net_unaligned_uint32(p,d) do { uint32_t *__P = (p); *__P = d; } while(0)
244#define get_unaligned_uint16(p) (*((uint16_t *) (p)))
245#define put_unaligned_uint16(p,d) do { uint16_t *__P = (p); *__P = d; } while(0)
246#define get_net_unaligned_uint16(p) (*((uint16_t *) (p)))
247#define put_net_unaligned_uint16(p,d) do { uint16_t *__P = (p); *__P = d; } while(0)
250#if defined(__cplusplus)