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)) 39 PACK(
struct __dealign_uint16 { uint16_t datum; };)
40 PACK(
struct __dealign_uint32 { uint32_t datum; };)
41 PACK(
struct __dealign_uint64 { uint64_t datum; };)
44 #
if defined(__GNUC__) || defined(__clang__)
45 struct __dealign_uint16 { uint16_t datum; } __attribute__((packed));
46 struct __dealign_uint32 { uint32_t datum; } __attribute__((packed));
47 struct __dealign_uint64 { uint64_t datum; } __attribute__((packed));
50 #if defined(__GNUC__) || defined(__clang__) || defined(_MSC_VER) 52 static __inline__ uint64_t get_unaligned_uint64(
const void *p)
54 const struct __dealign_uint64 *pp = (
const struct __dealign_uint64 *) p;
60 static __inline__
void put_unaligned_uint64(
void *p, uint32_t datum)
62 struct __dealign_uint64 *pp = (
struct __dealign_uint64 *) p;
68 static __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);
80 static __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);
92 static __inline__ uint32_t get_unaligned_uint32(
const void *p)
94 const struct __dealign_uint32 *pp = (
const struct __dealign_uint32 *) p;
100 static __inline__
void put_unaligned_uint32(
void *p, uint32_t datum)
102 struct __dealign_uint32 *pp = (
struct __dealign_uint32 *) p;
108 static __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);
120 static __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);
132 static __inline__ uint16_t get_unaligned_uint16(
const void *p)
134 const struct __dealign_uint16 *pp = (
const struct __dealign_uint16 *) p;
140 static __inline__
void put_unaligned_uint16(
void *p, uint16_t datum)
142 struct __dealign_uint16 *pp = (
struct __dealign_uint16 *) p;
148 static __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);
160 static __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__) 174 static __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];
182 static __inline__
void put_unaligned_uint64(
void *p, uint64_t datum)
184 const uint8_t *cp = p;
197 static __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];
205 static __inline__
void put_unaligned_uint32(
void *p, uint32_t datum)
207 const uint8_t *cp = p;
216 static __inline__ uint16_t get_unaligned_uint16(
const void *p)
218 const uint8_t *cp = p;
220 return (cp[0] << 8) | cp[1];
224 static __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)